Informatik II Programmieren in C - Webserver - DVZ

Download Report

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 int main(void) { int a, b, c; scanf("%d", &a); scanf("%d", &b); c = a * b; printf("c = %d\n", c); return(0); }

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 OutFile 2>ErrFile

• 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

cbv

cbr ?

?????

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