Brückenkurs Programmieren
Tag 3: For-Schleifen und Funktionen
Christopher Schölzel
Technische Hochschule Mittelhessen
4. September 2019
Inhalt
Schleifen Einleitung For
Funktionen
Nachmittag: Iterative Refinement und Zufallszahlen
2 / 22
Inhalt
Schleifen Einleitung For
Funktionen
Nachmittag: Iterative Refinement und Zufallszahlen
Warum Schleifen?
Aufgabe
Gib alle Zahlen von 1 bis 100 auf der Konsole aus.
Bisher: Eine Programmzeile pro Rechenoperation.
System.out.println(1);
System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); System.out.println(6); System.out.println(7); System.out.println(8); System.out.println(9); System.out.println(10); System.out.println(11); System.out.println(12); System.out.println(13); System.out.println(14); System.out.println(15); System.out.println(16); System.out.println(17); System.out.println(18); System.out.println(19); System.out.println(20); System.out.println(21); System.out.println(22); System.out.println(23); System.out.println(24); System.out.println(25); System.out.println(26); System.out.println(27); System.out.println(28); System.out.println(29); System.out.println(30); System.out.println(31); System.out.println(32); System.out.println(33);
System.out.println(34); System.out.println(35); System.out.println(36); System.out.println(37); System.out.println(38); System.out.println(39); System.out.println(40); System.out.println(41); System.out.println(42); System.out.println(43); System.out.println(44); System.out.println(45); System.out.println(46); System.out.println(47); System.out.println(48); System.out.println(49); System.out.println(50); System.out.println(51); System.out.println(52); System.out.println(53); System.out.println(54); System.out.println(55); System.out.println(56); System.out.println(57); System.out.println(58); System.out.println(59); System.out.println(60); System.out.println(61); System.out.println(62); System.out.println(63); System.out.println(64); System.out.println(65); System.out.println(66);
System.out.println(67); System.out.println(68); System.out.println(69); System.out.println(70); System.out.println(71); System.out.println(72); System.out.println(73); System.out.println(74); System.out.println(75); System.out.println(76); System.out.println(77); System.out.println(78); System.out.println(79); System.out.println(80); System.out.println(81); System.out.println(82); System.out.println(83); System.out.println(84); System.out.println(85); System.out.println(86); System.out.println(87); System.out.println(88); System.out.println(89); System.out.println(90); System.out.println(91); System.out.println(92); System.out.println(93); System.out.println(94); System.out.println(95); System.out.println(96); System.out.println(97); System.out.println(98); System.out.println(99);
System.out.println(100);
Bilquelle:http://muppet.wikia.com/wiki/The_Count_Counts 4 / 22
Warum Schleifen?
Aufgabe
Gib alle Zahlen von 1 bis 100 auf der Konsole aus.
Bisher: Eine Programmzeile pro Rechenoperation.
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
System.out.println(6);
System.out.println(7);
System.out.println(8);
System.out.println(9);
System.out.println(10);
System.out.println(11);
System.out.println(12);
System.out.println(13);
System.out.println(14);
System.out.println(15);
System.out.println(16);
System.out.println(17);
System.out.println(18);
System.out.println(19);
System.out.println(20);
System.out.println(21);
System.out.println(22);
System.out.println(23);
System.out.println(24);
System.out.println(25);
System.out.println(26);
System.out.println(27);
System.out.println(28);
System.out.println(29);
System.out.println(30);
System.out.println(31);
System.out.println(32);
System.out.println(33);
System.out.println(34);
System.out.println(35);
System.out.println(36);
System.out.println(37);
System.out.println(38);
System.out.println(39);
System.out.println(40);
System.out.println(41);
System.out.println(42);
System.out.println(43);
System.out.println(44);
System.out.println(45);
System.out.println(46);
System.out.println(47);
System.out.println(48);
System.out.println(49);
System.out.println(50);
System.out.println(51);
System.out.println(52);
System.out.println(53);
System.out.println(54);
System.out.println(55);
System.out.println(56);
System.out.println(57);
System.out.println(58);
System.out.println(59);
System.out.println(60);
System.out.println(61);
System.out.println(62);
System.out.println(63);
System.out.println(64);
System.out.println(65);
System.out.println(66);
System.out.println(67);
System.out.println(68);
System.out.println(69);
System.out.println(70);
System.out.println(71);
System.out.println(72);
System.out.println(73);
System.out.println(74);
System.out.println(75);
System.out.println(76);
System.out.println(77);
System.out.println(78);
System.out.println(79);
System.out.println(80);
System.out.println(81);
System.out.println(82);
System.out.println(83);
System.out.println(84);
System.out.println(85);
System.out.println(86);
System.out.println(87);
System.out.println(88);
System.out.println(89);
System.out.println(90);
System.out.println(91);
System.out.println(92);
System.out.println(93);
System.out.println(94);
System.out.println(95);
System.out.println(96);
System.out.println(97);
System.out.println(98);
System.out.println(99);
System.out.println(100);
Warum Schleifen?
Aufgabe
Gib alle Zahlen von 1 bis 100 auf der Konsole aus.
Bisher: Eine Programmzeile pro Rechenoperation.
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
System.out.println(6);
System.out.println(7);
System.out.println(8);
System.out.println(9);
System.out.println(10);
System.out.println(11);
System.out.println(12);
System.out.println(13);
System.out.println(14);
System.out.println(15);
System.out.println(16);
System.out.println(17);
System.out.println(18);
System.out.println(19);
System.out.println(20);
System.out.println(21);
System.out.println(22);
System.out.println(23);
System.out.println(24);
System.out.println(25);
System.out.println(26);
System.out.println(27);
System.out.println(28);
System.out.println(29);
System.out.println(30);
System.out.println(31);
System.out.println(32);
System.out.println(33);
System.out.println(34);
System.out.println(35);
System.out.println(36);
System.out.println(37);
System.out.println(38);
System.out.println(39);
System.out.println(40);
System.out.println(41);
System.out.println(42);
System.out.println(43);
System.out.println(44);
System.out.println(45);
System.out.println(46);
System.out.println(47);
System.out.println(48);
System.out.println(49);
System.out.println(50);
System.out.println(51);
System.out.println(52);
System.out.println(53);
System.out.println(54);
System.out.println(55);
System.out.println(56);
System.out.println(57);
System.out.println(58);
System.out.println(59);
System.out.println(60);
System.out.println(61);
System.out.println(62);
System.out.println(63);
System.out.println(64);
System.out.println(65);
System.out.println(66);
System.out.println(67);
System.out.println(68);
System.out.println(69);
System.out.println(70);
System.out.println(71);
System.out.println(72);
System.out.println(73);
System.out.println(74);
System.out.println(75);
System.out.println(76);
System.out.println(77);
System.out.println(78);
System.out.println(79);
System.out.println(80);
System.out.println(81);
System.out.println(82);
System.out.println(83);
System.out.println(84);
System.out.println(85);
System.out.println(86);
System.out.println(87);
System.out.println(88);
System.out.println(89);
System.out.println(90);
System.out.println(91);
System.out.println(92);
System.out.println(93);
System.out.println(94);
System.out.println(95);
System.out.println(96);
System.out.println(97);
System.out.println(98);
System.out.println(99);
System.out.println(100);
Bilquelle:http://muppet.wikia.com/wiki/The_Count_Counts 4 / 22
Bekannte Wiederholungsanzahl: While
while-Schleifen sind sehr flexibel. Man kann sie auch für eine feste Anzahl von Wiederholungen verwenden.
int i = 0; // Initialisierung while (i < 100) { // Fortsetzungsbedingung
i = i + 1; // Schrittanweisung System.out.println(i);
}
Problem:
I Um zu verstehen, wie oft die Schleife durchlaufen wird, muss man drei Zeilen überblicken.
I In großen while-Schleifen geht die Schrittanweisung unter.
⇒ Fehleranfällig
Bekannte Wiederholungsanzahl: While
while-Schleifen sind sehr flexibel. Man kann sie auch für eine feste Anzahl von Wiederholungen verwenden.
int i = 0; // Initialisierung while (i < 100) { // Fortsetzungsbedingung
i = i + 1; // Schrittanweisung System.out.println(i);
}
Problem:
I Um zu verstehen, wie oft die Schleife durchlaufen wird, muss man drei Zeilen überblicken.
I In großen while-Schleifen geht die Schrittanweisung unter.
⇒ Fehleranfällig
5 / 22
Bekannte Wiederholungsanzahl: For
Definition
Eine for-Schleife ist eine Schleife mit Zählvariable (oft i für Index).
Ihr Kopf enthält nicht nur die Bedingung, sondern auch die Initialisierungund die Schrittanweisung.
Syntax: for-Schleife
for (Initialisierung; Bedingung; Schrittanweisung) { Anweisungsblock
}
Beispiel: for-Schleife
for (int i = 0; i < 100; i = i + 1) { System.out.println(i);
}
Bekannte Wiederholungsanzahl: For
Definition
Eine for-Schleife ist eine Schleife mit Zählvariable (oft i für Index).
Ihr Kopf enthält nicht nur die Bedingung, sondern auch die Initialisierungund die Schrittanweisung.
Syntax: for-Schleife
for (Initialisierung; Bedingung; Schrittanweisung) { Anweisungsblock
}
Beispiel: for-Schleife
for (int i = 0; i < 100; i = i + 1) { System.out.println(i);
}
6 / 22
Bekannte Wiederholungsanzahl: For
Definition
Eine for-Schleife ist eine Schleife mit Zählvariable (oft i für Index).
Ihr Kopf enthält nicht nur die Bedingung, sondern auch die Initialisierungund die Schrittanweisung.
Syntax: for-Schleife
for (Initialisierung; Bedingung; Schrittanweisung) { Anweisungsblock
}
Beispiel: for-Schleife
for (int i = 0; i < 100; i = i + 1) { System.out.println(i);
}
Aufgabe: Statistik
Erzeuge eine zufällige Zahl mit Math.random(). Wiederhole das insgesamt 1000 mal und zähle, wie oft diese Zahl dabei größer als 0.3 ist.
Erinnerung: For-Syntax
for (Initialisierung; Bedingung; Schrittanweisung) { Anweisungsblock
}
Bonus:
I Erstelle ein Experiment für sechsseitige Würfel: Wie häufig wird die 6 gewürfelt?
I Wie ist das bei der Summe von zwei sechsseitigen Würfeln? Wie häufig ist die 7, wie häufig die 12?
7 / 22
Aufgabe: Statistik
Erzeuge eine zufällige Zahl mit Math.random(). Wiederhole das insgesamt 1000 mal und zähle, wie oft diese Zahl dabei größer als 0.3 ist.
Erinnerung: For-Syntax
for (Initialisierung; Bedingung; Schrittanweisung) { Anweisungsblock
}
Bonus:
I Erstelle ein Experiment für sechsseitige Würfel: Wie häufig wird die 6 gewürfelt?
I Wie ist das bei der Summe von zwei sechsseitigen Würfeln? Wie häufig ist die 7, wie häufig die 12?
For vs While
Beispiel: For
for(int i = 0;i < 100;i=i+1) { System.out.println(i);
}
Vergleich: While int i = 0;
while(i < 100) {
System.out.println(i);
i = i + 1;
}
Jede for-Schleife lässt sich auch als while-Schleife schreiben.
Vorteile von for:
I Schleifenkopf zeigt Anzahl der Durchläufe I Endlosschleife sofort erkennbar
8 / 22
For vs While
Beispiel: For
for(int i = 0;i < 100;i=i+1) { System.out.println(i);
}
Vergleich: While int i = 0;
while(i < 100) {
System.out.println(i);
i = i + 1;
}
Jede for-Schleife lässt sich auch als while-Schleife schreiben.
Vorteile von for:
I Schleifenkopf zeigt Anzahl der Durchläufe I Endlosschleife sofort erkennbar
Das Inkrement und die Faulheit
i = i + 1 ist für Informatiker viel zu viel Schreibarbeit!
Abkürzung für Zuweisungen
Der Ausdruck i += x ist eine Abkürzung für i = i + x. Solche Abkürzungen existieren auch für die anderen arithmetischen Operatoren
-, *, / und %.
Das reicht dem Informatiker aber immer noch nicht.
Inkrement und Dekrement
I Inkrement: i++ erhöht den Wert von i um 1. I Dekrement: i-- verringert den Wert von i um 1.
9 / 22
Das Inkrement und die Faulheit
i = i + 1 ist für Informatiker viel zu viel Schreibarbeit!
Abkürzung für Zuweisungen
Der Ausdruck i += x ist eine Abkürzung für i = i + x. Solche Abkürzungen existieren auch für die anderen arithmetischen Operatoren
-, *, / und %.
Das reicht dem Informatiker aber immer noch nicht.
Inkrement und Dekrement
I Inkrement: i++ erhöht den Wert von i um 1. I Dekrement: i-- verringert den Wert von i um 1.
Das Inkrement und die Faulheit
i = i + 1 ist für Informatiker viel zu viel Schreibarbeit!
Abkürzung für Zuweisungen
Der Ausdruck i += x ist eine Abkürzung für i = i + x. Solche Abkürzungen existieren auch für die anderen arithmetischen Operatoren
-, *, / und %.
Das reicht dem Informatiker aber immer noch nicht.
Inkrement und Dekrement
I Inkrement: i++ erhöht den Wert von i um 1. I Dekrement: i-- verringert den Wert von i um 1.
9 / 22
Das Inkrement und die Faulheit
i = i + 1 ist für Informatiker viel zu viel Schreibarbeit!
Abkürzung für Zuweisungen
Der Ausdruck i += x ist eine Abkürzung für i = i + x. Solche Abkürzungen existieren auch für die anderen arithmetischen Operatoren
-, *, / und %.
Das reicht dem Informatiker aber immer noch nicht.
Inkrement und Dekrement
I Inkrement: i++ erhöht den Wert von i um 1.
I Dekrement: i-- verringert den Wert von i um 1.
Wert vs Seiteneffekt
Vorsicht vor Zuweisungen mit Inkrement/Dekrement-Operatoren!
int x = 0;
int y = x++;
Hier ist der Wert von x zwar am Ende 1, aber der Wert von y ist 0! Der Ausdruck x++ besteht aus zwei Teilen:
I Wertdes Ausdrucks = Wert der Variable vor dem Inkrement I ZusätzlicherSeiteneffekt: x wird um 1 erhöht
Definition
Dinge, die bei der Auswertung eines Ausdrucks zusätzlich zur Berechnung des Ausdruckswerts passieren, nennt man Seiteneffekte.
10 / 22
Wert vs Seiteneffekt
Vorsicht vor Zuweisungen mit Inkrement/Dekrement-Operatoren!
int x = 0;
int y = x++;
Hier ist der Wert von x zwar am Ende 1, aber der Wert von y ist 0!
Der Ausdruck x++ besteht aus zwei Teilen:
I Wertdes Ausdrucks = Wert der Variable vor dem Inkrement I ZusätzlicherSeiteneffekt: x wird um 1 erhöht
Definition
Dinge, die bei der Auswertung eines Ausdrucks zusätzlich zur Berechnung des Ausdruckswerts passieren, nennt man Seiteneffekte.
Wert vs Seiteneffekt
Vorsicht vor Zuweisungen mit Inkrement/Dekrement-Operatoren!
int x = 0;
int y = x++;
Hier ist der Wert von x zwar am Ende 1, aber der Wert von y ist 0! Der Ausdruck x++ besteht aus zwei Teilen:
I Wert des Ausdrucks = Wert der Variable vor dem Inkrement I Zusätzlicher Seiteneffekt: x wird um 1 erhöht
Definition
Dinge, die bei der Auswertung eines Ausdrucks zusätzlich zur Berechnung des Ausdruckswerts passieren, nennt man Seiteneffekte.
10 / 22
Inhalt
Schleifen Einleitung For Funktionen
Nachmittag: Iterative Refinement und Zufallszahlen
Funktionen: Einleitung
Wollen wir den BMI von zwei Personen vergleichen, brauchen wir folgenden Code:
double w1 = 89.3;
double h1 = 1.92;
double w2 = 75.1;
double h2 = 1.85;
double bmi1 = w1 / (h1*h1);
double bmi2 = w2 / (h2*h2);
Probleme:
I Wir müssen zweimal das gleiche Schreiben. I Beim Kopieren könnten Fehler passieren.
12 / 22
Funktionen: Einleitung
Wollen wir den BMI von zwei Personen vergleichen, brauchen wir folgenden Code:
double w1 = 89.3;
double h1 = 1.92;
double w2 = 75.1;
double h2 = 1.85;
double bmi1 = w1 / (h1*h1);
double bmi2 = w2 / (h2*h2);
Probleme:
I Wir müssen zweimal das gleiche Schreiben.
I Beim Kopieren könnten Fehler passieren.
Funktionen: Definition
Definition
Durch das Definieren einer Funktiongibt man einer oft benötigten Teillösung einen Namen, damit man sie für verschiedeneEingabewerte (Argumente)anwenden kann und den richtigen Rückgabewertbekommt.
Rückgabewert: Leckerer Kaffee
Parameter/Argumente: Wasser, Pads Anweisungen (von außen unsichtbar):
Wasser kochen;
Padinhalt aufbrühen;
13 / 22
Funktionen: Syntax
Syntax
Rückgabetyp name (Parameter1, Parameter2, ...) { Anweisungsblock
return Rückgabewert;
}
Beispiel
double bmi(double weight, double height) { double result = weight / (height * height);
return result;
}
Funktionen: Aufruf
Syntax
name(Argument1, Argument2, ...);
Beispiel
bmi(89.3, 19.2);
Begriffsunterscheidung:
I Parameter: Variable für einen Eingabewert einer Funktion
I Argument: konkreter Wert, den diese Variable beim Funktionsaufruf annimmt
15 / 22
Funktionen: Aufruf
Syntax
name(Argument1, Argument2, ...);
Beispiel
bmi(89.3, 19.2);
Begriffsunterscheidung:
I Parameter: Variable für einen Eingabewert einer Funktion
I Argument: konkreter Wert, den diese Variable beim Funktionsaufruf annimmt
Funktionen: Parameter und Argumente
Wie funktioniert der Aufruf einer Funktion?
Definition
double bmi(double w, double h) { double result = w / (h * h);
return result;
}
Aufruf
double b = bmi(89.3, 19.2);
„Auflösung“ des Aufrufs
double w = 89.3; // 1. Argumentwerte in Parameter einsetzen double h = 19.2;
double result = w / (h * h); // 2. Funktionskörper ausführen double b = result; // 3. Rückgabewert einsetzen, wo
// vorher der Aufruf war
16 / 22
Aufgabe: Anhaltewegsfunktion
Schreibe eine Funktion stoppingDistance(double), die die Formel für den Anhalteweg berechnet.
Anhalteweg= Tachowert·3
10 +Tachowert2 100
Erinnerung: Funktionsdefinition Rückgabetyp name (p1, p2, ...) {
Anweisungsblock return Rückgabewert;
}
Erinnerung: Funktionsaufruf name(a1, a2, ...);
Bonus: Erstelle auch Funktionen für die anderen Rechnungen von Tag 1.
Aufgabe: Anhaltewegsfunktion
Schreibe eine Funktion stoppingDistance(double), die die Formel für den Anhalteweg berechnet.
Anhalteweg= Tachowert·3
10 +Tachowert2 100
Erinnerung: Funktionsdefinition Rückgabetyp name (p1, p2, ...) {
Anweisungsblock return Rückgabewert;
}
Erinnerung: Funktionsaufruf name(a1, a2, ...);
Bonus: Erstelle auch Funktionen für die anderen Rechnungen von Tag 1.
17 / 22
Funktionen ohne Rückgabewert
Manche Funktionen errechnen keinen Rückgabewert, sondern erzeugen nur Seiteneffekte.
Für solche Funktionen gibt es den Rückabetyp void. Beispiel: Variable mit Namen ausgeben
void printIntVar(String name, int value) { System.out.println(name+" = "+value);
}
printIntVar("a",10);
printIntVar("x",-7);
Wert vs Seiteneffekt in Funktionen
Seiteneffekte sind nicht immer unerwünscht. Sie können ...
I Zustandsänderungen herbeiführen I Ausgaben erzeugen
I Nachrichten an das Betriebssystem schicken
Man sollte einer Funktion aber immer ansehen können, ob sie Seiteneffekte erzeugt.
double bmi(double weight, double height) { double res = weight / (height * height);
System.out.println("Deine Mutter wiegt "+weight+" Tonnen!"); }
I double bmi(double, double) sieht nach Rechnung aus I erzeugt aber auch Ausgabe
⇒ Ausgabe lieber in eigener Funktion void deiMudder(double)
19 / 22
Wert vs Seiteneffekt in Funktionen
Seiteneffekte sind nicht immer unerwünscht. Sie können ...
I Zustandsänderungen herbeiführen I Ausgaben erzeugen
I Nachrichten an das Betriebssystem schicken
Man sollte einer Funktion aber immer ansehen können, ob sie Seiteneffekte erzeugt.
double bmi(double weight, double height) { double res = weight / (height * height);
System.out.println("Deine Mutter wiegt "+weight+" Tonnen!");
}
I double bmi(double, double) sieht nach Rechnung aus I erzeugt aber auch Ausgabe
⇒ Ausgabe lieber in eigener Funktion void deiMudder(double)
Zusammenfassung
Beispiel: for-Schleife
for (int i=0;i<100;i++) { System.out.println(i);
}
Beispiel: Funktion
int rollDice(int sides) { double r = Math.random();
int ir = (int) (r*sides);
return ir+1;
}
Beispiel: While-Schleife String s = "";
while(s.length() < 10) { s = s + "#";
System.out.println(s);
}
Beispiel: Funktionsaufruf rollDice(6);
20 / 22
Inhalt
Schleifen Einleitung For Funktionen
Nachmittag: Iterative Refinement und Zufallszahlen
Mögliche Themen zur Besprechung am Nachmittag
Iterative refinement
I Funktionen als Platzhalter in komplexen Programmen
I Top-Down vs Bottom-Up - wie komme ich an meine erste Zeile Code zu einem Problem?
I Was versteht man unter literate programming?
Zufallszahlen
I Erzeugt Math.random() echten Zufall?
I Mein eigener (dummer) Zufallszahlengenerator.
I Ereignisse mit beliebiger Wahrscheinlichkeit.
22 / 22