Post on 05-Apr-2015
transcript
Informatik IIGrundlagen der Programmierung
Programmieren in C
Grundlagen C 4
Hochschule Fulda – FB ET
Sommersemester 2010
http://www.rz.hs-fulda.de/et
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Anweisungen
• Anweisung im allgemeinsten Sinn:
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Ausdrücke 1
• Ausdrücke (siehe auch früherer Abschnitt)– Definitionen, Zuweisungen, …– arithmetische, logische, … Operationen, …
• Bei Zuweisungen zu beachten: gültiger l-value und r-value– l-value (left, location) Variable mit Speicherplatz– r-value (right, read) auswertbarer Ausdruck
• Beispiel:int i, j;i = 9 / 3; /* gültiger l-value */45 = j; /* ungültiger l-value */
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Ausdrücke 2
• Sind die Zuweisungen korrekt?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Blöcke 1
• Zusammenfassung mehrerer Anweisungen• Geklammert mit { }• v.a. bei Funktionen, 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• Bei Namensgleichheit ist Variable des
innersten Blocks sichtbar
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Blöcke 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Kontrollstrukturen
• Kontrolle des Programmablaufs abhängig von Ergebnis von Ausdrücken
• Selektionen / bedingte Anweisungen– Einfache Alternative if … else– Mehrfache Alternative if … else if … else– Fallunterscheidung switch
• Iterationen / Schleifen– Abweisende Schleife while– Annehmende Schleife do … while– Laufanweisung for
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Selektionen 1
• Bedingte Anweisung if• Syntax:if (ausdruck) anweisung
• Struktogramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Selektionen 2
• Bedingte Anweisung if … else if (ausdruck) anweisungelse anweisung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Selektionen 3
• 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 11
Selektionen 4
• Beispiel: Zeichen groß klein und vice versaint 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 12
Selektionen 5
• Beispiel: ctoggle.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Selektionen 6
• Mehrfache Alternative if…else if…else if (ausdruck_1) anweisung_1else if(ausdruck_2) anweisung_2else if(ausdruck_3) anweisung_3else if (ausdruck_n) anweisung_n... ...else /* kann auch fehlen */ anweisung_else
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Selektionen 7
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Selektionen 8
• Mehrfache Alternative / Fallunterscheidungswitchswitch(ausdruck){ case k1: anweisung_1;
break; case k2: anweisung_2; break; . . . default: anweisung_default;}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Selektionen 9
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Selektionen 10
• Beispielenum color { red, green, blue };enum color col = red;switch(col) { 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 18
Selektionen 11
• Beispiel: lettercount.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Selektionen 12
• Beispiel: mydraw3.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Iterationen 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 21
Iterationen 2
• Struktogramm
• Beispiel:int c;while ((c = getchar()) != EOF){ putchar(c);}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Iterationen 3
• 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 23
Iterationen 4
• Struktogramm
• Beispielchar *s1, *s2;do *s2++ = *s1++;while (*s1);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Iterationen 5
• Beispiel: stringcopy() mit while -Schleifevoid stringcopy(char *s1, char *s2){ while(*s1) *s2++ = *s1++; *s2 = '\0';}
• Beispiel: void stringcopy mit do-Schleifevoid stringcopy(char *s1, char *s2){ do *s2++ = *s1++; while(*s1);}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Iterationen 6
• Laufanweisung oder abweisenden Schleife mit for
• Syntaxfor(ausdruck1; ausdruck2; ausdruck3) anweisung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Iterationen 7
• 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 27
Iterationen 8
• for-Schleife ist eigentlich eine while-Schleifeausdruck1while(ausdruck2){ anweisung ausdruck3}
• Beispiel: stringcopy() mit forvoid stringcopy(char *s1, char *s2){ for ( ; *s1; s1++, s2++) *s2 = *s1; *s2 = '\0';}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Iterationen 9
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Iterationen 10
• Schleifensteuerung• break
– bricht die Ausführung der 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 30
Iterationen 11
• Beispiel: eingabegesteuertes Programmint c;while(1) { c = getchar(); if(c = 'Q') break; switch(c) { case 'A': funca(); break; case 'B': funcb(); break; ... }}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Funktionen 1
• Funktionen sind Programmteile (Blöcke) mit Namen, ggfs. Parametern und ggfs. einem Rückgabewert
• elementare Bausteine für Programme– gliedern umfangreiche Aufgaben in kleinere
Komponenten– reduzieren Komplexität– Wiederverwendung von Komponenten– verbergen Details der Implementierung vor
anderen Programmteilen (black box)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Funktionen 2
• dienen der Abstraktion• Name und Parameter abstrahieren
– vom tatsächlichen Programmstück– von Darstellung und Verwendung der Daten
• Verwendung– mehrfach benötigte Programmstücke werden
einmal erstellt und können durch Angabe des Funktionsnamens aufgerufen werden
– schrittweise Abstraktion möglichEntwurf top-down oder bottom-up
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Funktionen 3
• Beispiel: Summenbildungint summe(int a, int b){ int sum = 0, i; for(i = a; i <= b; i++) sum += i; return(sum);}
• Beliebig immer wieder verwendbar:s1 = summe(20, 50);s2 = summe(2, 120);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
Funktionen 4
• Beispiel
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
Funktionen 5
• vor Programmstart
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Funktionen 6
• Programmstart: Speicherreservierung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Funktionen 7
• Kopieren des aktuellen Parameters a
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Funktionen 8
• Aufruf der Funktion quadrat()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Funktionen 9
• In Funktion quadrat(): berechnen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Funktionen 10
• Returnwert liefern in a kopieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41
Funktionen 11
• Rückkehr aus quadrat() nach main()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
Funktionen 12
• Nach Rückkehr
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43
Funktionen 13
• Funktionsdefinition• Schnittstelle (Typ, Name, Parameterliste)• Typ
– Datentyp, der von Funktion zurückgeliefert wird– Kann beliebiger Typ sein– void kein Rückgabewert (Prozedur)
• Name – Bezeichner kann beliebig gewählt sein– keine Schlüsselworte
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44
Funktionen 14
• Syntaxdiagramm
• Beispielint add(int a, int b){ r = a + b; return(r);}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45
Funktionen 15
• Formale Parameter
• beliebiger Typ, beliebiger Bezeichner• formale Parameter Platzhalter für aktuelle
an Funktion übergebene Parameter• in Funktion wie vorbelegte lokale Variable
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46
Funktionen 16
• Beliebiger Block mit {} geklammert• Zusätzliche Anweisung return(ausdruck)
Rückkehr aus der Funktion• Bei void-Funktion: nur return• Nach Rückkehr aus Funktion Programm
wird nach Funktionsaufruf fortgesetzt• Typ von Ausdruck und Funktion müssen
übereinstimmen• Klammern bei return können entfallen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 47
Funktionen 17
• Aufruf einer Funktion
– jeder Funktionsaufruf ist ein Ausdruck– void-Funktionen können keine Teilausdrücke sein
wie Prozedur in anderen Sprachen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48
Funktionen 18
• Die Ausdrücke in der Parameterliste werden vor dem Sprung in die Funktion ausgewertet aktuelle Parameter
• Anzahl und Typen der Ausdrücke der aktuellen Parameter müssen mit denen der formalen Parameter in der Definition der Funktion übereinstimmen
• Die Auswertungsreihenfolge der Parameter-ausdrücke ist nicht festgelegt
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 49
Funktionen 19
• Regeln für Funktionen• Funktionen werden global definiert, damit
keine lokalen Funktionen möglich• main() ist normale Funktion, die aber beim
Programmstart automatisch aufgerufen wird• Rekursion ist problemlos möglich:int fak(int n){ if(n == 1) return(1); else return(n * fak(n-1));}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 50
Funktionen 20
• Funktionen müssen deklariert sein, bevor sie aufgerufen werden können
• Name, Rückgabetyp und Parametertypen müssen dem Compiler bekannt sein
• Funktionsdefinition Funktion ist automatisch deklariert und bekannt
• sonst Prototype, z.B. in Headerdateityp name ( liste der parametertypen );
• Beispiele:double sin(double);double cos(double x);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 51
Funktionen 21
• Wdh: Parameterübergabe an Funktionen• call by value
– aktuelle Parameter werden in Speicherbereich der Funktion kopiert
– in Funktion: Änderungen nur lokal in Funktion
• call by reference– In C nur über Zeiger realisierbar– Adresse der Parameter werden in Funktion kopiert– Änderungen an Parametern Änderungen an den
originalen Variablen