Sie sind auf Seite 1von 27

Einfhrung in die Programmierung Vorlesung 7 W I S S E N 1

T E C H N I K

L E I D E N S C H A F T

Einfhrung in die Programmierung


DI Dr. Christian Safran, IICM DI Michael Steurer, IICM Univ.-Prof. DI Dr. techn. Frank Kappe, IICM

www.tugraz.at

Einfhrung in die Programmierung Vorlesung 7 2

Inhalt Teil 7:
Selbstdefinierte Datentypen
"! Struct "! Typedef

File I/O

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 3

Strukturen (structs)
Mehrere einzelne Variablen werden zu einem neuen Typ zusammengefasst, und knnen dann als ganzes verwendet werden Syntax: struct identifier { members; }; oder struct identifier { members; } instances;
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 4

Beispiele
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // declare struct and define two instances: struct _Point_ { float x_; float y_; } point_1, point_2; // declaration only (usually in header file): struct _Vector_ { double x_; double y_; }; // definition of instances: struct _Vector_ point_1, point_2;

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 5

typedef
Erlaubt Verwendung selbstdefinierter Typ-Namen Syntax:
typedef <existing-type> <new-type>;

Beispiel:
typedef float coord; ... coord center_x = 0.0;

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 6

typedef
Leichter spter zu ndern (z.B. alle Koordinaten in double) Compiler kann Parameter-Typen genauer berprfen:
void draw_circle (coord x, coord y, float radius);

Meist in Zusammenhang mit struct verwendet (spter)

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 7

Eleganter: typedef und struct


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // declare type Point: struct _Point_ { float x_; float y_; }; typedef struct _Point_ Point; // all in one (preferred): typedef struct { double x_; double y_; } Vector; // definition of instances: Vector point_1, point_2;

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 8

Initialisierung von Structs


21 22 23 24 25 26 27 28 29 30 31 typedef unsigned char color_component; typedef struct { color_component red_; color_component green_; color_component blue_; } Color; Color black = { 0x00, 0x00, 0x00 }; Color white = { 0xFF, 0xFF, 0xFF };

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 9

struct of struct
40 // assuming definitions of Point and Color like before 41 42 typedef struct 43 { 44 Point bottom_left_; 45 Point top_right_; 46 Color line_color_; 47 Color fill_color_; 48 } Rectangle; 49 50 Rectangle rect_1 = { { 1.0, -1.0 }, 51 { 4.0, 10.0 }, 52 white, 53! { 0xFF, 0x80, 0x80 } };

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 10

struct of struct
Compiler kann Offsets "optimieren", nur Reihenfolge fix
"! z.B.: sizeof(Rectangle) = 24, nicht 22 !

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 11

Zuweisungen; Pointer auf struct; . und -> Operatoren


60 Rectangle rect_2, rect_3; 61 rect_2 = rect_1; // copies all members 62 63 rect_3.bottom_left_.x_ = 0.0; // access individual member 64 rect_3.fill_color_ = black; // black is of type Color 65 66 Rectangle *rect_pointer = &rect_3; 67 (*rect_pointer).bottom_left_.y_ = rect_2.top_right_.y_; 68 // same as above 69 rect_pointer->bottom_left_.y_ = rect_2.top_right_.y_; 70 rect_pointer->fill_color_.red_ = 0; 71 rect_pointer->line_color_ = rect_pointer->fill_color_;
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 12

struct of array
typedef struct { char first_name_[20]; char last_name_[20]; char phone_[20]; } Person; Person professor = { "Frank", "Kappe", "873-5602" }; Person assistant = { "Christian", "Safran", "873-5668" };

Nachteile von fixer String-Gre:


"! Lange Namen werden abgeschnitten "! Unntig viel Speicherverbrauch
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 13

arrays of struct
20 // assuming declarations from before 21 22 Person employees[10]; // static array 23 Person *person_pointer = employees; 24 25 employees[0] = professor; // copy whole record 26 strcpy(person_pointer->phone_, "873-5699"); // access employees[0] 27 person_pointer++; // move to next record 28 *person_pointer = assistant; // copy whole record 29 30 // dynamic array (60000 bytes): 31 Person *phone_book = malloc(1000 * sizeof(Person)); 32 person_pointer = phone_book + 500; 33 printf("%s %s\n", person_pointer->last_name_, 34 person_pointer->phone_);

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 14

struct of pointer
typedef struct { char *first_name_; char *last_name_; unsigned long number_; } Student; Student student_1 = { "Max", "Mustermann", 1234567 }; Student student_2; Student_2.first_name_ = malloc(10); Student_2.last_name_ = malloc(6); strcpy(student_2.first_name_, "Willibald"); strcpy(student_2.last_name_, "Huber"); student2.number_ = 987654321;
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 15

Vorsicht Fallen!
free() nicht vergessen!
void freeStudent(Student *student) { free(student->first_name_); free(student->last_name_); }

"shallow copy" kopiert nur die Pointer !!!


Student_2 = student_1;

== Operator vergleicht nicht den Inhalt, nur die Pointer !!!


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 16

Richtig: "deep copy"


char *copyString(char *dest, char *src) { dest = realloc(dest, strlen(src) + 1); strcpy(dest, src); return dest; } void copyStudent(Student *dest, Student *src) { dest->first_name_ = copyString(dest->first_name_, src->first_name_); dest->last_name_ = copyString(dest->last_name_, src->last_name_); dest->number_ = src->number_; }
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 17

Rekursive Deklaration
Struct-Deklaration kann einen Pointer auf sich selbst beinhalten
data left right

Beispiel (Binrbaum):
struct _Bintree_ { char data_[10]; struct _Bintree_ *left_; struct _Bintree_ *right_; }; // some data // pointer to left subtree // pointer to right subtree

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 18

Weitere Beispiele
Einfach verkettete Liste (Stack)
typedef struct _StackItem_ { int data_; struct _StackItem_ *next_; } StackItem; StackItem *top; // operations: void push(StackItem **top, int data); int pop(StackItem **top);
top
data next

data next

data next

data NULL

Siehe 7_simple_stack.c auf VL-Website


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 19

Files (Dateien)
Files sind eine Abstraktion des Betriebssystems fr
"! "! "! "! "! "! "! Disk-Files Netzwerkverbindungen Tastatur-Eingaben Ausgaben in ein Fenster am Bildschirm Bandlaufwerke Memory-Sticks ...

Vorteil: Programmierer muss sich nicht um die Details kmmern


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 20

"Buffered I/O": Operationen (in <stdio.h>)


fopen ffnet File zum Lesen oder Schreiben (text/ binary) fclose schreibt alle gepufferten Daten und schliesst File fread liest Daten von File fwrite schreibt Daten auf File fprintf, fscanf wie printf, scanf

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 21

"Buffered I/O" fseek bewegt die Position fr nchstes fread/fwrite rewind bewegt diese Position auf den Anfang des Files fflush schreibt alle gepufferten Daten feof am Ende des Files ? .... z.B. http://en.wikipedia.org/wiki/stdio.h oder man-pages

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 22

File I/O
Folgende Files sind automatisch geffnet:
"! stdin standard input; fscanf(stdin, ...) == scanf(...) "! stdout standard output; fprintf(stdout, ...) == printf(...) "! stderr standard error output

Knnen durch Shell von/zu Files oder anderen Programmen umgeleitet werden

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 23

Binrdateien vs. ASCII-Dateien


ASCII-Dateien
"! Inhalt ASCII-Zeichen "! Mit Texteditor lesbar

Binrdateien
"! Enthlt beliebige Datentypen (also z.B. auch ASCII Zeichen) "! Vgl 123 vs 123

Vorsicht bei Binrdateien:


"! Byte-Order der lesenden Maschine knnte unterschiedlich zu der der schreibenden Maschine bzw. der Spezifikation des File-Formats sein "! Compiler knnte Structs anders packen

Vorlesung #8

Einfhrung in die Programmierung Vorlesung 7 24

Beispiele

6_write_binary_file.c 6_read_binary_file.c 6_write_ascii_file.c 6_read_ascii_file.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 25

6. Hausbung
Binr- und Textdateien "! Lies Binrdatei ein
"! Pascal Strings

"! Speichere Strings in Binrdatei


DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 26

6. Hausbung
Dateiaufbau

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 7 27

6. Hausbung
Aufgabenstellung im Wiki
"! Halten Sie sich genau an die Anforderungen! "! Ihre Abgabe wird automatisiert getestet. "! Feedback: Anzahl der bestandenen Testflle.

Fragen von allgemeinem Interesse


"! Newsgroup tu-graz.lv.ep "! Zuerst lesen, dann posten

DI Dr. Christian Safran, IICM