Transcript Informatik II Programmieren in C - Webserver - DVZ
Informatik II Grundlagen der Programmierung Programmieren in C
Grundlagen C 1
Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ
Zeichensatz von C 1
• Buchstaben (incl. Unterstrich)
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz _
• Ziffern
0123456789
• Semikolon (z.B. am Ende einer Anweisung)
;
• Punkt (Gleitpunktzahlen, Selektionsoperator)
.
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Zeichensatz von C 2
• Sonderzeichen (Operatoren, Satzzeichen)
( ) [ ] < > + - * / % ^ ~ & | = ! ? , :
• Anführungszeichen (Einzelzeichen, Strings)
' "
• Blockklammern
{ }
• Fluchtzeichen (für Sonderzeichen)
\
• Doppelkreuz (Preprozessordirektiven)
#
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Reservierte Worte in C 1
• C kennt 32 reservierte Worte
auto break case char const continue default do double else enum extern float for
goto
if int long register return short signed sizeof static struct switch typedef union unsigned void
volatile
while
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Reservierte Worte in C 2
• • • • • • • • • •
auto
Speicherklasse automatisch
break
Verlassen von Schleife/Mehrfachauswahl
case
Auswahl in Mehrfachauswahl
char
Typbezeichner für Zeichen
const
Attribut bei Typangabe
continue
Fortsetzungsanweisung
default
Standardauswahl bei Mehrfachauswahl
do
Schleifenanweisung
double
Typbezeichner Fließkommazahl
else
Teil von Einfach-, Mehrfachalternative Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Reservierte Worte in C 3
• • • • • • • • • •
enum
Typbezeichner für Aufzählungstyp
extern
Speicherklasse extern
float
Typbezeichner Fließkommazahl
for
Schleifenanweisung
if
Alternative oder bedingte Anweisung
int
Typbezeichner Ganzzahl
long
Typbezeichner Ganzzahl
register
Speicherklasse Register
return
Rückkehranweisung
short
Typbezeichner Ganzzahl Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Reservierte Worte in C 4
• • • • • • • • • •
signed
Typbezeichner, -modifizierer
sizeof
Operator zur Größenbestimmung
static
Speicherklasse statisch
struct
Strukturvereinbarung
switch
Auswahlanweisung
typedef
Typnamenvereinbarung
union
Datenstruktur mit Alternativen
unsigned
Typbezeichner, -modifizierer
void
Typbezeichner
while
Schleifenanweisung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Datentypen 1
• Menge von Werten und Menge von Operationen auf diesen Werten • Konstanten / Variablen • Datentypen bestimmen – Darstellung der Werte im Rechner – benötigten Speicherplatz – zulässige Operationen • Festlegung des Datentyps – implizit durch Schreibweise bei Konstanten – explizit durch Deklaration bei Variablen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Datentypen 2
• Vordefinierte Grunddatentypen
char int float double void Zeichen (ASCII-Kode, 8 Bit) Ganzzahl (maschinenabhängig, meist 16 oder 32 Bit) Gleitkommazahl (32 Bit, IEEE, etwa auf 6 Stellen genau) doppelt genaue Gleitkommazahl (64 Bit, IEEE, etwa auf 12 Stellen genau) ohne Wert (z.B. Zeiger)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Datentypen 3
• Type-Modifier spezifizieren Grunddatentypen
short int, long int - legen Länge der Ganzzahl fest - maschinenabhängig, 16 Bit, 32 Bit int char kann auch fehlen long double - Gleitkommazahl, erw. Genauigkeit - oft 128 Bit, IEEE signed, unsigned / int mit/ohne Vorzeichen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Bezeichner 1
• Bezeichner (Identifier) für Konstanten, Variablen, Funktionen, Typen usw. müssen mit einem Buchstaben oder Unterstrich beginnen • danach können Buchstaben, Unterstriche und Ziffern folgen • Groß- und Kleinschreibung wird streng unterschieden • keine Sonderzeichen (z.B. $ oder #) • keine reservierten Worte • Vorsicht bei vordefinierten Funktionsnamen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Bezeichner 2
• Syntaxdiagramm Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Bezeichner 3
• Backus-Naur-Form (BNF)
letter ::= A|B|…|Y|Z|a|b|…|y|z|_ digit ::= 0|1|2|3|4|5|6|7|8|9 identifier ::= letter { letter | digit }
• BNF / EBNF zur Beschreibung formaler Sprachen • Vielfältige Formen / Notationen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Bezeichner 4
int zahl; float _angle = 1.4; char $zeichen = 'a'; short _123 = 123; double main; long int = 5; float fl123; struct volatile; char *string = "hallo"; const long double ____pi3___ = 3.141; long 5long = 5;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Konstanten
• Konstanten ha b en einen festgelegten, unveränderbaren Wert • explizite Deklaration, z.B.
const float pi = 3.141;
• implizite Notation, z.B.
u = 2 * r * 3.141;
• mittels CPP textuelle implizite Ersetzung
#define PI 3.141
...
u = 2 * PI * r;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Variablen 1
• Variable sind Platzhalter für Daten • haben einen festgelegten Speicherort, an dem der aktuelle Wert gespeichert wird • der aktuelle Wert (an seinem Speicherort) ist veränderbar • Attribute von Variablen: – Datentyp – Namen (Bezeichner, Identifier) – Lebensdauer / Speicherklasse – evtl. initialer Wert – Sichtbarkeit (Scope) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Variablen 2
• Deklaration / Definition von Variablen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Variablen 3
• Variablen-Definitionen, z.B.
double u; short int i, tab = 5; char *hallo = "Hallo, Welt!";
• Position im Programm: – außerhalb von Funktionen – am Anfang eines Blocks, also nach
{
• Wert ist veränderbar (Zuweisung, Operation) • Programmstruktur Lebensdauer / Scope Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
Wie speichert C? 1
• Hauptspeicher Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Wie speichert C? 2
• Beispiel: Zugriff auf Variable Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Wie speichert C? 3
• Vor Programmstart Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
Wie speichert C? 4
• Programmstart und Aufruf von
main()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Wie speichert C? 5
• Zuweisung
a = 4;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Wie speichert C? 6
• Zuweisung
b = 8;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Wie speichert C? 7
• Berechnung
a * b;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Wie speichert C? 8
• Zuweisung
c = a * b;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Wie speichert C? 9
• Danach Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Exkurs: Zeiger 1
• Wdh: Jede Variable hat einen Speicherort, d.h. eine Adresse im Hauptspeicher • Zeiger (Pointer) sind Variable, die auf eine andere Variable verweisen, oder exakter: den Speicherort bzw. die Adresse dieser Variablen als Wert haben • Pointerdefinition:
int int * ip; i = 5;
• Adresszuweisung: • Zugriff auf Wert:
ip = * & ip = i; * ip + * ip;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Exkurs: Zeiger 2
• Zugriff auf Variable mit Pointer Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Exkurs: Zeiger 3
• Vor Programmstart Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Exkurs: Zeiger 4
• Programmstart und Aufruf von
main()
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Exkurs: Zeiger 5
• Zuweisung
i = 5;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Exkurs: Zeiger 6
• Zuweisung
ip = &i;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Exkurs: Zeiger 7
• Berechnung
*ip + *ip;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
Exkurs: Zeiger 8
• Zuweisung
*ip = *ip + *ip;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
Exkurs: Zeiger 9
• Danach Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Exkurs: Zeiger 10
• Warum und wozu Zeiger?
?????
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Exkurs: Zeiger 11
• In anderes Programmiersprachen, z.B. Ada oder Pascal, werden Pointer meist nur für dynamische Datentypen verwendet • In C werden Zeiger leider schon von Anfang an für einfache Grundoperationen benötigt!
• Pointer notwendig für Eingaben:
scanf("%d", &i );
• Pointer notwendig als Funktionsparameter:
doit(int *i )
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Noch ein Exkurs: Ein-/Ausgabe 1
• Wdh: Aufbau eines C-Programms:
#include
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Noch ein Exkurs: Ein-/Ausgabe 2
• Jedes laufende C-Programm (= Prozess) hat voreingestellt drei Ein /Ausgabekanäle: –
stdin
Standardeingabe, meist Tastatur –
stdout
Standardausgabe, meist Bildschirm –
stderr
Standardfehlerausgabe, Bildschirm • Die Standardkanäle sind umlenkbar:
$ meinprog
• Bei einigen C-Compilern ist unter Windows auch der Kanal
stdprn
als Standarddrucker definiert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Noch ein Exkurs: Ein-/Ausgabe 3
• Einfache zeichenweise Ein- und Ausgabe mit
getchar()
und
putchar()
, z.B.:
int c; c = getchar(); /* Zeichen von stdin */ putchar(c); /* Zeichen auf stdout */
• Formatierte Ein- und Ausgabe mit printf() und scanf(), z.B.:
int c; scanf("%c", &c); printf("%c", c);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41
Noch ein Exkurs: Ein-/Ausgabe 4
• Obacht:
getchar()
liefert, bzw.
putchar()
benötigt als Parameter den Typ
int
!
• Typumwandlung von
char
int
erfolgt meist automatisch • Hauptgründe: – historisch ist
char
eine Art Untertyp von
int
– die Zeichenkonstante
EOF
als Endekennzeichner für die Eingabe ist in
stdio.h
als -1 definiert • Simples Kopierprogrammfragment:
while((c = getchar())!= EOF) putchar(c);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
Noch ein Exkurs: Ein-/Ausgabe 5
• Formatierte Ausgabe mit
printf()
• Aufruf:
printf(fmt, args)
•
printf()
konvertiert und gibt die Parameter
args
unter Kontrolle des Formatstrings
fmt
auf
stdout
aus • Der Formatstring
fmt
ist eine Zeichenkette • Parameter
args
können auch fehlen • Die Parameter
args
müssen den Typ haben, wie er im Formatstring
fmt
angegeben ist Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43
Noch ein Exkurs: Ein-/Ausgabe 6
• Formatierte Eingabe mit
scanf()
• Aufruf:
scanf(fmt, args)
•
scanf()
konvertiert und liest die Parameter
args
unter Kontrolle des Formatstrings
fmt
von
stdin
ein • Der Formatstring
fmt
ist eine Zeichenkette • Die Parameter
args
müssen den Typ haben, wie er im Formatstring
fmt
angegeben ist • Die Parameter
args
müssen Pointer sein Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44
Noch ein Exkurs: Ein-/Ausgabe 7
• Wichtige Formatzeichen:
%c Einzelzeichen / char %d Ganzzahl / int %ld Ganzzahl / long int %f Gleitkommazahl / float %lf Gleitkommazahl / double %s Zeichenkette / char *
• Wichtige Sonderzeichen
\n Newline, Zeilensprung \t Tabulator \0 EOS - Endezeichen in String \' einfaches Anführungszeichen ' \" \% Prozentzeichen % \\ doppeltes Anführungszeichen " Fluchtzeichen \
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45
Noch ein Exkurs: Ein-/Ausgabe 8
• Beispiele:
char c; int a, b; double d; printf("integer a und b eingeben: "); scanf("%d %d", &a , &b ); printf("a=%d b=%d\n", a , b ); printf("char c und double d: "); scanf("%c %lf", &c , &d ); printf("c=%c d=%lf\n", c , d );
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46
Noch ein Exkurs: Ein-/Ausgabe 9
int main(void) { char c; int a, b; double d; printf("Eingabe int a, b: ", c); scanf("%d %d", a, b); printf("a=%d b=%d\n", &a, &b); printf("Eingabe double d: "); scanf("%lf", &d); printf("f=%c\n", d); return(0); }
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 47
Funktionsaufruf und Parameter
• Parameterübergabe als Werte (call by value), z.B. bei
printf()
• Variable werden als Werte in den Adressraum der Funktion kopiert • Parameterübergabe als Adresse (call by reference), z.B. bei
scanf()
• Adressen der Variablen werden in den Adressraum der Funktion kopiert • In Funktion sind die Parameter Zeiger Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48
Call by value 1
• Beispiel: Funktionsaufruf cbv Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 49
Call by value 2
• Vor Programmstart Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 50
Call by value 3
• Zuweisung a = 4 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 51
Call by value 4
• Kopie des Parameters an Funktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 52
Call by value 5
• Aufruf der Funktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 53
Call by value 6
• Zuweisung b = b * 2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 54
Call by value 7
• Rückkehr aus Funktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 55
Call by value 8
• Variable a unverändert!!!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 56
Call by reference 1
• Beispiel: Funktionsaufruf cbr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 57
Call by reference 2
• Vor Programmstart Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 58
Call by reference 3
• Wo ist der Unterschied
–
?????
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 59
Call by reference 4
• Aufruf: Adresse der Variablen!!!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 60
Call by reference5
• In Funktion: Zeiger auf Variable!!!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 61
Call by reference 6
• Zuweisung a = 4 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 62
Call by reference 7
• Kopie der
Adresse
an Funktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 63
Call by reference 8
• Aufruf der Funktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 64
Call by reference 9
• Zuweisung *b = *b * 2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 65
Call by reference 10
• Rückkehr aus Funktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 66
Call by reference 11
• Variable a verändert!!!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 67