Bedingte Anweisungen (if-else)

Erstellt von Niklas von Moers
Code und Zusatzmaterial
Als PDF
PDF-Download
Arbeitsblatt
PDF-Download erweitert
Erweitertes Arbeitsblatt

Beschreibung

Nicht bei jeder Codedurchführung soll derselbe Programmcode durchgeführt werden. So soll ein Arduino beispielsweise abhängig von der Wahrnehmung eines Sensors eine Lampe leuchten lassen oder nicht. Je nachdem, was der Sensor misst, müssen also verschiedene Codeteile durchgeführt und andere ignoriert werden. Dazu stehen in der Sprache C++ “bedingte Anweisungen” (engl. conditional statements) zur Verfügung. Das sind Codeabschnitte, deren Durchführung an bestimmte Bedingungen geknüpft sind. Eine bedingte Anweisung hat folgende Form:

if (bedingung) {
    anweisung;
}

Hierbei ist bedingung ein Ausdruck vom Typ boolean, also ein Ausdruck, welcher wahr (entspricht true) oder falsch (entspricht false) ist. Ein Beispiel-Codeausschnitt könnte wie folgt aussehen:

if (gemessenerAbstand < 10){
    digitalWrite(LED, HIGH);
}

Hier sind einige Beispiele für Ausdrücke, welche man als Bedingung verwenden könnte:

true                //true
false               //false
0 == 1              //false
1 < 5               //true
random(0, 2) == 1   //can be true or false
isDigit("a")        //false

Für die Schrägstriche // sei auf Kommentare verwiesen.

Es ist außerdem möglich, Zahlen, also Ausdrücke vom Typ int, als Bedingung zu verwenden. Hiervon ist allerdings abzuraten, da dies das Verständnis des Programmes erschwert.

anweisung ist Platzhalter für Code, welcher ausgeführt werden soll, falls bedingung wahr ist. Die geschweiften Klammern { } dienen einerseits dazu, mehrere Ausdrücke zusammenzufassen. Außerdem erleichtern sie das Verständnis des Codes, da genau klar ist, welcher Code ausgeführt wird, falls die Bedingung erfüllt ist. Auch wenn diese geschweiften Klammern nicht zwingend nötig sind, sofern man nur eine Anweisung ausführt, ist es eine gute Angewohntheit, die geschweiften Klammern immer zu verwenden. Der Code könnte bei mehreren Anweisungen wie folgt aussehen:

if (bedingung) {
    anweisung1;
    anweisung2;
}

Häufig möchten wir auch in dem Fall, dass bedingung falsch ist, etwas anderes ausführen. Dazu dient das Schlüsselwort else:

// Falls bedingung wahr ist, führe anweisung1 aus.
if (bedingung) {
    anweisung1;
//  Ansonsten führe anweisung2 aus.
} else {
    anweisung2;
}

Die if-else-Konstruktion wird häufig fälschlicherweise mit wenn-dann übersetzt. wenn-dann entspricht aber genau der Konstruktion

if (bedingung) {
    anweisung;
}

else lässt sich besser mit “ansonsten” übersetzen.

Es ist möglich, nicht nur eine sondern beliebig viele Bedingungen zu prüfen. Hierzu verwenden wir if-else if: Die Bedingungen werden von oben nach unten geprüft und die zugehörige Anweisung der ersten wahren Bedingung wird ausgeführt.

if (bedingung1) {
    anweisung1;
} else if (bedingung2) {
    anweisung2;
} else {
    anweisung3;
}

Hier ist ein Beispiel-Programm, welches herausfindet, ob "a" eine Ziffer ist:

char myChar = "a";
if (isDigit(myChar)) {
  Serial.println("The character is a number.");
}
else {
  Serial.println("The character is not a number.");
}

Für Serial.println sei auf den seriellen Monitor verwiesen.

Vergleichsoperatoren

Die Programmiersprache C++ bietet die folgenden Operatoren, um Zahlen miteinander zu vergleichen.

a == b  //Sind a und b gleich?
a != b  //Sind a und b ungleich?
a < b   //Ist a kleiner als b?
a > b   //Ist a größer als b?
a <= b  //Ist a kleiner gleich b?
a >= b  //Ist a größer gleich b?

Verknüpfung von Bedingungen

In C++ gibt es logische Operatoren für “nicht”, “oder” und “und”.

!       //nicht
&&      //und
||      //oder

Diese werden wie folgt verwendet:

!bedingung                  // Gilt bedingung nicht?
bedingung1 && bedingung2    // Gelten beide Bedingungen?
bedingung1 || bedingung2    // Gilt mindestens eine der beiden Bedingungen?

Code

int led = 12;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  // Lege den Abstand als Gleitkommazahl (Datentyp "float") 20 fest.
  // An diesem Punkt könnte man den Abstand auch messen, siehe
  // [Ultraschallsensor].
  float abstand = 20.0;

  // Falls der Abstand kleiner als 10 ist, schalte die LED ein.
  if (abstand < 10) {
    digitalWrite(led, HIGH);

  // Ansonsten schalte die LED aus.
  } else {
    digitalWrite(led, LOW);
  }
}

Aufgaben

Wenn die Ampel grün ist, fährt das Auto, ansonsten bleibt es stehen. Schreibe dies als bedingte Anweisung.

int LED_GRUEN = 9;
int LED_GELB = 10;
int LED_ROT = 11; 
int MOTOR_LINKS  = 12;
int MOTOR_RECHTS = 13;
if(digitalRead(LED_ROT) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
} else if(digitalRead(LED_GELB) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
} else if(digitalRead(LED_ROT) == HIGH && digitalRead(LED_GELB) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
}

// oder besser so:
if(digitalRead(LED_ROT) == HIGH || digitalRead(LED_GELB) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
}

Wenn die Ampel rot leuchtet, oder wenn wenn die Ampel gelb leuchtet, oder beides, steht das Auto.

int LED_GRUEN = 9;
int LED_GELB = 10;
int LED_ROT = 11; 
int MOTOR_LINKS  = 12;
int MOTOR_RECHTS = 13;
if(digitalRead(LED_ROT) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
} else if(digitalRead(LED_GELB) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
} else if(digitalRead(LED_ROT) == HIGH && digitalRead(LED_GELB) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
}

// oder besser so:
if(digitalRead(LED_ROT) == HIGH || digitalRead(LED_GELB) == HIGH){
    digitalWrite(MOTOR_LINKS, LOW);
    digitalWrite(MOTOR_RECHTS, LOW);
}

Häufige Fragen und Probleme

Warum schreibt man das logische Und als && und nicht als &?

Das Zeichen & ist als Bit-Operation reserviert. Eine Bit-Operation verknüpft zwei Zahlen miteinander abhängig von deren Schreibweise als Binärzahl. Dies ist in C++ eine wichtige Operation, da C++ aus der Programmiersprache C entstanden ist, welche sehr maschinennah arbeitet, bei welcher man also fast direkt am Speicher des PCs programmiert. Hierbei sind Bit-Operationen sehr schnell.

Warum schreibt man den Vergleich zweier Werte als == und nicht als =?

Das einfache Gleich = ist reserviert für eine Zuweisung.

Das Material und dessen Inhalte sind - sofern nicht anders angegeben - lizenziert unter der Creative Commons Lizenz CC BY-NC-SA 4.0 (für den vollständigen Lizenztext siehe https://creativecommons.org/licenses/by-sa/4.0/legalcode )