===== 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 =====
* 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 %.
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.