Der Datenverbund: struct |
struct TAutoTyp // Definiere den Typ
{
char Marke[MaxMarke];
char Modell[MaxModell];
long km;
int kW;
float Preis;
}; // Hier vergisst man leicht das Semikolon!
TAutoTyp MeinRostSammler; // Variable anlegen TAutoTyp Fuhrpark[100]; // Array von Autos TAutoTyp *ParkhausKarte; // Zeiger auf ein Auto
Das mag zwar logisch sein, aber es ist weder elegant noch leicht zu merken.
Zum Glück gibt es in C und C++ eine etwas hübschere Variante, über einen
Zeiger auf Strukturelemente zuzugreifen.
Dazu wird aus Minuszeichen und Größer-Zeichen ein Symbol zusammengesetzt,
das an einen Pfeil erinnert.
Elementzugriff
Die Variable MeinRostSammler enthält nun alle Informationen, die
in der Deklaration von TAutoTyp festgelegt sind. Um von der
Variablen auf die Einzelteile zu kommen, wird an den Variablenname ein
Punkt und daran der Name des Bestandteils gehängt.
// Auf die Details zugreifen
MeinRostSammler.km = 128000;
MeinRostSammler.kW = 25;
MeinRostSammler.Preis = 25000.00;
Zeigerzeichen
Wenn Sie über einen Zeiger auf ein Strukturelement zugreifen wollten,
müssten Sie über den Stern referenzieren und dann über den Punkt
auf das Element zugreifen. Da aber der Punkt vor dem Stern ausgewertet
wird, müssen Sie eine Klammer um den Stern und den Zeigernamen legen.
TAutoTyp *ParkhausKarte = 0; // Erst einmal keine Zuordnung
ParkhausKarte = &MeinRostSammler; // Nun zeigt sie auf ein Auto
(*ParkhausKarte).Preis = 12500; // Preis für MeinRostSammler
ParkhausKarte->Preis = 12500;
L-Value
Strukturen sind L-Values. Sie können also auf der linken Seite einer Zuweisung
stehen. Andere Strukturen des gleichen Typs können ihnen zugewiesen werden.
Dabei wird die Quellvariable Bit für Bit der Zielvariable zugewiesen.
TAutoTyp MeinNaechstesAuto, MeinTraumAuto;
MeinNaechstesAuto = MeinTraumAuto;
Trotzdem die beiden Strukturvariablen nach dieser Operation ganz offensichtlich
gleich sind, kann man dies nicht einfach durch eine Anwendung des doppelten
Gleichheitszeichen nachprüfen.
Sie können bei Strukturen die Typdeklaration und die Variablendefinition
zusammenfassen, indem der Name der Variablen direkt nach der geschweiften
Klammer eingetragen wird.
struct // hier wird kein Typ namentlich festgelegt
{
char Marke[MaxMarke];
char Modell[MaxModell];
long km;
int kW;
float Preis;
} MeinErstesAuto, MeinTraumAuto;
Hier werden im Beispiel die Variablen MeinErstesAuto und
MeinTraumAuto gleich mit ihrer Struktur definiert.
Werden auf diese Weise gleich Variablen dieser Struktur gebildet, muss
ein Name für den Typ nicht unbedingt angegeben werden. Damit ist dann natürlich
keine spätere Erzeugung von Variablen dieses Typs möglich.
Initialisierung
Auch Strukturen lassen sich initialisieren. Dazu werden wie bei den Arrays
geschweifte Klammern verwendet. Auch hier werden die Werte durch Kommata
getrennt.
TAutoTyp JB = {"Aston Martin", "DB5", 12000, 90, 12.95};
TAutoTyp GWB = {0};
Klassenähnlich
Die Struktur ist bereits mit C eingeführt worden und ist dort die einzige
Möglichkeit, Datenverbünde zu definieren. In C++ werden zu diesem Zweck
normalerweise Klassen eingesetzt, die
allerdings wesentlich mehr können als
die C-Strukturen. Schon aus Kompatibilität ist das Schlüsselwort in C++
noch vorhanden und wird auch erwartungsgemäß übersetzt. Allerdings kann
eine Struktur in C++ wesentlich mehr. Sie ist dort so definiert, dass sie
eine Klasse entspricht, deren Elemente öffentlich zugänglich sind.
Im Buch befindet sich an dieser Stelle der Syntaxgraf von struct (grafstruct).
Den Syntaxgraf für VarDef finden Sie auf Seite (grafvardef). An dieser Stelle befinden sich also Variablendefinitionen. Dabei sind auch Arrays, Zeiger oder weitere Strukturen zulässig. Als Vars dürfen Variablen von der Struktur aufgezählt werden. Hier dürfen Zeiger und Arrays gebildet werden. Bei der Definition mehrerer Variablen müssen sie durch Komma getrennt werden.
const int MaxSchiff=4;
struct tSchiff
{
int x;
int y;
bool gefunden;
};
tSchiff Schiff[MaxSchiff];
Im nächsten Schritt müssen die Schiffe versteckt werden. Natürlich dürfen wie bei den Lottozahlen nicht zwei Schiffe die gleiche Position haben. Demzufolge ist der Algorithmus sehr ähnlich. Hier sehen Sie das komplette Programm:
// Bermuda: Einführung der Strukturen
#include <iostream>
using namespace std;
#include <stdlib.h>
const int X=9; // Spielfeldausdehnung waagerecht
const int Y=7; // Spielfeldausdehnung senkrecht
const int MaxSchiff=4; // Anzahl der Schiffe
struct tSchiff
{ // Nachbildung eines Schiffes
int x; // Position waagerecht
int y; // Position senkrecht
bool gefunden;
};
tSchiff Schiff[MaxSchiff]; // Unsere Flotte
int main()
{
int i, j; // Zählervariablen
bool neueZahl; // ist eine Position gefunden?
srand(0);
for(i=0; i<MaxSchiff; i++) // alle Schiffe
{
Schiff[i].gefunden = false;
// Bestimmung der Position
do
{
// Einmal Position würfeln
Schiff[i].x = rand() % X;
Schiff[i].y = rand() % Y;
neueZahl = true;
// Prüfe, ob eines der bisherigen Schiffe die
// Position schon innehat
for (j=0; j<i; j++)
{
if (Schiff[j].x==Schiff[i].x
&& Schiff[j].y==Schiff[i].y)
{
// Da saß schon eins!
neueZahl = false;
}
}
// erst bei neuer Position fertig
} while (!neueZahl);
}
// Zur Kontrolle alle anzeigen
for (i=0; i<MaxSchiff; i++)
{
cout << Schiff[i].x << "," << Schiff[i].y << " ";
}
cout << endl;
}
Nun sind die Datenstrukturen für das Bermuda-Programm geschaffen. Im nächsten Schritt wird es um das Gliedern der Funktionalität gehen.
|
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Einstieg in C++ Mit freundlicher Genehmigung und Unterstützung des Verlags galileo computing |
| Informatik-Ecke Einstieg in C++ |
(C) Copyright 2005 Arnold Willemer
|