lehrkraefte:blc:informatik:ffprg2017:l2:l2

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);

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 (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
}
&& 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)

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
}

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

  int a = (bedingung) ? resultatWennWahr : resultatWennFalsch;
  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.
  • Erst obiges Studieren, Codes ausprobieren, verstehen, abändern, Fragen stellen.

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.

  • lehrkraefte/blc/informatik/ffprg2017/l2/l2.txt
  • Last modified: 2017/09/01 07:52
  • by Ivo Blöchliger