________________________________________________________________________________
Inhalt....: print-Ausgaben innerhalb von Prozeduren
Kategorie.: Handwerkskasten
Mathematik: Programmierung
MuPAD.....: 3.0.0
Datum.....: 2002-08-14
Autoren...: Kai Gehrs <acrowley@mupad.de>
Funktionen: print, Unquoted, ., proc, for, if, error, isprime
________________________________________________________________________________
Elementare MuPAD-Funktionen:
print-Ausgaben innerhalb von Prozeduren
Wir wollen lernen, wie man in eigenen MuPAD Prozeduren die Funktion 'print' nutzen kann,
um während einer Prozedur Ausgaben zu produzieren.
Wir betrachten die Prozedur Primzahlen aus dem Notebook
"Einfache_Prozeduren"
des Handwerkastens.
Primzahlen:= proc(u, o, n)
local Zufallszahlen, Zufall, i, Zaehler;
begin
if u >= o then
error("das erste Argument muss kleiner als das zweite sein");
end_if;
if n <= 0 then
error("das dritte Argument muss eine natürliche Zahl sein");
end_if;
Zufall:= random(u..o);
Zufallszahlen:= {Zufall() $ i = 1..n};
Zaehler:= 0;
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
end_if;
end_for;
return(Zaehler);
end_proc:
Zur Erinnerung: Ein Aufruf der Prozedur Primzahlen( u, o, n ) bewirkt, dass
genau n Zufallszahlen aus dem Bereich von u bis o erzeugt werden und
die Anzahl der Primzahlen innerhalb dieser Menge von Zufallszahlen
bestimmt wird. Dabei sollte n stets eine ganze Zahl größer als Null und
u und o sollten positive ganze Zahlen mit u echt kleiner o sein.
Wir wollen die Prozedur jetzt in sofern erweitern, dass jedesmal dann,
wenn eine Primzahl innerhalb der Menge der Zufallszahlen gefunden
wird, diese Primzahl auch ausgegeben wird. Dazu verwenden wir
die MuPAD Funktion print.
Wir erinnern uns zunächst, dass der Programmteil
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
end_if;
end_for;
dafür zuständig ist, alle Zufallszahlen zu durchlaufen und zu testen, ob die
jeweils gerade betrachtete Zahl i eine Primzahl ist. Ist dies der Fall, so wird
die Zeile
Zaehler:= Zaehler + 1;
ausgeführt. Wollen wir also jede gefundene Primzahl ausgeben, so sollte
an dieser Stelle die Zahl i ausgegeben werden. Die einfachste Variante
ist es, die Befehlszeile print( i ); in die if-Anweisung einzufügen. Diese
Befehlszeile bewirkt, dass jedesmal, wenn in dem Programm der innere
Teil der if-Anweisung ausgeführt wird, die Zahl i ausgegeben wird.
Primzahlen:= proc(u, o, n)
local Zufallszahlen, Zufall, i, Zaehler;
begin
if u >= o then
error("das erste Argument muss kleiner als das zweite sein");
end_if;
if n <= 0 then
error("das dritte Argument muss eine natürliche Zahl sein");
end_if;
Zufall:= random(u..o);
Zufallszahlen:= {Zufall() $ i = 1..n};
Zaehler:= 0;
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
print(i);
end_if;
end_for;
return(Zaehler);
end_proc:
Wir testen die neue Version der Prozedur an einem Beispiel:
Primzahlen(10, 50, 20)
37
47
11
13
31
![]()
Die Ausgabe ist wie folgt zu lesen: Die ersten 5 Zahlen sind genau die
Primzahlen, die in der Menge von Zufallszahlen enthalten waren (man
beachte, dass bei mehrfacher Ausführung der letzten obigen Befehlszeile
wegen der Zufallsbasiertheit der Prozedur durchaus andere Primzahlen
auftreten können - auch die Anzahl der gefundenen Primzahlen wird u.U.
variieren).
Die letzte ausgegebene Zahl, d.h. die Zahl 5, ist die (ursprüngliche) Ausgabe
der Prozedur Primzahlen, d.h. die Anzahl der in der Menge von Zufallszahlen
gefundenen Primzahlen.
Natürlich ist diese Ausgabeform nicht sehr glücklich, denn ein Benutzer
der Prozedur Primzahlen bekommt keinerlei Informationen über die
ausgegebenen Zahlen - er müsste raten, was die Prozedur tatsächlich
tut. Daher wollen wir die Ausgaben stärker kommentieren.
Beispielsweise könnten wir, anstatt einfach nur die jeweilige Primzahl
auszugeben, einen Kommentar anfügen, dass es sich bei der ausgegebenen
Zahl um eine Primzahl handelt. Dieses können wir folgendermaßen erreichen:
Wir ersetzen die Ausgabezeile durch print( "Die Zahl ", i ," ist eine Primzahl").
Mit diesem Befehl wird MuPAD zunächst die Zeichenkette "Die Zahl ", dann
die Zahl i und unmittelbar danach die Zeichenkette " ist eine Primzahl"
ausgegeben. Dabei ist das Leerzeichen nach dem Wort Zahl und vor dem
Wort ist wichtig, denn sonst entsteht auch in der Ausgabe kein Leerzeichen.
Wir modifizieren die obige Prozedur und testen Sie erneut an einem Beispiel:
Primzahlen:= proc(u, o, n)
local Zufallszahlen, Zufall, i, Zaehler;
begin
if u >= o then
error("das erste Argument muss kleiner als das zweite sein");
end_if;
if n <= 0 then
error("das dritte Argument muss eine natürliche Zahl sein");
end_if;
Zufall:= random(u..o);
Zufallszahlen:= {Zufall() $ i = 1..n};
Zaehler:= 0;
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
print("Die Zahl ",i," ist eine Primzahl");
end_if;
end_for;
return(Zaehler);
end_proc:
Primzahlen(10, 50, 20)
"Die Zahl ", 13, " ist eine Primzahl"
"Die Zahl ", 47, " ist eine Primzahl"
"Die Zahl ", 41, " ist eine Primzahl"
![]()
Sind wir ganz genau, so möchten wir natürlich eigentlich kein Komma
zwischen der jeweiligen Primzahl und den Zeichenketten sehen.
Dies können wir realisieren, indem wir das Komma in der print-Anweisung
durch einen Punkt . ersetzen. Ein Punkt . innerhalb einer print-Aweisung, der
nicht in Anführungszeichen steht, dient der Verbindung von Zeichenketten,
d.h. durch print( "Die Zahl ".i." ist eine Primzahl"); erhalten wir Ausgaben
der Form
"Die Zahl i ist eine Primzahl"
Primzahlen:= proc(u, o, n)
local Zufallszahlen, Zufall, i, Zaehler;
begin
if u >= o then
error("das erste Argument muss kleiner als das zweite sein");
end_if;
if n <= 0 then
error("das dritte Argument muss eine natürliche Zahl sein");
end_if;
Zufall:= random(u..o);
Zufallszahlen:= {Zufall() $ i = 1..n};
Zaehler:= 0;
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
print("Die Zahl ".i." ist eine Primzahl");
end_if;
end_for;
return(Zaehler);
end_proc:
Primzahlen(10, 50, 20)
"Die Zahl 31 ist eine Primzahl"
"Die Zahl 11 ist eine Primzahl"
"Die Zahl 37 ist eine Primzahl"
![]()
Ein weiterer kleiner Schönheitsfehler ist die Tatsache, dass die Ausgabe in
Anführungszeichen angegeben werden. Dies können wir mit der
Zusatzoption Unquoted abstellen. Dabei muss man Unquoted immer als
erstes in der entsprechenden print-Anweisung anführen und dann, mit
einem Komma getrennt, die gewünschte Ausgabe angeben. Wir modifizieren
also unsere Ausgabezeile nochmals:
Primzahlen:= proc(u, o, n)
local Zufallszahlen, Zufall, i, Zaehler;
begin
if u >= o then
error("das erste Argument muss kleiner als das zweite sein");
end_if;
if n <= 0 then
error("das dritte Argument muss eine natürliche Zahl sein");
end_if;
Zufall:= random(u..o);
Zufallszahlen:= {Zufall() $ i = 1..n};
Zaehler:= 0;
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
print(Unquoted, "Die Zahl ".i." ist eine Primzahl");
end_if;
end_for;
return(Zaehler);
end_proc:
Primzahlen(10, 50, 20)
Die Zahl 47 ist eine Primzahl
Die Zahl 31 ist eine Primzahl
![]()
Jetzt sind wir fast fertig. Wir wollen noch zusätzlich eine einleitende Ausgabe
einfügen, die die Berechnung der Prozedur dokumentiert, und eine Ausgabe
am Ende der Prozedur, die den Rückgabewert dokumentiert. Eine Möglichkeit
dies zu tun, ist die folgende:
Nachdem die Parameter auf Korrektheit überprüft sind, geben wir aus:
======================================================
Es werden n Zufallszahlen von u bis o erzeugt.
Jede Zufallszahl, die eine Primzahl ist, wir ausgegeben.
Am Ende der Prozedur wird die Anzahl dieser Primzahlen ausgegeben.
======================================================
Dabei wollen wir in der ersten der drei Zeilen erreichen, dass für u, o und
n die tatsächlichen, aktuellen Parameterwerte erscheinen.
Am Ende der Prozedur, direkt vor der return-Anweisung, geben wir aus:
======================================
Insgesamt wurden Zaehler Primzahlen gefunden.
======================================
Auch hier sollte anstelle des Wortes Zaehler die entsprechende Anzahl
der gefundenen Primzahlen ausgegeben werden. Haben wir all diese Ausgaben
in die Prozedur eingefügt, so können wir uns die Rückgabe return( Zaehler )
sparen, denn wir haben das Ergebnis ja bereits in der obigen Ausgabezeile
bekanntgegeben. Daher ersetzen wir return( Zaehler ) durch return( ).
Primzahlen:= proc(u, o, n)
local Zufallszahlen, Zufall, i, Zaehler;
begin
if u >= o then
error("das erste Argument muss kleiner als das zweite sein");
end_if;
if n <= 0 then
error("das dritte Argument muss eine natürliche Zahl sein");
end_if;
print(Unquoted,"==================================================================");
print(Unquoted,"Es werden ".n." Zufallszahlen von ".u." bis ".o." erzeugt.");
print(Unquoted,"Jede Zufallszahl, die eine Primzahl ist, wir ausgegeben.");
print(Unquoted,"Am Ende der Prozedur wird die Anzahl dieser Primzahlen ausgegeben.");
print(Unquoted,"==================================================================");
Zufall:= random(u..o);
Zufallszahlen:= {Zufall() $ i = 1..n};
Zaehler:= 0;
for i in Zufallszahlen do
if isprime(i) = TRUE then
Zaehler:= Zaehler + 1;
print(Unquoted, "Die Zahl ".i." ist eine Primzahl");
end_if;
end_for;
print(Unquoted, "=================================================");
print(Unquoted, "Insgesamt wurden ".Zaehler." Primzahlen gefunden.");
print(Unquoted, "=================================================");
return();
end_proc:
Primzahlen(10, 50, 20)
==================================================================
Es werden 20 Zufallszahlen von 10 bis 50 erzeugt.
Jede Zufallszahl, die eine Primzahl ist, wir ausgegeben.
Am Ende der Prozedur wird die Anzahl dieser Primzahlen ausgegeben.
==================================================================
Die Zahl 47 ist eine Primzahl
Die Zahl 31 ist eine Primzahl
Die Zahl 11 ist eine Primzahl
=================================================
Insgesamt wurden 3 Primzahlen gefunden.
=================================================
Natürlich sind so viele Ausgaben innerhalb einer Prozedur nicht unbedingt
sinnvoll - hier ging es in erster Linie darum, den Umgang mit print in seinen
verschiedenen Varianten kennenzulernen.
_______________________________________________________________________________
Anmerkungen:
1. Weitere Anregungen finden Sie in der Buchreihe Mathematik 1 x anders. In dieser Reihe
wird eine Vielzahl unterschiedlichster mathematischer Probleme mit MuPAD gelöst. Die
Bücher können unter www.schule.mupad.de/literatur kostenfrei kopiert werden.
_______________________________________________________________________________