Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tagestachometer).Wenn.

Ähnliche Präsentationen


Präsentation zum Thema: "Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tagestachometer).Wenn."—  Präsentation transkript:

1 Verzweigung oder bedingte Anweisung

2 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 !

3 d = zneu – zalt Ausgabe (bv100) Eingabe(zalt) Eingabe(zneu) Eingabe(bv) bv100 = bv / d * 100

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

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

6 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?

7 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 km Welche Differenz berechnet das Programm?

8 Aufgabe: Verändern Sie das Flussdiagramm so, dass dieser Fall (Tachoüberlauf) berücksichtigt wird.

9 d = zneu – zalt Ausgabe (bv100) Eingabe(zalt) Eingabe(zneu) Eingabe(bv) bv100 = bv / d * 100

10 zneu zalt f w Eingabe(zalt) Eingabe(zneu) Eingabe(bv) zneu = zneu

11 zneu zalt f w Eingabe(zalt) Eingabe(zneu) Eingabe(bv) zneu = zneu d = zneu – zalt Ausgabe(bv100) bv100 = bv / d * 100

12 Java-Syntax für die Einseitige Verzweigung

13 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

14 Aufgabe: Verändern Sie das Java-Programm so, dass dieser Fall (Tachoüberlauf) berücksichtigt wird.

15 ... if(zneu <= zalt){ zneu = zneu ; } 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.

16 Struktogramme als Alternative zu Flussdiagrammen

17 Eingaben, Ausgaben, einfache Anweisungen. Beispiele: Fläche = Länge * Breite Umfang = 2*(Länge + Breite)

18 Flussdiagramm für eine Einseitige Verzweigung

19 zneu <= zalt f w zneu = zneu

20 Struktogramm für eine Einseitige Verzweigung

21 zneu <= zalt w zneu = zneu f Bei einer zweiseitigen Verzweigung würde hier mindestens eine Anweisung stehen!

22 Beispiel:

23 //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 !

24 Eingabe(bv) Eingabe(zneu) Eingabe(zalt) Bitte Struktogramm zum vorigen Java- Programm vervollständigen !

25 d = zneu–zalt Ausgabe(bv100) bv100 = bv/d*100 zneu <= zalt w f Eingabe(bv) Eingabe(zneu) Eingabe(zalt) zneu = zneu+1000 Ausgabe("Tachoüberlauf")

26 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 !!!

27 max = b Ausgabe(max) a < b w f Eingabe(b) Eingabe(a) max = a a >= b w f Ist es möglich, dass das Programm alle zwei false-Teile durchläuft?

28 max = b Ausgabe(max) a < b w f Eingabe(b) Eingabe(a) max = a a >= b w f Nein, denn wenn eine Bedingung false ist, muss die andere Bedingung true sein!

29 a < b f w Eingabe(a) Eingabe(b) max = b Ausgabe(max) a >= b f w max = a

30 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

31 System.out.println("erste Zahl eingeben"); BufferedReader myinput = new BufferedReader(new InputStreamReader( System.in));

32 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

33 if (a

34 } }

35 Wir machen ein paar Tests, denn die Wahrheit ist konkret ! Um Platz zu sparen schreiben wir statt System.out.println abgekürzt: sout

36 if (a=b){ max = a; } 1 2 Für a werde 2 eingegeben Für b werde 1 eingegeben

37 if (a=b){ max = a; } 5 3 Für a werde 3 eingegeben Für b werde 5 eingegeben

38 if (a=b){ max = a; } 7 7 Für a werde 7 eingegeben Für b werde 7 eingegeben

39 Andere Lösung mit einseitiger Verzweigung:

40 max = b Ausgabe(max) a < b w f Eingabe(b) Eingabe(a) max = a a > b w f max = a a == b w f

41 Andere Lösung mit einseitiger Verzweigung:

42 max = b Ausgabe(max) a < b w 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

43 oder als eine elegantere Alternative:

44 Aufgabe: Bestimmen des Maximums zweier ganzer Zahlen. Flussdiagramm mit zweiseitiger Verzweigung !

45 a < b f w Eingabe(a) Eingabe(b) max = b Ausgabe(max) max = a Ende Anfang

46 Und hier das zugehörige Struktogramm für diese zweiseitige Verzweigung

47 a

48 Java - Syntax für die zweiseitige Verzweigung

49 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

50 Wie kann man also ganz allgemein die folgende zweiseitige Verzweigung durch zwei einseitige Verzweigungen darstellen ?

51 if (B){ A1; } else{ A2; } if(B){ A1; } if(!B){ A2; } A1, A2 und B sind alles Ausdrücke

52 Aufgabe: Bestimmung des Maximums zweier ganzer Zahlen. Java-Programm

53 if (a

54 }

55 Programmverlauf

56 Annahme: Bedingung wahr

57 if (a

58 Annahme: Bedingung falsch

59 if (a

60 Warum ist folgende Lösung falsch ? Frage:

61 if (a

62 Programmverlauf

63 Annahme: Bedingung wahr

64 if (a

65 Annahme: Bedingung falsch

66 if (a

67 Aufgabe: Bestimmen des Maximums und Minimums zweier ganzer Zahlen. Struktogramm + Java-Programm

68 a

69 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...

70 if (a

71 System.out.println("Max= " +max+" Min= "+min); } }

72 Block: Fasst mehrere Anweisungen zusammen.

73 Vorschlag: In "nicht einfachen" Anweisungen (wie z.B. if...else, bzw. if) immer Block benutzen.

74 WICHTIG: Nach einem Block kommt kein Semikolon.

75 Stellen Sie den Algorithmus durch ein Struktogramm dar, der das Maximum dreier in beliebiger Reihenfolge eingegebener Zahlen berechnet. Aufgabe:

76 Eingabe(z1,z2,z3) z1

77 Erstellen Sie das zu diesem Struktogramm zugehörige Java-Programm

78 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...

79 if(z1

80 Stellen Sie den Algorithmus durch ein Struktogramm dar, der das Maximum und Minimum dreier in beliebiger Reihenfolge eingegebener Zahlen berechnet. Aufgabe:

81 Eingabe(z1,z2,z3) z1z3 W F min= z3

82 Erstellen Sie das zu diesem Struktogramm zugehörige Java-Programm

83 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...

84 if(z1 z3){ min=z3; } sout("Max= "+max+" Min= "+min); }

85 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:

86 TESTEN Sie mit den gerade angegebenen Zahlenkombinationen dieses Struktogramm.

87 TESTEN Sie Ihre Lösung (Struktogramm). Machen Sie dazu folgende Überlegungen:

88 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.

89 3 verschiedene Zahlen: a b c a c b b a c b c a c a b c b a

90 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.

91 Genau 2 gleiche Zahlen: a a b b a a a b a b b a a b b b a b

92 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.

93 Genau 3 gleiche Zahlen: a a a

94 Zusammengefasst: a b c a c b b a c b c a c a b c b a a a b b a a a b a b b a a b b b a b a a a

95 Eine mögliche Lösung der vorigen Aufgabe:

96 Bemerkung: Die Lösung wird in der folgenden Folie durch ein Flußdiagramm dargestellt. Wandeln Sie dieses Flussdiagramm in ein Struktogramm um.

97 w k:=z3 m:=z1 g:=z2 z1 < z2 f z3 < z1 z3 < z2 k:=z1 m:=z3 g:=z2 k:=z1 m:=z2 g:=z3 k:=z3 m:=z2 g:=z1 z3 < z2 z3 < z1 k:=z2 m:=z3 g:=z1 k:=z2 m:=z1 g:=z3 Ausgabe(k,m,g) w w w w f f f f

98 z1

99 z1

100 TESTEN Sie mit den gerade angegebenen Zahlenkombinationen dieses Struktogramm.

101 Erstellen Sie das zu diesem Struktogramm zugehörige Java-Programm

102 import java.io.*; public class MainMaximum1 { public static void main() throws IOException{ int z1,z2,z3,m,g,k; String str;

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

104 if (z1

105 System.out.println("sortierte Reihenfolge=" +" "+k+" "+m+" "+g); }

106 Nochmals zum EVA-Prinzip

107 Das EVA-Prinzip bedeutet: In einer Anweisung dürfen nicht zwei verschiedene Komponenten von EVA stehen (wie z.B. V und A)

108 Eingabe(zaehler, nenner) nenner != 0 WF erg = zaehler / nenner Ausgabe(erg) Ausgabe("unerlaubte Division durch 0") E V A + Schlechter Programmierstil: 2 Komponenten in 1 Anweisung

109 Guter Programmierstil:

110 Eingabe(zaehler, nenner) zaehler != 0 WF erg = zaehler / nenner erlaubt = 1 erlaubt = 0 E V erlaubt == 1 WF Ausgabe(erg) A Ausgabe("Division durch 0")

111 Eingabe(zaehler, nenner) WF erg = zaehler / nenner erlaubt = 1 erlaubt = 0 E V erlaubt == 1 WF Ausgabe(erg) A Ausgabe("Division durch 0") Wieviel if...else Anweisungen kommen in diesem Programm vor? Genau 2! zaehler != 0

112 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.

113 ... 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?

114 ... 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

115 Geben Sie dazu ein paar Beispiele...

116 ... if(n/t * t == n){ // t teilt n } else{ //... }... Also ist die nächste Anweisung im if-Teil der if... else Anweisung * 7 =

117 ... if(n/t * t == n){ //... } else{ // t teilt n nicht }... Also ist die nächste Anweisung im else-Teil der if... else Anweisung * 7


Herunterladen ppt "Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tagestachometer).Wenn."

Ähnliche Präsentationen


Google-Anzeigen