1.12k likes | 1.31k Views
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 ?
E N D
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 ? Flussdiagramm + C-Programm ! Aufgabe:
Ausgabe (bv100) Eingabe(zalt) Eingabe(zneu) Eingabe(bv) d = zneu – zalt bv100 = bv / d * 100
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);
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
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
Verändern Sie das Flussdiagramm so, dass dieser Fall (Zählerüberlauf) berücksichtigt wird. Aufgabe:
Ausgabe (bv100) Eingabe(zalt) Eingabe(zneu) Eingabe(bv) d = zneu – zalt bv100 = bv / d * 100
Eingabe(zalt) Eingabe(zneu) Eingabe(bv) zneu zalt f w zneu = zneu + 1000
Eingabe(zalt) Eingabe(zneu) Eingabe(bv) Ausgabe(bv100) zneu zalt f w zneu = zneu + 1000 d = zneu – zalt bv100 = bv / d * 100
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
Verändern Sie das C-Programm so, dass dieser Fall (Tachoüberlauf) berücksichtigt wird. Aufgabe:
...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.
Struktogramme als Alternative zu Flussdiagrammen
Eingaben, Ausgaben, einfache Anweisungen.Beispiele: Fläche = Länge * Breite Umfang = 2*(Länge + Breite)
f zneu <= zalt w zneu = zneu + 1000
Bei einer zweiseitigen Verzweigung würde hier mindestens eine Anweisung stehen! zneu <= zalt w f zneu = zneu + 1000
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 ?
Eingabe(zalt) Eingabe(zneu) Bitte Struktogramm zum vorigen C-Programm vervollständigen ! Eingabe(bv)
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)
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:
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?
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!
Eingabe(a) Eingabe(b) Ausgabe(max) a < b f w max = b a >= b f w max = a
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
Logisch gleichwertig: !(a<b) if (a<b){ max = b;} if (a>=b){ max = a; } printf("Max=%d", max);
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
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
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
Eingabe(a) Eingabe(b) a < b w f max = b a == b w f max = a a > b w f max = a Ausgabe(max)
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)
Aufgabe: Bestimmen des Maximums zweier ganzer Zahlen. Flussdiagramm mit zweiseitiger Verzweigung !
Eingabe(a) Eingabe(b) Ausgabe(max) Anfang a < b f w max = a max = b Ende
Und hier das zugehörige Struktogramm für diese zweiseitige Verzweigung
a<b w f max = b max = a
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
Wie kann man also ganz allgemein die folgende zweiseitige Verzweigung durch zwei einseitige Verzweigungen darstellen ?
A1, A2 und B sind alles Ausdrücke if (B){ A1;}else{ A2;} if(B){ A1;}if(!B){ A2;}
Aufgabe: Bestimmung des Maximums zweier ganzer Zahlen. C-Programm
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);