Vergleiche und bedingte Ausführung

Ein wesentliches Element eines Programmes sind Befehle, die festlegen, dass bestimmte Programmzeilen nur ausgeführt werden, wenn eine Bedingung erfüllt ist. Diese Bedingung besteht im einfachsten Fall aus dem Vergleich einer Variablen mit einem Zahlenwert, kann aber auch sehr komplexe Formen annehmen. Wir beschränken uns vorläufig auf numerische Vergleiche, weil wir Zeichenketten später noch getrennt behandeln.

In allen Programmiersprachen hat das Resultat eines Vergleichs den Wert falsch oder wahr (in der wirklichen Welt könnte man auch den Wert unentscheidbar zulassen, für Programme wäre das eher ärgerlich). In C, C++, JavaScript, Perl und PHP gilt: Jede Zahl ausser 0 steht für den Wahrheitswert wahr, 0 steht für den Wahrheitswert falsch.

Vergleiche stellt man an, um je nach deren Ausgang unterschiedlichen Programmcode auszuführen: Falls der Vergleich den Wert wahr ergibt, tue dieses, sonst tue jenes. Man benutzt dazu die Schlüsselwörter if und else, sowie in PHP elseif (was nichts weiter als ein zusammengezogenes else if darstellt).

Die Ausführungen in diesem Abschnitt sind nicht vollständig, dafür aber in C, C++, Perl, PHP und JavaScript gleichermassen gültig.

Einfache Vergleiche

Gleichheit

Um die Gleichheit zweier Zahlenwerte festzustellen, verwendet man den doppelten Gleichheitszeichenoperator ==. Beispiel:
var a = 3, b = 4, c = 12;
  
if(a * b == c) {  // wenn ja, dann den Code zwischen der geöffneten
                  // geschweiften Klammer hier und der geschlosssenen
                  // geschweiften Klammer vor dem else
  document.writeln("Ihr Computer rechnet richtig!");
} else {          // andernfalls diesen Code
  document.writeln("Kaufen Sie einen anderen Computer!");
}

oder in PHP

$a = 3;
$b = 4;
$c = 12;
  
if($a * $b == $c) {  // wenn ja, dann den Code zwischen der geöffneten
                     // geschweiften Klammer hier und der geschlosssenen
                     // geschweiften Klammer vor dem else
  echo "Ihr Computer rechnet richtig!\n";
} else {          // andernfalls diesen Code
  echo "Kaufen Sie einen anderen Computer!\n";
}

Zu beachten ist, das Tests auf Gleichheit mit Fliesskommazahlen unter Rundungsfehlern leiden können. Wenn Sie z.B. schreiben if(cos(3.141592653589793238 / 2) == 0.0) wird der Wahrheitswert dieses Vergleichs vermutlich falsch sein, weil 3.141592653589793238 / 2 eben doch nicht exakt gleich pi/2 ist. Sicherer wäre im vorliegenden Fall: if(abs(cos(3.141592653589793238 / 2)) < 1e-12), damit testet man, ob der Cosinus von 3.141592653589793238 / 2 näher als 10-12 bei 0 liegt.

ungleich, grösser als, grösser gleich, kleiner als, kleiner gleich

Die Operatoren für "ungleich", "grösser als", "grösser gleich", "kleiner als" und "kleiner gleich" sind in allen C-ähnlichen Sprachen (C, C++, Java, Perl, JavaScript, PHP usw.) !=, >, >=, < und <=.

Wahrheitswerte verknüpfen

Um zwei Bedingungen gleichzeitig zu testen und mit oder bzw. mit und zu verknüpfen, gibt es die Operatoren || (für oder) und && (für und). Z.B. testet if(a > 9 || a < 2) ob a grösser als 9 oder kleiner als 2 ist (in beiden Fällen ist der Wahrheitsgehalt der Gesamtaussage wahr), und if(a >= 9 && b < 2) testet, ob a grösser gleich 9 und gleichzeitig b kleiner als 2 ist (nur wenn beide Bedingungen erfüllt sind, ist der Gesamtausdruck wahr).

Bei der Ausführung des Programms werden die Einzelaussagen immer von links nach rechts ausgewertet, und zwar nur so lange, wie unbedingt nötig. Das bedeutet:

Ein Beispielprogramm: Mäxchen

Im Würfelspiel "Mäxchen" würfelt man mit zwei Würfeln. Sind beide Ziffern verschieden, bildet die höhere der beiden Ziffern den Zehnerwert des Wurfs, die andere Ziffer bildet den Einerwert. Sind beide Ziffern gleich, so ist der Wert "Einerpasch", "Zweierpasch", "Dreierpasch", "Viererpasch", "Fünferpasch" oder "Sechserpasch". Der Einerpasch ist weniger wert als der Zweierpasch, der Zweierpasch weniger als der Dreierpasch usw. Alle Päsche sind mehr wert als alle anderen Würfe. Die bis jetzt genannten Regeln haben eine wichtige Ausnahme: Der an sich niedrigstmögliche Wurf, bestehend aus einer 2 und einer 1, heisst "Mäxchen" und ist am meisten wert.1

Im Beispielprogramm wird das Würfeln simuliert, indem die Funktion zur Erzeugung von Zufallszahlen aufgerufen wird. Da diese einen Wert zwischen 0 und 1 erzeugt, wird dieser zuerst mit 6 multipliziert und dann auf die nächste ganze Zahl aufgerundet (mit der Funktion ceil(x)). Beim Ermitteln des Werts des Wurfs wird zunächst untersucht, ob es sich um einen Pasch handelt, falls nicht, welche Ziffer grösser ist, und dann ob ein Mäxchen vorliegt.

Das Programm ist nur in der JavaScript-Version angegeben, lässt sich aber leicht nach PHP übersetzen. Austesten können Sie das Programm hier.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Mäxchen</title>
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-1">        
<link rel=stylesheet type="text/css" href="css/programmieren.css">
<style type="text/css">
<!--
td { padding:4px }
//-->
</style>
<script type="text/javascript" language="javascript">
function wuerfeln() {
  wurf = new maexchen();
  document.getElementById("zahl1").firstChild.nodeValue wurf.zahl1;
  document.getElementById("zahl2").firstChild.nodeValue wurf.zahl2;
  document.getElementById("bezeichnung").firstChild.nodeValue wurf.bezeichnung();
}

function maexchen() {
  this.zahl1 Math.ceil(Math.random() * 6);   // Math.random() liefert eine Zahl
  this.zahl2 Math.ceil(Math.random() * 6);   // im Intervall (0,1], ceil liefert
  this.bezeichnung bezeichnung;              // die nächsthöhere ganze Zahl
}

function bezeichnung() {   
  var wert;
  if(this.zahl1 == this.zahl2) { // Zahlen gleich?
     if(this.zahl1 == 1)
        return("Einerpasch");
     else if(this.zahl1 == 2)
        return("Zweierpasch");
     else if(this.zahl1 == 3)
        return("Dreierpasch");
     else if(this.zahl1 == 4)
        return("Viererpasch");
     else if(this.zahl1 == 5)
        return("Fünferpasch"); 
     else if(this.zahl1 == 6)
        return("Sechserpasch");
     else
        return("Fehler");
  } else {
     if(this.zahl1 this.zahl2) 
        wert 10 this.zahl2 this.zahl1;  // zahl1 < zahl2
     else
        wert 10 this.zahl1 this.zahl2;  // zahl1 > zahl2
     if(wert == 21)
        return("Mäxchen");
     else return wert;
  }
}
//-->
</script>
</head>
<body>
<h2>Mäxchen</h2>

<table style="border-style:none; margin-left:auto; margin-right:auto; border-spacing:0px">
<tr><td>Gewürfelte Augenzahlen:</td><td><span id="zahl1">3</span> und <span id="zahl2">4</span></td></tr>
<tr><td>Bezeichnung des Wurfs:</td><td><span id="bezeichnung">34</span></td></tr>
<tr><td colspan=2 style="text-align:center"><input type="button" value="neu würfeln" name="wuerfle" onClick="javascript:wuerfeln()"></td></tr>
</table>
<script type="text/javascript" language="javascript">
<!--<?php
wuerfeln(); // Diese Zeile wird unmittelbar nach dem Aufruf der Seite ausgeführt
//?>-->
</script>
<<p>
<a href="http://validator.w3.org/check/referer"><img border="0"
          src="http://www.w3.org/Icons/valid-html401"
          alt="Valid HTML 4.01!" height="31" width="88"></a>
<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img style="border:0;width:88px;height:31px"
src="http://jigsaw.w3.org/css-validator/images/vcss" 
alt="Valid CSS!" ></a></p>
</body>
</html>


1Der Reiz des Spiels, das ab etwa 6 Teilnehmern lustig wird, besteht darin, dass man unter einem Würfelbecher würfelt, so dass die anderen Spielteilnehmer den Wurf nicht sehen können. Die Person, die an der Reihe ist, würfelt, schaut unter den Würfelbecher und nennt dann einen Wert für den Wurf, der richtig oder falsch sein kann. Sie muss aber immer einen höheren als den zuletzt genannten Wert nennen. Die nächste Person hat dann die Wahl, den genannen Wert zu glauben (dann muss sie selbst wieder einen höheren Wert würfeln, bzw. angeben), oder den Wurf aufzudecken (wobei sie dann ausscheidet, wenn der wirkliche Wurf mindestens so hoch ist wie genannt; andernfalls aber scheidet die Person aus, die zuvor geblufft hat).

Valid HTML 4.01! Valid CSS!