(*  Elemente der Programmierung,  WQ FS 2013 *)

(* Beispiel  :=  gegen =  *)
z1=Random[]
z2:=Random[]
Table[z1,{6}]
Table[z2,{6}]

(* Beispiel  :=  gegen =  *)
Plot[Sinc[x],{x,-10,10}]

g[ω_]:= FourierTransform[Sinc[t],t,ω]
Plot[g[x],{x,-5,5}] // Timing

h[ω_]= FourierTransform[Sinc[t],t,ω]
Plot[h[x],{x,-5,5}] // Timing

(* Beispiel  :=  gegen =  , sowie  :=  und =  *)
fib[n_Integer]:=Switch[n,0,0,1,1,_,fib[n-1]+fib[n-2]]

Timing[fib[25]]

Timing[fib[29]]

Clear[fib]

fib[n_Integer]:=fib[n]=Switch[n,0,0,1,1,_,fib[n-1]+fib[n-2]]

Timing[fib[15]]

?fib

Timing[fib[111]]

(* aber Rekursionstiefe noch beschraenkt, im Modul geht es noch besser: beachte Buendelzuweisung!  *)

fibM[n_Integer]:=Module[{a=0,b=1},Do[{a,b}={b,a+b},{n}]; a]

Timing[fibM[1000]]

(*  noch 'schneller' ist die MatrixPotenz - Rechnung, wie in vorangegangener Ueb *)

(* Funktionen mit eigenen Optionen *)

multPlot[func_,list1_List, list2_List]:=Plot[Evaluate[Table[func,list1]],list2]

multPlot[Sin[n x]/n,{n,1,7},{x,0,2 Pi}]

multPlot2[func_,list1_List, list2_List,Opts___?OptionQ]:=Plot[Evaluate[Table[func,list1]],list2,Opts]

multPlot2[c/x,{c,-3,3},{x,-5,5},PlotRange->{-5,5},AspectRatio->1]

allgMat[localOpts___?OptionQ]:= myallgMat[{(Subscript[x, #1,#2]) &,zeilen,spalten} /. {localOpts }
/. {zeilen->2,spalten->2}]
myallgMat[{f_,z_,s_}]:=Table[f[i,j],{i,1,z},{j,1,s}]

MatrixForm /@ {allgMat[],  allgMat[spalten->5]}

sehrallgMat[localOpts___?OptionQ]:= myallgMat[{f,zeilen,spalten} /. {localOpts} 
/. {f->((Subscript[x, #1,#2]) &) ,zeilen->2,spalten->2}]

(* Beispiel: Matrix mit Zufallszahlen *)
sehrallgMat[f->Function[{x,y},Random[]],zeilen->3] // MatrixForm

(*  Funktionen mit optionalen Parametern *)

potReihe[f_,x_:x,xo_:0,order_:6]:= Series[f,{x,xo,order}]

potReihe[Sin[x],x]

potReihe[Sin[x],x,Pi,3]

(* 'bessere' Programmierung ist aber, Standardwerte als Optionen zu formulieren *)

Clear[potReihe]

Options[potReihe]:={val->x,value->0,order->6};

potReihe[f_,Opts___?OptionQ]:=Series[f,{var,value,order} /. {Opts} /. Options[potReihe] ]

potReihe[Sin[y],var->y,order->7]