Vorlesung 5: Kontrollstrukturen - FB2

Werbung
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
Herunterladen