• Keine Ergebnisse gefunden

Brückenkurs Programmieren Tag 3: For-Schleifen und Funktionen Christopher Schölzel

N/A
N/A
Protected

Academic year: 2022

Aktie "Brückenkurs Programmieren Tag 3: For-Schleifen und Funktionen Christopher Schölzel"

Copied!
38
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Brückenkurs Programmieren

Tag 3: For-Schleifen und Funktionen

Christopher Schölzel

Technische Hochschule Mittelhessen

4. September 2019

(2)

Inhalt

Schleifen Einleitung For

Funktionen

Nachmittag: Iterative Refinement und Zufallszahlen

2 / 22

(3)

Inhalt

Schleifen Einleitung For

Funktionen

Nachmittag: Iterative Refinement und Zufallszahlen

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

}

(10)

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

(11)

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

}

(12)

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

(13)

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?

(14)

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

(15)

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

(16)

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

(17)

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.

(18)

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

(19)

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.

(20)

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

(21)

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.

(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 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

(23)

Inhalt

Schleifen Einleitung For Funktionen

Nachmittag: Iterative Refinement und Zufallszahlen

(24)

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

(25)

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.

(26)

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

(27)

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;

}

(28)

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

(29)

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

(30)

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

(31)

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.

(32)

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

(33)

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

(34)

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

(35)

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)

(36)

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

(37)

Inhalt

Schleifen Einleitung For Funktionen

Nachmittag: Iterative Refinement und Zufallszahlen

(38)

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

Referenzen

ÄHNLICHE DOKUMENTE

Bunte Fenster und die Maus sind Hilfsmittel, aber es geht auch

Es könnte immer ein Würfelwurf mehr nötig sein.... // die gleichen Anweisungen wie

Nachmittag: Java-Objekte erstellen und verwenden.. über einen Index).. über einen Index).. über einen Index).. über einen Index).. über einen Index)... Arrays: Definition,

Der Callstack: Simulation Die folgenden Folien zeigen den Zustand des Stacks während der Ausführung des angegebenen Programms inklusive Rücksprungadressen und Ergebnisregister...

zwei Punkte erlauben Zahlbereiche anzugeben. – Bsp.: laptop €100..€200 ,

Durch das Definieren einer Funktion gibt man einer oft benötigten Teillösung einen Namen, damit man sie für verschiedene Eingabewerte (Argumente) anwenden kann und den

Fülle das restliche Array, indem du immer den Wert des vorherigen Elements mit 1.01 multiplizierst.. Erinnerung: Arraydefinition

Rekursive Funktionen bestehen immer aus den folgenden Bestandteilen: I mindestens ein Basisfall, in dem die Rekursion abbricht und das Ergebnis fest steht I mindestens ein