Table of Contents

For loop

Standard-Form:

for (int i=0; i<10; i++) {
   // irgendwas mit i
}

Genauer: for(Initialisierung; Pre-Loop-Condition; Post-Loop-Operation);

Die Variable(n), die im For-Loop initialisert wird (werden), sind nur im drauf folgenden Block sichtbar! Sonst davor deklarieren:

for (int i=0; i<10; i++) {
  if (i==5) {
    break; // loop abbrechen
  }
}
Serial.println(i); // Fehler, i nicht deklariert, da nur im loop gültig.
//
// Abhilfe:
int i=0;
for (;i<10; i++) { // leere Initialisierung
   // bla, bla, break, ...
}
Serial.println("Abbruch mit i=");
Serial.print(i);

Schlechte Beispiele

Schreiben Sie keinen solchen Code! Der ist nur dazu da, die Mechanik der For-Schlaufe in C++ besser zu verstehen.

void setup() {
  Serial.begin(115200);
}
 
void loop() {
  Serial.println("--------8><------------");
  for (int i=0; Serial.print(i), Serial.println("<5?"), i<5; Serial.print(i), Serial.println("++"),i++) {
    Serial.print("im Loop mit i=");
    Serial.println(i);
  }
  Serial.println();
  delay(2000);
 
  for (int i,j=0; j<5; i<4 ? i++ : (i=0,j++)) {
    Serial.print("i=");
    Serial.print(i);
    Serial.print(" j=");
    Serial.println(j);
  }
  delay(3000);
}

If-Schleife

if (bedingung) {
  // tu was
}
 
if (bedingung) {
  // tu was
} else {
  // anderes
}
 
if (bedingung) {
  // tu was
} else if (andere bedingung) {
  // tu was anderes
} else if (noch andere bedingung) {
  // tu noch was anderes
} else {
  // wenn alles nicht wahr war
}

Logische Verknüpfungen

&& und (der zweite Ausdruck wird nur ausgewertet wenn der erste Ausdruck wahr ist)
|| oder (der zweite Ausdruck wird nur ausgewertet wenn der erste Ausdruck falsch ist)

Wahrheitswerte: false und true

Typ bool kann false oder true sein.

Andere Werte sind true, wenn diese nicht null sind.

true wird zu 1 konvertiert, wenn als Zahl aufgefasst.

int i=true;  // i wird 1
bool ok=42;  // ok wird true;
Serial.println(ok);  // Zeigt 1 an.
bool nk=0;   // nk wird false;
if (42) {
  // immer wahr
}

Ternärer Operator

Sehr kompakt, aber schwer zu lesen. Einsatz wie Gewürz.

  int a = (bedingung) ? resultatWennWahr : resultatWennFalsch;

Modulo Operator

  int a=19, b=5;
  int rest = a % b;  // liefert 4, Rest der Division 19/5
  a=-19;
  rest = a % b;  // liefert -4. Erklärung: Integer-Division rundet immer zu Null hin!, D.h. (-19)/5 ergibt -3, Rest -4.

Aufgaben

Primzahlen

Schreiben Sie einen Sketch, der Primzahlen ausgibt (ohne obere Grenze).

Studieren Sie dazu, falls nötig, die Arduino-Dokumentation zum for-loop, der if-Schleife und dem Modulo-Operator %.

Lösungsvorschlag

Lösungsvorschlag

void setup() {
  Serial.begin(115200);
  Serial.println(2);
}
 
void loop() {
  for (long i=1000001; ; i+=2) {
    bool prime = true;
    for (long t=3; t*t<=i; t+=2) {
      if (i % t==0) {
        prime = false;
        break;
      }
    }
    if (prime) {
      Serial.print(i);
      Serial.print(",");
    } else if (i%29 == 0) {
      Serial.println();
    }    
  }
  delay(20000);
}

Perfekte Zahlen

Finden Sie Zahlen, die gleich der Summe ihrer Teiler sind (sich selbst natürlich ausgeschlossen). Beispiel: 6=1+2+3. Gegenbeispiel: 8!=1+2+4.