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
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
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“;
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.“
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
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
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)
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
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
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)
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
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
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)
14
Kap 6: Strukturen Vorl “EINI-I"
Anmerkungen Anmerkungen structstruct
• Vereinbarung konstanter structs durch Angabe der Werte:
const BuchDaten dieseDaten = {1997,234,14.70};
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")
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:
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
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));
}
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
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
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
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
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
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
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
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
Top Related