{VERSION 4 0 "IBM INTEL NT" "4.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "Befehlstext" -1 256 "Courier" 1 12 255 0 0 1 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 257 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 258 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 259 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 260 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 261 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 262 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "" -1 263 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 264 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 265 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 266 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 267 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "" -1 268 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 269 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 270 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 271 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 272 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 } {CSTYLE "" -1 273 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 274 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 275 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{CSTYLE "" -1 276 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }{PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Heading 1" 0 3 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 1 }1 0 0 0 8 4 0 0 0 0 0 0 -1 0 }{PSTYLE "Title" 0 18 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 1 0 0 0 0 0 0 1 }3 0 0 -1 12 12 0 0 0 0 0 0 19 0 }{PSTYLE "A uthor" 0 19 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 }3 0 0 -1 8 8 0 0 0 0 0 0 -1 0 }{PSTYLE "Korrektur" 0 256 1 {CSTYLE "" -1 -1 "Helvetica" 1 12 255 0 255 1 2 1 2 0 0 2 1 0 0 1 }1 0 0 -1 -1 -1 0 0 0 0 0 0 256 1 }} {SECT 0 {EXCHG {PARA 18 "" 0 "" {TEXT -1 23 "Programmierung in Maple" }}{PARA 19 "" 0 "" {TEXT -1 20 "G.Bitsch, 08.02.2000" }}{PARA 0 "" 0 " " {TEXT -1 0 "" }}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 14 "Vorbemerkungen " }}{PARA 0 "" 0 "" {TEXT -1 178 "Maple ist nicht nur ein Computeralge bra-System, es stellt auch eine sehr leistungsf\344hige Programmierumg ebung zur Verf\374gung. Diese Umgebung ist ein in die Worksheets integ rierter " }{TEXT 258 11 "Interpreter" }{TEXT -1 322 ", der es erlaubt \+ sehr komfortabel interaktiv Programme zu entwickeln. Die verwendete Sp rache zeigt in ihren deutliche Verwandschaft zu Lisp-\344hnlichen Spra chen, verwendet aber eine Syntax, die st\344rker an die \374blichen i mperativen Sprachen wie C und Pascal erinnert. objektorientiertes Prog rammieren wird nicht unterst\374tzt." }}{PARA 0 "" 0 "" {TEXT -1 19 " Maples Sprache ist " }{TEXT 257 17 "schwach typisiert" }{TEXT -1 211 " , d.h. Datentypinformationen sind nicht an die Variablennamen gekoppel t, sondern an die mit diesen verkn\374pften Objekte. Es gibt folglich \+ auch keine Sprachkonstrukte zur Deklaration von Datentypen f\374r Vari ablen. " }}{PARA 0 "" 0 "" {TEXT -1 29 "Maple hat einen eingebauten \" " }{TEXT 259 17 "Garbage-Collector" }{TEXT -1 108 "\", d.h. das System f\374hrt selbst\344ndig Speicherplatz f\374r nicht mehr ben\366tigte \+ Objekte der Wiederverwertung zu." }}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 5 "Namen" }}{PARA 0 "" 0 "" {TEXT -1 212 "Maple verwendet Namen auf zw ei Weisen. Zum einen kann ein Name eine symbolische Variable sein, der kein Wert zugewiesen ist. Diese Form der Namen wird verwendet, um sym bolische Berechnungen durchf\374hren zu k\366nnen." }}{EXCHG {PARA 0 " > " 0 "" {MPLTEXT 1 0 21 "ft:=x->t*x^2+t^2*x-t;" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 17 "solve(ft(x)=0,x);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 180 "Man kann einen Namen aber auch an ein beliebiges Objekt \+ binden. Maple wertet dann in Formeln diese Bindung aus und ersetzt den Namen durch das Objekt, an das der Name gebunden ist:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "a:=3;b:=5*a;" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 7 "a:=7;b;" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 198 "Soweit ist alles wie gewohnt. Die Auswertung einer Variablen in e inem Ausdruck kann man aber auch unterdr\374cken, indem man den Quote- Operator verwendet. Dazu setzt man den Namen in Anf\374hrungszeichen: " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "'a';" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "c:=4 *'a';" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 4 "a;c;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "a:=9;c;" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 11 "a:='a';c;b;" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 113 "Offensichtlich ver\344ndert sich das Ergebnis der Auswertung von \+ c mit dem Wert von a, w\344hrend b unver\344ndert bleibt." }}{PARA 0 " " 0 "" {TEXT -1 124 "Der Grund f\374r dieses Verhalten liegt in den ve rschiedenene Arten, in denen b und c definiert wurden. Der Zuweisungso perator " }{TEXT 261 3 ":= " }{TEXT -1 384 "wertet den auf der linken \+ Seite stehenden Ausdruck vollst\344ndig aus und bindet das Ergebnis an den auf der rechten Seite stehenden Namen. Im Falle der Definition vo n b wird daher der Name a ersetzt durch den gegenw\344rtig zugewiesene n Wert und das Ergebnis der darauf folgenden Multiplikation wird an b \+ gebunden. Jede sp\344tere Auswertung von b liefert dann stets wieder d iesen Zahlenwert." }}{PARA 0 "" 0 "" {TEXT -1 314 "Im Falle der Defini tion von c wird die Auswertung von a durch den Quote-Operator unterbun den, die Multiplikation kann nur symbolisch ausgef\374hrt werden und c wird an den Term 4*a gebunden. Bei jeder weiteren Auswertung von c w ird jetzt aber f\374r a das zum Zeitpunkt der Auswertung an a gebunden e Objekt eingesetzt. " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "a:= d;c;" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 193 "Das ist nach der vorheri gen Erkl\344rung zu erwarten. d ist an nichts gebunden, ist also ein N ame. a ist an diesen Namen gebunden, und bei der Auswertung von c wird diese Bindung von a eingesetzt." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 7 "d:=5;c;" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 172 "Hier \+ kann man nun sehen, dass Maple beim Auswerten eines Ausdruckes anschei nend rekursiv s\344mtliche Bindungen weiterverfolgt und in den auszuwe rtenden Ausdruck einbaut. Mit " }{TEXT 260 4 "eval" }{TEXT -1 168 " ka nn man diese weitergehende Auswertung einschr\344nken, indem man ausse r dem einzugebenden Term auch noch die Rekursionstiefe angibt, bis zu \+ der ausgewertet werden soll:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 30 "eval(c,1);eval(c,2);eval(c,3);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 130 "Will man die Bindung eines Namens an ein Objekt aufheben, so k ann man den explizit nicht ausgewerteten Namen sich selbst zuweisen:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 "a:='a';d;c;" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 82 "Als Namen sind auch indizierte Terme wie \+ a[3] zul\344ssig. Wir k\366nne also definieren:" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 36 "for i from 1 to 10 do a[i]:=i^2: od:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "seq(a[i],i=1..12);" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 185 "a[11] und a[12] sind an keinen We rt gebunden, folglich wird nur der Name ausgegeben. Will man die Bindu ngen wieder r\374ckg\344ngig machen, so kann man f\374r einzelne Namen wie bisher vorgehen:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "a[ 3]:='a[3]';" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "seq(a[i],i=1 ..12);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 133 "Will man alle indizier ten Variablen a[i] zur\374cksetzen, w\374rde man dies nat\374rlich lie ber \374ber eine Schleife tun. Dies ist aber mit dem " }}{PARA 0 "" 0 "" {TEXT -1 29 "Quote-Operator nicht m\366glich:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 39 "for i from 1 to 10 do; a[i]:='a[i]':od:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "seq(a[i],i=1..12);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "eval(a[1],1);i;'a[i]';" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 267 "Offensichtlich hat der Quote-Oper ator auch die Auswertung von i unterdr\374ckt, und somit die indiziert en Namen nicht korrekt zur\374ckgesetzt. Wir ben\366tigen hier eine Au swertung, die abbricht, wenn ein Name erzeugt wurde, Indizes aber noch korrekt auswertet. Die Funktion " }{TEXT 262 5 "evaln" }{TEXT -1 22 " leistet genau dieses:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "i ;evaln(a[i]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 44 "for i from 1 to 10 do; a[i]:=evaln(a[i]):od:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 18 "seq(a[i],i=1..12);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 232 "Die Regel, dass Maple alle Namen soweit wie m\366glich auswert et trifft nicht f\374r alle Objekte zu: Die Auswertung bricht ab, wenn Maple auf einen Namen st\366sst, der an eine Funktion, eine Tabelle ( table) oder einen Array gebunden ist. " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 39 "f:=x->x^2;t1:=table([\"Anfang\",\"Ende\"]);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "f;[f,x,t1];t1;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 17 "eva l(f);eval(t1);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 117 "Diese Regel gi lt nicht, wenn die Funktion angewendet werden soll oder auf die Tafel \+ (oder den Array) zugegriffen wird" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 16 "f(3);f(y);t1[2];" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 10 "Prozeduren " }}{PARA 0 "" 0 "" {TEXT -1 232 "Maple erlaubt die Definition von Pro zeduren. Prozeduren sind first-class-Objekte, d. h. sie k\366nnen als \+ Funktionswerte und als Funktionsparameter verwendet werden. Sie k\366n nen an Namen gebunden werden, k\366nnen aber auch anonym bleiben:" }} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 56 "(proc(a,b,c) [solve(a*'x'^2+ b*'x'+c=0,'x')];end)(1,3,2);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 55 "qgl:=proc(a,b,c)\n [solve(a*'x'^2+b*'x'+c=0,'x')];\nend:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 11 "qgl(1,3,2);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 86 "Innerhalb von Funktionen lauten die Auswe rtungsregeln von Maple etwas anders. Es sind " }{TEXT 269 20 "drei Art en von Namen" }{TEXT -1 18 " zu unterscheiden:" }}{PARA 0 "" 0 "" {TEXT -1 7 "1) Die " }{TEXT 268 9 "Parameter" }{TEXT -1 48 ", die in d er Klammer hinter proc angegeben sind." }}{PARA 0 "" 0 "" {TEXT -1 282 " Diese Parameter werden beim Funktionsaufruf in der ganzen Fun ktion durch den Wert des \374bergebenen Parameters ersetzt. Die Werte \+ werden noch vor Aufruf der Funktion (in der Reihenfolge von links nach rechts) berechnet, in den Funktionen wird dieser Wert an Stelle des P arameters " }{TEXT 263 12 "substituiert" }{TEXT -1 34 " und w\344hrend des Funktionsablaufs " }{TEXT 264 22 "nie mehr neu berechnet" }{TEXT -1 138 ". Diese Technik heisst 'call by evaluated name'. Sie ist eine \+ Mischung aus den sonst \374blichen Methoden 'call by value' und 'call \+ by name'." }}{PARA 0 "" 0 "" {TEXT -1 3 "2) " }{TEXT 270 16 "Lokale Va riable." }{TEXT -1 56 "\n Sie werden am Prozeduranfang mit dem Schl \374sselwort " }{TEXT 266 5 "local" }{TEXT -1 178 " deklariert.Im Gege nsatz zu globalen Variablen werden lokale innerhalb einer Prozedur nur bis zur Rekursionstiefe 1 ausgewertet. Will man eine weitergehende Au swertung, muss man " }{TEXT 265 4 "eval" }{TEXT -1 168 " verwenden. Lo kale Variablen werden bei Aufruf der Prozedur neu angelegt und nach de m Ende der Prozedur in der Regel wieder gel\366scht. (Au\337nahmen bet rachten wir sp\344ter.)" }}{PARA 0 "" 0 "" {TEXT -1 3 "3) " }{TEXT 271 17 "Globale Variable." }{TEXT -1 56 "\n Sie werden am Prozedura nfang mit dem Schl\374sselwort " }{TEXT 267 6 "global" }{TEXT -1 322 " deklariert. Sie werden auch in Prozeduren vollst\344ndig ausgewertet \+ (mit den \374berall geltenden Ausnahmen f\374r Prozeduren , Tafeln und Arrays). Globale Variable werden auch erzeugt, wenn in einem Workshee t ein Name an ein Objekt gebunden wird. Bindungen an globale Variablen sind auch nach Ablauf der Prozedur noch vorhanden." }}{PARA 0 "" 0 " " {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 94 "Namen, die nicht deklar iert und keine Parameter sind, werden nach folgender Regel eingeordnet :" }}{PARA 0 "" 0 "" {TEXT -1 184 "Wird der Name in der Prozedur an ei n Objekt gebunden oder taucht er als Kontrollvariable einer Schleife a uf, so wird er als lokal aufgefasst. Andernfalls wird er als global be trachtet." }}{PARA 0 "" 0 "" {TEXT -1 1 " " }}{PARA 0 "" 0 "" {TEXT -1 66 "Wir beginnen das n\344chste Beispiel mit vier nicht gebundenen \+ Namen:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "glob1;x;y;z;" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 29 "Wir definieren eine Prozedur:" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 179 "bsp1:=proc(x)\n local y;\n global glob1;\n y:=x; \n print('y'=y, 'z'=z, 'x'=x);\n glob1:=2* x+z;\n print('glob1'=glob1);\n z:=5;\n### WARNING: `z` is implicitly declared local\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "bsp 1(9);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 26 "x;y;glob1;z;eval(g lob1,1);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 1239 "Wie man sieht, wird man bei der Verwendung nicht deklarierter Variablen in einer Zuweisun g gewarnt. x, y und z sind auch nach Ablauf der Prozedur nicht gebunde n, die in der Prozeur vorgenommene Bindung von glob1 ist auch nach E nde der Prozedur erhalten. Die Druckausgabe zeigt auch die Behandlung \+ von Parametern: alle Vorkommen eines Parameters im Funktionscode werde n durch das voll ausgewertete Objekt ersetzt, das an diesen Parameter \+ \374bergeben wird. Der Quote-Operator kann hier eine Auswertung von x \+ nicht unterdr\374cken, da beim Ablauf der Prozedur hier nicht mehr 'x' sondern (in unserem Fall) '9' steht.\nErstaunlich ist allerdings die \+ Ausgabe der ausgewerteten Bindung von glob1, da die Zuweisung von 5 an z erst nach der Bindung von glob1 stattgefunden hat und z global ja \+ nicht gebunden ist. Da in der Zuweisung innerhalb der Prozedur aber d ie lokale Variable z verwendet wurde, beh\344lt Maple f\374r die Auswe rtung von glob1 die lokale Bindung von z im Speicher, so dass bei eine r erneuten Auswertung von glob1 diese Bindung verwendet werden kann. S chr\344nkt man die Tiefe der Auswertung ein, so wird die Bindung von g lob1 sichtbar gemacht, ohne dass ein weiterer Auswertungsschritt stat tfindet. Man kann dies noch genauer aufzeigen:" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 18 "op(eval(glob1,1));" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 21 "op(eval(glob1,1))[2];" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "eval(op(eval(glob1,1))[2]);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 5 "z:=9;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "z;eval(op(eval(glob1,1))[2]);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 33 "Diese Art der Bindung nennt man '" }{TEXT 272 11 "lexikalisch" } {TEXT -1 235 "': die Bindungen von Namen, die in einem Ausdruck verwen det werden, werden zur Definitionszeit des Ausdrucks mit abgespeichert und h\344ngen auch bei sp\344terer Auswertung nicht von der Umgebung \+ ab, in der diese Auswertung aufgerufen wurde." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 24 "Funkti onale (Operatoren)" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{EXCHG {PARA 0 " " 0 "" {TEXT -1 172 "Funktionen, die als Funktionsergebnis wieder Funk tionen liefern nennt man Funktionale (oder Operatoren). Sie sind einfa ch zu definieren, wie die folgenden Beispiele zeigen:" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 92 "Zun\344chst einen Ersa tz f\374r den D-Operator, der f\374r den Unterricht bessere Ergebnisse liefert:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 66 "ableitung:=pro c(f)\n unapply(simplify(diff(f('x'),'x')),'x');\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "fu1:=x->x^2/(x^2+1);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "ableitung(fu1);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 20 "(ableitung@@2)(fu1);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 102 "Nun die Tangentenfunktion f\374r eine Tangente in e inem beliebigen Punkt an das Schaubild einer Funktion:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 84 "tangente:=proc(f,x0)\n unapply(si mplify(ableitung(f)(x0)*('x'-x0)+f(x0)),'x');\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 102 "plot([fu1,tangente(fu1,sqrt(2)),tangente (fu1,-2)],-3..3,color=[blue,red,magenta],scaling=constrained);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "tangente(fu1,sqrt(2));" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 19 "analog die Normale:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 86 "normale:=proc(f,x0)\n unapply(sim plify(-1/ableitung(f)(x0)*('x'-x0)+f(x0)),'x');\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 98 "plot([fu1,tangente(fu1,0.5),normale (fu1,0.5)],-3..3,color=[blue,red,magenta],scaling=constrained);" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 185 "Allen Beispielen ist gemeinsam, dass das Ergebnis eines \+ Funktionsaufrufs selbst wieder eine Funktion ist, die dauerhaft von de r beim Aufruf des Funktionals \374bergebenen Funktion abh\344ngt." }}} }{SECT 1 {PARA 3 "" 0 "" {TEXT -1 27 "Programmierung mit Objekten" }} {PARA 0 "" 0 "" {TEXT -1 196 "Maple unterst\374tzt zwar selbst keine o bjektorientierte Programmierung (keine richtigen Klassen mit Vererbung ), man kann aber die lexikalische Bindung zur Konstruktion gekapselter Objekte verwenden." }}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restar t:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 107 "zaehler:=proc(init) \n local a;\n a:=init;\n proc () \n local a1;\n a1:=a;\n a:= a+1;\n a1;\n end;\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 30 "z1:=zaehler(0):z2:=zaehler(9):" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "seq([z1(),z2()],i=1..10);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 1025 "Die lokale Variable a geh\366rt zur Definitionsumgebung der inne rhalb von zaehler erzeugten anonymen Prozedur und kann in dieser Umgeb ung auch ver\344ndert werden. Bei jedem Aufruf von zaehler wird diese \+ Variable als lokale Variable neu erzeugt. Beim Ende von zaehler kann a uf diese Variable nicht mehr direkt zugegriffen werden, ihre Bindung i st aber in der lexikalischen Tafel der erzeugten Prozedur gespeichert. Bei jedem Aufruf dieser Prozedur wird die Variable a ausgewertet, das Ergebnis gespeichert, der Wert von a um 1 erh\366ht und das vorherige Auswertungsergebnis als Funktionsergebnis zur\374ckgegeben. Da a nich t lokal zu der erzeugten Prozedur ist, wird es nach deren Ende auch ni cht vernichtet und kann so \374ber mehrere Aufrufe der Funktion seinen Wert beibehalten. Wir haben also ein Funktional erzeugt, das Funktion en mit einem inneren Zustand produziert. Alle diese mit zaehler erzeug ten Funktionen kann man so als (sehr einfache) Objekte einer bestimmte n Klasse betrachten und zaehler ist der Konstruktor dieser Klasse." }} }{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 102 " Im n\344chsten Beispiel erzeugen wir eine etwas kompliziertere Klasse, n\344mlich einen Stapel (oder stack)." }}{PARA 0 "" 0 "" {TEXT -1 29 "Ein Stapel besteht aus einer " }{TEXT 274 5 "Liste" }{TEXT -1 38 ", a n deren Anfang mit einer Operation " }{TEXT 273 4 "push" }{TEXT -1 64 " beliebig neue Objekte gesetzt werden k\366nnen. Mit der Operation " }{TEXT 275 3 "pop" }{TEXT -1 90 " kann man das \"oberste\" Objekt vom \+ Stapel nehmen und als Ergebnis ausgeben, die Operation " }{TEXT 276 5 "empty" }{TEXT -1 40 " liefert true, wenn der Stapel leer ist." }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 280 "makestack:=proc()\n local \+ stapel,leer,rein,raus;\n stapel:=[];\n leer:=proc() evalb(nops(stape l)=0);end;\n rein:=proc(obj) stapel:=[obj,stapel[]];true;end;\n raus :=proc() local erg; erg:=stapel[1];stapel:=stapel[2..-1];erg;end;\n t able([(empty)=leer,(push)=rein,(pop)=raus]);\nend:" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 16 "s1: =makestack();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "s1[empty]( );" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 25 "seq(s1[push](i),i=1.. 10);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "seq(s1[pop](),i=1.. 9);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "s1[empty]();" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 16 "s2:=makestack();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 12 "s2[empty]();" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 17 "s2[push](\"Hugo\");" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "s1[pop]();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "s2[pop]();" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 0 "" }}}}}{MARK "5" 0 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }