Upload
frieda-hemesath
View
108
Download
0
Embed Size (px)
Citation preview
Informatik IIGrundlagen der Programmierung
Programmieren in C
Programmstrukturen / Kontrollstrukturen
Hochschule Fulda – FB ET
Sommersemester 2014
http://c-et.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Programmstrukturen 1
• Programmstrukturen legen fest, wie die Anweisungen des Programms ausgeführt werden
• seqentiell– mach dies - dann mach das - dann mach jenes
• bedingt– wenn dies zutrifft - dann mach das
• wiederholt– solange dies zutrifft - mach jenes
• Programmstrukturen steuern Programmfluss
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Programmstrukturen 2
• Programmstrukturen im allgemeinsten Sinn:
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Anweisungen
• Einfache Anweisungen (statements oder genauer expressions) werden mit einem Semikolon ; abgeschlossen
• Eine "leere" Anweisung besteht nur aus einem Semikolon ;
• Typische Beispiele:int summe; // Definition summeint a, b = 123; // Definition a, ba = b; // Zuweisungsumme = a + b; // arithm. Operationsumme++; // Inkrementprintf("%d", a); // Funktionsaufruf; // leere Anweisung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Ausdrücke
• Ausdrücke (expressions)– Definitionen, Zuweisungen, …
– arithmetische, logische, … Operationen, …
• Bei Zuweisungen zu beachten: gültiger l-value und r-value– l-value (left, location) Variable mit Speicherplatz,
der ein Wert zugewiesen werden kann
– r-value (right, read) auswertbarer Ausdruck / Wert
• Beispiele:int i, j;i = 9 / 3; // i - gültiger l-value 45 = j; // 45 - ungültiger l-value
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Blöcke 1
• Zusammenfassung mehrerer Anweisungenin einen Block (compound statement)
• Blöcke werden mit { } geklammert • bei Funktionen und Kontrollstrukturen• aber auch lokale Blöcke, Unterblöcke
– zur Definition z.B. von lokalen Variablen,insbesondere Hilfsvariablen
• legt Lebensdauer von Variablen fest• legt Sichtbarkeit (Scope) von Variablen fest• Blöcke werden nicht mit einem Semikolon
abgeschlossen• "leerer" Block: {}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Blöcke 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Kontrollstrukturen
• Alle Programme können mit drei Arten von Kontrollstrukturen ausgedrückt werden
• Sequenz– Anweisungen / Ausdrücke werden der Reihe nach
abgearbeitet und ausgeführt
• bedingte Verzweigung, C kennt drei Arten: – if– if / else– switch
• Wiederholung, C kennt drei Arten:– while– do / while– for
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Sequenzen 1
• Anweisungen werden nacheinander ausgeführt
• Beispiel:i = 4711; // statement1i = i - 123; // statement2printf("%d\n", i); // statement3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Sequenzen 2
• Sequenz von Anweisungen kann auch als Flussdiagramm dargestellt werden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Entscheidungen 1
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Entscheidungen 2
• Aktion soll nur dann ausgeführt werden, wenn eine Bedingung zutrifft:
Einsatz von Verzweigungen Programmierung von Entscheidungen• Bedingung ist ein logischer Wahrheitswert,
also true (in C != 0) oder false (in C == 0)• Bedingung kann auch ein Ausdruck sein,
der einen Wahrheitswert liefert• Beispiele:
– (x < 4711)– ((c & EAD_R) && (c & EAD_D1))– (i = 1) // Zuweisung!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
if 1
• if• Pseudocode
...
temperatur messenwenn temperatur < 15° dann heizung einschalten...
• C-Code...
temp = mess_temperatur();if(temp < 15) heizung(ON);...
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
if 2
• Bedingte Anweisung if• Syntax:if (ausdruck) anweisung
• Struktogramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
if 3
• Flussdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
if 4
• Beispiel: Zeichen groß kleinint c;...c = getchar();if ( (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){ if (c >= 'A' && c <= 'Z') c = c – 'A' + 'a'; else c = c – 'a' + 'A';}...
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
if 5
• Beispiel: ctoggle.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
if 6
• nach Bedingung (expression) darf kein Semikolon stehen
• sonst wird statement immer ausgeführt:if(temperatur > 15); heizung(OFF); // immer ausgeführt!
• nach statement Semikolon erforderlich heizung(OFF);
• folgt nach (expression) nur ein statement, sind Blockklammern { } nicht erforderlichif(temperatur > 15) heizung(OFF);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
if 7
• zur Sicherheit sollten aber immer Blockklammern { } verwendet werden
• sonst wird 2. Statement immer ausgeführt:if(temperatur > 15) heizung(OFF); printf(OFF!); // immer ausgeführt
• Einrückung hat keine Bedeutung• Korrekt:if(temperatur > 15) { heizung(OFF); printf(OFF!);}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
if 8
• Anweisung kann ein Block sein, bei mehreren Ausdrücken Verwendung von { } notwendig
• Beispiel:int c, i;...c = getchar();
if (c != EOF) { if(i < 32) { putchar(c); i++ }}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
if 9
• in (expression) unbedingt unterscheiden:• Zuweisungsoperator =• Vergleichsoperator ==• Bedingung ist wegen Zuweisung immer wahr,
wenn b != 0:if(a = b) printf(a gleich b!); // immer!
• denn: Zuweisung ist ein gültiger Ausdruck• gemeint war aber eher:if(a == b) printf(a gleich b!); // wenn a == b
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
if 10
• Integerwerte in Bedingungen (expression) werden als Wahrheitswerte ausgewertet:
• True (expression) ist ungleich 0• False (expression) ist gleich 0• Beispiel:if((x % 2) == 0) printf(%d ist gerade!, x);
• Äquivalent:if( !(x % 2)) printf(%d ist gerade!, x);
• if(expr != 0) entspricht if(expr)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
if else 1
• if else• Pseudocode
temperatur messenwenn temperatur < 15° dann heizung einschaltensonst heizung ausschalten
• C-Codetemp = mess_temperatur();if(temp < 15) heizung(ON);else heizung(OFF);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
if else 2
• Bedingte Anweisung if … else if (ausdruck) anweisungelse anweisung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
if else 3
• Flussdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
if else 4
• Werden zwei if-Anweisungen nacheinander benötigt, gehört ein else immer zum direkt voranstehenden ifint n = 0, a = 4, b = 2, z = 0;if(n > 0) | if(n > 0) { if(a > b) | if(a > b) z = a; | z = a; else | } else z = b; | z = b;
• Wie ist der Wert von z?• Blockstruktur beachten!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
if else if else 1
• Mehrfachverzweigungen if…else if…else if (ausdruck_1) anweisung_1else if(ausdruck_2) anweisung_2else if(ausdruck_3) anweisung_3... ...else if (ausdruck_n) anweisung_nelse /* kann auch fehlen */ anweisung_else
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
if else if else 2
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
if else if else 3
• Beispiel: Notenberechnungint punkte;float note;...if(punkte <= 30) note = 5.0;else if(punkte <= 50) note = 4.0;else if(punkte <= 65) note = 3.0;else if(punkte <= 80) note = 2.0;else note = 1.0;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Bedingte Bewertung
• Schon bekannt ? : expr1 ? expr 2 : expr3
• Verkürzte Formulierung von Bedingungen• Auswertung
– Erst Auswertung von expr1– Wenn expr1 ≠ 0 dann gesamter Ausdruck expr2– Sonst gesamter Ausdruck expr3
• Beispiel max(a, b) und min(a, b):
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Beispiel Schaltjahr 1
• Algorithmus zur Schaltjahrbestimmung:• ein Jahr ist ein Schaltjahr,
– wenn die Jahreszahl ohne Rest durch 4 teilbar ist– wobei alle 100 Jahre das Schaltjahr ausfällt– es sei denn, die Jahreszahl ist durch 400 teilbar
• Formulieren Sie ein Programm,– das eine Jahreszahl jahr einliest– die Variable schaltjahr auf true setzt, wenn jahr ein Schaltjahr ist
– jahr und „ist ein Schaltjahr“ oder „ist kein Schaltjahr“ ausgibt
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Beispiel Schaltjahr 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Beispiel Schaltjahr 3
• Berechnung ohne Entscheidungen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
switch 1
• Mehrfache Alternative / Fallunterscheidungswitchswitch(expression){ case const1: statements1;
break; case const2: statements2; break; . . . default: statements_default;}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
switch 2
• expression muss Integerergebnis liefern, also char, short, int, long
• expression wird ausgewertet …• … und zur Stelle const<n> gesprungen,
die mit dem expression-Wert übereinstimmt• bzw. zu default, wenn es keine
Übereinstimmung gibt• const<n> muss eine Konstante sein• Oft letzte Anweisung von statements<n> break, um switch zu terminieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
switch 3
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
switch 4
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
switch 5
• Beispiel#define red 1#define green 2#define blue 3int color;switch(color) { case red: printf("Farbe: rot\n"); break; case green: printf("Farbe: grün\n"); break; case blue: printf("Farbe: blau\n"); break; default: printf("Farbe: nicht definiert!\n");}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
switch 6
• Beispiel: lettercount.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Schleifen 1
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41
Schleifen 2
• Sollen Aufgaben wiederholt ausgeführt werden, sind Schleifen in C zu verwenden
• C kennt drei Arten von Schleifen• Schleifen mit abweisendem Charakter
Schleifenbedingung (expression) wird vor Durchlauf durch Schleifenkörper geprüft
• Schleifen mit nicht abweisendem Charakter Schleifenkörper wird durchlaufen und danach wird Schleifenbedingung geprüft
• Schleifen mit bekannter fester Wiederholung oder fester Schrittweite
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
while 1
• Abweisende Schleife while, manchmal auch kopfgesteuerte Schleife genannt
• Syntaxwhile (ausdruck) anweisung
• Bedingung ausdruck wird vor Ausführung vom Schleifenkörper anweisung geprüft
• Schleifenkörper wird nur ausgeführt, wenn Bedingung ausdruck wahr ist
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43
while 2
• Struktogramm
• Beispiel:int c;while ((c = getchar()) != EOF){ putchar(c);}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44
while 3
• Flussdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45
while 4
• Schleifenbedingung expression• Schleifenrumpf statement• Beispiel:• Pseudocodeinitialisiere produkt mit 2solange produkt <= 25 ist verdopple produkt
• C-Codeint produkt = 2;while(produkt <= 25) { produkt = 2 * produkt;}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46
while 5
• Schleifen wiederholte Ausführung von Aufgaben
Schleifen sollen meist irgendwann enden• das ist nicht der Fall,• wenn es beabsichtigt ist
– while(1) { } // Endlosschleife– Schleife wird dann i.d.R. im Schleifenkörper verlassen– if(expression) break; // Schleife terminieren
• oder ein Programmierfehler verhindert, dass Schleifenbedingung jemals false wird
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 47
do while 1
• Nicht-annehmende Schleife do while, machmal auch: fußgesteuerte Schleife
• Syntaxdo anweisungwhile (ausdruck)
• Bedingung ausdruck wird erst am Ende des Schleifenkörperts geprüft
Schleife wird mindestens einmal durchlaufen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48
do while 2
• Struktogramm
• Beispiel:do { printf(Zahl zwischen 4 und 22: ); scanf(%d, &zahl);} while(zahl < 4 || zahl > 22);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 49
do while 3
• Flussdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 50
Kombination 1
• eine Schleife innerhalb einer anderen Schleife ist möglich
• allgemein: Kontrollstrukturen können verschachtelt werden
• die Verschachtelungstiefe ist beliebig• damit sind komplexe Abläufe zur Realisierung
von Algorithmen möglich• Aufgabe: Vom Zahlenbereich 1 bis 9 soll für jede
Zahl die Fakultät n! = 1*2*..*n berechnet und ausgegeben werden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 51
Kombination 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 52
Kombination 3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 53
for 1
• Laufanweisung oder abweisenden Schleife mit for
• Syntaxfor(ausdruck1; ausdruck2; ausdruck3) anweisung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 54
for 2
• Flussdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 55
for 3
• Beispiel: Summenbildung von 1 … 100int x, i;
x = 0;for (i = 1; i <= 100; i++) x = x + i;
• eine Alternativeint x, i;
for (x = 0, i = 1; i <= 100; i++) x += i;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 56
for 4
• die for-Schleife ist eigentlich eine while-Schleifeausdruck1while(ausdruck2){ anweisung ausdruck3}
• Beispiel von vorhin– int prod = 2;while(prod <= 25) { prod = 2 * prod}
– int prod;for(prod = 2; prod <= 25; prod *= 2) ;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 57
for 5
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 58
Komma-Operator 1
• Der Komma-Operator , bewirkt, dass die Ausdrücke auf beiden Seiten des Kommas von links nach rechts ausgewertet werden
• Allgemeine Formexpression1, expression2
• zuerst wird expression1, dann expression2 ausgewertet
• der Gesamtausdruck erhält den Wert des Ausdrucks rechts vom Komma expression2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 59
Komma-Operator 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 60
Komma-Operator 3
• Häufige Verwendung des Komma-Operators in for-Schleifen
• in der Initialisierung (expression1)• in der Re-Initialisierung (expression3)• Beispiel:// Summenberechnung ohne Schleifenrumpfint i, sum; // Kein Komma-Operator
for(i=1, sum=0; i<=10; sum += i, i++) ;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 61
break und continue 1
• Schleifensteuerung• break
– bricht die Ausführung einer Schleife bzw. switch-Anweisung ab und verlässt diese
• continue– bricht den aktuellen Schleifendurchlauf ab– setzt mit Ausführung des Schleifenkopfes fort
• Endlosschleifewhile(1) ...for(;;) ...
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 62
break und continue 2
• Beispiel: eingabegesteuertes Programmint c;while(1) { // Endlosschleife c = getchar(); // Kommando lesen if(c = 'Q') // Q -> Beenden break; // while verlassen switch(c) { case 'A': funca(); break; // switch verlassen case 'B': funcb(); break; // switch verlassen ... }}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 63
break und continue 3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 64
Sprünge 1
• Mit der Sprunganweisung kann zu einer beliebigen Marke (Label) gesprungen werden
• name– beliebiger Name einer Marke
• goto– Sprunganweisung: Verzweigung zum Label name
• Beispiel:marke:…goto marke;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 65
Sprünge 2
• es gibt nur ganz wenige Ausnahmen, bei denen goto sinnvoll einsetzbar ist– … etwa in Echtzeitanwendungen – … oder bei systemnaher Programmierung– … oder um aus sehr tiefen Verschachtelungen
sehr schnell wieder zu einer wohldefinierten Stelle zurückzukehren
• goto ist (fast) immer verzichtbar• goto macht Programme fehleranfällig• goto ist schlechter Programmierstil
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 66
Sprünge 3