Beispiel 3: struct person

21.11.2016 04:30 Uhr
#include <iostream>

using namespace std;

struct person 
   {
   char vorname[100];
   char nachname[100];
   char patronym[100];
   char middlename[100];
   char titel[100];
   char sprache;
   char herkunft;
   } ;

void askEnglish(struct person *partner);
void frageDeutsch(struct person *partner);
void greetEnglish(struct person *partner);
void gruesseDeutsch(struct person *partner);

int main()
{
struct person person = { 0 } ;
char sprache;

cout << "Wählen Sie Ihre Sprache:" << endl;
cout << "e = English" << endl;
cout << "d = deutsch" << endl;
cout << "   Ihre Wahl:";
cin >> sprache;

cout << "Sie kommen aus:" << endl;
cout << "w = Westeuropa" << endl;
cout << "a = Amerika" << endl;
cout << "r = Rußland" << endl;
cout << "o = Österreich" << endl;
cout << "   Ihre Herkunft:";
cin >> person.herkunft;

switch(sprache)
   {
case 'e':
   askEnglish(&person);
   break;
case 'd':
   frageDeutsch(&person);
   break;
default:
   cout << "I do not know your language / Maybe you know English?";
   askEnglish(&person);
   sprache='e';
   break;
   }

switch(sprache)
   {
case 'e':
   greetEnglish(&person);
   break;
case 'd':
   gruesseDeutsch(&person);
   break;
   }
}

void askEnglish(
struct person  *partner)
{
cout << "What's your first name?";
cin >> partner->vorname;
cout << "What's your last name?";
cin >> partner->nachname;
switch(partner->herkunft)
   {
case 'r':
   cout << "What's your patronym?";
   cin >> partner->patronym;
   break;
case 'a':
   cout << "What's your middle name?";
   cin >> partner->middlename;
   break;
case 'o':
   cout << "What's your title?";
   cin >> partner->titel;
   break;
   }
}
   

void frageDeutsch(
struct person    *partner)
{
cout << "Wie lautet Ihr Vorname?";
cin >> partner->vorname;
cout << "Wie lautet Ihr Familienname?";
cin >> partner->nachname;
switch(partner->herkunft)
   {
case 'r':
   cout << "Was ist Ihr Vatersname?";
   cin >> partner->patronym;
   break;
case 'a':
   cout << "Was ist Ihr Mittelname?";
   cin >> partner->middlename;
   break;
case 'o':
   cout << "Welchen Titel haben Sie?";
   cin >> partner->titel;
   break;
   }
}
 
void greetEnglish(
struct person    *partner)
{
cout << "Welcome, ";
if (partner->herkunft=='o') cout << partner->titel << " ";
cout << partner->vorname << " ";
if (partner->herkunft=='r') cout << partner->patronym << " ";
else if (partner->herkunft=='a') cout << partner->middlename << " ";
cout << partner->nachname << "!" << endl;
}

void gruesseDeutsch(
struct person    *partner)
{
cout << "Willkommen, ";
if (partner->herkunft=='o') cout << partner->titel << " ";
cout << partner->vorname << " ";
if (partner->herkunft=='r') cout << partner->patronym << " ";
else if (partner->herkunft=='a') cout << partner->middlename << " ";
cout << partner->nachname << "!" << endl;
}


#include <iostream>

using namespace std;

struct person 
   {
   char vorname[100];
   char nachname[100];
   char patronym[100];
   char middlename[100];
   char titel[100];
   char sprache;
   char herkunft;
   } ;
Arrays waren ein Hilfsmittel um mehrere gleichartige Variable
unter einem Namen ansprechen zu können.
Strukturen sind eine Konstruktion, um umgleichartige einfachere Bestandteile
unter einem Namen ansprechen zu können.

Die Bestandteile einer Struktur heißen "Mitglieder".

In unserem Fall ist die Variable "vorname" also ein Mitglied der Struktur des
Typs "person".

Strukturen sind Datentypen, wie andere auch.

I.e.: struct person personen[100] würde ein Array von 100 Strukturen des Typs
"person" erzeugen.

Achtung! Im obigen Beispiel wird eine "abstrakte" Struktur deklariert. Sie
belegt zu diesem Zeitpunkt keinen Speicherplatz.

Der Sinn der obigen Definition ist also etwa:
"Wenn ich von 'struct person' rede, meine ich folgendes:"

void askEnglish(struct person *partner);
Die Adressen von Strukturen können einer Funktion zur
bearbeitung übergeben oder von ihr zurückgegeben werden, genau wie Arrays.
void frageDeutsch(struct person *partner);
void greetEnglish(struct person *partner);
void gruesseDeutsch(struct person *partner);

int main()
{
struct person person = { 0 } ;
Erst hier wird ein Exemplar einer Struktur des Typs
person definiert. Die Variable "person" ist eine Struktur des Typs "person";
denselben Typ kann aber auch eine andere Variable haben - z.b.:
struct person mutter, vater, kind1, kind2;

Wird eine Struktur durch eine Menge initialisiert, wie im obigen Beispiel, so
werden, genau wie bei Arrays, nicht explizit initialisierte Mitglieder der
Struktur mit '0' initialisiert.
char sprache;

cout << "Wählen Sie Ihre Sprache:" << endl;
cout << "e = English" << endl;
cout << "d = deutsch" << endl;
cout << "   Ihre Wahl:";
cin >> sprache;

cout << "Sie kommen aus:" << endl;
cout << "w = Westeuropa" << endl;
cout << "a = Amerika" << endl;
cout << "r = Rußland" << endl;
cout << "o = Österreich" << endl;
cout << "   Ihre Herkunft:";
cin >> person.herkunft;

Soll ein Mitglied einer Struktur die in einer Funktion
definiert wurde, verwendet werden so folgt sien Name dem der Struktur nach einem
Punkt.

person.herkunft

heißt also: "Die Variable herkunft, die ein Mitglied der Variable person ist".

'herkunft' allein, würde eine völlig andere Variable bezeichnen.


switch(sprache)
   {
case 'e':
   askEnglish(&person);
Während der name eines Arrays seiner Adresse gleich ist,
muß bei der Übergabe eines Strukturnamens an eine verarbeitende Funktion der
Adressoperator ('&') explizit angegeben werden.
   break;
case 'd':
   frageDeutsch(&person);
   break;
default:
   cout << "I do not know your language / Maybe you know English?";
   askEnglish(&person);
   sprache='e';
   break;
   }

switch(sprache)
   {
case 'e':
   greetEnglish(&person);
   break;
case 'd':
   gruesseDeutsch(&person);
   break;
   }
}

void askEnglish(
struct person  *partner)
{
Beachten Sie bitte, daß hier die Adresse der Struktur übergeben
wird! Wir können den Inhalt der Struktur also, analog zu einem Array, beliebig
verändern.

cout << "What's your first name?";
cin >> partner->vorname;
Wird eine Struktur nicht über ihren Namen, sondern über einen Zeiger
verwaltet, so werden die Namen von Zeiger und Mitgliedern durch den Operator
"->" verwaltet.

partner->vorname;

heißt also:

"Die Variable 'vorname', auf die der Zeiger 'partner' zeigt."
cout << "What's your last name?";
cin >> partner->nachname;
switch(partner->herkunft)
   {
case 'r':
   cout << "What's your patronym?";
   cin >> partner->patronym;
   break;
case 'a':
   cout << "What's your middle name?";
   cin >> partner->middlename;
   break;
case 'o':
   cout << "What's your title?";
   cin >> partner->titel;
   break;
   }
}
   

void frageDeutsch(
struct person    *partner)
{
cout << "Wie lautet Ihr Vorname?";
cin >> partner->vorname;
cout << "Wie lautet Ihr Familienname?";
cin >> partner->nachname;
switch(partner->herkunft)
   {
case 'r':
   cout << "Was ist Ihr Vatersname?";
   cin >> partner->patronym;
   break;
case 'a':
   cout << "Was ist Ihr Mittelname?";
   cin >> partner->middlename;
   break;
case 'o':
   cout << "Welchen Titel haben Sie?";
   cin >> partner->titel;
   break;
   }
}
 
void greetEnglish(
struct person    *partner)
{
cout << "Welcome, ";
if (partner->herkunft=='o') cout << partner->titel << " ";
cout << partner->vorname << " ";
if (partner->herkunft=='r') cout << partner->patronym << " ";
else if (partner->herkunft=='a') cout << partner->nachname << " ";
cout << partner->nachname << "!" << endl;
}

void gruesseDeutsch(
struct person    *partner)
{
cout << "Willkommen, ";
if (partner->herkunft=='o') cout << partner->titel << " ";
cout << partner->vorname << " ";
if (partner->herkunft=='r') cout << partner->patronym << " ";
else if (partner->herkunft=='a') cout << partner->nachname << " ";
cout << partner->nachname << "!" << endl;
}

Anhang: example3.cpp

Schlagwörter: