Programm in Maxima schreiben < Maxima < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:05 Sa 23.05.2020 | Autor: | kuyaykim |
Aufgabe | (a) Schreiben Sie eine Funktion p r i m z a h l i
n f o zu folgendem Flussdiagramm; dabei soll x
eine nicht-negative ganze Zahl sein dürfen:
[imp]
(b) Überprüfen Sie, ob Ihre Befehlsumgebung
aus (a) auch dann "richtig" reagiert, wenn für x
die Zahl 0 oder 1 eingesetzt wird;
falls in diesem Fall eine Fehlermeldung
erscheint, finden Sie heraus, woran das liegt.
(c) Formulieren Sie nun eine
Mehrfach-Verzweigung, um zusätzlich die Fälle
x=0 und x=1 korrekt zu behandeln.
Die Grundstruktur für eine solche
Mehrfach-Verzweigung lautet:
if BEDINGUNG1 then AUSDRUCK1
elseif BEDINGUNG2 then
AUSDRUCK2
elseif BEDINGUNG3 then
AUSDRUCK3
...
else AUSDRUCKn |
Hallo!
Ich komme mit dieser Frage nicht weiter.
Ich habe es so geschrieben, aber Maxima erkennt keine Primzahl
prim(x):=block(
if (integerp(x) and x>0) then
(if integerp(primep(x)) then sconcat(x, " ist eine Primzahl")
else sconcat(x," ist keine Primzahl"))
else return(" Als Argument muss eine natürliche Zahl eingegeben werden.")
)$
Wenn ich es wie folgt teste:
prim(1);
prim(2);
prim(3);
prim(4);
prim(-1);
prim(5);
prim(0);
gibt Maxima das raus:
"1 ist keine Primzahl"
"2 ist keine Primzahl"
"3 ist keine Primzahl"
"4 ist keine Primzahl"
" Als Argument muss eine natürliche Zahl eingegeben werden."
"5 ist keine Primzahl"
" Als Argument muss eine natürliche Zahl eingegeben werden."
Was habe ich da falsch gemacht?
Wie muss der Befehl sonst heißen?
Auch die 0 und die 1 muss erkannt werden.
Was ist da falsch?
Ich danke euch schonmal für eure Hilfe.
LG
Nicole
Ich habe diese Frage auch in folgenden Foren auf anderen Internetseiten gestellt:
[https://matheplanet.com/default3.html?call=viewtopic.php?topic=235877&ref=https%3A%2F%2Fwww.google.com%2F]
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
Du hast nichts falsch, sondern eigentlich gar nichts gemacht.
Maxima weiß eher, ob heute schönes Wetter ist, als dass es weiß, was eine Primzahl ist. Das sollst du doch gerade programmieren!
Wie geht das?
Bei 0 und 1 gibst du "ist keine PZ" aus und verlässt das Programm (Nein, nicht "muss eine nat. Z. eingegeben werden", 0 ist ausdrücklich erlaubt).
Jetzt setzt du t=2 (das ist ein möglicher Teiler)
Solange (t<x) und (x mod t [mm] \ne [/mm] 0) wiederhole t:=t+1
falls t=x schreibe "PZ" sonst "keine PZ".
Erklärung:
x mod t ist eine Funktion aus der Computersprache Pascal. (weiteres für Maxima s.u.) Sie gibt den Rest an, der beim Teilen von x durch t entsteht. 20 mod 7 ist 6, weil 20:7=2 Rest 6 ist. 20 mod 5 ist 0, weil 20:5=4 Rest 0 ist. Wenn also 0 herauskommt, ist x durch t teilbar, und du hast einen Teiler gefunden, und x ist keine PZ. Wenn nicht, erhöhst du den Teiler um 1 und probierst es weiter, bis es klappt.
Spätestens bei t=x klappt es natürlich, und du müsstest nun nur noch nachfragen, ob t bis x gelaufen ist oder vorher schon einen Teiler gefunden hat. Wenn t=x der erste Teiler ist, gibt es außer 1 keinen weiteren, und du hast eine PZ.
Falls du die mod-Funktion nicht findest: Sie kann auch "remainder" oder "reminder" heißen. Falls es so etwas in Maxima auch nicht gibt, kannst du dich mit einer Ganzzahldivision behelfen. Die heißt in Pascal div und lässt den Rest weg: 20 div 7 ist 2, 20 div 5 ist 4. Dann gibt x-(x div t)*t den Rest an: 20-(20 div 7)*7 =20-2*7=6 bzw. 20-(20 div 5)*5=20-4*5=0.
Falls es auch keine Ganzzahldivision gibt, kann ich dir nicht weiterhelfen.
Das obige Programm ist übrigens sehr ineffektiv, weil man bei einer PZ von t=2 bis t=x alles durchprobiert, obwohl man schon bei der Wurzel von x aufhören kann. Aber das ist eine andere Geschichte...
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:59 Sa 23.05.2020 | Autor: | kuyaykim |
Ich habe es jetzt ein wenig geändert und damit klappt es.
prim(x):=block(
if (integerp(x) and x>=0) then
(if (primep(x)) then sconcat(x, " ist eine Primzahl")
else sconcat(x," ist keine Primzahl"))
else return(" Als Argument muss eine ganze Zahl eingegeben werden.")
)$
prim(2);
prim(3);
prim(4);
prim(-1);
prim(5);
"2 ist eine Primzahl"
"3 ist eine Primzahl"
"4 ist keine Primzahl"
" Als Argument muss eine ganze Zahl eingegeben werden."
"5 ist eine Primzahl"
Das ich Maxima dazu nehme ist eine Vorgabe. Da kann ich nichts dran ändern.
|
|
|
|
|
Damit hast du natürlich, was die Primzahleigenschaft betrifft, eigentlich gar nichts selber programmiert, sondern du stützt dich einfach auf eine in Maxima offenbar eingebaute Funktion "primep" , welche mittels einer äußerst raffinierten zahlentheoretischen Methode mit großer Sicherheit über die Primzahleigenschaft entscheidet - und für alle gängigen (nicht zu riesengroßen) Zahlenwerte auch das richtige Ergebnis liefert.
|
|
|
|