Grundlagen C 4 - Peter Klingebiel, HS Fulda, AI

Werbung
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
Zugehörige Unterlagen
Herunterladen