Programmieren in C Grundlagen C 4 Hochschule Fulda – FB AI Wintersemester 2014/15 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ Anweisungen • Anweisung im allgemeinsten Sinn: Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2 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; 45 = j; /* gültiger l-value */ /* ungültiger l-value */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3 Ausdrücke 2 • Sind die Zuweisungen korrekt? typedef struct _st { int a[5]; } stt; stt s1 = { 1, 2, 3, 4, 5 }, s2; int a1[5] = { 1, 2, 3, 4, 5 }, a2[5]; int i, j; ... i = 23; /* ??? */ 32 = j; /* ??? */ a2 = a1; /* ??? */ s2 = s1; /* ??? */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4 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 5 Blöcke 2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6 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 7 Selektionen 1 • Bedingte Anweisung if • Syntax: if (ausdruck) anweisung • Struktogramm Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8 Selektionen 2 • Bedingte Anweisung if … else if (ausdruck) anweisung else anweisung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9 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 10 Selektionen 4 • Beispiel: Zeichen groß klein und vice versa int c; ... c = getchar(); if ( (c >= 'A' && (c >= 'a' && { if (c >= 'A' && c = c – 'A' + else c = c – 'a' + } ... c <= 'Z') || c <= 'z')) c <= 'Z') 'a'; 'A'; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11 Selektionen 5 • Beispiel: ctoggle.c /* * * * */ ctoggle.c Wandlung Gross- in Kleinbuchstaben un klin, 30.04.2010 #include <stdio.h> int main(void) { int c; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12 Selektionen 6 • Mehrfache Alternative if…else if…else if (ausdruck_1) anweisung_1 else if(ausdruck_2) anweisung_2 else if(ausdruck_3) anweisung_3 else if (ausdruck_n) anweisung_n ... ... else /* kann auch fehlen */ anweisung_else Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13 Selektionen 7 • Syntaxdiagramm Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14 Selektionen 8 • Mehrfache Alternative / Fallunterscheidung switch switch(ausdruck){ case k1: anweisung_1; break; case k2: anweisung_2; break; . . . default: anweisung_default; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15 Selektionen 9 • Syntaxdiagramm Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16 Selektionen 10 • Beispiel enum 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 17 Selektionen 11 • Beispiel: lettercount.c /* * * * */ lettercount.c Ziffern und sonstige Zeichen zaehle klin, 30.04.2010 #include <stdio.h> int main(void) { int c, n, nd, no; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18 Selektionen 12 • Beispiel: mydraw3.c /* * * * * * * * */ mydraw3.c Einfaches Zeichenprogramm Kreise, Farben, + Linien, + Rechtec Leinwandgroesse: 640 x 480 Pixel Erzeugt SVG-Format Version 3 - fest kodiert klin, 15.04.2010 #include <stdio.h> Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19 Iterationen 1 • Abweisende Schleife while, manchmal auch kopfgesteuerte Schleife genannt • Syntax while (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 20 Iterationen 2 • Struktogramm • Beispiel: int c; while ((c = getchar()) != EOF){ putchar(c); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21 Iterationen 3 • Annehmende Schleife do while, machmal auch fußgesteuerte Schleife genannt • Syntax do anweisung while (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 22 Iterationen 4 • Struktogramm • Beispiel char *s1, *s2; do *s2++ = *s1++; while (*s1); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23 Iterationen 5 • Beispiel: stringcopy() mit while -Schleife void stringcopy(char *s1, char *s2) { while(*s1) *s2++ = *s1++; *s2 = '\0'; } • Beispiel: void stringcopy mit do-Schleife void stringcopy(char *s1, char *s2) { do *s2++ = *s1++; while(*s1); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24 Iterationen 6 • Laufanweisung oder abweisenden Schleife mit for • Syntax for(ausdruck1; ausdruck2; ausdruck3) anweisung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25 Iterationen 7 • Beispiel: Summenbildung von 1 … 100 int x, i; x = 0; for (i = 1; i <= 100; i++) x = x + i; • eine Alternative int x, i; for (x = 0, i = 1; i <= 100; i++) x += i; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26 Iterationen 8 • for-Schleife ist eigentlich eine while-Schleife ausdruck1 while(ausdruck2){ anweisung ausdruck3 } • Beispiel: stringcopy() mit for void stringcopy(char *s1, char *s2) { for ( ; *s1; s1++, s2++) *s2 = *s1; *s2 = '\0'; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27 Iterationen 9 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28 Iterationen 10 • Schleifensteuerung • break – bricht die Ausführung der Schleife bzw. switchAnweisung ab und verlässt diese • continue – bricht den aktuellen Schleifendurchlauf ab – setzt mit Ausführung des Schleifenkopfes fort • Endlosschleife while(1) ... for(;;) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29 Iterationen 11 • Beispiel: eingabegesteuertes Programm int 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 30 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 31 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öglich Entwurf top-down oder bottom-up Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32 Funktionen 3 • Beispiel: Summenbildung int 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 33 Funktionen 4 • Beispiel Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34 Funktionen 5 • vor Programmstart Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35 Funktionen 6 • Programmstart: Speicherreservierung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36 Funktionen 7 • Kopieren des aktuellen Parameters a Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37 Funktionen 8 • Aufruf der Funktion quadrat() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38 Funktionen 9 • In Funktion quadrat(): berechnen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39 Funktionen 10 • Returnwert liefern in a kopieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40 Funktionen 11 • Rückkehr aus quadrat() nach main() Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41 Funktionen 12 • Nach Rückkehr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42 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 43 Funktionen 14 • Syntaxdiagramm • Beispiel int add(int a, int b) { r = a + b; return(r); } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44 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 45 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 46 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 47 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 Parameterausdrücke ist nicht festgelegt Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48 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 49 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 Headerdatei typ name ( liste der parametertypen ); • Beispiele: double sin(double); double cos(double x); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 50 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 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 51