48
Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ

Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS Fulda, DVZ

Embed Size (px)

Citation preview

Page 1: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C

Grundlagen C 3

Hochschule Fulda – FB AI

Sommersemester 2014

http://c-ai.rz.hs-fulda.de

Peter Klingebiel, HS Fulda, DVZ

Page 2: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

Felder 1

• Ein Feld (array) ist die Zusammenfassung von Daten gleichen Typs in einer Variablen

• Felder haben eine oder auch mehrere Dimensionen (Vektoren, Matrizen, …)

• Definition von Feldern: char sbuf[128]; int arr[] = { 1, 8, 7, -1, 2 }; short mat[2][2] = { 11, 12, 21, 22};

• Mit der Felddefinition wird der benötigte Speicherplatz für die Variable reserviert

Page 3: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Felder 2

• Zugriff auf Feldelemente mit Index in []: char c; c = sbuf[32]; sbuf[0] = 'A';

• Die Feldindizierung beginnt immer mit 0! short s, mat[3][3]; s = mat[0][0];

• Felder werden elementweise und Zeile für Zeile hintereinander abgespeichert

• Es gibt beim Zugriff keinerlei Überprüfungen auf Bereichsgrenzen von Feldern!

Page 4: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Felder 3

• Feldnamen sind eigentlich Pointer, zeigen auf das erste Element im Feld

• Felder werden mit Adresse an Funktionen übergeben (wie Pointer)

• Feldindizes sind eigentlich Offsets und geben den Abstand zum Feldanfang anBsp: ia[3] *(&ia[0] + 3 * sizeof(int))

Page 5: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Felder und Zeiger 1

• Felder reservieren bei der Definition den benötigten Speicherplatz

• Zeiger erhalten den Speicherplatz erst bei der Zuweisung des Objekts, auf das sie zeigen, oder bei dynamischer Speicherallokation

• Ähnlichkeit von Feldern und Zeigern mächtige Pointerarithmetik möglich

• Manchmal ein wenig unverständlich!• Pointer essentiell bei Zeichenketten (strings)

Page 6: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

Felder und Zeiger 2

• Beispiel

Page 7: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

Felder und Zeiger 3

• Vor Ablauf

Page 8: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

Felder und Zeiger 4

• Programmstart: Speicher für Feld reservieren

Page 9: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

Felder und Zeiger 5

• Programmstart: Speicher für Zeiger reservieren

Page 10: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

Felder und Zeiger 6

• Zeiger bufp Feld buf bzw. &buf[0]

Page 11: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11

Felder und Zeiger 7

• Zeichen 'A' buf[0]

Page 12: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12

Felder und Zeiger 8

• *bufp 'Y'

Page 13: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

Felder und Zeiger 9

• bufp inkrementieren

Page 14: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

Felder und Zeiger 10

• *bufp 'Z'

Page 15: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

Felder und Zeiger 11

• Danach

Page 16: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

Zeichenketten 1

• Zeichenketten (strings) sind eine Folge von Einzelzeichen char

• String ist terminiert mit '\0'• Speicherbedarf: Länge + 1 Byte• Beispiel: char *s; char *hallo = "Hallo, Welt!";

• String Pointer auf Feld von Elementen vom Typ char

• Nullstring NULL (definiert in stdio.h)

Page 17: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

Zeichenketten 2

• Beispiel: char buffer[128]; char *bp = buffer;

• Stringpointer bp erstes Zeichen im Feld buffer

Ähnlichkeit von Feldern und Pointern!• Beispiel: String kopieren und ausgeben

Page 18: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Zeichenketten 3

• Beispiel: String kopieren

Page 19: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

Zeichenketten 4

• Programmstart

Page 20: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Zeichenketten 5

• Konstante in Speicher

Page 21: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

Zeichenketten 6

• Pointer s1 initialisieren

Page 22: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

Zeichenketten 7

• Speicher für s1 und t anlegen

Page 23: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

Zeichenketten 8

• String s2 = t s2 = & t[0]

Page 24: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

Zeichenketten 9

• Schleife: zeichenweise kopieren

Page 25: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

Zeichenketten 10

• Zeichen kopieren

Page 26: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

Zeichenketten 11

• Pointer inkrementieren

Page 27: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Zeichenketten 12

• …• Zeichen kopieren• Pointer inkrementieren• bis Ende des Strings erreicht

*s1 == '\0'• …

Page 28: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Zeichenketten 13

• End of String: *s1 == '\0'

Page 29: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

Zeichenketten 14

• String terminieren: *s2 = '\0'

Page 30: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

Zeichenketten 15

• Danach

Page 31: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

Exkurs Kommandozeilenparameter 1

• Bekannt: jedes C-Programm startet mit einer main-Funktion

• main-Funktion ist vom Typ int und hat drei Parameter:

• int argcAnzahl von Kommandozeilenparametern

• char *argv[]Feld von Strings Kommandozeilenparameter

• char *envv[]Feld von Strings Umgebungsparameter

Page 32: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32

Exkurs Kommandozeilenparameter 2

• Beispiel echo1.c

/* echo1.c */

#include <stdio.h>

int main(int argc, char **argv){ while(--argc) printf("%s ", *++argv); putchar('\n'); return(0);}

Page 33: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

Exkurs Kommandozeilenparameter 3

• Beispiel: echo2.c

Page 34: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

Aufzählungsdatentyp 1

• Aufzählungsdatentyp enum• Für Datentypen mit diskreten konstanten

Werten• Beispiel: enum color { rot, gruen, blau } c; enum boolean { FALSE, TRUE } b; b = FALSE; c = blau;

• Darstellung als int beginnend mit 0,wenn nicht explizit angegeben: enum boolean { TRUE=1, FALSE=0 } b; b = TRUE;

Page 35: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35

Aufzählungsdatentyp 2

• Beispiel: enumdemo.c

Page 36: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36

Zusammengesetzte Datentypen 1

• Zusammenfassung von zusammgehörigen Daten in eigenen Datentyp struct

• Beispiel einfaches EA-Gerät mit 8-Bit Steuerregister cr und 16-Bit Datenregister dr: struct { char cr; int dr; } ea1; struct _ea { char cr; int dr; } ea2;

• Zugriff durch Selektor . if(ea1.cr & 0x01) ea2.dr = 4711;

• Bei Pointern durch Selektor -> if(ea1->cr & 0x01) ea2->dr = 4711;

Page 37: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37

Zusammengesetzte Datentypen 2

• Beispiel: Datentyp struct circle für Objekt Kreis in einem Zeichenprogrammnotwendig Mittelpunkt (x,y) und Radius r

/* Kreis: Typ */struct circle { int x; /* Mittelpunktkoordinate x */ int y; /* Mittelpunktkoordinate y */ int r; /* Radius */};struct circle c;c.x = 100; c.y = 100; c.r = 50;

Page 38: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38

Zusammengesetzte Datentypen 3

• Funktionen für struct circle

/* Kreis bewegen: Mittelpunkt veraendern */void move_circle(struct circle *c, int x, int y){ c->x = x; c->y = y; }

/* Kreisgroesse aendern: Radius veraendern */ void resize_circle(struct circle *c, int r){ c->r = r;}

Page 39: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39

Zusammengesetzte Datentypen 4

• Beispiel: mydraw1.c

Page 40: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40

Exkurs Computergrafik 1

• Zwei Typen von Computergrafik:• Pixelgrafik

– Grafik wird pixelweise aufgebaut– Formate: gif, jpg, png, bmp, …– Probleme bei Skalierung

• Vektorgrafik– Grafik besteht aus Objekten mit den nötigen

Eigenschaften, z.B. Linie: (x1,y1) und (x2,y2)oder Kreis: Mittelpunkt (x,y) und Radius r

– Problemlos skalierbar

Page 41: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41

Exkurs Computergrafik 2

• Beispiel Pixelgrafik, GIF-Format

Page 42: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42

Exkurs Computergrafik 3

• Beispiel: Vektorgrafik, SVG-Format

Page 43: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43

Exkurs Computergrafik 4

• SVG – Scalable Vector Graphics• Wikipedia

http://de.wikipedia.org/wiki/Scalable_Vector_Graphics

• Veröffentlicht vom W3C erstmals 09/2001• vergleichbar Flash• Animationen und Präsentationen möglich• XML-Format• im Browser eingebaut (Opera, Firefox, u.v.a.,

Internet Explorer ab Version 9!)

Page 44: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44

Typdefinitionen 1

• Oft sinnvoll, eigene Typen oder Untertypen zu definieren typedef

• Beispiel: typedef unsigned char byte;

• Beispiel: typedef struct _ea { byte cr; int dr; } ea; ea ea1, ea2;

• Problem: Typprüfung bei C eher ungenau! besser lesbar, bessere Dokumentation!

Page 45: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45

Typdefinitionen 2

• Erweiterung von mydraw: mydraw2.c

typedef enum { /* Farben */ white, black, grey, red, green, blue, yellow, cyan, magenta} color;

typedef struct _circle { /* Kreis */ int x; /* Mittelpunktkoordinate x */ int y; /* Mittelpunktkoordinate y */ int r; /* Radius */ color c; /* Farbe */} circle;

Page 46: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46

Typdefinitionen 3

• Beispiel: mydraw2.c

Page 47: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 47

Typdefinitionen 4

• Erweiterung Linien, Rechtecke: mydraw3.c

typedef struct _line { /* Linie */ int x1, y1; /* Eckpunkt 1 x,y */ int x2, y2; /* Eckpunkt 2 x,y */ color c; /* Farbe */} line;

typedef struct _rect { /* Rechteck */ int x, y; /* Linke obere Ecke x,y */ int w; /* Breite */ int h; /* Hoehe */ color c; /* Farbe */} rect;

Page 48: Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014  Peter Klingebiel, HS Fulda, DVZ

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 48

Typdefinitionen 5

• Beispiel: mydraw3.c