klicken
Transcription
klicken
3. Strukturierung von Programmen 3.1. Kontrollstrukturen 3.1.1. Statements und Blöcke Jeder Ausdruck, abgeschlossen von einem Semikolon ist ein Statement. Somit ist das Semikolon kein Trennsymbol sondern das Abschlußzeichen eines Statements. Mehrere Statements können mit geschweiften Klammern zu einem Block zusammengefaßt werden. Der Block (=Block-statement) gilt nach außen wie ein Statement und wird nicht mit einem Semikolon abgeschlossen. Es gibt folgende Statements : expression-statement compound-statement selection-statement iteration-statement jump-statement labeled-statement 3.1.2. expression statement Dem expression statement entsprechen Wertzuweisungen, Wertvergleiche oder Funktionsaufrufe. Expressions werden sequentiell der Reihe nach ausgewertet und von einem Semikolon abgeschlossen. Die leere expression heißt Nullstatement. Beispiel : x = 1; i <= a; a = b + x; ; 3.1.3. compound statement Die geschweiften Klammern gruppieren statements zu einem compound statement (=Block). Innerhalb eines compound statements können Variablen deklariert werden. Die Lebensdauer der Variablen ist nur auf diesen Block geschränkt. Beispiel : { } int a; a=x; /* Hier kein Semikolon notwendig, da Block-statement */ oder : if (a==0) { b=1; c=1; d=1; printf(“%d”,i); oder : if (a==0) { int i; } i= a + 1; printf(“%d”,i); } 19 3.2. selection-statements 3.2.1. selection statment : if , if - else if (expression) statement if (expression) statement1 else statement2 Das if statement testet den numerischen Wert der Bedingung (expression). Falls der Wert ungleich Null ist (TRUE Fall), wird statement1 ausgeführt. Es wird nur ein einziges statement nach der Bedingung ausgeführt. Sollen mehrere statements zusammengefaßt werden, so müssen sie mit geschweiften Klammern geklammert werden. Bei geschachtelten if .. else gehört das else immer zum näheren if. Achtung : expression muß immer in runden Klammern eingschlossen werden. Beispiel : if (i==2) else oder puts("i ist gleich zwei"); puts(" i ist ungleich zwei") ; if ((i==2) || (j!=0)) { puts(" Der Fall ist eingetreten"); i = 3; } else puts(" Ja du Glückspilz "); Achtung, folgendes ist zulässig : Ausdruck if (i=2) if (++i) if (i=j<n) if (i) if (2) Bedeutung Zuweisung an i, dann Test : immer true Erhöhen des Wertes von i, dann Test Zuerst errechnen und zuweisen des Wertes an i, dann test ob i TRUE (!= 0) oder FALSE (=0) Test ob i TRUE (!= 0) oder FALSE (=0) immer TRUE (!= 0) 20 3.2.2. selection-statement : switch switch (expression) { case constant-expr: statements1 case constant-expr: statements2 default : statementsn } Jeder Label hat eine oder mehrere ganzzahlige Konstanten oder Konstanten Ausdrücke. Entsprechend dem Wert von expression werden sequentiell alle case constant-expr. ausgewertet und verglichen, ob sie mit dem Wert übereinstimmen. Bei Übereinstimmung werden die nachfolgenden statements ausgeführt und beim nächsten case Statement weiter getestet. Soll die Abarbeitung der sequentiellen Tests nach der Ausführung eines statements abgebrochen werden, so muß dieses statement mit break abgeschlossen werden. Die Abarbeitung wird dann hinter dem gesamten switch statement fortgesetzt. Wird keine Übereinstimmung zwischen dem Wert von expression und constant-expr. gefunden, so wird auf einen eventuell vorhandenen default Fall verzweigt. Beispiel : switch (c) { case ´0´ case ´2´ case ´2´ default } 3.3. : case ´1´ : : : case ´3´: : puts("0,1"); break; puts("2"); puts("2,3"); puts(" Nichts davon"); Iteration statements 3.3.1. iteration statement : while while (expression) statement Solange expression TRUE (ungleich Null) ist , wird statement ausgeführt. Es wird genau ein statement ausgeführt. Sollen mehrere statements ausgeführt werden, müssen sie zu einem compound-statement zusammengefaßt werden. Statement wird solange wiederholt, bis der Wert von expression FALSE (gleich Null) ist. 21 Beispiel : int while_1(void) { int num; puts("Gib den Countdown Wert ein >>>"); readint(num); /* Achtung bei Endlosschleifen */ while ( num > 0 ) { num --; printf(" Countdown laeuft >>%d<<\n",num); }; printf(" Start \n"); } Achtung vor Unendlichschleifen : i = 5; while (i) ; i --; while (i > 0) printf(" Countdownwert ist = %d\n",i); i--; 3.3.2. iteration statement : for for (expr1; expr2; expr3) statement expr1 : Wird vor dem Durchlauf der Schleife ausgeführt (Initialisierung) expr2 : Testbedingung der Scheife : Wiederholung falls expr2 ungleich Null expr3 : Wird nach einem Durchlauf von statement ausgeführt (Increment) entspricht : expr1; while (expr2) { statement; expr3; } Achtung : Im Gegensatz zu anderen Programmiersprachen ist die for Schleife bei C viel flexibler, da die Komponenten expr1, expr2, expr3 einer for loop beliebige Ausdrücke sein können, deren Werte auch innerhalb der Komponenten verändert werden können. 22 Beispiele : Es dürfen auch expr's der for Schleife fehlen : Die endlos Schleife : for (;;) ; Der Index einer for Schleife muß nicht unbedingt ein ganzzahliger Wert sein : int for_2(void) { char a; puts(" Die Buchstaben von a bis g lauten : "); for (a='a'; a < 'g'; a ++) printf(" %c ",a); printf("\n"); int for_3(void) { float x; puts(" Die Reihe von x - 1/x lautet : "); for (x=3; x > 0.00005; x = x - 1/x) printf(" %6.3f\n ",x); printf("\n"); } for (i=0; i<n; i++) { printf(" Der Schleifendurchlauf Nummer %d\n",i); m= n+i; } komplexe Ausdrücke in expr1, expr2 und expr3, als Rumpf der for Schleife wird die leere Ausweisung verwendet. Sämtliche Berechnungen werden innerhalb der for Schleife ausgeführt. Dies ist jedoch ein sehr komplizierter Programmstil und eigentlich abzulehnen. for (i=0,j=1,x=10; i=j*2*x; i = i*j,x--) ; 3.3.3. Aufgabe : Welche Werte werden bei folgendem Programmausschnitt ausgedruckt : int i,j; int n,m; n=m=4; for (i=0;j<n;i++) for (j=0;j<m;j++) printf("Der Matrixindex lautet : i = %d 23 j = %d \n",i,j); 3.3.4. iteration statement : do - while do statement while (expression); Das statement wird ausgeführt und die expression ausgewertet. Falls die expression TRUE ist (ungleich Null) wird das statement erneut ausgeführt. Wird expression gleich Null (FALSE) terminiert die Schleife und es wird hinter das Programm wird hinter dem do statement fortgesetzt. 3.4. jump statements 3.4.1. jump statement : break Das break statement stellt ein vorzeitiges exit aus einem for, while, do oder switch statement dar. Das break statement veranlaßt, die innerste Schleife sofort zu verlassen. Das continue statement beendet eine Iteration innerhalb einer Schleife und springt direkt zum nächsten Schleifendurchlauf. 3.4.2. jump statement : goto, label label : und goto label; Es wird empfohlen, auf die Programmierung mit Lables zu verzichten (Spagetticode). Es gibt genügend Kontrollanweisungen um Sprünge innerhalb des Programms zu vermeiden. 3.5. Die Vor- und Nachteile von for, do und while Die for Loop wird dann verwendet : - wenn der Schleifenindex im Vordergrund steht. (z.B. Durchlaufen von Arrays). - Bei einfachen Interationsschritten - Falls die Iteration und das Abbruchkriterium eng zusammenhängen Die while ( ) Loop wird verwendet : - wenn das Abbruchkriterium im Vordergrund steht - es soll zuerst getestet werden, bevor die Statements im while Block ausgeführt werden, da sonst Fehler auftreten könnten (z.B. Arithmetischer Ausdruck um Division durch Null zu vermeiden) Die do () Loop wird verwendet : - wenn die Statements im do Block im Vordergrund stehen. - Es sollen zuerst die Statements ausgeführt werden und dann die Bedingung getestet werden. (z.B : Einlesen von Abbruchkriterien) 24 Beispiel : #include <stdio.h> main() /* Demonstration of blocks and statements */ { char in,buffer[10]; int len,i=0; while ( ( (buffer[i++]=getchar() ) != '\n') && (i < 10)) ; len=i; for (i=0;i<len;i++) { char c; switch (c = buffer[i]) { case '0':case '1':case '2':case '3':case '4':case '5' : case '6':case '7': puts(" Die Zahl ist kleiner 8"); break; case '8':case '9': puts(" Die Zahl ist größer 8"); break; default : if (( c >= 'A' && c <= 'Z') || ( c >= 'a' && c <= 'z')) puts(" Wir haben einen Buchstaben"); else puts(" Wir haben ein Sonderzeichen"); } } } 3.5.1. Aufgaben 1. Schreiben Sie ein Programm, das 20 Buchstaben ein liest und zählt wieviele Groß bzw. Kleinbuchstaben und Umlaute darunter waren. 2. Schreiben Sie ein Programm, das bis zu 5 mal eine nur im Programm bekannte Geheimzahl abfagt. Bei jedem Durchlauf wird dem Benutzer ein neuer Tip gegeben, der einen neuen Hinweis zu dieser Geheimzahl gibt. Wird die Zahl gefunden, dann werden die Anzahl der Versuche ausgegeben. 3. Schreiben Sie ein Programm, das eine Zahl einliest und in Abhängigkeit der Zahl einen beliebigen Spruch auf das Terminal ausgibt. Nur bei einer bestimmten Zahl soll das Program terminieren. Verwenden Sie zum beenden des Programms dazu die Lösung aus Aufgabe 2 25