Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Vorlesung 5: Kontrollstrukturen Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Inhalt • Musterlösungen Übung 4 • Anweisungsblock • Einfache Alternative mit if und else • Mehrfache Alternative mit if und else • Mehrfache Alternative mit switch • Anfangsbedingte Schleife mit while • Anfangsbedingte Schleife mit for • Endbedingte Schleife mit do while • Sprunganweisungen: break - continue - goto Dr. J. Raimann 1 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Musterlösung Übung 4 - Aufgabe 1 #include <stdio.h> #include <stdlib.h> int main(void) { int ikm; int iliter; printf( "Programm zur Berechnung des Benzinverbrauchs\n\n"); printf( "Gefahrene Kilometer:\n"); scanf("%i",&ikm); printf( "Benzinverbrauch:\n"); scanf("%i",&iliter); printf("\nVerbrauch je Kilometer: %i\n\n", iliter * 100 / ikm); system("pause"); } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Musterlösung Übung 4 - Aufgabe 2 #include <stdlib.h> #include <stdio.h> #include <math.h> int main(void) { double x,y; printf("\n\t\tRechenprogramm \n\n"); printf("\nBitte x eingeben :"); scanf("%lf", &x); printf("\nBitte y eingeben :"); scanf("%lf",&y); printf("\n\n %lf + %lf ist %lf",x,y,x+y); printf("\n\n %lf - %lf ist %lf",x,y,x-y); printf("\n\n %lf * %lf ist %lf",x,y,x*y); printf("\n\n %lf / %lf ist %lf",x,y,x/y); printf("\n\n %lf mod %lf ist %lf",x,y,fmod(x,y)); printf("\n\n %lf pow %lf ist %lf\n\n",x,y,pow(x,y)); system("PAUSE"); } Dr. J. Raimann 2 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Kontrollstrukturen • steuern den sequentiellen Ablauf des Programms • Zu den Kontrollstrukturen gehören: o Anweisungsblöcke o Selektionen (bedingte Verzweigungen) o Iterationen (Schleifen) Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Anweisungsblock • alle Anweisungen innerhalb eines mit geschweiften Klammern begrenzten Abschnitts werden als Anweisungsblock bezeichnet { Anweisung l Anweisung_2 Anweigung_3 Anweisung_n } Dr. J. Raimann Anweisung_1 Anweisung_2 Anweisung_3 ... „Struktogramm“ 3 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Einfache Alternative (if/else) - Fallunterscheidung • Mit if/else kann im Programm alternativ auf eine logische Aussage reagiert werden. – Wenn die Temperatur den Wert 20° übersteigt, dann schalte die Heizung aus, ansonsten schalte die Heizung ein. Logische Bedingung kann nur mit ja oder nein beantwortet werden. float temp; unsigned char heizung; if (temp > 20.0) { heizung = 0; } else { heizung = 1; } ( Logische Bedingung immer in Klammern! ) Ja-Teil im eigenen Anweisungsblock Nein-Teil im eigenen Anweisungsblock nach Schlüsselwort else Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Logik in C (1) • Bei Fallunterscheidungen kommt es darauf an, ob – eine durch einen logischen Ausdruck formulierte Aussage „richtig“ oder „falsch“ ist • Generell gilt in C – Der Wert 0 bedeutet „falsch“! – Ein Wert ungleich 0 bedeutet „richtig“ (bzw. logisch wahr)! • Nicht nur die 1 ist richtig! • Alle Zahlen ungleich 0 sind richtig (d.h. logisch wahr)! int i = 10; if (i){ printf("Aussage ist richtig!\n"); } else { printf("Aussage ist falsch!\n"); } Dr. J. Raimann Es wird der if-Zweig ausgeführt, da i = 10 WAHR bedeutet! 4 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Logik in C (2) • Logische Ausdrücke, wie sie in if/else-Konstrukten ausgewertet werden, werden mit Hilfe von Operatoren formuliert • Zu den Operatoren gehören bspw. die Vergleichsoperatoren: – linke Seite wird mit rechter Seite verglichen – Ergebnis des Vergleichs ist eine binäre Information • • • • • 0 1 > >= == = unwahr (FALSE), Aussage ist falsch = wahr (TRUE), Aussage ist richtig größer < kleiner größer gleich <= kleiner gleich gleich != ungleich • Mit den sogenannten logischen Operatoren können logische Teilausdrücke miteinander verbunden und gemeinsam ausgewertet werden: – && – || – ! logisches UND logisches ODER Negation Fachhochschule Frankfurt am Main FB 2 if (x >= 10 && x <= 20){ y = 1; } else { y = 0; } Modul 12: Höhere Programmiersprache SS 2008 Beispiel: Einfache Alternative mit if und else #include <stdlib.h> #include <stdio.h> int main(void) { int x,y; printf("Bitte erste Zahl eingeben: "); scanf("%i", &x); printf("Bitte zweite Zahl eingeben: "); scanf("%i", &y); if (x < y) printf("%i ist kleiner als %i!", x,y); else printf("%i ist groesser als %i!\n\n", x,y); system("PAUSE"); } Dr. J. Raimann 5 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Bedingte Anweisung • Eine if (-else)-Anweisung, bei der der else-Zweig fehlt oder leer ist, wird als bedingte Anweisung (oder auch einseitige if-Anweisung) bezeichnet. „bedingte Anweisung“ Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Mehrfache Alternative mit if und else if (Ausdruck_l) Anweisung_l else if (Ausdruck_2) Anweisung_2 else if (Ausdruck_3) Anweisung 3 else if (Ausdruck_n) Anweisung n else /* der else-Zweig */ Anweisung_else /* ist optional */ Dr. J. Raimann 6 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: Mehrfache Alternative mit if und else #include <stdlib.h> #include <stdio.h> int main(void) { int imonat; printf("Monat eingeben (als Zahl): "); scanf("%i",&imonat); printf("\nMonat: "); if (imonat == 1) printf("Januar"); else if (imonat == 2) printf("Februar"); else if (imonat == 3) printf("Maerz"); else if (imonat == 4) printf("April"); else if (imonat == 5) printf("Mai"); /* ... */ else printf("ungueltige Eingabe"); printf("\n\n"); system("Pause"); } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Verschachtelung von if-else-Anweisungen 1. if (a) if (b > c) printf ("%d\n", b) ; else printf ("%d\n", c) ; ... Achtung: Die Klammernsetzung steuert die Zugehörigkeit des else-Zweiges zum jeweiligen if-Zweig! 2. if (a) { if (b > c) printf ("%d\n", b) ; } else printf ("%d\n", c); Dr. J. Raimann 7 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Mehrfache Alternative mit switch switch (Ausdruck) { case k1: Anweisungen_l break; case k2: Anweisungen_2 break; . . . case kn: Anweisungen_n break; default: Anweisungen_default } Fachhochschule Frankfurt am Main FB 2 /* ist optional */ /* ist optional */ /* ist optional /* */ ist optional */ Modul 12: Höhere Programmiersprache SS 2008 Beispiel: Mehrfache Alternative mit switch #include <stdlib.h> #include <stdio.h> int main (void) { int zahl; printf ("\nEingabe: "); scanf ("%d",&zahl); switch (zahl) { case 2: case 4: printf ("\nEs war eine gerade Zahl zwischen l und 5\n"); break; case 1: case 3: case 5: printf ("\nEs war eine ungerade Zahl zwischen l und 5\n"); break; default: printf ("\nEs war keine Zahl zwischen l und 5\n"); }system("PAUSE");} Dr. J. Raimann 8 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Anfangsbedingte Schleife mit while while (Ausdruck) Anweisung Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: Anfangsbedingte Schleife mit while #include <stdlib.h> #include <stdio.h> int main (void) { int iv = 0; while (iv < 10) { printf ("%i\n", iv); iv++; } system("PAUSE"); } Dr. J. Raimann Initialisierung Schleifenabbruchbedingung Manipulation des Werts der Abbruchbedingung 9 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Anfangsbedingte Schleife mit for for (Ausdruck l; Ausdruck 2; Ausdruck 3) Anweisung ist äquivalent zu Ausdruck_l; while (Ausdruck_2) { Anweisung Ausdruck_3; } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: Anfangsbedingte Schleife mit for #include <stdlib.h> Initialisierung #include <stdio.h> int main (void) Schleifen{ abbruchbedingung int iv = 0; for (iv = 0; iv < 10; iv++) { Manipulation des Werts printf ("%i\n", iv); der Abbruchbedingung } system("PAUSE"); } Dr. J. Raimann 10 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Endlosschleifen for ( ; ; ) { /*. . . .*/ } /* Endlosschleife */ while (l) { /*. . . .*/ } Fachhochschule Frankfurt am Main FB 2 /* Endlosschleife */ Modul 12: Höhere Programmiersprache SS 2008 Endbedingte Schleife mit do while do Anweisung while (Ausdruck); Achtung: Im Gegensatz zur anfangsbedingten Schleife wird die endbedingte Schleife immer mindestens einmal durchlaufen, auch wenn die Abbruchbedingung (Ausdruck) von Beginn an falsch ist! Dr. J. Raimann 11 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: Endbedingte Schleife mit do while #include <stdlib.h> #include <stdio.h> int main (void) { int zahl; long summe = 0; printf("Bitte Zahlen eingeben (Ende mit 0)\n"); do { scanf ("%d", &zahl) ; summe += zahl; Hier muss ein Strichpunkt } stehen ! while (zahl); printf("Summe: %i\n", summe); system("PAUSE"); } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Verlassen von Schleifen: break und continue • vorzeitiges Beenden von Schleifen-Konstrukten • durch break • wird die Verarbeitung des jeweiligen Blockes abgebrochen und der Block verlassen • gilt für: • for, while und • switch • durch continue • wird die Verarbeitung im Block auch abgebrochen aber das Schleifen-Konstrukt weiter durchlaufen • gilt nur für: • for, while Dr. J. Raimann 12 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: break #include <stdlib.h> #include <stdio.h> int main (void) { char eingabe; for ( ; ; ) /* Endlos-Schleife */ { /* Die Funktion getchar() liest ein einzelnes Zeichen von der Tastatur ein */ eingabe = getchar(); if (eingabe == 'e') { break; } } system("PAUSE"); } Fachhochschule Frankfurt am Main FB 2 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: continue #include <stdlib.h> #include <stdio.h> int main (void) { int lv = 0; int zahl; do { printf ("Geben Sie bitte eine positive Integer-Zahl ein: ") ; lv = lv + 1; scanf ("%d", &zahl); if (zahl <= 0) { Sprung an Schleifenanfang, continue; wenn eingegebene Zahl <= 0 } printf ("Die Zahl war: %d\n", zahl); } while (lv < 5) ; system("pause"); 5 Schleifendurchläufe } Dr. J. Raimann 13 Fachhochschule Frankfurt am Main FB 2 Fachhochschule Frankfurt am Main FB 2 Höhere Programmiersprache SS 2008 Modul 12: Höhere Programmiersprache SS 2008 Beispiel: goto #include <stdlib.h> Achtung: Mit der Anweisung goto kann #include <stdio.h> eine beliebige Stelle im Programm int main (void) angesprungen werden (hier: groesser, weiter). { int x,y,z; goto sollte wegen der entstehenden printf ("\nEingabe x: "); Unübersichtlichkeit nur sehr sparsam scanf ("%d",&x); verwendet werden! printf ("\nEingabe y: "); scanf ("%d",&y); if (x > y) goto groesser; else { z = y; goto weiter; } groesser: z = x; weiter: printf ("der groessere Wert ist %i\n", z); system("PAUSE"); } Dr. J. Raimann 14