Verzweigung oder
bedingte Anweisung
Aufgabe:Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei-stelliger Tagestachometer).Wenn er das nächste Mal tankt, macht er das gleiche und notiert sich zusätzlich noch die getankten Liter.Wie groß ist der Benzinverbrauch pro 100 km ?Flussdiagramm + Java-Programm !
d = zneu – zalt
Ausgabe (bv100)
Eingabe(zalt)
Eingabe(zneu)
Eingabe(bv)
bv100 = bv / d * 100
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;
public class MainBenzinrechner1 { throws IOException{ public static void main() throws IOException{ double zalt, zneu, d, bv, bv100; String str;
System.out.println("Kilometerstand alt eingeben"); BufferedReader myinput = new BufferedReader(new InputStreamReader(System.in)); str = myinput.readLine(); zalt=Double.parseDouble(str);
System.out.println("Kilometerstand neu eingeben"); str = myinput.readLine(); zneu=Double.parseDouble(str);
System.out.println("Benzinverbrauch eingeben"); str = myinput.readLine(); bv=Double.parseDouble(str); d = zneu - zalt; bv100 = bv/d * 100; System.out.println("L/100 km: " +bv100); }} Differenz kann negativ werden
Wann berechnet das Java-Programm ein falsches Ergebnis?
Zählerstand beim 1. Tankvorgang: 900 km
Beispiel für negative Differenz
Zählerstand beim 2. Tankvorgang: 100 km
Differenz = 100 – 900 = - 800km
Es werden nun 200 km bis zum nächsten Tankvorgang gefahren.Welcher Kilometerstand steht dann auf dem Tacho?
Welcher neue Kilometerstand müsste in Wirklichkeit aber auf dem Tacho stehen?
1000 km + 100 km
Welche Differenz berechnet das Programm?
Aufgabe:Verändern Sie das Flussdiagramm so, dass dieser Fall (Tachoüberlauf) berücksichtigt wird.
d = zneu – zalt
Ausgabe (bv100)
Eingabe(zalt)
Eingabe(zneu)
Eingabe(bv)
bv100 = bv / d * 100
zneu zaltf
w
Eingabe(zalt)
Eingabe(zneu)
Eingabe(bv)
zneu = zneu + 1000
zneu zaltf
w
Eingabe(zalt)
Eingabe(zneu)
Eingabe(bv)
zneu = zneu + 1000
d = zneu – zalt
Ausgabe(bv100)
bv100 = bv / d * 100
Java-Syntax für die Einseitige
Verzweigung
if (Ausdruck) Anweisung;
Bedingung Nächste auszuführende Anweisung, wenn Bedingung wahr.
Wahr bedeutet:
Wert des Ausdrucks: true
Nächste auszuführende (d.h. die diesem roten Rahmen folgende) Anweisung,
wenn Bedingung falsch.Falsch bedeutet:
Wert des Ausdrucks: false
Aufgabe:Verändern Sie das Java-Programm so, dass dieser Fall (Tachoüberlauf) berücksichtigt wird.
... if(zneu <= zalt){ zneu = zneu + 1000; } d = zneu - zalt; bv100 = bv/d * 100; System.out.println("L/100 km:" +bv100);
}
bei einer Anweisung sind Klammern nicht nötig.
Trotzdem:Immer Klammern machen.
Struktogrammeals Alternative zu Flussdiagrammen
Eingaben, Ausgaben, einfache
Anweisungen.Beispiele:
Fläche = Länge * Breite
Umfang = 2*(Länge + Breite)
Flussdiagramm für eine
Einseitige Verzweigung
zneu <= zaltf
w
zneu = zneu + 1000
Struktogramm für eine Einseitige Verzweigung
zneu <= zalt
w
zneu = zneu + 1000
f
Bei einer zweiseitigen Verzweigung würde hier mindestens eine Anweisung stehen!
Beispiel:
//Eingabeteil (wurde weg-// gelassen)
if (zneu <= zalt) zneu = zneu+1000; System.out.println("Tacho- überlauf");}d = zneu–zalt;erg = b/d*100;System.out.println("L/100 km:" +erg);
Block (Verbundanweisung): fasst mehrere Anweisungen zusammen
{
Übrigens: Welchem Prinzip widerspricht dieses Programm ?
Dem EVA-Prinzip !
Eingabe(bv)
Eingabe(zneu)
Eingabe(zalt)
Bitte Struktogramm zum vorigen Java-
Programm vervollständigen !
d = zneu–zalt
Ausgabe(bv100)
bv100 = bv/d*100
zneu <= zaltw f
Eingabe(bv)
Eingabe(zneu)
Eingabe(zalt)
zneu = zneu+1000
Ausgabe("Tachoüberlauf")
Aufgabe:Bestimmung des Maximums zweier ganzer Zahlen, also:
Struktogramm + Flussdiagramm +C-Programm !
Achtung: Bis jetzt können wir nur die einseitige Verzweigung in C umsetzen !!!
max = b
Ausgabe(max)
a < bw f
Eingabe(b)
Eingabe(a)
max = a
a >= bw f
Ist es möglich, dass das Programm alle zwei false-Teile durchläuft?
max = b
Ausgabe(max)
a < bw f
Eingabe(b)
Eingabe(a)
max = a
a >= bw f
Nein, denn wenn eine Bedingung false ist, muss die andere Bedingung true sein!
a < bf
w
Eingabe(a)
Eingabe(b)
max = b
Ausgabe(max)
a >= bf
w
max = a
import java.io.*;
public class MainMaximum1 { public static void main() throws IOException{ int a,b,max; String str;
Möglich: Trennen von Variablennamen mit Komma
System.out.println("erste Zahl eingeben"); BufferedReader myinput = new BufferedReader(new InputStreamReader( System.in));
str = myinput.readLine(); a=Integer.parseInt(str);
System.out.println("zweite Zahl eingeben"); str = myinput.readLine(); b=Integer.parseInt(str); // Wie geht es weiter ?
Kommentar
if (a<b){ max = b; }
System.out.println(
"Max= "+max);
if (a>=b){ max = a; }
Logisch gleichwertig:!(a<b)
}}
Wir machen ein paar Tests, denn die Wahrheit ist konkret
!
Um Platz zu sparen schreiben wir statt System.out.println
abgekürzt: sout
if (a<b){ max = b;}
sout("Max=%d", max);
if (a>=b){ max = a;}
12 Für a werde 2 eingegeben
Für b werde 1 eingegeben
2 1
2
2
if (a<b){ max = b;}
sout("Max=%d", max);
if (a>=b){ max = a;}
53 Für a werde 3 eingegeben
Für b werde 5 eingegeben
3 5
5
5
if (a<b){ max = b;}
sout("Max=%d", max);
if (a>=b){ max = a;}
77 Für a werde 7 eingegeben
Für b werde 7 eingegeben
7 7
7
7
Andere Lösung mit einseitiger
Verzweigung:
max = b
Ausgabe(max)
a < bw f
Eingabe(b)
Eingabe(a)
max = a
a > bw f
max = a
a == bw f
Andere Lösung mit einseitiger
Verzweigung:
max = b
Ausgabe(max)
a < bw f
Eingabe(b)
Eingabe(a)
max = a;
Das vorläufige Maximum wird auf den Wert der Variablen a gesetzt.
Ist das vorläufige Maximum kleiner als die 2. Zahl, dann ist das endgültige Maximum gleich der 2. Zahl
oder als eine elegantere Alternative:
Aufgabe:
Bestimmen des Maximums zweier ganzer Zahlen.
Flussdiagramm mit zweiseitiger Verzweigung !
a < bf
w
Eingabe(a)
Eingabe(b)
max = b
Ausgabe(max)
max = a
Ende
Anfang
Und hier das zugehörige
Struktogramm für diese zweiseitige
Verzweigung
a<bw
max = b
f
max = a
Java - Syntax für die zweiseitige
Verzweigung
if (Ausdruck) Anweisung1;else Anweisung2;
Nächste Anweisung, wenn Bedingung wahr
Bedingung
Nächste Anweisung, wenn Bedingung falsch
wahr bedeutet:Wert des Ausdrucks: true
falsch bedeutet:Wert des Ausdrucks: false
Wie kann man also ganz allgemein die folgende
zweiseitige Verzweigung durch zwei einseitige
Verzweigungen darstellen ?
if (B){ A1;}else{ A2;}
if(B){ A1;}if(!B){ A2;}
A1, A2 und B sind alles Ausdrücke
Aufgabe:
Bestimmung des Maximums zweier ganzer
Zahlen.Java-Programm
if (a<b){ max = b;}else{ max = a;}
System.out.println("Maximum= " +max);
Bedingung
Nächste Anweisung, wenn Bedingung wahr
Nächste Anweisung, wenn Bedingung falsch
bei einer Anweisung sind Klammern nicht nötig.
Trotzdem:Immer Klammern machen.
}
Programmverlauf
Annahme:
Bedingung wahr
if (a<b){ max = b;}else{ max = a;}
sout("Maximum =%d", max);
1 22
2
Zum Beispiel ...
Annahme:
Bedingung falsch
if (a<b){ max = b;}else{ max = a;}
sout("Maximum =%d", max);
2 1
2
2
Zum Beispiel ...
Warum ist folgende Lösung falsch ?
Frage:
if (a<b){ max = b;}sout("Maximum =%d", max);
}
Programmverlauf
Annahme:
Bedingung wahr
if (a<b){ max = b;}sout("Maximum = %d ", max);
1 2
Zum Beispiel ...2
2
Annahme:
Bedingung falsch
if (a<b){ max = b;}
Wert von max ist unbekannt und deshalb mit hoher Wahrscheinlichkeit nicht gleich dem Wert von a
sout("Maximum = %d ", max);
2 1Zum Beispiel ...
?
Aufgabe:
Bestimmen des Maximums und Minimums zweier
ganzer Zahlen.Struktogramm +Java-Programm
a<bw
max = b
f
max = a
min = a min = b
Eingabe(a,b)
Ausgabe (max,min)
import java.io.*;
public class MainMaximum1 { public static void main() throws IOException{ int a,b,min,max; String str; // Eingabeteil wie immer // Dann weiter mit ...
if (a<b){ max = b; min = a; }else{ max = a; min = b;}
Anweisungen in einem Block zusammenfassen
Blockbeginn
Blockende
kein Semikolon
System.out.println("Max= "
+max+" Min= "+min); }}
Block: Fasst mehrere Anweisungen zusammen.
Vorschlag: In "nicht
einfachen" Anweisungen (wie z.B. if...else, bzw. if) immer Block
benutzen.
WICHTIG: Nach einem Block
kommt keinSemikolon.
Stellen Sie den Algorithmus durch ein Struktogramm dar, der das Maximum dreier in beliebiger Reihenfolge eingegebener Zahlen berechnet.
Aufgabe:
Eingabe(z1,z2,z3)
z1<z2W F
max = z2 max = z1
max<z3W F
max = z3
Ausgabe(max)
Erstellen Sie das zu diesem Struktogramm zugehörige
Java-Programm
import java.io.*;
public class MainMaximum1 { public static void main() throws IOException{ int z1,z2,z3,max; String str; // Eingabeteil wie immer // Dann weiter mit ...
if(z1<z2){ max=z2; } else{ max=z1; } if(max<z3){ max=z3; } System.out.println("Max= " +max);}
Stellen Sie den Algorithmus durch ein Struktogramm dar, der das Maximum und Minimum dreier in beliebiger Reihenfolge eingegebener Zahlen berechnet.
Aufgabe:
Eingabe(z1,z2,z3)
z1<z2W Fmax = z2
Ausgabe(max, min)
min = z1max = z1min = z2
max<z3W F
max = z3
min>z3W F
min= z3
Erstellen Sie das zu diesem Struktogramm zugehörige
Java-Programm
import java.io.*;
public class MainMaximum1 { public static void main() throws IOException{ int z1,z2,z3,max,min; String str; // Eingabeteil wie immer // Dann weiter mit ...
if(z1<z2){ max=z2; min=z1; } else{ max=z1; min=z2; } if(max<z3){ max=z3; } if(min>z3){ min=z3; } sout("Max= "+max+" Min= "+min);}
Erzeugen Sie einen Algorithmus (und stellen Sie diesen durch ein Struktogramm dar), der drei in beliebiger Reihenfolge eingegebene Zahlen ihrer Größe nach sortiert und ausgibt (kleinste, mittlere, grösste).
Aufgabe:
TESTEN Sie mit den gerade angegebenen Zahlenkombinationen dieses Struktogramm.
TESTEN Sie Ihre Lösung (Struktogramm).Machen Sie dazu folgende Überlegungen:
Unter 3 Zahlen gibt es genau 3 verschiedene, genannt a, b und c.Wie viele verschiedene Möglichkeiten (bzgl. der Reihenfolge der Eingabe) gibt es diese 3 Zahlen einzugeben? Bitte notieren Sie diese Möglichkeiten.
3 verschiedene Zahlen:a b ca c bb a cb c ac a bc b a
Unter 3 Zahlen gibt es genau 2 verschiedene, genannt a und b.Wie viele verschiedene Möglichkeiten (bzgl. der Reihenfolge der Eingabe) gibt es diese 3 Zahlen einzugeben? Bitte notieren Sie diese Möglichkeiten.
Genau 2 gleiche Zahlen:a a bb a aa b a b b aa b bb a b
Unter 3 Zahlen gibt es genau 3 gleiche, genannt a, a, und a.Wie viele verschiedene Möglichkeiten (bzgl. der Reihenfolge der Eingabe) gibt es diese 3 Zahlen einzugeben? Bitte notieren Sie diese Möglichkeiten.
Genau 3 gleiche Zahlen:a a a
Zusammengefasst:
a b ca c bb a cb c ac a bc b a
a a bb a aa b a b b aa b bb a b
a a a
Eine mögliche Lösung der vorigen Aufgabe:
Bemerkung:Die Lösung wird in der folgenden Folie durch ein Flußdiagramm dargestellt. Wandeln Sie dieses Flussdiagramm in ein Struktogramm um.
w
k:=z3m:=z1g:=z2
z1 < z2 f
z3 < z1
z3 < z2
k:=z1m:=z3g:=z2
k:=z1m:=z2g:=z3
k:=z3m:=z2g:=z1
z3 < z2
z3 < z1
k:=z2m:=z3g:=z1
k:=z2m:=z1g:=z3
Ausgabe(k,m,g)
w
w
w
w
f f
ff
z1<z2W F
z3<z1W F
k=z3m=z1g=z2
z3<z2W Fk=z1m=z3g=z2
k=z1m=z2g=z3
z3<z2W F
k=z3m=z2g=z1
z3<z1W Fk=z2m=z3g=z1
k=z2m=z1g=z3
Eingabe(z1, z2, z3)
Ausgabe(k, m, g)
z1<z2W F
z3<z1W F
k=z3m=z1g=z2
z3<z2W Fk=z1m=z3g=z2
k=z1m=z2g=z3
z3<z2W F
k=z3m=z2g=z1
z3<z1W Fk=z2m=z3g=z1
k=z2m=z1g=z3
Eingabe(z1, z2, z3)
Ausgabe(k, m, g)
Wieviel if...else Anweisungen kommen in diesem Programm vor?
Genau eine (die rot umrandete)! Diese ist allerdings verschachtelt !!!
TESTEN Sie mit den gerade angegebenen Zahlenkombinationen dieses Struktogramm.
Erstellen Sie das zu diesem Struktogramm zugehörige
Java-Programm
import java.io.*;
public class MainMaximum1 { public static void main() throws IOException{ int z1,z2,z3,m,g,k; String str;
System.out.println("1. Zahl eingeben"); BufferedReader myinput = new BufferedReader(new InputStreamReader( System.in));
str = myinput.readLine(); z1=Integer.parseInt(str);
System.out.println("2. Zahl eingeben"); str = myinput.readLine(); z2=Integer.parseInt(str);
System.out.println("3. Zahl eingeben"); str = myinput.readLine(); z3=Integer.parseInt(str);
if (z1<z2){ if(z3<z1){ k=z3; m=z1; g=z2; } else{ if(z3<z2){ k=z1; m=z3; g=z2; } else{ k=z1; m=z2; g=z3; } } } else{ if(z3<z2){ k=z3; m=z2; g=z1; } else{ if(z3<z1){ k=z2; m=z3; g=z1; } else{ k=z2; m=z1; g=z3; } } }
System.out.println("sortierte Reihenfolge=" +" "+k+" "+m+" "+g); }}
Nochmals zum EVA-Prinzip
Das EVA-Prinzip bedeutet:In einer Anweisung dürfen
nicht zwei verschiedene Komponenten von EVA stehen
(wie z.B. V und A)
Eingabe(zaehler , nenner)
nenner != 0W F
erg = zaehler / nenner
Ausgabe(erg)
Ausgabe("unerlaubte Division durch 0")
E
V
A+
Schlechter Programmierstil:
2 Komponenten in 1 Anweisung
Guter Programmierstil:
Eingabe(zaehler , nenner)
zaehler != 0W F
erg = zaehler / nenner
erlaubt = 1
erlaubt = 0
E
V
erlaubt == 1W F
Ausgabe(erg)A
Ausgabe("Division durch 0")
Eingabe(zaehler , nenner)
W F
erg = zaehler / nenner
erlaubt = 1
erlaubt = 0
E
V
erlaubt == 1W F
Ausgabe(erg)A
Ausgabe("Division durch 0")
Wieviel if...else Anweisungen kommen in diesem Programm vor?
Genau 2!
zaehler != 0
Aufgabe:Die Variablen n und t sollen den Datentyp integer haben.
Mit welcher Anweisung kann man nachprüfen, ob t ein Teiler von n ist, wie z.B. 3 ein Teiler
von 18 ist.
... if(n % t == 0){ // t teilt n } else{ // t teilt n nicht } ...
Mit dem Operator % wird der Rest berechnet. Wenn t Teiler von n ist, ist
der Rest gleich 0.
Gibt es eine andere Lösung, die die Operatoren / und * benutzt?
... if(n/t * t == n){ // t teilt n} else{ // t teilt n nicht } ...
Wenn n von t nicht geteilt wird, wird der Rest bei der Division abgeschnitten und
somit das Produkt n/t * t ungleich n
Geben Sie dazu ein paar Beispiele ...
... if(n/t * t == n){ // t teilt n} else{ // ... } ...
Also ist die nächste Anweisung im if-Teil der if ... else Anweisung.
21 7 7 21
3 * 7 21=
... if(n/t * t == n){ // ...} else{ // t teilt n nicht } ...
Also ist die nächste Anweisung im else-Teil der if ... else Anweisung.
20 7 7 20
2 * 7 20≠
Top Related