EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio...

26
EINI-I EINI-I Einführung in die Einführung in die Informatik Informatik für Naturwissenschaftler für Naturwissenschaftler und Ingenieure I und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido [email protected]

Transcript of EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio...

Page 1: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

EINI-IEINI-IEinführung in die Informatik Einführung in die Informatik für Naturwissenschaftler und für Naturwissenschaftler und

Ingenieure IIngenieure I

Kapitel 6

Claudio Moraga; Gisbert Dittrich

FBI Unido

[email protected]

Page 2: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

2

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

Gliederung Kapitel 6: StrukturenGliederung Kapitel 6: Strukturen

Vereinbarung für Zeichen auf charZusammengesetzte Strukturen: struct

Beispiel Buchdaten (einfach)

Vereinbarung

Zugriffu.a. unter Verwendung von Zeigern

Verwendung Beispiel Buchdaten (komplexer)

KarteikarteKarteLesen

AufrufNamensraum

Page 3: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

3

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

Vereinbarung für Zeichen auf char

char Kette[]; // Deklaration einer Zeichenkette // unbestimmter Länge. Kette // ist gleichzeitig ein Zeiger zur // ersten Komponente des Feldes.

char Kette[]= “Text“; // Definition einer // Zeichenkette mit dem Initialinhalt “Text“

Kurze Schreibweise (Vereinbarung):

char * Kette = “Text“;

Page 4: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

4

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

Vereinbarung für Zeichen auf char

Einige Autoren interpretieren die kurze Schreibweise wie folgt:

„Der Datentyp für eine Zeichenkette ist char *, der einen Zeiger auf den Beginn der Zeichenfolge beschreibt, über den auf die Zeichenkette zugegriffen wird. Bei der Ausgabe einer Zeichenkette weißt der zu cout gehörende Ausgabeoperator <<, dass char * nicht als Zeiger, sondern als mit \0 terminierter Zeichenfolge aufzufassen ist.“

Page 5: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

5

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

#include<iostream.h>

void main ( ) {char feldname[ ]= "Frohe Weihnachten!";char * zeigername;zeigername = &feldname[0];

cout << "\n *zeigername = " << *zeigername << endl;

cout << "\n uebernaechstes Symbol = " << *(zeigername + 2) << endl;

cout << "\n zeigername = " << zeigername << endl;

1

Page 6: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

6

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

// Nun nur die Abgekürtzte Definition:

char * zeiger_alleine = "Guten Rutsch!";

cout << "\n *zeiger_alleine = " << *zeiger_alleine << endl;

cout << "\n uebernaechstes Symbol = " << *(zeiger_alleine + 2) << endl;

cout << "\n zeiger_alleine = " << zeiger_alleine << endl;

cout << endl;} 2

Ausführen

Page 7: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

7

Kap 6: Strukturen Vorl “EINI-I"

Zusammengesetzte StrukturenZusammengesetzte Strukturen

Möchte die Daten von Büchern verwalten(Daten eines Buchs sollenlogisch zusammengefügt werden).

Buch-Daten

jahr(int)

seiten(int)

preis(float)

Page 8: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

8

Kap 6: Strukturen Vorl “EINI-I"

Typ der Komponenten

structstruct

Name der struct

• Vereinbarung durch – Angabe der einzelnen Komponenten – mit Namen und Typ:

struct BuchDaten {

int jahr, seiten;

float preis;

}; Name der

Komponenten

Page 9: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

9

Kap 6: Strukturen Vorl “EINI-I"

Anmerkungen zu Anmerkungen zu structstruct

• Name der Struktur ist zugleich Typname.– damit können Variable und Konstanten deklariert

werden: BuchDaten meineDaten;Danach hat die Variable meineDaten den Typ BuchDaten

• Zugriff auf die Komponenten (jahr, seiten, preis) durch Qualifikation: meineDaten.jahr

Page 10: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

10

Kap 6: Strukturen Vorl “EINI-I"

Anmerkungen zu Anmerkungen zu structstruct

• Beispiel (Zuweisung über Komponenten)

meineDaten.jahr = GanzeZahlLesen("Jahr: ");meineDaten.seiten = GanzeZahlLesen("Seiten: ");meineDaten.preis = ReelleZahlLesen("Preis: ");

• Andere Möglichkeit durch Zuweisung einer vollständigen struct (vom Typ BuchDaten) meineDaten = dieseDaten

• Über Verwendung von Zeigern (analog)

Page 11: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

11

Kap 6: Strukturen Vorl “EINI-I"

Zuweisung unter Verwendung von Zeigern:Z.B.: Gib die Adresse eines Elements von BuchDaten an, schreibe die eingelesenen Daten "an die entsprechende Adresse“ :

BuchDaten meineDaten

LiesBuchDaten (&meineDaten);

Die Funktion LiesBuchDaten ist so definiert:

Anmerkungen zu Anmerkungen zu structstruct

Page 12: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

12

Kap 6: Strukturen Vorl “EINI-I"

Anmerkungen Anmerkungen structstruct

int GanzeZahlLesen (char *);float ReelleZahlLesen (char *);

void LiesBuchDaten (BuchDaten *bd) {bd->jahr = GanzeZahlLesen ("Jahr: ");bd->seiten = GanzeZahlLesen ("Seiten: ");bd->preis = ReelleZahlLesen ("Preis: ");

}

Zeiger auf Typ BuchDaten

Zuweisung an Komponenten

bd->jahr steht für

(*bd).jahr

Signatur benutzter FunktionenSignatur benutzter Funktionen

Funktion LiesBuchDaten

Page 13: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

13

Kap 6: Strukturen Vorl “EINI-I"

Anmerkungen Anmerkungen structstruct

• Also:– in der Funktionsdefinition wird als formaler Parameter

verwendet• Zeiger auf Element vom Typ BuchDaten.

– im Rumpf der Definition Zugriff durch Dereferen-zieren

• Beispiel:

Die Komponente jahr wird angesprochen als (*bd).jahr, abgekürzt als bd->jahr

– Aufruf :• Im Beispiel: mit konkreter Adresse &meineDatenLiesBuchDaten(&meineDaten)

Page 14: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

14

Kap 6: Strukturen Vorl “EINI-I"

Anmerkungen Anmerkungen structstruct

• Vereinbarung konstanter structs durch Angabe der Werte:

const BuchDaten dieseDaten = {1997,234,14.70};

Page 15: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

15

Kap 6: Strukturen Vorl “EINI-I"

Anmerkungen zu {..} Anmerkungen zu {..}

• Allgemein:– Wertangaben bei der Definition zur gleichzeitigen

Initialisierung mehrerer Werte können in geschweiften Klammern {..} angegeben werden.

Weiteres Beispiel:

char s[4] = {'a', 'b', 'c', ‘\0'};

(wirkt wie die Zeichenkette s="abc")

Page 16: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

16

Kap 6: Strukturen Vorl “EINI-I"

BeispielBeispiel

Verfasser Zeichenkette,Länge autorMax

Titel Zeichenkette,Länge titelMax

Verlag Zeichenkette,Länge verlagMax

Buchdaten Typ BuchDaten

Karteikarte für ein Buch soll enthalten:

Page 17: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

17

Kap 6: Strukturen Vorl “EINI-I"

BeispielBeispiel

const int autorMax = 75,

titelMax = 100, verlagMax = 128;

struct karteikarte {

char autor [autorMax];

char titel [titelMax];

char verlag [verlagMax];

BuchDaten dieDaten;

};

• Direkte Umsetzung der angegebenen Spezifi- kation für die Daten.• Strukturen können selbst Strukturen enthalten

Page 18: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

18

Kap 6: Strukturen Vorl “EINI-I"

BuchdateiBuchdatei

void AngabeLesen (char *, char *, int);

void LiesBuchDaten(Buchdaten *);

void KarteLesen(int i, karteikarte * k){cout << "Buch Nr. :" << (i + 1) << endl;AngabeLesen("Autor: ", k->autor, autorMax);AngabeLesen("Titel: ", k->titel, titelMax);AngabeLesen("Verlag : ", k->verlag, verlagMax);LiesBuchDaten (&(k->dieDaten));

}

Page 19: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

19

Kap 6: Strukturen Vorl “EINI-I"

KarteLesen/BuchdateiKarteLesen/Buchdatei

Der Aufruf

KarteLesen (17, &ka)

liest die Karte Nr. 17 ein und speichert sie unter der Adresse &ka (wobei vereinbart ist Karteikarte ka)

Programm:

KKarte als struct

Page 20: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

20

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

// K6-P1 KKarte als Struct//// demonstriert structs// Bei Behandlung von "Randfällen" nicht robust. // Fehlerhaft !?

#include <iostream.h>#include <stdio.h>

const char ZeilenEnde = '\n', Null = '\0';const int autorMax = 75, titelMax = 100, verlagMax = 128;

struct BuchDaten { int jahr, seiten; float preis;}

1

Page 21: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

21

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

struct karteikarte { char autor[autorMax];char titel[titelMax];char verlag[verlagMax];BuchDaten dieDaten;

};

//Funktionsprototypenint GanzeZahlLesen(char *);float ReelleZahlLesen(char *);void LiesBuchDaten (BuchDaten *);void AngabeLesen(char *, char *, int); void KarteLesen(int, karteikarte *);void AutorAusgeben(karteikarte *);void TitelAusgeben(karteikarte *);

const int n=2;

2

Page 22: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

22

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

main() {

// const int n=2;

karteikarte kartei[n],*zk;int i;cout << "Eingabe der Kartei-Karten:\n";for (int i=0;i<n;i++)

KarteLesen(i, &kartei[i]);zk = kartei;

cout << "\nAusgabe der Autoren:\n";for (i=0;i<n;i++) {

AutorAusgeben(zk);TitelAusgeben(zk++);}cout << '\n' << "Fertig!" << endl;

} 3

Page 23: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

23

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

void AngabeLesen(char * prompt, char * angabe, int maxWert){int i = 0;cout << prompt << "(Zeichenkette)\t";for (i = 0; (angabe[i] = getchar()) != ZeilenEnde

&& i < maxWert; i++);if (i <= maxWert) angabe[i] = Null;

}

void LiesBuchDaten (BuchDaten *bd) {bd->jahr = GanzeZahlLesen ("Jahr: ");bd->seiten = GanzeZahlLesen ("Seiten: ");bd->preis = ReelleZahlLesen ("Preis: ");

}

void KarteLesen(int i, karteikarte * k){cout << “\nBuch Nr. :" << (i + 1) << endl;AngabeLesen("Autor: ", k->autor, autorMax);AngabeLesen("Titel: ", k->titel, titelMax);AngabeLesen("Verlag : ", k->verlag, verlagMax);LiesBuchDaten (&(k->dieDaten));

} 4

Page 24: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

24

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

int GanzeZahlLesen(char * prompt) {int i;cout << prompt << "(ganze Zahl)\t";cin >> i;return i;

}

float ReelleZahlLesen(char * s) {float fl;cout << s << "(reelle Zahl)\t";cin >> fl;return fl;

}5

Page 25: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

25

Kap 6: Strukturen Vorl “EINI-I"

22.11.2000

void AutorAusgeben(karteikarte * k){ cout << "Autor : "

<< k->autor << '\n';}

void TitelAusgeben(karteikarte * k){ cout << "Titel : "

<< k->titel << '\n';}

6

Ausführen

Page 26: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 6 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

26

Kap 6: Strukturen Vorl “EINI-I"

KarteLesen/BuchdateiKarteLesen/Buchdatei

Jedes struct hat seinen eigenen Namensraum

struct eins {

int x;

char *t;

}

struct zwei {

float x;

int t;

}

unabhängig

voneinander