Kurs  Cours

10. Lokale Variablen und prozedurales Programmieren
 Variables locales et programmation procédurale

Die Gliederung dieses Kurses folgt in groben Zügen dem Buch von Nancy Blachman: A Practical Approach.... 
Hinweis: Kapitel 10 lesen!
Run mit WIN+Mathematica Version 5.2

 L'articulation de ce cours correspond à peu près à celle du livre de Nancy Blachman: A Practical Approach.... 
Indication: Lire le chapitre 10.
Testé avec Mathematica version 5.2+WIN

WIR94/98/99/2000/2007 // Copyright Rolf Wirz

10.1. Globale Variablen
        Variables globales

Mathematica stört es nicht, dass im folgenden Beispiel zweimal dieselbe globale Variable (hier "i") in verschiedenen Bedeutungen gebraucht wird:
  Cela ne dérange pas Mathematica que dans l'exemple suivant on emploie deux fois la même variable globale (ici "i") avec deux significations différentes:

f[n_]:=Table[g[i],  {i,n}];
g[m_]:=Table[Log[i],{i,m}];

f[3]

??i

Zum Vergleich:    Pour comparer:

f[n_]:=Table[g[i],  {i,n}];
g[m_]:=Table[Log[j],{j,m}];

f[3]

10.2. Lokale Variablen im Unterschied zu 
         globalen Variablen
       Variables locales à la différence de 
          variables globales

10.2.1. Lokale Variablen in einer "Block"-Prozedur
         Variables locales dans une procédure "Block"

??Block

Betrachte das folgende Beispiel:
  Considère l'exemple suivant:

Clear[f,g];
f[n_] := Block[{i}, Table[  g[i], {i, n}]];
g[m_] := Block[{i}, Table[Log[i], {i, m}]]

Ausprobieren:    Essayer:

i

?f

f[n]

f[3]

f[5]

i

Was ist passiert? (Welcher Wert ist in "i" gespeichert?)  Betrachte:
  Que s'est-il passé? (Quelle valeur est mémorisée dans "i"?)  Considère:

Clear[f,g,i];
Block[{i}, i]

10.2.2. Lokale Variablen in einer "Module"-Prozedur
         Variables locales dans une procédure "Module"

??Module

Vergleiche mit dem letzten Beispiel:
  Compare au dernier exemple:

Clear[f];
Module[{i}, i]

Clear[i];
Module[{i}, i]

Was bedeutet wohl die ausgegebene Zahl? 
  Que signifie le nombre sorti?

Betrachte das folgende Beispiel:
  Considère l'exemple suivant:

Clear[f,g];
f[n_] := Module[{i}, Table[  g[i], {i, n}]];
g[m_] := Module[{i}, Table[Log[i], {i, m}]]

Ausprobieren:     Essayer:

?f

f[n]

f[3]

f[5]

i

Was ist passiert? (Welcher Wert ist in "i" gespeichert?)
  Que s'est-il passé? (Quelle valeur est mémorisée dans "i"?)

10.2.3. Lokale Variablen mit "With"
         Variables locales avec "With"

Damit lassen sich Ausdrücke manipulieren:
  Par cela on peut manipuler des expressions:

?With

With[{x=2, y=a, z=b^3}, y Log[x^z]]

Clear[x,y,z,r,s];
Solve[{x+2==r-s,s+1==y+2z,2r+z==-4x},{x,r}]

With[{z=4, s=Sin[z^2]}, 
Solve[{x+2==r-s,s+1==y+2z,2r+z==-4x},{x,r}]]

10.3. Prozedurale Programmierung
       Programmation procédurale

Mathematica erlaubt prozedurale Programmierung, d.h. Befehlssequenzen mit 
Wiederholungen und Verzweigungen. Studiere die folgenden Befehle:
  Mathematica permet la programmation procédurale, c'est-à-dire des séquences d'ordres avec des répétitions et des ramifications. Etudier les ordres suivants:

??Do

?For

?While

?If

?Which

?Switch

10.3.1. Arithmetische Operationen auf bestehenden
Variablen wie Inkrementierung u.s.w.
 Opérations arithmétiques sur des variables existantes comme "increment" etc.

Studiere die folgenden Beispiele:
  Etudie les exemples suivants:

??++

?+=

?-=

?*=

?/=

?DivideBy

i=1

++i

i

i++

i

i

i +=6

i -=5

i *=7

i /=4

10.3.2. Iterative Konstruktionen
         Constructions itératives

Studiere die folgenden Beispiele:
  Etudie les exemples suivants:

Do[Print[3 n^2], {n,7}]

For[n=1, n<=7, ++n, Print[3 n^2]]

n=1;
While[n<=7, (Print[3 n^2]; n++)]

10.3.3. Logik
         Logique

Studiere die folgenden Befehle:
 Etudie les ordres suivants:

?&&

?And

?||

?Or

?!

?!!

?Not

?Xor

Studiere die folgenden Beispiele:
  Etudie les exemples suivants:

(1 < 2) || (4 > 5/0)

(4 > 5/0) || (1 < 2)

Von wo her wird also geklammert?
  D'où viennent les parenthèses?

10.3.4. Wahrheitstabellen
         Tableaux de verité

Ein Beispiel: Die folgende Aussageform soll untersucht werden:
  Un exemple: La forme propositionelle suivante soit examinée:

Clear[f];
f[x_:0, y_:0, z_:0, w_:0, u_:0, v_:0]:= 
		!(!x || (x && y)) || (x || ! y) && w;
AppendTo[Attributes[f], Listable]

??f

Die nachstehende Funktion definiert den "Input" in die Wahrheitstabelle:
  La fonction ci-dessous définit l'"Input" dans le tableau de vérité:

Remove[tabteil,tabelle];
tabteil[n_, k_]:= Permutations[
				Table[Ceiling[Floor[n/i]/k], 
						{i,1,k}]];
tabelle = {};
t[k_]:=(Do[AppendTo[tabelle,tabteil[n,k]],
						{n,0,k}];
		tabelle  = Sort[Flatten[tabelle,1]];
		(tabelleTF=tabelle /. {0->False,
								1->True});
		Print[MatrixForm[tabelle]];
		MatrixForm[tabelleTF]);
t[3]

Remove[tabteil,tabelle];
tabteil[n_, k_]:= Permutations[
				Table[Ceiling[Floor[n/i]/k], 
								{i,1,k}]];
tabelle = {};
t[k_]:=(Do[AppendTo[tabelle,tabteil[n,k]],
								{n,0,k}];
		tabelle  = Sort[Flatten[tabelle,1]];
		(tabelleTF=tabelle /. {0->False,
								1->True});
		Print[MatrixForm[tabelle]];
		MatrixForm[tabelleTF]);
t[4]

Und hier der "Output" in der entsprechenden Reihenfolge:
  Et voici l'"Output" dans l'ordre correspondant:

??Map

f @@ Transpose[tabelleTF]

MatrixForm[Transpose[
	Join[Transpose[tabelleTF],
	{Table["|",{i,1,
		Length[f @@ Transpose[tabelleTF]]}]},
	{f @@ Transpose[tabelleTF]}]]]

Remove[tabteil,tabelle];
tabteil[n_, k_]:= Permutations[
				Table[Ceiling[Floor[n/i]/k], 
									{i,1,k}]];
tabelle = {};
t[k_]:=(Do[AppendTo[tabelle,tabteil[n,k]],
									{n,0,k}];
		tabelle  = Sort[Flatten[tabelle,1]];
		(tabelleTF=tabelle /. {0->False,
									1->True});
		MatrixForm[Transpose[
		Join[Transpose[tabelleTF],
		{Table["|",{i,1,
			Length[f @@ Transpose[tabelleTF]]}]},
		{f @@ Transpose[tabelleTF]}]]]);
(*Anwendung*)
t[5]

10.3.5. Verzweigungen
         Ramification

Probiere aus:    Essaie:

?If

?PrintForm

PrintForm[Print"gagag"]

?HorizontalForm

?Write

?WriteString

?SequenceForm

Clear[t];
Do[(t=Table[(If[Random[]>0.5, 
	SequenceForm["omumo"],SequenceForm["wvovw"], 
	SequenceForm["bubu"]]),{i,7}];
Print[t[[1]],t[[2]],t[[3]],t[[4]],t[[5]],
		t[[6]],t[[7]]]),{k,25}]

Verzweigung je nach Mathematica-Version:
  Ramification selon la version de Mathematica:

If[$VersionNumber < 2.0,
	Plot[E^(-x^2) Cos[20x],{x,-2,2},Framed->True],
	Plot[E^(-x^2) Cos[20x],{x,-2,2},Frame ->True]];

Mit Switch:    Avec Switch:

x=Random[Integer,{1,5}];
Print[x];
Switch[x^2,1,x,4,2x,9,3x,16,4x,25,-5x]

x=Random[Integer,{1,5}];
Print[x];
Switch[x^2,1,x,4,2x,9,3x,16,4x,25,-5x]

x=Random[Integer,{1,5}];
Print[x];
Switch[x^2,1,x,4,2x,9,3x,16,4x,25,-5x]

Mit Which:    Avec Which:

signum[x_]:=Which[x<0.,-1,x==0.,0,x>0.,1]

Plot[signum[x],{x,-3,3}];

10.3.6: Spaghetti-Code (resp. die "Chaos-Erzeugung"...)
         Code spaghetti (résp. la "génération du chaos"...)

Davon ist abzuraten! 
  On le déconseille!

?Goto

?Label

?Throw

?Catch

10.3.7: Beispiel aus der Statistik
         Exemple pris de la statistique

Der Median:    La médiane:

median[liste_List]:=
	Block[{
			sl,
			len
		  },
		  len = Length[liste];
		  sl = Sort[liste];
		  If[
		  	 OddQ[len],
		  	 sl[[(len+1)/2]],
		  	 (sl[[len/2]]+sl[[len/2+1]])/2
		  ]
	]

median[{53,64,78,24,63,78}] // N

median[{76, 56, 23, 78, 34}]

median[{0,1,2,3,4,5,6}]

median[{1,2,3,4,5,6}]  // N

median[{1,2,3,4,5,6,7}]

Was ist der Median?
  Qu'est-ce la médiane?

"Putzmaschine" einsetzen
 Employer la "machine de nettoyage"

(* Old Form: Remove["Global`@*"] *)

Remove["Global`*"]