Kurs  Cours

13. Fallstricke und "Debugging" (Fehler eliminieren)
 Embûches et "Debugging" (éliminer les erreurs)

Die Gliederung dieses Kurses folgt in groben Zügen dem Buch von Nancy Blachman: A Practical Approach.... Hinweis: Kapitel 13 lesen!
 L'articulation de ce cours correspond à peu près à celle du livre de Nancy Blachman: A Practical Approach.... 
Indication: Lire le chapitre 13.

Run mit WIN+Mathematica Version 5.2
 Testé avec Mathematica version 5.2+WIN

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

13.1. Fehlermeldungen
       Annonces d'erreurs

Beispiel:    Exemples:

1 + 2 = 3

Hier kommt eine Fehlermeldung. Die Fehlermeldungen sind im Technical Report Number 9 ff  von Wolfram Research beschrieben. Achtung! Orthographische, syntaktische Fehler (programmlogische Fehler, Durchbrechung der Programmierregeln) können entdeckt werden, jedoch nicht semantische Fehler (falsche Interpretation der eigenen Absicht in der Niederschrift).
  Voici une annonce d'erreurr.(Les annonces d'erreurs sont décrites dans le Technical Report Number 9 ff  de Wolfram Research.) Attention! Erreurs d'orthographe ou de syntaxe (erreurs concernant la logique de programmation ou les règles de programmation) peuvent être découvertes, tandis que les erreurs sémantiques (fausse interprétation de la propre intention dans le manscrit) ne le peuvent pas.

Beispiel:    Exemple:

2 - )5 + 7

Hinweis zum Notebook Front End: Mit (<Command>-B (B gross) --- NeXT) <Shift Control> B (B gross) ist eine Klammerüberprüfung möglich. Probiere das aus (setze den Cursor in die Lücke und verwende   (<Command>-B (B gross) --- NeXT) <Shift Control> B (B gross) ):
  Indication au sujet de Notebook Front End: Avec  (<Command>-B (B grand) --- NeXT) <Shift Control> B (B grand) il est possible de faire un examen des parenthèses. Essaie  (met le cursor dans l'espace vide et emploie (<Command>-B (B grand) --- NeXT) <Shift Control> B (B grand) ):

((([    [cjklf]r]}}]

13.2. Fehler durch vordefinierte Variablen
       Erreur par des variables définies d'avance

Beispiel:    Exemple:

Wird einer Variablen ein Wert zugewiesen, so wird auf den Wert und nicht auf die Variable gegriffen:
  Quand une valeur est assignée à une variable, c'est la valeur qui est prise et non pas la variable:

t = 5;
Print["t = ", t];
Integrate[Sin[t], t]

Abhilfe: Z.B. mit lokalen Variablen arbeiten.
  Secours: P.ex. travailler avec des variables locales.

13.3. Unvollständige Befehle
        Ordres incomplets

13.3.1.Fehlende oder nicht korrekte Namen
        Noms qui manquent  ou qui ne sont pas corrects.

Studiere:    Etudie:

D[x^3]

D[x^3, x]

D[x^3, y]

D[x^3, 1]

D[x^3 Sin[y], x, y]

D[x^3] ergibt offenbar die 0-te Ableitung von x^3.
  D[x^3] donne apparemment la 0-ième dérivation de x^3.

13.3.2.Fehlende oder nicht korrekte Punktuation
        Ponctuation qui manque ou qui n'est pas correcte

Studiere:    Etudie:

Clear[f];
f[x_] := If[x > 0,  x -x];
{f[5], f[-5]}

Mit Komma:  
  Avec virgule:

Clear[f];
f[x_] := If[x > 0,  x, -x];
{f[5], f[-5]}

Studiere:    Etudie:

Clear[f];
f[x_, y_] := xy;
f[2, 3]

Clear[f];
f[x_, y_] := x y;
f[2, 3]

D[x^3 Sin[y], x, y]

13.4. Falsche Klammerung
       Erreurs de parenthèses

Beispiel:    Exemple:

Clear[g]

g[0]

g(0)

g(a)

13.5. Verwechslung von Zeilen- und Spaltenvektor
 Confusion entre vecteur de ligne et vecteur de colonnes

Skalarprodukt
 Produit scalaire

{a, b, c}.{e, f, g}

{a, b, c}.{e, f, g, h}

Matrixprodukt
 Produit de matrice

Uebersicht:    Vue d'ensemble:

{{a},{b},{c}} // MatrixForm

Transpose[{{a},{b},{c}}] // MatrixForm

Diverse Produkte:
  Produits divers:

{{a},{b},{c}} . {{e},{f},{g}} // MatrixForm

{{a},{b},{c}} . Transpose[{{e},{f},{g}}] // 
						MatrixForm

Transpose[{{a},{b},{c}}] . {{e},{f},{g}} // 
						MatrixForm

Transpose[{{a},{b},{c}}] .
	Transpose[{{e},{f},{g}}] // MatrixForm

Generierung:    Génération:

Table[u[[i]] v[[j]], {i, Length[u]}, {j, 
						Length[v]}]

Was weiss man über u und v?
  Que sait-on de u et v?

13.6. Weiter mit "Return" statt "Enter"
       Continuer par "Return" au lieu de "Enter"

Beispiele    Exemple

a = 5
	+ 7
	+ 9

a

a = 5 +
	7 +
	9

a

Was ist hier los?
  Que se passe-t-il ici?

13.7. Probleme mit Wurzeln (Mehrdeutigkeiten)
 Problèmes de racines (différentes acceptions, équivoques)

Beispiele 
 Exemples

(x^2)^(0.5)

Sqrt[x^2]

Integrate[Sqrt[1 - Cos[x]^2], {x, 0, Pi/2}]

Integrate[Cos[x], {x, Pi, 2Pi}]

Integrate[Sqrt[1 - Sin[x]^2], {x, Pi, 2Pi}]

Was ist hier los?
  Que se passe-t-il ici?

??Sqrt

Sqrt[(-2)^2]

13.8. Abarbeitungsreihenfolge
       Ordre de travail

Probiere:    Essaie:

s = 2 x /(5x - 7)

Plot[s, {x, 0, 4}];

Plot[Numerator[s], {x, 0, 4}];

Wieso der Fehler? Probiere:
  Pourquoi l'erreur? Essaie:

Plot[Evaluate[Numerator[s]], {x, 0, 4}];

13.9. Ordnung von Regeln
       Ordre de règles

Probiere und erkläre die Prioritäten! Beispiel:
  Essaie et explique les priorités!

Clear[f];
f[x_] := x^2;
f[y_] := y^3;

{f[x],f[y]}

??f

Beispiel:    Exemple:

Clear[ung];
ung[x_?OddQ ] := (ung[x] = 1);
ung[x_?EvenQ] := (ung[x] = 0);

Table[ung[x], {x,10}]

??ung

13.10. "Protect" und Funktionen
          "Protect" et fonctions

??Protect

??Unprotect

Probiere:    Essaie:

Integrate[f[x_], x_] := F[x]

Remove[f, F];
f/: Integrate[f[x_], x_] := F[x];
Integrate[f[x], x]

Probiere:    Essaie:

Pi = 3.1416

{Pi, Pi // N}

Unprotect[Pi];
Pi = 3.1416;
Pi

Protect[Pi];
Pi // N

??Pi

Unprotect[Pi];
Remove[Pi];
Pi // N

??Pi

13.11. Debugging
          Debugging

13.11.1. Allgemeine Regeln
           Règles générales

Beachte beim Programmieren:
	Dokumentiere die eigenen Funktionen.
	Beachte Gross- und Kleinschreibung.
	Beachte Klammerung.
	Beachte die Initialisierung von Variablen.
	Beachte die Funktionennamen.
	Teste die Statements.
	Beachte die Argumente von Funktionen.
	Beachte die Punktuation.
	Kontrolliere, ob Befehle oder Zeichen vergessen worden sind.
	Mache Tests in trivialen Fällen.
	Teste den Code mit Testdaten.
	Beachte das Zuladen von Packages.
	Beachte die "Contexts" (Erklärung in Kap. 15.)
	Schreibe die Programme so, dass ein anderer nicht viel Zeit benötigt, um sie zu lesen. Wer die eigenen Kriterien den andern aufzwingen will, ist nicht sehr teamfähig. Denke auch an die andern, obwohl Du ja für Dich alleine sicher sehr gescheit bist!

Considère en programmant:
	Documente les propres fonctions.
	Tiens compte des majuscules et minuscules.
	Tiens compte des initiales des variables.
	Tiens compte des noms et fonctions.
	Examine et teste les statements.
	Tiens compte des arguments de fonction.
	Tiens compte de la ponctuation.
	Contrôle si des ordres ou des signes ont été oubliés.
	Fais des tests dans des cas triviaux.
	Teste le code par des données aptes à cela.
	Tiens compte des Packages utilisés.
	Tiens compte des "Contexts". (Explication au chapitre 15.)
	Ecris les programmes de façon  qu'une autre personne ne perde pas beaucoup de temps à les lire. Qui veut imposer ses propres critères aux autres, n'est pas capable de travailler en groupe. Pense aux autres, bien que tu n'aies pas de problèmes en travaillant seul.

Studiere:    Etudie:

?On

?Off

?Print

?Debug

?Trace

?Input

?Interrupt

13.11.2. Traceing
           Traceing

Probiere aus:    Essaie:

Remove[f, g];
f[x_]:= x^3 + g[x];
g[x_]:= x - 14

On[f, g]

f[4]

Off[f, g]

f[4]

13.11.3. Print
           Print

Von 10.3.7:
  De 10.3.7:

median[liste_List]:=
	Block[{
			sl,
			len
		  },
		  len = Length[liste];
		  Print["Länge der Liste: ", len];
		  sl = Sort[liste];
		  Print["Sortierte Liste: ", sl];
		  Print["Median: "];
		  If[
		  	 OddQ[len],
		  	 sl[[(len+1)/2]],
		  	 (sl[[len/2]]+sl[[len/2+1]])/2
		  ]
	];
	median[{24, 32, 36, 47, 49, 52}]

13.11.4. Debug (für Version 1.2)
           Debug (pour version 1.2)

Beispiel:    Exemple:

?$Version

?$VersionNumber

$VersionNumber < 2

If[$VersionNumber < 2, 
   Debug[For[n = 1, n < 4, ++n, Print[n^3]]],
   Print["Achtung: Bei Debug ab Version 2:
   			 Systemabsturz! \ 
   Attention: Debug dès version 2: 
             système interrompu!"]]

13.11.5. Trace
           Trace

Studiere:    Etudie:

2 5 + 8 9

Trace[2 5 + 8 9]

Trace[2 5 + 8 9, TraceDepth -> 1]

Trace[2 5 + 8 9, Plus]

Trace[2 5 + 8 9, Times]

Trace[2 5 + 8 9, x_ y_]

Trace[2 5 + 8 9, TraceDepth -> 1]

13.11.6. Input
           Input

Studiere (obiges Beispiel abgeändert):
Falls während der Rechnung plötzlich ein Fenster geöffnet wird so kannst Du eine Variable abfragen. Schreibe z.B. "?len" ins Fenster und beobachte, was passiert!
 
Etudie (Exemple ci-dessus changé):
Si pendant le calcul il s'ouvre tout à coup une fenêtre, tu peux demander le contenu d'une variable. Ecris p.ex. "?len" dans la fenêtre et observe ce qui se passe!

median[liste_List]:=
	Block[{
			sl,
			len
		  },
		  len = Length[liste];
		  sl = Sort[liste];
		  Print[Input[]];
		  If[
		  	 OddQ[len],
		  	 sl[[(len+1)/2]],
		  	 (sl[[len/2]]+sl[[len/2+1]])/2
		  ]
	];
	median[{24, 32, 36, 47, 49, 52}]

13.11.7. Interrupt
           Inerrupt

Beispiel: n! soll berechnet werden. Die Rechnung soll wegen der Rechnungszeit aber nur durchgeführt werden für n <= 1000. 
  Exemple: n! doit être calculé, mais à cause du temps de calcul on ne le calculera que pour des n >= 1000.

Remove[f];
f::gross = "Eingegebene Zahl grösser tausend. \
		Rechenzeit möglicherweise sehr lang.";
f[n_] := If[n <= 500, Print[n,"! = ", n!], 
		f::gross]

f[10]

f[100]

f[500]

f[501]

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

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

Remove["Global`*"]