\mnb150ÿ{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fprq2 System;}{\f3\fswiss\fprq2 Arial;}{\f4\fswiss\fprq2 Helvetica;}{\f5\fmodern\fprq1 Courier New;}}
{\colortbl\red0\green0\blue0;\red0\green0\blue255;\red0\green128\blue0;\red255\green0\blue0;\red128\green128\blue128;}
\deflang1031\pard\ri4\plain\f5\fs20\cf0\b ________________________________________________________________________________
\par
\par \plain\f5\fs20\cf0 Inhalt....: Einfache Prozeduren
\par Kategorie.: Handwerkskasten
\par Mathematik: Programmierung
\par MuPAD.....: 3.0.0
\par Datum.....: 2002-08-14
\par Autoren...: Kai Gehrs
\par Funktionen: if, then, proc, mod
\par \plain\f5\fs20\cf0\b ________________________________________________________________________________
\par \plain\f3\fs36\cf0\b
\par \plain\f3\fs40\cf0\b Elementare MuPAD-Funktionen:
\par Einfache Prozeduren in MuPAD\plain\f3\fs24\cf2
\par
\par Wir wollen lernen, wie man in MuPAD einfache eigene Prozeduren definieren kann.
\par \plain\f3\fs28\cf0
\par \plain\f3\fs28 In den \plain\f3\fs28\cf4 Notebooks zur if-Anweisung und zu for-Schleifen im Handwerkskasten\plain\f3\fs28
\par haben wir gelernt, wie man mit \plain\f3\fs28\cf3 if \plain\f3\fs28 Bedinungen abfragt und wie man Schleifen
\par z.B. zur Summation verwenden kann. Hier wollen wir diese einzelnen
\par Programmkonstrukte zu einer richtigen kleinen Prozedur zusammensetzen.
\par
\par Aufgabe soll es sein, eine Prozedur zu schreiben, die bei Eingabe zweier
\par Werte \plain\f3\fs28\cf2 u\plain\f3\fs28 und und \plain\f3\fs28\cf2 o\plain\f3\fs28 einerseits die Summe aller ungeraden Zahlen im Bereich
\par von \plain\f3\fs28\cf2 u\plain\f3\fs28 bis \plain\f3\fs28\cf2 o \plain\f3\fs28 und andererseits die Summe alle geraden Zahlen im Bereich von \plain\f3\fs28\cf2 u\plain\f3\fs28
\par bis \plain\f3\fs28\cf2 o\plain\f3\fs28 ausgibt.
\par
\par Als erstes m\'fcssen wir uns einen Namen f\'fcr unsere Prozedur ausdenken:
\par Wir nennen sie schlicht \plain\f3\fs28\cf3 Summen\plain\f3\fs28 .
\par
\par Die Prozedur \plain\f3\fs28\cf3 Summen\plain\f3\fs28 muss die beiden Werte \plain\f3\fs28\cf2 u\plain\f3\fs28 und \plain\f3\fs28\cf2 o\plain\f3\fs28 , die den betrachteten
\par Zahlbereich eingrenzen, als \plain\f3\fs28\cf2 Argumente \plain\f3\fs28 erhalten.
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 begin
\par return();
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par Dies ist das Grundger\'fcst f\'fcr unsere Prozedur. Wir leiten die Prozedur mit dem
\par Befehl \plain\f3\fs28\cf3 proc(u, o)\plain\f3\fs28 ein. Damit teilen wir MuPAD mit, dass wir eine Prozedur
\par definieren, die zwei Argumente \plain\f3\fs28\cf2 u \plain\f3\fs28 und \plain\f3\fs28\cf2 o\plain\f3\fs28 \'fcbergeben bekommt, mit denen sie
\par dann Berechnungen jeglicher Art ausf\'fchren kann. Bevor wir aber mit
\par irgendwelchen Berechnungen beginnen k\'f6nnen, m\'fcssen wir den Befehl
\par \plain\f3\fs28\cf3 begin \plain\f3\fs28 in den K\'f6rper der Prozedur hineinschreiben. Nach dem Befehl \plain\f3\fs28\cf3 begin \plain\f3\fs28
\par k\'f6nnen wir dann mit unserem eigentlichen Programm starten.
\par
\par Bisher steht nach dem Befehl \plain\f3\fs28\cf3 begin \plain\f3\fs28 nur der Befehl \plain\f3\fs28\cf3 return( )\plain\f3\fs28 . Dieser Befehl
\par dient dazu, das, was unsere Prozedur als Ergebnis berechnet hat,
\par zur\'fcckzugeben (etwa so, als wenn man nach einer l\'e4ngeren Rechnung auf
\par einem Blatt Papier das Ergebnis zwecks Hervorhebung unterstreicht).
\par
\par Bis jetzt lassen wir innerhalb der Prozedur, also nach dem Befehl \plain\f3\fs28\cf3 begin\plain\f3\fs28 ,
\par noch keine Berechnungen durchf\'fchren. Daher haben wir auch noch kein
\par Ergebnis, das wir mit Hilfe von \plain\f3\fs28\cf3 return\plain\f3\fs28 zur\'fcckgeben lassen k\'f6nnten.
\par Aus diesem Grund haben wir \plain\f3\fs28\cf3 return( )\plain\f3\fs28 geschrieben. Das tats\'e4chliche
\par Ergebnis oder die Ergebnisse, die am Ende zur\'fcckgegeben werden
\par sollen, schreiben wir dann einfach in die Klammern hinein.
\par
\par Wie muss nun der Teil der Prozedur aussehen, der die entsprechenden
\par Summen der geraden bzw. ungeraden Zahlen in der Menge \{u, . . . ,o\}
\par berechnet?
\par
\par Zun\'e4chst ben\'f6tigen wir eine for-Schleife, deren Laufvariable (wir nennen
\par sie wieder \plain\f3\fs28\cf3 i\plain\f3\fs28 ) alle Werte von \plain\f3\fs28\cf2 u\plain\f3\fs28 bis \plain\f3\fs28\cf2 o\plain\f3\fs28 durchl\'e4uft.
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 begin
\par for i from u to o do
\par
\par end_for;
\par return();
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par Soweit so gut! Die Laufvariable\plain\f3\fs28\cf3 i \plain\f3\fs28 der Schleife ist nun eine sogenannte
\par "lokale Variable" der Prozedur. Stellen wir uns vor, wir h\'e4tten der Variablen
\par \plain\f3\fs28\cf3 i\plain\f3\fs28 in einer vorherigen Berechnung den Wert 7 zugewiesen. Dann m\'f6chten
\par wir doch trotzdem, dass\plain\f3\fs28\cf3 i \plain\f3\fs28 innerhalb unserer Prozedur keinen Wert besitzt,
\par sondern, wie beabsichtigt, als Variable frei von Werten den Zahlbereich
\par von \plain\f3\fs28\cf2 u\plain\f3\fs28 bis \plain\f3\fs28\cf2 o\plain\f3\fs28 durchl\'e4uft. Das es sich bei\plain\f3\fs28\cf3 i \plain\f3\fs28 um eine lokale Variable der
\par Prozedur \plain\f3\fs28\cf3 Summen \plain\f3\fs28 handeln soll, teilen wir MuPAD wie folgt mit:
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 local i;
\par begin
\par for i from u to o do
\par
\par end_for;
\par return();
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par An derjenigen Stelle, an die wir die Variable\plain\f3\fs28\cf3 i \plain\f3\fs28 geschrieben haben, k\'f6nnen
\par wir auch alle weiteren lokalen Variablen, die wir im Laufe unserer Prozedur
\par noch ben\'f6tigen, nacheinander einf\'fcgen.
\par
\par Als n\'e4chstes ben\'f6tigen wir zwei lokale Variablen \plain\f3\fs28\cf3 Summe1\plain\f3\fs28 und \plain\f3\fs28\cf3 Summe2\plain\f3\fs28 f\'fcr
\par die Summe aller geraden Zahlen und die Summe aller ungeraden Zahlen.
\par Diese Variablen m\'fcssen wir (wie schon im Notebook zu for-Schleifen) am
\par Anfang, d.h. vor der for-Schleife, auf den Wert 0 setzen
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 local i, Summe1, Summe2;
\par begin
\par Summe1:= 0;
\par Summe2:= 0;
\par for i from u to o do
\par
\par end_for;
\par return();
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par
\par Jetzt m\'fcssen wir die for-Schleife mit Leben f\'fcllen. Zur Erinnerung: Wir
\par wollen die Summe aller geraden und aller ungeraden Zahlen von \plain\f3\fs28\cf2 u \plain\f3\fs28 bis \plain\f3\fs28\cf2 o\plain\f3\fs28
\par berechnen. Daher m\'fcssen wir bei jedem Durchlauf der Schleife zun\'e4chst
\par testen, ob\plain\f3\fs28\cf3 i \plain\f3\fs28 zum aktuellen Zeitpunkt den Wert einer geraden oder einer
\par ungeraden Zahl besitzt. Abfragen erledigen wir mit if-Anweisungen. Wie
\par schon im Notebook zu if-Anweisungen rechnen wir \plain\f3\fs28\cf3 i mod 2\plain\f3\fs28 . Ist das
\par Ergebnis 0, so ist\plain\f3\fs28\cf3 i \plain\f3\fs28 eine gerade Zahl, ist es 1, so ist\plain\f3\fs28\cf3 i \plain\f3\fs28 eine ungerade Zahl.
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 local i, Summe1, Summe2;
\par begin
\par Summe1:= 0;
\par Summe2:= 0;
\par for i from u to o do
\par if i mod 2 = 0 then
\par
\par else
\par
\par end_if;
\par end_for;
\par return();
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par Jetzt m\'fcssen wir die L\'fccken in der if-Anweisung nur noch mit den
\par entsprechenden Summationsvorschriften f\'fcllen.
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 local i, Summe1, Summe2;
\par begin
\par Summe1:= 0;
\par Summe2:= 0;
\par for i from u to o do
\par if i mod 2 = 0 then
\par Summe1:= Summe1 + i;
\par else
\par Summe2:= Summe2 + i;
\par end_if;
\par end_for;
\par return();
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par Wir haben fast alles geschafft. Das einzige, was noch fehlt, ist die
\par R\'fcckgabe der beiden Ergebnisse. Dazu schreiben wir die Variablen
\par \plain\f3\fs28\cf3 Summe1\plain\f3\fs28 und \plain\f3\fs28\cf3 Summe2\plain\f3\fs28 einfach durch ein Komma getrennt in die bisher
\par leeren Klammern nach dem Befehl \plain\f3\fs28\cf3 return\plain\f3\fs28 .
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen:= proc(u, o)
\par \pard\li600\ri1\fi-300\plain\f5\fs28\cf3 local i, Summe1, Summe2;
\par begin
\par Summe1:= 0;
\par Summe2:= 0;
\par for i from u to o do
\par if i mod 2 = 0 then
\par Summe1:= Summe1 + i;
\par else
\par Summe2:= Summe2 + i;
\par end_if;
\par end_for;
\par return(Summe1, Summe2);
\par end_proc:
\par \pard\ri4\plain\f3\fs28
\par Fertig! Jetzt k\'f6nnen wir unsere Prozedur an einigen Beispielen
\par erproben:
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen(23, 567)
\par \pard\ri4\plain\f3\fs28
\par d.h. die Summe aller geraden Zahl von 23 bis 567 ist 80240, die Summe
\par aller ungeraden Zahlen aus diesem Bereich ist 80535.
\par
\par Auf die Einzelergebnisse k\'f6nnen wir entweder mit dem Indexoperator \plain\f3\fs28\cf3 [ ]\plain\f3\fs28
\par zugreifen oder mit Hilfe des Befehls \plain\f3\fs28\cf3 op\plain\f3\fs28 .
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Ergebnis:= Summen(23, 567):
\par {\pntext\f1\'b7\tab}Ergebnis[1], Ergebnis[2]
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}op(Ergebnis, 1), op(Ergebnis, 2)
\par \pard\ri4\plain\f3\fs28
\par Nat\'fcrlich k\'f6nnen wir auch mit viel gr\'f6\'dferen Werten experimentieren:
\par
\par \pard\li300\ri5\fi-300{\*\pn\pnlvlblt\pnf1\pnindent300{\pntxtb\'b7}}\plain\f5\fs28\cf3 {\pntext\f1\'b7\tab}Summen(211, 379143)
\par \pard\ri4\plain\f3\fs28
\par Diese Rechnung bedarf schon einiger Zeit.
\par
\par Viele Beispiele zu weiteren Prozeduren finden sich auch in der
\par Materialsammlung unter
\par
\par \tab \tab \plain\f3\fs28\cf1\ul www.schule.mupad.de/material
\par \plain\f3\fs28
\par Dort bietet sich die M\'f6glichkeit einer Volltextsuche innerhalb aller
\par zum Download bereitstehenden MuPAD Notebooks. Sucht man an
\par dieser Stelle nach dem Begriff \plain\f3\fs28\cf3 proc\plain\f3\fs28 , so taucht eine Vielzahl von
\par Notebooks auf, in denen eigene Prozeduren vorgestellt und/oder
\par benutzt werden. Beachten Sie bitte auch das Notebook
\par
\par \plain\f3\fs28\cf4 Einfache_Prozeduren_mit_Fehlerabfragen\plain\f3\fs28
\par
\par im Handwerkskasten.
\par
\par \plain\f5\fs20\cf0\b _______________________________________________________________________________
\par \plain\f3\fs22\cf0
\par \plain\f3\fs22\cf2\b Anmerkungen:\plain\f3\fs22\cf2
\par \plain\f3\fs20\cf2\b 1\plain\f3\fs20\cf2 . Weitere Anregungen finden Sie in der Buchreihe \plain\f3\fs20\cf3 Mathematik 1 x anders\plain\f3\fs20\cf2 . In dieser Reihe
\par wird eine Vielzahl unterschiedlichster mathematischer Probleme mit MuPAD gel\'f6st. Die
\par B\'fccher k\'f6nnen unter \plain\f4\fs20\cf1 www.schule.mupad.de/literatur\plain\f3\fs20\cf2 kostenfrei kopiert werden.
\par \plain\f3\fs20\cf1
\par \plain\f5\fs20\cf0\b _______________________________________________________________________________
\par
\par
\par }