Uebungen  Exercices

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!
 L'articulation de ce cours correspond à peu près à celle du livre de Nancy Blachman: A Practical Approach.... Indication: 
Lire le chapitre 10.
WIR94/98/99 // Copyright Rolf Wirz

Aufgabe 1    Problème 1

Bestimme die Anzahl Iterationsschritte, die notwendig sind, um "Wurzel aus 2" auf 30 Dezimalen mittels der Newton-Methode zu approximieren.
 Détermine le nombre de pas d'itération qui sont nécessaires pour approximer "racine de 2" jusqu'à 30 décimales par la méthode de Newton.

Starte mit dem Wert 2. Berechne die Wurzel mit der Formel x(i+1)=(x(i)+2/x(i))/2. Erkläre wie diese Formel entsteht. (Löse x^2 - 2 = 0 ...)
  Démarre avec la valeur 2. Calcule la racine par la formule x(i+1)=(x(i)+2/x(i))/2. Explique comment cette formule s'est formée. (Résous x^2 - 2 = 0 ...)

Clear[newtonMethode, counter, zahl, approx];
newtonMethode[x_]:=
	Module[{
			counter = 1,
			zahl = N[x,30],
			approx = N[x,40]
		},
		While[approx^2 != zahl,
			Print[counter, ":  ", N[approx,30]];
			approx = (approx + 2/approx)/2;
			++counter;
		];
		Print[counter, ":  ", N[approx,30]];
	]

newtonMethode[2]

Vergleich:    Comparaison:

N[Sqrt[2],30]

Aufgabe 2    Problème 2

Definiere eine Funktion, die als Argumente drei Zahlen aufnimmt und die Summe der Quadrate der beiden grösseren Zahlen ausgibt.
 Définis une fonction qui prend 3 nombres comme arguments et sort la somme des carrés des deux nombres plus grands.

Definition:    Définition:

Clear[f];
f[x_,y_,z_]:=
	Module[{i,j,liste,min},
		min=Min{x,y,z};
		liste=Sort[{x,y,z}];
		restQuadr=Rest[{x,y,z}]^2;
		Print[Apply[Plus,restQuadr]]
		]

Ausprobieren:    Essayer:

{f[0,0,0],f[0,0,1],f[0,1,1],f[1,1,1],f[1,1,2],f[1,2,3]}

f[3]

Was ist passiert?
  Que s'est-il passé?

Aufgabe 3    Problème 3

Annahme: Familien haben Kinder, bis erstmals ein Knabe kommt. Mache eine Simulation mit 1000 Familien um herauszufinden, wieviele Kinder etwa durchschnittlich eine Familie haben wird (Abschätzung). Wieviele Töchter und wieviele Söhne werden in einer Familie zu erwarten sein?
 Supposition: Des familles ont des enfants jusqu'à la naissance du 1er garçon. Fais une simulation avec 1000 familles pour obtenir le nombre moyen d'enfants qu'une famille aura (estimation). A combien de filles et à combien de fils pourra s'attendre une famille?

Lösung von Nancy Blachman:
  Solution de Nancy Blachman:

Clear[makeFamily];
makeFamily[ ] :=
	Module[{
			children = {}
			},
			While[Random[Integer] == 0,
				AppendTo[children, "girl"]
			];
			Append[children, "boy"]
		]

makeFamily::usage="makeFamily[ ] returns a list 
					of children."

Clear[numChildren];
numChildren[n_Integer]:=
	Module[{
			allChildren
			},
			allChildren = Flatten[Table[
					makeFamily[ ],{n}]];
			{	avgChildren -> Length[
						allChildren]/n,
				avgBoys -> Count[allChildren,
							  "boy"]/n,
				avgGirls -> Count[allChildren,
							 "girl"]/n 
			}
		]

numChildren::usage="numChildren[n] returns 
			statistics on the number of children 
			from n families."

numChildren[1000]

Aufgabe 4    Problème 4

Mischen von Kartenspielen:
 Mélanger des jeux de cartes:

Beim perfekten Mischen teilt der Spieler das Kartenspiel genau in der Mitte und mischt das Spiel im "Reissverschlussverfahren": Abwechslungsweise kommt von jeder Seite je eine Karte, wobei sicher sein muss, dass die erste Karte von der ersten Hälfte zuerst "hingelegt" wird (das Spiel wird umgekehrt gehalten). Z.B. wenn man ein Spiel mit 10 Karten hat, ursprünglich geordnet in der Reihenfolge {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, so ist es nach einmal perfektem Mischen in der Reihenfolge {1, 6, 2, 7, 3, 8, 4, 9, 5, 10}.
a) Schreibe eine Funktion "perfektMischen", die das perfekte Mischen einer geraden Anzahl von Karten simuliert.
b) Schreibe die Funktion "wiederOrdnung", die die Anzahl perfekter Mischungen berechnet um das Spiel wieder in die urspüngliche Ordnung zu bringen. Wieviel mal ist es bei 52 Karten?

Un joueur qui mélange les cartes à la perfection, divise le jeu de cartes exactement par la moitié et mélange les cartes par la méthode de la "fermeture éclair": De chaque côté il arrive une carte alternativement, mais on doit être sûr que la 1ère carte vient de la 1ère moitié (on tient le jeu à l'envers). P.ex. si on a un jeu de 10 cartes dans l'ordre d'origine {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, on obtient l'ordre suivant en mélangeant une fois {1, 6, 2, 7, 3, 8, 4, 9, 5, 10}.
a) Ecris une fonction "perfectMischen" qui simule un mélange parfait d'un nombre pair de cartes.
b) Ecris la fonction "wiederOrdnung" qui calcule le nombre de mélange parfaits pour remettre le jeu dans l'ordre d'origine. Combien de mélanges faut-il pour un jeu de 52 cartes?

Clear[mischen, perfektMischen, mischen1, 
				perfektMischen1];

mischen::usage="mischen[ ] erzeugt eine Liste 
			von perfekt gemischten Zahlen -- donne 
			une liste de nombres mélangés à la 
			perfection.";
mischen[n_]:=
	Module[{matrix1,matrix2},
		listeIn=Range[n];
		matrix1=Partition[listeIn,n/2];
		matrix2=Transpose[matrix1];
		listeOut=Flatten[matrix2];
		Print["Liste_In: ", listeIn, "   ",
		 "Liste_Out: ", listeOut]
	 ];
	 
perfektMischen::usage="perfektMischen[ ] greift 
		auf den Modul mischen[ ] im Falle einer 
		eingegebenen geraden natuerlichen Zahl --
		utilise le Modul mischen[ ] dans le cas 
		d-un nombre donné pair, naturel.";

perfektMischen[n_Integer]:=
	Module[{listeIn},
		If[(OddQ[n] || n <= 0),
		Print["Bitte gerade, positive Zahl 
		eingeben -- S.v.p. entrer nombre positif 
		pair."], mischen[n],
		Print["Bitte gerade, positive Zahl 
		eingeben -- S.v.p. entrer nombre positif 
		pair."]]
		];
		
mischen1::usage="mischen1[ ] erzeugt eine Liste 
			von perfekt gemischten Zahlen ohne 
			Output -- donne une liste de nombres 
			mélangés à la perfection sans output.";
mischen1[n_]:=
	Module[{matrix1,matrix2},
		listeIn=Range[n];
		matrix1=Partition[listeIn,n/2];
		matrix2=Transpose[matrix1];
		listeOut=Flatten[matrix2];
	 	];

perfektMischen1::usage="perfektMischen1[ ] 
        greift auf den Modul mischen[ ] 
		im Falle einer eingegebenen geraden
		natuerlichen Zahl. Im Unterschied zu 
		perfektMischen[ ]
		wird hier die Ausgabe unterdruekt 
		-- utilise le Modul mischen[ ] dans le cas 
		d-un nombre donné pair, naturel. Par contre
		à perfektMischen[ ] l-output est retenu.";

perfektMischen1[n_Integer]:=
	Module[{},
		If[(OddQ[n] || n <= 0),
		Print["Bitte gerade, positive Zahl 
		eingeben -- S.v.p. entrer nombre positif
		pair."], mischen1[n],
		Print["Bitte gerade, positive Zahl 
		eingeben -- S.v.p. entrer nombre positif 
		pair."]]];

perfektMischen[100]

listeOut

Clear[mischenAnzahl];

mischenAnzahl::usage="mischenAnzahl[ ] greift auf 
		den Modul perfektMischen1[ ] und wendet 
		diesen an, bis die ursprüngliche 
		Reihenfolge wieder hergestellt ist. Ein 
		Zaehler zaehlt die Anzahl Mischablaeufe
		-- utilise le Modul perfektMischen1[ ] 
		et l-utilise jusqu-à l-ordre original est 
		remis. Un compteur compte le nombre de 
		mélanges.";

mischenAnzahl[n_]:=
	Module[{liste, counter=1, matrix1, matrix2},
		mischen1[n];
		liste  =listeIn;
		While[((listeOut != liste) && 
			counter < 10000), Print[counter,"  ",
			listeIn,"  ", listeOut];
			matrix1=Partition[listeOut,n/2];
			matrix2=Transpose[matrix1];
			listeOut=Flatten[matrix2];
			++counter;
			]
		Print[counter,"  ",listeIn,"  ", listeOut];
		Print["Anzahl Mischungen -- 
			Nombre de mélanges:   ", counter];

	 ]

perfektMischenAnzahl::usage="perfektMischenAnzahl[ ]
 		greift auf den Modul mischenAnzahl[ ] im 
 		Falle einer eingegebenen geraden 
 		natuerlichen Zahl  --
		utilise le Modul mischenAnzahl[ ] dans le 
		cas d-un nombre donné pair, naturel..";


perfektMischenAnzahl[n_Integer]:=
	Module[{},
		If[(OddQ[n] || n <= 0),
		Print["Bitte gerade, positive Zahl 
		eingeben-- S.v.p. entrer nombre positif 
		pair."], mischenAnzahl[n],
		Print["Bitte gerade, positive Zahl 
		eingeben-- S.v.p. entrer nombre positif 
		pair."]]]

perfektMischenAnzahl[1]

perfektMischenAnzahl[0]

perfektMischenAnzahl[2]

perfektMischenAnzahl[4]

perfektMischenAnzahl[6]

perfektMischenAnzahl[8]

perfektMischenAnzahl[10]

perfektMischenAnzahl[12]

perfektMischenAnzahl[14]

perfektMischenAnzahl[16]

perfektMischenAnzahl[18]

(* perfektMischenAnzahl[20] *)

(* perfektMischenAnzahl[52] *)

Aufgabe 5    Problème 5

Zum Unterschied zwischen "Block" und "Module"
 Quant à la différence entre "Block" er "Module"

Betrachte die folgenden Beispiele. Sie sind bis auf die Anweisungen "Block" resp. "Module" identisch. Wieso gibt Mathematica verschiedene Resultate aus?
  Considère les exemples suivants. Ils sont identiques, sauf les directives "Block" resp. "Module". Pourquoi est-ce que Mathematica sort des résultats différents?

Clear[a, i];
a = i;
i = 3;
Block[{i},
		Table[a, {i, 2}]
	]

Clear[a, i];
a = i;
i = 3;
Module[{i},
		Table[a, {i, 2}]
	]

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

Remove["Global`@*"]