Häufig gestellte Fragen zum Programmieren (FAQ)



Fragen zum Programmieren

Ist meine Lösung so richtig?

Es gibt nicht die eine richtige Lösung, sondern es sind immer mehrere Lösungswege denkbar. Man kann zwar beweisen, ob ein Programm korrekt ist oder nicht, es ist allerdings aufwändig und wird in der Praxis nicht gemacht. Deshalb versucht man mit charakteristischen Beispielen zu testen und die Ergebnisse zu prüfen. Falsch-Eingaben sollten ein Programm nicht abstürzen lassen oder falsche Resultate liefern, sondern eine aussagekräftige Fehlermeldung zurückgeben.

Was tun, wenn ich den Fehler nicht finde?

Man muss zwei Arten von Fehlern unterscheiden.
Es gibt syntaktische Fehler, das heißt die Form des Programms entspricht nicht den Regeln der Programmiersprache; vergleichbar einem Grammatikfehler bei Sprachen. Computer sind da sehr strikt. Bei syntaktischen Fehlern bricht das Programm ab und gibt eine Fehlermeldung aus, die Hinweise auf den Fehler geben. Es wird dabei die Zeilennummer mit angegeben, so dass der Fehler in dieser Zeile oder der näheren Umgebung zu suchen ist.
Die Zeile
n = length(b;
führt zur Fehlermeldung wie
>> {#??? Error: File: /work/16/source.m Line: 31 Column: 13 Unbalanced or unexpected parenthesis or bracket.
die angibt, dass die Zahl der öffnenden und schließenden Klammern ( bzw. ) unterschiedlich ist. Damit sollte der Fehler zu finden sein.
Schwieriger zu finden sind semantische Fehler, also logische Fehler im Programm. Bei Sprache wären das korrekte Sätze mit einer falschen Aussage. Inhaltliche Fehler sind schwerer zu finden. Es gibt einige klassische Fehler. Oft werden Schleifen einmal zu viel oder zu wenig durchlaufen, Vorzeichenfehler in Bedingungen oder Dimensionsfehler bei Vektoren und Matrizen treten auf. Manchmal bricht das Programm ab, wenn der Befehl nicht ausgeführt werden kann. Dann ist der Fehler leicht einzugrenzen. Stimmt allerdings das Ergebnis nicht, muss das Programm noch einmal durchdacht werden. Es kann helfen Zwischenergebnisse mit disp, printf ausgeben zu lassen. Oft haben die Variablen andere Werte, als man fälschlicher Weise vermutet.

Wie kann der Quelltext besser lesbar gemacht werden?

Quelltext sollte formatiert werden, damit man ihn leichter lesen und verstehen kann. Innerhalb einer Funktion, Schleife oder If-Verzweigung wird um zwei Leerzeichen oder ein Vielfaches davon eingerückt.
if t > 0
  disp('Positiv.');
else
  disp('Negativ.');
end;

Sind mehrere Schleifen oder Verzweigungen geschachtelt, so wird jedesmal weiter eingerückt. Durch Einrücken ist schnell erkennbar, wo eine Schleife oder Verzweigung endet.
for i = 1:n   for j = i:n
    if (i == j)
      disp('Gleichheit.');
    end;
  end;
end;

Vor inhaltlich zusammenhängenden Teilen sollte eine Kommentarzeile stehen, die beschreibt was warum im Folgenden passiert.
% bilde Betrag von t um negative Zeit auszuschließen
if t < 0
  t = t * (-1);
end;

Bei Klammern und Leerzeichen nicht geizig sein, denn Zeichen-Bandwürmer sind schwer lesbar. Vor und nach jedem Gleichzeichen ein Leerzeichen, nach if, while und for ein Leerzeichen und bei logischen Ausdrücken sorgen Klammern ebenfalls für mehr Klarheit.
if ((t > 0) && (t * (2 + i) == 10)) || (t ~= 2)
  disp('wahr.');
end;

Was bedeutet rekursiv und iterativ?

Diese Begriffe haben beim Programmieren eine leicht andere Bedeutung als in der Mathematik.
Iterativ bedeutet schrittweises Lösen. Meistens wird dies mit For- oder While-Schleifen erledigt. Beispielsweise kann die Vektorsumme berechnet werden, indem mit einer Schleife alle Vektoreinträge auf eine Zwischensumme addiert wird. Als iteratives Programm:
summe = 0;
for i = 1:len(vector)
   summe = summe + vector(i);
end;

Rekursiv bedeutet, dass sich die Funktion selbst aufruft, allerdings mit einem etwas leichteren Problem, bis das Problem trivial ist und die einzelnen Schritte leicht zu lösen sind. Rekursive Programme sind am Anfang meist nicht so leicht zu verstehen, ergeben aber oft kompakte und elegante Lösungen.
Die Vektorsumme als rekursives Programm könnte den ersten Eintrag auf die Summe der restlichen Vektoreinträge addieren, welche wiederrum durch das Programm selbst aufgerufen wird; bei einem eindimensionalen Vektor ist die Summe offensichtlich:
function [summe] = vectorsumme(vector)
  if len(vector) == 1
    summe = vector(1);
   else
     summe = vector(1) + vectorsumme(vector(2:len(vector)));
   end;
end;