MuPAD Education Group: Kostenlose Materialen für MuPAD Pro:
www.sciface.com/education, schule.mupad.de, studium.mupad.de, mupad.zum.de.

________________________________________________________________________________

 

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

math

 

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"

math

 

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"

math

 

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

math

 

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. 

 

_______________________________________________________________________________

 

 

 

MuPAD Education Group: Kostenlose Materialen für MuPAD Pro:
www.sciface.com/education, schule.mupad.de, studium.mupad.de, mupad.zum.de.