====== Strukturen ======
Die Struktur definiert einen neuen Datentyp welcher Komponenten unterschiedlichen Typs vereint. Die Typdeklaration
struct
{
};
erlaubt die Deklaration von Variablen diesen Typs
;
**Beispiel:** Wir deklarieren einen Datentyp zur Speicherung der persönlichen Daten eines Studenten.
// Structure
{
// new structure
struct Student
{
long long int matrikel;
int skz;
char name[30], vorname[20];
};
// Variable of type Student
Student arni,robbi;
// Data input
cout << endl << " Vorname : ";
cin >> arni.vorname;
...
robbi = arni; // complete copy
cout << robbi.vorname << endl;
}
Die Zuweisung ''robbi = arni;'' kopiert den kompletten Datensatz von einer Variablen zur anderen. Der Zugriff auf die Komponente vorname der Variablen ''arni'' (des Typs Student) erfolgt über
''arni.vorname''
++++ gesamtes Programm|
// Structure
#include
#include
main()
{
// new structure
struct Student
{
long long int matrikel;
int skz;
char name[30], vorname[20];
};
// Variable of type Student
Student arni,robbi;
// Data input
cout << endl << " Vorname : ";
cin >> arni.vorname;
cout << endl << " Familienname : ";
cin >> arni.name;
cout << endl << " Studentenkennzahl : ";
cin >> arni.skz;
cout << endl << " Matrikelnummer : ";
cin >> arni.matrikel;
robbi = arni;
// output
cout << endl << "-----------------------------------" << endl;
cout << robbi.vorname << " " << robbi.name << ", SKZ: ";
cout << robbi.skz << " " << robbi.matrikel << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
++++
\\ \\
Abgespeichert werden die Daten in der Form
{{:inf:cpp:struct1.png|}}
Abhängig von Compilereinstellungen bzw. -optionen können kleinere ungenutzte Speicherlücken zwischen den Komponenten im Speicher auftreten (Data Alignment für schnelleren Datenzugriff).
Die Struktur ''Student'' kann leicht für Studenten, welche mehrere Studienrichtungen belegen, erweitert werden.
{
const int MAX_SKZ=5;
struct Student_Mult
{
long long int matrikel;
int skz[MAX_SKZ];
int nskz; // number of studies
char name[30], vorname[20];
};
// Variable of type Student
Student arni,robbi;
// Data input
cout << endl << " Vorname : ";
cin >> arni.vorname;
...
robbi = arni; // complete copy
cout << robbi.vorname << endl;
}
++++ gesamtes Programm|
#include
#include
main()
{
const int MAX_SKZ = 5;
// new structure
struct Student_Mult
{
long long int matrikel;
int skz[MAX_SKZ];
char name[30], vorname[20];
int num_skz;
};
// Variable of type Student
Student_Mult arni,robbi;
int i;
// Data input
cout << endl << " Vorname : ";
cin >> arni.vorname;
cout << endl << " Familienname : ";
cin >> arni.name;
cout << endl << " # skz : ";
cin >> arni.num_skz;
for (i=0; i < arni.num_skz; i++)
{cout << endl << " Studentenkennzahl : ";
cin >> arni.skz[i];
}
cout << endl << " Matrikelnummer : ";
cin >> arni.matrikel;
robbi = arni;
// output
cout << endl << "-----------------------------------" << endl;
cout << robbi.vorname << " " << robbi.name << ", SKZ: ";
for (i=0; i < robbi.num_skz; i++)
{
cout << robbi.skz[i] << " ";
}
cout << robbi.matrikel << endl << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
++++
\\ \\
Die Struktur ''Student'' enthält bereits Felder als Komponenten. Andererseits können diese Datentypen wiederum zu Feldern arrangiert werden.
// Array of structures
{
struct Student // new structure
{
...
};
const int N = 20;
int i;
Student gruppe[N]; // Array
// Init
for (i = 0; i < N; i++)
{
cin >> gruppe[i].vorname;
...
}
...
}
++++ gesamtes Programm|
// Dynamic array of type student
// data form input-file
#include
main()
{
struct Student
{
long long int matrikel;
int skz;
char name[30], vorname[20];
};
int i, n;
Student gruppe[4]; //array of Student
cout << endl;
cout << " How many Students : ";
cin >> n; // input n
if ( n <= 4)
{
for (i = 0; i < n; i++)
{
cout << endl << "Student nr. " << i << endl;
cout << "Familenname : ";
cin >> gruppe[i].name;
cout << "Vorname : ";
cin >> (gruppe+i)->vorname;
cout << "Matrikelnummer : ";
cin >> gruppe[i].matrikel;
cout << "SKZ : ";
cin >> gruppe[i].skz;
}
cout << endl;
}
i = 3;
cout << endl;
cout << "Student nr. " << i << " : ";
cout << gruppe[i].vorname << " " << gruppe[i].name << " , ";
cout << gruppe[i].matrikel << " , " << gruppe[i].skz << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
++++
\\ \\
Strukturen können wiederum andere strukturierte Datentypen als Komponenten enthalten.
// Structures in structures
{
struct Point3D // simple structure
{
double x,y,z;
};
struct Line3D // structure uses Point3D
{
Point3D p1,p2;
};
Line3D line; // Declare variable
// Init
cout << "Anfangspkt.: ";
cin >> line.p1.x >> line.p1.y >>line.p1.z;
cout << " Endpkt.: ";
cin >> line.p2.x >> line.p2.y >>line.p2.z;
...
}
++++ gesamtes Programm|
// structure in structure
// data form input-file
#include
#include
main()
{
// Define structures
struct Point3D
{
double x,y,z; // Coordinates
};
struct Line3D
{
Point3D p1,p2; // Points
};
// Define variables
Line3D line;
double length;
// Input data
cout << endl;
cout << "Input Line , Point 1 (x,y,z) : ";
cin >> line.p1.x >> line.p1.y >> line.p1.z;
cout << " Point 2 (x,y,z) : ";
cin >> line.p2.x >> line.p2.y >> line.p2.z;
length = sqrt( (line.p2.x-line.p1.x)*(line.p2.x-line.p1.x)
+(line.p2.y-line.p1.y)*(line.p2.y-line.p1.y)
+(line.p2.z-line.p1.z)*(line.p2.z-line.p1.z) );
cout << endl;
cout << " has length " << length << endl;
cout << endl;
}
++++
In obigem Beispiel ist ''line.p2'' eine Variable vom Typ ''Point3D'' , auf deren Daten wiederum mittels des ''.'' Operators zugegriffen werden kann.
\\ \\
===== Übungsaufgaben =====
Ex1: Erstelle eine Struktur zur Ein- und Ausgabe von Adressen
++++ Lösung|
// Structure
#include
#include
#include
using namespace std;
main()
{
// new structure
struct Adresse
{string name,vorname;
string strasse;
string nr;
string ort;
int plz;
};
// Variable of type Student
Adresse huber;
// Data input
cout << endl << " Vorname : ";
cin >> huber.vorname;
cout << endl << " Familienname : ";
cin >> huber.name;
cout << endl << " Strasse: ";
cin >> huber.strasse;
cout << endl << " Hausnummer : ";
cin >> huber.nr;
cout << endl << " Ort : ";
cin >> huber.ort;
cout << endl << " PLZ : ";
cin >> huber.plz;
// output
cout << endl << "-----------------------------------" << endl;
cout << huber.vorname << " " << huber.name << "\n ";
cout << huber.plz << " " << huber.ort << " " << huber.strasse << huber.nr<< "\n\n ";
system("PAUSE");
return EXIT_SUCCESS;
}
++++