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

Documents pareils