Kontrollstrukturen 1. Bedingter Ablauf: if, if-else 2. Blöcke von Code 3. Wiederholungsschleife: for mit Inkrement und Dekrement Operatoren 4. erweiterte Eigenschaften von printf() 5. Die relationalen und logischen Operatoren in C 6. Einlesen von Zeichen 7. verschachtelte if Anweisungen 8. while und do while Schleifen 9. Verschachtelte Schleifen 10. break um eine Schleife zu verlassen und die Arbeitsweise von continue 11. das switch statement 12. Die goto Anweisung Bedingter Ablauf: if if(expression) statement; Bsp.: if(10>9) printf("wahr"); hier Vergleichsoparatoren: > und == kein logischer Typ in C, int verwendet! 0 ist falsch, ungleich O ist wahr, Welche dieser Ausdruecke sind wahr? if( 0 ) printf("wahr"); if( 1 ) printf("wahr"); if( 10*9<90 ) printf("wahr"); if( 1==1 ) printf("wahr"); if( -1 ) printf("wahr"); Bedingter Ablauf: if-else if(expression) statement1; else statement2; Bsp.:if(10>9) printf("wahr"); else printf("falsch"); Bloecke: if(expression) statement1; statement2; /*...*/ else statement1; statement2; /*...*/ 1
Bedingter Ablauf: Beispiel int answer; printf("was ist 10 + 14? "); scanf("%d", &answer); if(answer == 10+14) printf("gut!"); else printf("leider falsch. "); printf("die Antwort ist 24."); Wiederholungsschleife for mit Beispiel for(initialisierung ; teste-bedingung ; inkrementiere) statement; int answer, count; for(count=1; count<11; count=count+1) printf("what is %d + %d? ", count, count); scanf("%d", &answer); if(answer == count+count) printf("right! "); else printf("sorry, you're wrong. "); printf("the answer is %d. ", count+count); /*wie geht das mit inkrement Operator? bekannt!?*/ Ausgabe von printf verbessern Escape Sequenzen (Backslash characters) \b backspace \f form feed \n Newline \r carriage return \t Horizontaler tab \a Alert \" \ \0 \\ \N Oktale Konstante (wobei N oktaler Wert ist) \xn Hexadezimale Konstante (N hexadezmaler Wert) printf("\a"); 2
Vergleichs- und logische Operatoren Vergleichsoperatoren sind zweiwertige Operatoren a op b wobei op aus > >= < <= ==!= logische Operatoren: && AND 2 wertig OR 2 wertig! NOT 1 wertig Praezedenz: hoch! > >= < <= ==!= && nieder Bsp. Vergleichs - und logische Operatoren int i, j; printf("enter first number: "); scanf("%d", &i); printf("enter second number: "); scanf("%d", &j); /* relational operations */ printf("i < j %d\n", i < j); printf("i <= j %d\n", i <= j); printf("i == j %d\n", i == j); printf("i > j %d\n", i > j); printf("i >= j %d\n", i >= j); /* logical operations */ printf("i && j %d\n", i && j); printf("i j %d\n", i j); printf("!i!j %d %d\n",!i,!j); int xor(int a, int b); Bsp. XOR Operation int p, q; printf("enter P (0 or 1): "); scanf("%d", &p); printf("enter Q (0 or 1): "); scanf("%d", &q); printf("p AND Q: %d\n", p && q); printf("p OR Q: %d\n", p q); printf("p XOR Q: %d\n", xor(p, q)); int xor(int a, int b) return (a b) &&!(a && b); 3
Einlesen von Zeichen von der Tastatur char ch; ch = getchar(); /* read a char */ printf(" you typed: %c", ch); Problem: getchar() manchmal zeilengepuffert! -> ein Zeichen gelesen, Rest noch in Puffer nach Eingabe ganze Zeile -> gibt evtl. Durcheinander! (spaeter genauer untersucht!) interaktive Zeicheneingabe: getche(), Header: conio.h (nicht ANSI!) gibt es diese Funktion fuer gcc? Experimentieren! Bsp.: Zeichen einlesen von der Tastatur /* #include <conio.h> dies ist fuer getche() */ char ch; printf("enter a character: "); ch = getchar(); printf("\nits ASCII code is %d", ch); Bsp.: Zeichen einlesen fuer Menueauswahl int a, b; char ch; printf("do you want to:\n"); printf("add, Subtract, Multiply, or Divide?\n"); printf("enter first letter: "); ch = getchar(); printf("\n"); printf("enter first number: "); scanf("%d", &a); printf("enter second number: "); scanf("%d", &b); if(ch=='a') printf("%d", a+b); if(ch=='s') printf("%d", a-b); if(ch=='m') printf("%d", a*b); if(ch=='d' && b!=0) printf("%d", a/b); 4
verschachtelte if Anweisungen if(count > max) /* aeusseres if */ if(error) printf("error, try again."); /* verschachteltes if */ Vorsicht: if(p) if(q) printf("a and b are true"); else printf("to which statement does this else apply?"); else gehoert zum nahesten if (im gleichen Block), das noch kein else hat! die if-else-if Leiter: die if-else-if Leiter: if(ausdruck) Anweisung; if(ausdruck) Anweisung; else else if(ausdruck) Anweisung; if(ausdruck) Anweisung; else if(ausdruck) Anweisung; else... if(ausdruck) Anweisung;... empfohlene Uebung: Verbessern Sie das Beispiel "Zeichen einlesen fuer Menueauswahl" durch Verwendung einer if-else-if Leiter Variationen in for printf("enter an integer: "); scanf("%d", &i); for(; i; i--) printf("%d ",i); for(i=0; i<10; ) printf("%d ", i); i++; int i, j, k; for(i=0; i<3; i++) for(j=0; j<26; j++) for(k=0; k<2; k++) printf("%c", 'A'+j); for( ; ; ) /*besser waere? */... Beliebige Ausdruecke im for Kopf 5
while und do while Schleifen while (ausdruck) anweisung; while (ausdruck) anweisungsblock anweisungsblock ::= anweisung; anweisung;... do anweisungen while (ausdruck); break um eine Schleife zu verlassen und die Arbeitsweise von continue for(i=1; i<100; i++) printf("%d ", i); if(i==10) /* beendet Schleife */ int x; /*was gibt das Programm aus?*/ int i, j; for(i=0; i<5; i++) for(j=0; j<100; j++) printf("%d", j); if(j==5) printf("\n"); for(x=0; x<100; x++) continue; printf("%d ", x); /* das wird nie ausgefuehrt */ switch(wert) case Konstante1: case Konstante1: case Konstante2:... default: die switch Anweisung printf("zahl von 1 bis 4: "); scanf("%d", &i); switch(i) case 1: printf("eins"); case 2: printf("zwei"); case 3: printf("drei"); case 4: printf("vier"); default: printf("falsche Zahl!"); 6
Die goto Anweisung Ein Fossil aus der Zeit von Assembler goto mylabel; /* unbedingte Sprunganweisung */ printf("das wird nicht auusgedruckt"); mylabel: printf("das wird ausgedruckt \n"); i = 1; again: /* ist das leicht zu lesen? */ printf("%d ", i); i++; if(i<10) goto again; Beispiele Klausuraufgaben Geben Sie ein kleines Beispielprogramm, mit dem sie die Verwendung der while Schleife deomistrieren Geben Sie ein kleines Beispielprogramm, mit dem sie die Verwendung der do-while Schleife deomistrieren Schreiben Sie das Beispiel aus der Vorlesung "Zeichen einlesen fuer Menueauswahl" um mit Hilfe der switch Kontrollstruktur. Im ASCII Code ist die Differenz zwischen Kleinbuchstaben und Grossbuchstaben 32 (Bsp.: A : 64, a : 96, dezimal). Um einen Kleinbuchstaben in einen Grossbuchstaben umzuwandeln, kann man also einfach 32 abziehen. Schreiben Sie ein Programm, das zeichen von der Tastatur einliest und Kleinbuschstaben als Grossbuchstaben ausgibt. 7