Fallunterscheidung: if-statement A E 1 E 2 V 1 V 2 Syntax: if ( ausdruck ) Semantik: else anweisungsfolge_1 anweisungsfolge_2 1. Der ausdruck wird bewertet 2. Ergibt die Bewertung einen Wert ungleich 0 (wahr), wird anweisungsfolge_1 ausgeführt, sonst (falsch) wird anweisungsfolge_2 ausgeführt. 3. Besteht eine Anweisungsfolge nur aus einer Anweisung, so sind die Klammern nicht notwendig 4. Der else-teil ist optional 1
Fallunterscheidung: if-statement A E 1 E 2 V 1 V 2 Mit dem if statement 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; Ja-Teil im eigenen Anweisungsblock Nein-Teil im eigenen Anweisungsblock nach Schlüsselwort else ( Logische Bedingung immer in Klammern! ) 2
Logik in C Bei Fallunterscheidungen kommt es darauf an, ob eine Aussage richtig oder falsch ist Generell gilt in C Der Wert 0 bedeutet falsch! Ein Wert ungleich 0 bedeutet richtig! Nicht nur die 1 ist richtig! Alle Zahlen ungleich 0 sind richtig! int i = 10; if (i) printf("aussage ist richtig!\n"); else printf("aussage ist falsch!\n"); Das kommt raus! 3
Beispiel: if-statement #include <stdio.h> int main (void) int punkte, note; printf ( "Punkte eingeben: "); if (scanf("%d", &punkte)!= 1) printf ("ungueltige Zahl! \n"); return 1; if (punkte > 94) note = 1; else if (punkte > 84) note = 2; else if (punkte > 69) note = 3; else if (punkte > 59) note = 4; else if (punkte > 49) else note = 5; note = 6; printf("%3d Punkte ergibt Note %d\n", punkte, note); return 0; 4
Fallunterscheidung mit dem Konditionaloperator? : A E 1 E 2 V 1 V 2 Zweifachverzweigung Syntax: ausdruck_1? ausdruck_2 : ausdruck3 Semantik: 1. ausdruck_1 wird bewertet. 6. Ergibt die Bewertung von ausdruck_1 einen Wert ungleich 0 (wahr), ist das Ergebnis des bedingten Ausdrucks der Wert von ausdruck_2, sonst ist das Ergebnis des bedingten Ausdrucks der Wert von ausdruck_3. Wesentliche Unterschiede zur if-kontrollstruktur: 1. Alle drei logischen Teile des Struktogrammes müssen da sein. 2. Der Bedingte Ausdruck ist ein Ausdruck, während die if-kontrollstruktur eine Anweisung ist. So kann der bedingte Ausdruck Teil einer Anweisung sein. 5
Fallunterscheidung mit dem Konditionaloperator? : Ein Kurzform für eine if- Abfrage Bedingung stimmt if (i > k) max = i; else max = k; max = (i > k)? i : k; Bedingung stimmt nicht int i1 = 2; int i2 = 1; z = (i1 <= i2)? (i1 += 10) : (i2 += 20); printf ("z:\t%i \ni1:\t%i\ni2:\t%i \n", z, i1, i2); z: 21 i1: 2 i2: 21 6
Beispiele: bedingter Ausdruck #include <stdio.h> // Stringersetzung main (void) int i; printf( Anzahl der Teile eingeben: ); if (scanf( %d, &i )!= 1) printf ( Ungueltige Zahl\n ) return 1; printf( %d Teil%s\n, i, i == 1? : e ); return 0; #include <stdio.h> // Maximumbestimmung int main (void) float a, b, max; printf( Bitte Zahl a eingeben: ); if (scanf( %f, &a)!=1) printf ( ungueltige Zahl\n ); return 1; printf( Zahl b eingeben: ); if (scanf( %f, &b)!= 1) printf ( Ungueltige Zahl\n ); return 2; max = a > b? a : b; printf ( max = %f\n, max) return 0; 7
switch - die Mehrfachverzweigung E 1 E 2 E 3 E 4 V 1 V 2 V 3 V 4 A Syntax: switch (Ausdruck) case Wert1: Anweisungen1; case Wert2: Anweisungen2; break; case Wert3: case Wert4 : Anweisungen3; default: Anweisungen; Semantik: 1. Der switch ist eine Auswahl unter mehreren Möglichkeiten. 2. Der Ausdruck wird bewertet. int z=5; switch (tag) case 1: case 2: z = 6; case 6: z += 3; break; case 7: z += 4; break; default: z = 7; printf( Aufstehen um %i:00 Uhr\n, z); 3. Das Ergebnis der Bewertung wird mit den Konstanten Wert1, Wert2 usw. verglichen und die Anweisungen ab der entsprechenden Stelle ausgeführt. Eine Anweisungsfolge ohne break führt dazu, dass auch die Anweisungen des nächsten Falles durchlaufen werden. 4. Der default-teil kann an beliebiger Stelle stehen oder auch fehlen. 5. Jede Anweisungsfolge sollte mit einer break-anweisung abgeschlossen werden. 8
Wiederholen mit Vorabtest: while Schleife B V Sollen Anweisungen mehrfach ausgeführt werden, so wird eine Programmierschleife benötigt. z.b.: Wir lesen solange von der Tastatur Zahlen ein, verarbeiten sie, bis die Zahl 0 eingegeben wird. Syntax: while (Bedingung) // Anweisungen Semantik: Bedingung ist das Ergebnis einer Bewertung eines logischen Ausdrucks sie ist richtig (entspricht ungleich Null) oder falsch (entspricht gleich Null) solange die Bedingung richtig ist werden die Anweisungen im Anweisungsblock ausgeführt, wenn die Bedingung falsch ist geht es mit der nächsten Anweisung nach der Schleife weiter 9
Wiederholen mit Endtest: do while Schleife Semantik: Bei einer while Schleife wird erst geprüft und dann (Bedingung ist TRUE) werden die Anweisungen durchlaufen d.h. ist die Bedingung gleich beim ersten Durchlauf falsch dann werden die Anweisungen nicht ein einziges Mal bearbeitet. Bei einer do while Schleife Syntax: werden zuerst die Anweisungen durchlaufen dann wird geprüft d.h. auch wenn die Bedingung im ersten Durchlauf falsch ist werden die Anweisungen doch mindestens einmal ausgeführt. do // Anweisungen while (Bedingung); V B 10
Beispiele: while Schleifen Mittelwert int i; double zahl, sum, mittel; i = 0; sum = 0.; mittel = 0.; do printf ( Bitte Zahl eingeben: ); if (scanf( %lf, &zahl)!= 1) printf ( ungueltige Zahl\n ); break; sum += zahl; i++; while( i < 10 && zahl!= 0 ); if ( zahl == 0 ) i--; if ( i!= 0 ) mittel = sum / i; printf( Der Mittelwert ist: %f\n, mittel); int i; double zahl, sum, mittel; i = 0; sum = 0.; mittel = 0.; zahl = 1.; while( i < 10 && zahl!= 0 ) printf ( Bitte Zahl eingeben: ); if (scanf( %lf, &zahl)!= 1) printf ( ungueltige Zahl\n ); break; sum += zahl; i++; if ( zahl == 0 ) i--; if ( i!= 0 ) mittel = sum / i; printf( Der Mittelwert ist: %f\n, mittel); 11
Wiederholen mit Vorabtest der Laufbedingung: for Schleife B Semantik: for (int n = 0; n < 10; n++) printf ("\n%i", n); Syntax: Auch bei der for Schleife wird zunächst eine Bedingung geprüft und dann die Anweisungen ausgeführt allerdings kann die for Schleife noch mehr Deklarierung, Initialisierung Vergleich Anweisung, Post-Operation for (Initialisierung; Vergleich; Postoperation) Anweisungen; while (n < 10) for (;n < 10;) identisch int n = 0; while (n < 10) printf ("\n%i", n); n++; for (;n < 10;) V Initialisierung; while (Vergleich) Anweisungen; Postoperation; 12
Beispiele: for Schleife Mittelwert int i; double zahl, sum, mittel; sum = 0.; mittel = 0.; zahl = 1.; for (i = 0; i < 10 && zahl!= 0; i++) printf( Bitte Zahl eingeben: ); if (scanf( %lf, &zahl)!=1) printf ( ungueltige Zahl\n ); break; sum += zahl; if (zahl == 0) i--; if (i!= 0) mittel = sum / i; printf( Der Mittelwert betraegt: %f\n, mittel); 13
break und continue vorzeitiges Beenden von Schleifen-Konstrukten durch break wird die Verarbeitung des jeweiligen Blockes wird abgebrochen und der Block verlassen Also Abbruch der Schleife gilt für: for, while und switch durch continue wird die Verarbeitung im Block auch abgebrochen aber das Schleifen-Konstrukt weiter durchlaufen Also Sprung an das Ende des Schleifenblocks gilt nur für: for, while // Absolutwertbildung while (scanf("%i", &ezahl)) if (ezahl >= 0) continue; ezahl = - ezahl; printf ("%i\t", ezahl); 14
goto - der Feind guter Programmstruktur Sofort wieder vergessen Nur der Vollständigkeit halber goto wird bei strukturierter Programmierung nicht benötigt Mit goto kann zu einer Marke gesprungen werden. Die Marke ist ein Name (Bezeichner) gefolgt von einem Doppelpunkt z = (x > y)? x : y; printf ("der groessere Wert ist %i\n", z); if (x > y) z = x; else z = y; printf ("der groessere Wert ist %i\n", z); if (x > y) goto groesser; else z = y; goto weiter; groesser: z = x; weiter: printf ("der groessere Wert ist %i\n", z); 15
Beispiele: und nochmal Rechnen Aufgabenstellung: Zu schreiben ist ein C-Programm, das eine 9x9 Multiplikationsmatrix für die Zahlen 0..9 berechnet und ausgibt. Die Ausgabeform ist eine Matrix, wo die Länge der Zahlen entsprechend berücksichtigt wird. Die einzelnen Matrixeinträge werden durch den senkrechten Strich, das Minuszeichen - und dem Pluszeichen + begrenzt. Das Programm erzeugt zunächst eine Programmanfangsmeldung und zum Schluss eine Programmendemeldung. Dazu gehören auch: Programmbeschreibung Verwaltungsteil Struktogramm #include <stdio.h> int main() /* Erzeugung einer 9x9 Multiplikationsmatrix */ int i=0, j=0; printf("ausgabe einer Multiplikationsmatrix\n\n"); printf("* "); for (i=1;i<10;i++) printf(" %d ",i); printf("\n"); for (i=1;i<11;i++) printf("--+"); printf("\n"); for (i=1;i<10;i++) printf(" %d ",i); for (j=1;j<10;j++) printf("%2d ",i*j); printf("\n"); for (j=1;j<11;j++) printf("--+"); printf("\n"); printf( Das wars mit der Multiplikationsmatrix\n"); return 0; 16
#define ANZAHL 20 Arrays (Vektoren) Zur Speicherung mehrerer gleichartiger Daten z.b. die Noten einer Klausur von 20 Studenten int noten[anzahl]; wie normale Variablendefinition die Anzahl in eckigen Klammern hinter dem Variablennamen lesen und schreiben der Elemente durch Verwendung eines Index dieser kann nur Werte von 0 bis ANZAHL - 1 annehmen! y = noten[5]; noten[i] = 3; noten[20] = 5; int i, summe = 0, werte[anzahl]; float mittelw; // Bilden eines Mittelwertes for (i = ANZAHL; i; summe += werte[--i]) ; // leere Anweisung mittelw = (float)summe; mittelw /= ANZAHL; Datentypwandlung: cast Operator (float) 17
Sortieren von Werten Schlechter Algorithmus da sehr häufig die ganze Tabelle Bubble sort durchsucht werden muss! man fängt beim ersten Wert an und geht bis zum vorletzten Wert es werden immer benachbarte Werte verglichen und u.u. getauscht ist einmal getauscht worden, so muß die ganze Kette nochmal überprüft werden (weiterer Durchgang) solange bis kein Tausch mehr stattfindet. while (!fertig) fertig = 1; // falls kein Tausch vorgenommen werden muss for (i = 0; i < MAX - 1; i++) if (werte[i] > werte[i+1]) //tauschen int temp = werte[i+1]; werte[i+1] = werte[i]; werte[i] = temp; fertig = 0; Nur um C zu üben! 5;3;2;7;4 fertig=1 1. forschleife 3;5;2;7;4 fertig=0 3;2;5;7;4 fertig=0 3;5;2;4;7 fertig=0 fertig=1 2. forschleife 3;2;5;4;7 fertig=0 3;2;4;5;7 fertig=0 fertig=1 3. forschleife 2;3;4;5;7; fertig=0 18