# MAPLE fuer ANALYSIS # RWTH -Aachen, Wintersemester 1997/98 # E. Goerlich # # Maple -Input von Kapitel 10: # Kapitel 10: Einfache Maple-Programme # ============================ # a) Erkl"arung zum Programm "z" aus Kapitel 8, Skript S.68. > z:= proc(x) local m, result; result := 0; if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2; result:= "; > od; fi; fi; fi; end; # Dasselbe mit Zeilen-Nummern: # 1) z:= proc(x) # 2) local m, result; # 3) result := 0; # 4) if type(x, integer) = false then FAIL # 5) else # 6) if x<1 then FAIL # 7) else if x = 1 then result; else for m from 2 to x do sqrt(2+2*result)/2; # 8) result:= " od fi # 9) fi # 10) fi # 11) end # # Erkl"arung der Schleifen . . . . . . # 1)-11): proc . . . end # 4)-10): if then else fi # 6)-9): if then else fi # 7)-8): if then else fi # 7)-8): for from to do od # # Zu Zeile 2): lokale Variable # Ein Versuch ohne Zeile 2): > z:= proc(x) result := 0; if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2; result:= "; > od; fi; fi; fi; end; # Erneutes Einlesen des Originalprogramms: > z:= proc(x) local m, result; result := 0; if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2; result:= "; > od; fi; fi; fi; end; # Probe f"ur die Unabh"angigkeit von lokalen und globalen Variablen: > result:=100; m:=1000; > z(10);result; m; # ==================================================== # b) Trennungen in Programmen > ?separator > ?; # Wenn am Ende von Zeile 2 oder 3 das ";" fehlt, gibt es # Fehlermeldungen: # Erstes ";" fehlt: > z:= proc(x) local m, result result := 0; if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2; result:= "; > od; fi; fi; fi; end; Syntax error, missing operator or `;` # Zweites ";" fehlt: > z:= proc(x) local m, result; result := 0 if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2; result:= "; > od; fi; fi; fi; end; Syntax error, reserved word `if` unexpected # Beide ";" fehlen: > z:= proc(x) local m, result result := 0 if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2; result:= "; > od; fi; fi; fi; end; Syntax error, missing operator or `;` # Das ";" zwischen den beiden unabh"angigen Befehlen in Zeilen 7), 8) # fehlt: > z:= proc(x) local m, result; result := 0; if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2 result:= "; > od; fi; fi; fi; end; Syntax error, missing operator or `;` # Alle anderen ";" sind entbehrlich (ausser nat"urlich dem letzten). # In Programmen sind semicolon und colon gleichwertig. > z:= proc(x) local m, result: result := 0: if > type(x, integer) = false > then FAIL else if x<1 then FAIL else if x = 1 > then result; else for m from 2 to x do sqrt(2+2*result)/2: result:= " > od fi fi fi end; # =================================================== # c) Verwendung des "pattern binding operator "::" > ?typematch # so nicht: > ?:: # "::" braucht unevaluation quotes: > ?'::' # "zz" ist eine neue Version des Programms "z", bei der zwei # Abfrageschleifen durch ein Testen des Datentyps mittels "x::posint" # ersetzt sind: # > zz:= proc(x::posint) local m, result: result:= 0 : if x = 1 > then result else for m from 2 to x do sqrt(2+2*result)/2 ; result:= " > od fi end; # Test: > zz(3); > zz(0); Error, zz expects its 1st argument, x, to be of type posint, but received 0 # Verhalten beim Versuch, eine Folge bearbeiten zu lassen, die mit einem # unzul"assigen Wert beginnt: > seq(zz(k),k=0..7); Error, zz expects its 1st argument, x, to be of type posint, but received 0 # Unerw"unschte Konsequenz: Die Laufvariable hat einen festen Wert # bekommen: > k; > seq(zz(k),k=1..7); > k; > k:='k'; # Versuch, diesen Effekt zu vermeiden: # ========================= > evalb(0::posint); > typematch(0,posint); # Neue Variante des Programms, mit "typematch": # Zugleich wurde "FAIL" ersetzt durch # "RETURN('zzz(x)')", d.h. Ausgabe des unausgewerteten Befehls. > zzz:= proc(x) local m, result; result := 0; > if typematch(x, posint) = false then RETURN('zzz(x)') else if x = 1 > then result; else for m > from 2 to x do sqrt(2+2*result)/2; result:= "; od; fi; fi; end; > zzz(0); > seq(zzz(k),k=-3..7); # Option Copyright: # ============ # N"aheres zum Sichtbarmachen von Maple-Programm-Code sp"ater! > interface(verboseproc=2); > print(sin); > interface(verboseproc=0); > print(sin); > ?verboseproc > ?option > zzz:= proc(x) local m, result; option `Home made for mapleFan, > Ch.9,25.9.1997: zzz(x) computes the exact value of > cos(Pi/2^x) in case x=posint`; result := 0; if typematch(x, posint) = > false then RETURN('zzz(x)') else if x = 1 then result; else for m from > 2 to x do sqrt(2+2*result)/2; result:= "; od; fi; fi; end; > seq(zzz(k),k=-3..18); # ================================================== # Weitere keywords oder "statements" findet man unter > ?statement # Noch nicht verwendet bisher: break, next, while, by, in, elif > ?break > ?repetition > ?procedure > ?index,procedure >