1 / 112

Verzweigung oder bedingte Anweisung

Verzweigung oder bedingte Anweisung. Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei-stelliger Tageszähler).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 ?

Download Presentation

Verzweigung oder bedingte Anweisung

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Verzweigung oder bedingte Anweisung

  2. Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei-stelliger Tageszähler).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 + C-Programm ! Aufgabe:

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

  4. int main(){ double zalt, zneu, d, bv, bv100; printf("\nKilometerstand "); scanf("%lf", &zalt); fflush(stdin); printf("\nKilometerstand "); scanf("%lf", &zneu); fflush(stdin); printf("\nBenzinverbrauch \n"); scanf("%lf", &bv); fflush(stdin);

  5. Wann berechnet das C-Programm ein falsches Ergebnis ? ... d = zneu - zalt; bv100 = bv/d * 100; printf("L/100 km %f",bv100); return 0;} Differenz kann negativ werden

  6. Beispiel für negative Differenz Zählerstand beim 1. Tankvorgang: 900 km Es werden nun 200 km bis zum nächsten Tankvorgang gefahren. Welcher Kilometerstand steht dann auf dem Tacho? Zählerstand beim 2. Tankvorgang: 100 km Welche Differenz berechnet das Programm? Differenz = 100 – 900 = - 800km Welcher neue Kilometerstand müsste in Wirklichkeit aber auf dem Tacho stehen? 1000 km + 100 km

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

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

  9. Eingabe(zalt) Eingabe(zneu) Eingabe(bv) zneu  zalt f w zneu = zneu + 1000

  10. Eingabe(zalt) Eingabe(zneu) Eingabe(bv) Ausgabe(bv100) zneu  zalt f w zneu = zneu + 1000 d = zneu – zalt bv100 = bv / d * 100

  11. C-Syntax für die Einseitige Verzweigung

  12. Nächste auszuführende Anweisung, wenn Bedingung wahr. Wahr bedeutet: Wert des Ausdrucks: !=0 Bedingung if (Ausdruck) Anweisung; Nächste auszuführende (d.h. die diesem roten Rahmen folgende) Anweisung, wenn Bedingung falsch. Falsch bedeutet: Wert des Ausdrucks: 0

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

  14. ...if(zneu <= zalt){ zneu = zneu + 1000; }d = zneu - zalt; bv100 = bv/d * 100; printf("L/100km %f",bv100); return 0;} bei einer Anweisung sind Klammern nicht nötig. Trotzdem: Immer Klammern machen.

  15. Struktogramme als Alternative zu Flussdiagrammen

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

  17. Flussdiagramm für eine Einseitige Verzweigung

  18. f zneu <= zalt w zneu = zneu + 1000

  19. Struktogramm für eine Einseitige Verzweigung

  20. Bei einer zweiseitigen Verzweigung würde hier mindestens eine Anweisung stehen! zneu <= zalt w f zneu = zneu + 1000

  21. Beispiel:

  22. Dem EVA-Prinzip ! //Eingabeteil (wurde weg-// gelassen) Block (Verbundanweisung): fasst mehrere Anweisungen zusammen if (zneu <= zalt) { zneu = zneu+1000; printf("Zählerüberlauf"); } d = zneu–zalt; erg = b/d*100; printf("\n L/100 km %f",erg); Übrigens: Welchem Prinzip widerspricht dieses Programm ?

  23. Eingabe(zalt) Eingabe(zneu) Bitte Struktogramm zum vorigen C-Programm vervollständigen ! Eingabe(bv)

  24. Eingabe(zalt) Eingabe(zneu) Eingabe(bv) zneu <= zalt w f zneu = zneu+1000 Ausgabe("Zählerüberlauf") d = zneu–zalt bv100 = bv/d*100 Ausgabe(bv100)

  25. Bestimmung des Maximums zweier ganzer Zahlen, also: Struktogramm + Flussdiagramm + C-Programm ! Achtung: Bis jetzt können wir nur die einseitige Verzweigung in C umsetzen !!! Aufgabe:

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

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

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

  29. Möglich: Trennen von Variablennamen mit Komma #include "stdafx.h" #include <stdio.h>int main(){ int a,b,max; printf("\nEingabe der ersten Zahl: ");scanf("%d", &a); fflush(stdin); printf("\nEingabe der zweiten Zahl: ");scanf("%d", &b);fflush(stdin);// Wie geht es weiter ? Kommentar

  30. Logisch gleichwertig: !(a<b) if (a<b){  max = b;} if (a>=b){  max = a; } printf("Max=%d", max);

  31. return 0;}

  32. Wir machen ein paar Tests, denn die Wahrheit ist konkret !

  33. 2 1 Für a werde 2 eingegeben if (a<b){  max = b;} Für b werde 1 eingegeben if (a>=b){  max = a; } 1 2 2 printf("Max=%d", max); 2

  34. 3 5 Für a werde 3 eingegeben if (a<b){  max = b;} Für b werde 5 eingegeben 5 if (a>=b){  max = a; } 5 3 printf("Max=%d", max); 5

  35. 7 7 Für a werde 7 eingegeben if (a<b){  max = b;} Für b werde 7 eingegeben if (a>=b){  max = a; } 7 7 7 printf("Max=%d", max); 7

  36. Andere Lösung mit einseitiger Verzweigung:

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

  38. Andere Lösung mit einseitiger Verzweigung:

  39. 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 Eingabe(a) Eingabe(b) max = a; a < b w f max = b Ausgabe(max)

  40. oder als eine elegantere Alternative:

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

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

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

  44. a<b w f max = b max = a

  45. C - Syntax für die zweiseitige Verzweigung

  46. Bedingung Nächste Anweisung, wenn Bedingung wahr if (Ausdruck) Anweisung1;else Anweisung2; falsch bedeutet:Wert des Ausdrucks = 0 wahr bedeutet:Wert des Ausdrucks != 0 Nächste Anweisung, wenn Bedingung falsch

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

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

  49. Aufgabe: Bestimmung des Maximums zweier ganzer Zahlen. C-Programm

  50. Bedingung if (a<b){  max = b;}else{ max = a;} Nächste Anweisung, wenn Bedingung wahr bei einer Anweisung sind Klammern nicht nötig. Trotzdem: Immer Klammern machen. Nächste Anweisung, wenn Bedingung falsch printf("Maximum =%d", max);

More Related