\mnb150ÿ{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fprq2 System;}{\f3\fmodern\fprq1 Courier New;}{\f4\fswiss\fprq2 Arial;}{\f5\fswiss\fprq2 Helvetica;}}
{\colortbl\red0\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green0\blue0;\red128\green128\blue128;}
\deflang1031\pard\ri4\plain\f3\fs20\cf0\b ________________________________________________________________________________
\par
\par \plain\f3\fs20\cf0 Inhalt....: print-Ausgaben innerhalb von Prozeduren
\par Kategorie.: Handwerkskasten
\par Mathematik: Programmierung
\par MuPAD.....: 3.0.0
\par Datum.....: 2002-08-14
\par Autoren...: Kai Gehrs
\par Funktionen: print, Unquoted, ., proc, for, if, error, isprime
\par \plain\f3\fs20\cf0\b ________________________________________________________________________________
\par \plain\f4\fs36\cf0\b
\par \plain\f4\fs40\cf0\b Elementare MuPAD-Funktionen:
\par print-Ausgaben innerhalb von Prozeduren \plain\f4\fs24\cf1
\par
\par Wir wollen lernen, wie man in eigenen MuPAD Prozeduren die Funktion 'print' nutzen kann,
\par um w\'e4hrend einer Prozedur Ausgaben zu produzieren.
\par \plain\f4\fs28\cf0
\par \plain\f4\fs28 Wir betrachten die Prozedur \plain\f4\fs28\cf3 Primzahlen\plain\f4\fs28 aus dem Notebook
\par
\par "\plain\f4\fs28\cf4 Einfache_Prozeduren\plain\f4\fs28 "
\par
\par des Handwerkastens.
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen:= proc(u, o, n)
\par \pard\li600\ri1\fi-300\plain\f3\fs28\cf3 local Zufallszahlen, Zufall, i, Zaehler;
\par begin
\par if u >= o then
\par error("das erste Argument muss kleiner als das zweite sein");
\par end_if;
\par if n <= 0 then
\par error("das dritte Argument muss eine nat\'fcrliche Zahl sein");
\par end_if;
\par Zufall:= random(u..o);
\par Zufallszahlen:= \{Zufall() $ i = 1..n\};
\par Zaehler:= 0;
\par for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par end_if;
\par end_for;
\par return(Zaehler);
\par end_proc:
\par \pard\ri4\plain\f4\fs28
\par Zur Erinnerung: Ein Aufruf der Prozedur \plain\f4\fs28\cf3 Primzahlen( \plain\f4\fs28\cf1 u, o, n\plain\f4\fs28\cf3 )\plain\f4\fs28 bewirkt, dass
\par genau \plain\f4\fs28\cf1 n\plain\f4\fs28 Zufallszahlen aus dem Bereich von \plain\f4\fs28\cf1 u\plain\f4\fs28 bis \plain\f4\fs28\cf1 o\plain\f4\fs28 erzeugt werden und
\par die Anzahl der Primzahlen innerhalb dieser Menge von Zufallszahlen
\par bestimmt wird. Dabei sollte \plain\f4\fs28\cf1 n\plain\f4\fs28 stets eine ganze Zahl gr\'f6\'dfer als Null und
\par \plain\f4\fs28\cf1 u\plain\f4\fs28 und \plain\f4\fs28\cf1 o\plain\f4\fs28 sollten positive ganze Zahlen mit \plain\f4\fs28\cf1 u\plain\f4\fs28 echt kleiner \plain\f4\fs28\cf1 o\plain\f4\fs28 sein.
\par
\par Wir wollen die Prozedur jetzt in sofern erweitern, dass jedesmal dann,
\par wenn eine Primzahl innerhalb der Menge der Zufallszahlen gefunden
\par wird, diese Primzahl auch ausgegeben wird. Dazu verwenden wir
\par die MuPAD Funktion \plain\f4\fs28\cf3 print\plain\f4\fs28 .
\par
\par Wir erinnern uns zun\'e4chst, dass der Programmteil
\par
\par \plain\f3\fs28\cf3 for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par end_if;
\par end_for;
\par \plain\f4\fs28
\par daf\'fcr zust\'e4ndig ist, alle Zufallszahlen zu durchlaufen und zu testen, ob die
\par jeweils gerade betrachtete Zahl\plain\f4\fs28\cf3 i \plain\f4\fs28 eine Primzahl ist. Ist dies der Fall, so wird
\par die Zeile
\par
\par \plain\f3\fs28\cf3 Zaehler:= Zaehler + 1;
\par \plain\f4\fs28
\par ausgef\'fchrt. Wollen wir also jede gefundene Primzahl ausgeben, so sollte
\par an dieser Stelle die Zahl\plain\f4\fs28\cf3 i \plain\f4\fs28 ausgegeben werden. Die einfachste Variante
\par ist es, die Befehlszeile \plain\f4\fs28\cf3 print( i );\plain\f4\fs28\cf0 in die if-Anweisung einzuf\'fcgen. Diese
\par Befehlszeile bewirkt, dass jedesmal, wenn in dem Programm der innere
\par Teil der if-Anweisung ausgef\'fchrt wird, die Zahl\plain\f4\fs28\cf3 i \plain\f4\fs28\cf0 ausgegeben wird.
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen:= proc(u, o, n)
\par \pard\li600\ri1\fi-300\plain\f3\fs28\cf3 local Zufallszahlen, Zufall, i, Zaehler;
\par begin
\par if u >= o then
\par error("das erste Argument muss kleiner als das zweite sein");
\par end_if;
\par if n <= 0 then
\par error("das dritte Argument muss eine nat\'fcrliche Zahl sein");
\par end_if;
\par Zufall:= random(u..o);
\par Zufallszahlen:= \{Zufall() $ i = 1..n\};
\par Zaehler:= 0;
\par for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par print(i);
\par end_if;
\par end_for;
\par return(Zaehler);
\par end_proc:
\par \pard\ri4\plain\f4\fs28
\par Wir testen die neue Version der Prozedur an einem Beispiel:
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen(10, 50, 20)
\par \pard\ri4\plain\f4\fs28
\par Die Ausgabe ist wie folgt zu lesen: Die ersten 5 Zahlen sind genau die
\par Primzahlen, die in der Menge von Zufallszahlen enthalten waren (man
\par beachte, dass bei mehrfacher Ausf\'fchrung der letzten obigen Befehlszeile
\par wegen der Zufallsbasiertheit der Prozedur durchaus andere Primzahlen
\par auftreten k\'f6nnen - auch die Anzahl der gefundenen Primzahlen wird u.U.
\par variieren).
\par Die letzte ausgegebene Zahl, d.h. die Zahl 5, ist die (urspr\'fcngliche) Ausgabe
\par der Prozedur \plain\f4\fs28\cf3 Primzahlen\plain\f4\fs28 , d.h. die Anzahl der in der Menge von Zufallszahlen
\par gefundenen Primzahlen.
\par
\par Nat\'fcrlich ist diese Ausgabeform nicht sehr gl\'fccklich, denn ein Benutzer
\par der Prozedur \plain\f4\fs28\cf3 Primzahlen \plain\f4\fs28 bekommt keinerlei Informationen \'fcber die
\par ausgegebenen Zahlen - er m\'fcsste raten, was die Prozedur tats\'e4chlich
\par tut. Daher wollen wir die Ausgaben st\'e4rker kommentieren.
\par
\par Beispielsweise k\'f6nnten wir, anstatt einfach nur die jeweilige Primzahl
\par auszugeben, einen Kommentar anf\'fcgen, dass es sich bei der ausgegebenen
\par Zahl um eine Primzahl handelt. Dieses k\'f6nnen wir folgenderma\'dfen erreichen:
\par
\par Wir ersetzen die Ausgabezeile durch \plain\f4\fs28\cf3 print( "Die Zahl ", i ," ist eine Primzahl")\plain\f4\fs28 .
\par Mit diesem Befehl wird MuPAD zun\'e4chst die Zeichenkette "Die Zahl ", dann
\par die Zahl\plain\f4\fs28\cf3 i \plain\f4\fs28 und unmittelbar danach die Zeichenkette \plain\f4\fs28\cf3 " ist eine Primzahl"\plain\f4\fs28
\par ausgegeben. Dabei ist das Leerzeichen nach dem Wort \plain\f4\fs28\cf3 Zahl\plain\f4\fs28 und vor dem
\par Wort \plain\f4\fs28\cf3 ist\plain\f4\fs28 wichtig, denn sonst entsteht auch in der Ausgabe kein Leerzeichen.
\par
\par Wir modifizieren die obige Prozedur und testen Sie erneut an einem Beispiel:
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen:= proc(u, o, n)
\par \pard\li600\ri1\fi-300\plain\f3\fs28\cf3 local Zufallszahlen, Zufall, i, Zaehler;
\par begin
\par if u >= o then
\par error("das erste Argument muss kleiner als das zweite sein");
\par end_if;
\par if n <= 0 then
\par error("das dritte Argument muss eine nat\'fcrliche Zahl sein");
\par end_if;
\par Zufall:= random(u..o);
\par Zufallszahlen:= \{Zufall() $ i = 1..n\};
\par Zaehler:= 0;
\par for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par print("Die Zahl ",i," ist eine Primzahl");
\par end_if;
\par end_for;
\par return(Zaehler);
\par end_proc:
\par \pard\ri4\plain\f4\fs28
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen(10, 50, 20)
\par \pard\ri4\plain\f4\fs28
\par Sind wir ganz genau, so m\'f6chten wir nat\'fcrlich eigentlich kein Komma
\par zwischen der jeweiligen Primzahl und den Zeichenketten sehen.
\par
\par Dies k\'f6nnen wir realisieren, indem wir das Komma in der print-Anweisung
\par durch einen Punkt \plain\f4\fs28\cf3 .\plain\f4\fs28 ersetzen. Ein Punkt \plain\f4\fs28\cf3 . \plain\f4\fs28 innerhalb einer print-Aweisung, der
\par nicht in Anf\'fchrungszeichen steht, dient der Verbindung von Zeichenketten,
\par d.h. durch \plain\f4\fs28\cf3 print( "Die Zahl ".i." ist eine Primzahl");\plain\f4\fs28 erhalten wir Ausgaben
\par der Form
\par
\par \plain\f4\fs28\cf2 "Die Zahl i ist eine Primzahl"\plain\f4\fs28
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen:= proc(u, o, n)
\par \pard\li600\ri1\fi-300\plain\f3\fs28\cf3 local Zufallszahlen, Zufall, i, Zaehler;
\par begin
\par if u >= o then
\par error("das erste Argument muss kleiner als das zweite sein");
\par end_if;
\par if n <= 0 then
\par error("das dritte Argument muss eine nat\'fcrliche Zahl sein");
\par end_if;
\par Zufall:= random(u..o);
\par Zufallszahlen:= \{Zufall() $ i = 1..n\};
\par Zaehler:= 0;
\par for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par print("Die Zahl ".i." ist eine Primzahl");
\par end_if;
\par end_for;
\par return(Zaehler);
\par end_proc:
\par \pard\ri4\plain\f4\fs28
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen(10, 50, 20)
\par \pard\ri4\plain\f4\fs28
\par Ein weiterer kleiner Sch\'f6nheitsfehler ist die Tatsache, dass die Ausgabe in
\par Anf\'fchrungszeichen angegeben werden. Dies k\'f6nnen wir mit der
\par Zusatzoption \plain\f4\fs28\cf3 Unquoted \plain\f4\fs28 abstellen. Dabei muss man \plain\f4\fs28\cf3 Unquoted\plain\f4\fs28 immer als
\par erstes in der entsprechenden print-Anweisung anf\'fchren und dann, mit
\par einem Komma getrennt, die gew\'fcnschte Ausgabe angeben. Wir modifizieren
\par also unsere Ausgabezeile nochmals:
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen:= proc(u, o, n)
\par \pard\li600\ri1\fi-300\plain\f3\fs28\cf3 local Zufallszahlen, Zufall, i, Zaehler;
\par begin
\par if u >= o then
\par error("das erste Argument muss kleiner als das zweite sein");
\par end_if;
\par if n <= 0 then
\par error("das dritte Argument muss eine nat\'fcrliche Zahl sein");
\par end_if;
\par Zufall:= random(u..o);
\par Zufallszahlen:= \{Zufall() $ i = 1..n\};
\par Zaehler:= 0;
\par for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par print(Unquoted, "Die Zahl ".i." ist eine Primzahl");
\par end_if;
\par end_for;
\par return(Zaehler);
\par end_proc:
\par \pard\ri4\plain\f4\fs28
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen(10, 50, 20)
\par \pard\ri4\plain\f4\fs28
\par Jetzt sind wir fast fertig. Wir wollen noch zus\'e4tzlich eine einleitende Ausgabe
\par einf\'fcgen, die die Berechnung der Prozedur dokumentiert, und eine Ausgabe
\par am Ende der Prozedur, die den R\'fcckgabewert dokumentiert. Eine M\'f6glichkeit
\par dies zu tun, ist die folgende:
\par
\par Nachdem die Parameter auf Korrektheit \'fcberpr\'fcft sind, geben wir aus:
\par
\par \plain\f4\fs28\cf2 \tab ======================================================
\par \tab Es werden \plain\f4\fs28\cf1 n\plain\f4\fs28\cf2 Zufallszahlen von \plain\f4\fs28\cf1 u \plain\f4\fs28\cf2 bis \plain\f4\fs28\cf1 o\plain\f4\fs28\cf2 erzeugt.
\par \tab Jede Zufallszahl, die eine Primzahl ist, wir ausgegeben.
\par \tab Am Ende der Prozedur wird die Anzahl dieser Primzahlen ausgegeben.
\par \tab ======================================================
\par \plain\f4\fs28
\par Dabei wollen wir in der ersten der drei Zeilen erreichen, dass f\'fcr \plain\f4\fs28\cf1 u\plain\f4\fs28 , \plain\f4\fs28\cf1 o\plain\f4\fs28 und
\par \plain\f4\fs28\cf1 n\plain\f4\fs28 die tats\'e4chlichen, aktuellen Parameterwerte erscheinen.
\par
\par Am Ende der Prozedur, direkt vor der return-Anweisung, geben wir aus:
\par
\par \plain\f4\fs28\cf2 \tab \tab ======================================
\par \tab \tab Insgesamt wurden \plain\f4\fs28\cf1 Zaehler\plain\f4\fs28\cf2 Primzahlen gefunden.
\par \tab \tab ======================================
\par \plain\f4\fs28
\par Auch hier sollte anstelle des Wortes \plain\f4\fs28\cf1 Zaehler\plain\f4\fs28 die entsprechende Anzahl
\par der gefundenen Primzahlen ausgegeben werden. Haben wir all diese Ausgaben
\par in die Prozedur eingef\'fcgt, so k\'f6nnen wir uns die R\'fcckgabe \plain\f4\fs28\cf3 return( Zaehler )\plain\f4\fs28
\par sparen, denn wir haben das Ergebnis ja bereits in der obigen Ausgabezeile
\par bekanntgegeben. Daher ersetzen wir \plain\f4\fs28\cf3 return( Zaehler )\plain\f4\fs28 durch \plain\f4\fs28\cf3 return( )\plain\f4\fs28 .
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen:= proc(u, o, n)
\par \pard\li600\ri1\fi-300\plain\f3\fs28\cf3 local Zufallszahlen, Zufall, i, Zaehler;
\par begin
\par if u >= o then
\par error("das erste Argument muss kleiner als das zweite sein");
\par end_if;
\par if n <= 0 then
\par error("das dritte Argument muss eine nat\'fcrliche Zahl sein");
\par end_if;
\par print(Unquoted,"==================================================================");
\par print(Unquoted,"Es werden ".n." Zufallszahlen von ".u." bis ".o." erzeugt.");
\par print(Unquoted,"Jede Zufallszahl, die eine Primzahl ist, wir ausgegeben.");
\par print(Unquoted,"Am Ende der Prozedur wird die Anzahl dieser Primzahlen ausgegeben.");
\par print(Unquoted,"==================================================================");
\par Zufall:= random(u..o);
\par Zufallszahlen:= \{Zufall() $ i = 1..n\};
\par Zaehler:= 0;
\par for i in Zufallszahlen do
\par if isprime(i) = TRUE then
\par Zaehler:= Zaehler + 1;
\par print(Unquoted, "Die Zahl ".i." ist eine Primzahl");
\par end_if;
\par end_for;
\par print(Unquoted, "=================================================");
\par print(Unquoted, "Insgesamt wurden ".Zaehler." Primzahlen gefunden.");
\par print(Unquoted, "=================================================");
\par return();
\par end_proc:
\par \pard\ri4\plain\f4\fs28
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f3\fs28\cf3 {\pntext\f1\'b7\tab}Primzahlen(10, 50, 20)
\par \pard\ri4\plain\f4\fs28
\par Nat\'fcrlich sind so viele Ausgaben innerhalb einer Prozedur nicht unbedingt
\par sinnvoll - hier ging es in erster Linie darum, den Umgang mit \plain\f4\fs28\cf3 print\plain\f4\fs28 in seinen
\par verschiedenen Varianten kennenzulernen.
\par
\par
\par \plain\f3\fs20\cf0\b _______________________________________________________________________________
\par \plain\f4\fs22\cf0
\par \plain\f4\fs22\cf1\b Anmerkungen:\plain\f4\fs22\cf1
\par \plain\f4\fs20\cf1\b 1\plain\f4\fs20\cf1 . Weitere Anregungen finden Sie in der Buchreihe \plain\f4\fs20\cf3 Mathematik 1 x anders\plain\f4\fs20\cf1 . In dieser Reihe
\par wird eine Vielzahl unterschiedlichster mathematischer Probleme mit MuPAD gel\'f6st. Die
\par B\'fccher k\'f6nnen unter \plain\f5\fs20\cf2 www.schule.mupad.de/literatur\plain\f4\fs20\cf1 kostenfrei kopiert werden.
\par \plain\f4\fs20\cf2
\par \plain\f3\fs20\cf0\b _______________________________________________________________________________
\par
\par
\par }