Der verflixte 7. Teil :-)

Wie schon am Ende des letzten Teil des C-Kurses angesprochen wurde, wollen wir uns unsere eigene kleine Datenbank schreiben. Was eignet sich dazu besser als eine Adressverwaltung ? Am Anfang kümmern wir uns erstmal um eine effiziente Datenverwaltung.
 
 
 
Strukturen

Wenn wir unsere Adressen verwalten, so sind die Angaben in der Regel
 

  • Name 
  • Vorname 
  • Straßenname 
  • Hausnummer 
  • Postleitzahl 
  • Ort 
  • Telefonnummer

Mit unseren bisherigen Kenntnissen würden wir für jeden Eintrag ein Feld benutzen Das das auf die Dauer recht umständlich und nervenraubend ist,kann man sich vorstellen. Da wir in unserer Adressverwaltung immer einen feststehenden Datensatz haben können wir uns auch eine eigene Datenstruktur anlegen, die unsere gewünschten, und bekannten, Datentypen enthält.

Folgende Anweisung muß nun im Vereinbarungsteil stehen
 

char *Name; 
char *Vorname;
char *Strassenname;
int Hausnummer;
int Postleitzahl; 
char *Ort;
char *Telefonnummer;
    struct datensatz {
        char *Name; 
        char *Vorname; 
        char *Strassenname; 
        int Hausnummer; 
        int Postleitzahl; 
        char *Ort;
        char *Telefonnummer;
    };

Damit hätten wir nun eine Benennung & Reihenfolge der Datentypen vorgegeben der wir einen Namen gaben. Prinzipiell sieht eine Strukturdeklarierung in C wie folgt aus.
 

struct Strukturname 
      Komponenten 
    };

Komponenten sind hier eine Ansammlung von definierten Variablen die Strukturelemente sind und fest zu der erstellten Struktur gehören. Mit der Struktur können wir im Prinzip wie mit einem Variablentypen umgehen, da es sich hierbei um eine Ansammlung von Datentypen handelt.

Mit
 

struct datensatz freunde[10];

legen wir im Vereinbarungsteil fest, daß das Feld freunde 10 Einträge umfaßt. (s. Felder)

Man kann sich vorstellen, das ein Datentyp "struct datensatz" erzeugt wird und die Variable Freunde vom Typ "struct datensatz" ist.
 
 
 
Beispielprogramm für Strukturen

Damit wir von der grauen Theorie etwas Abstand gewinnen, schreiben wir eine Struktur und spielen ein wenig mit ihr herum.
 

#include <stdio.h>

 
void main ( void
{
    /* die Variable struktur wird mittels einer Struktur deklariert */
    struct ganz 
    {
      int zahl; 
      char *zeichen;
    } struktur[2];

     
    /* nun weisen wir den Einzelelementen Werte zu */
    struktur[0].zahl = 2;
    struktur[0].zeichen = "unsere erste Struktur";

     
    struktur[1].zahl = 5; 
    struktur[1].zeichen = "unsere zweite Struktur";

     
    /* schlieszlich geben wir das Ganze noch aus */
    printf ("\n %s enthaelt %d\n",struktur[0].zeichen, struktur[0].zahl);
    printf ("\n %s enthaelt %d\n",struktur[1].zeichen, struktur[1].zahl);
}

Sicherlich sind einem zwei Dinge ins Auge gefallen: Die Deklaration und das Auslesen und Zuweisen der einzelnen Strukturelemente.

Bei der Deklaration gibt es folgende Vereinfachung
 

struct ganz 
    int zahl; 
    char *zeichen;
} struktur[2];

ist die Abkürzung für
 

struct ganz 
    int zahl;
    char *zeichen;
};

 
struct ganz struktur[2];

 
 
 
 
Datenausgabe ( Zugriff auf Strukturelemente )

Wie in dem Beispielprogramm zu sehen ist, kann man gezielt auf einzelne Daten zugreifen. Auf die einzelne Variable kann man mittels

zugreifen. Es ist wichtig, daß zwischen den Elementen der Punkt steht. Er trennt in der Hierarchie die einzelnen Elemente. Der Variablenname ist immer der, der in der Strukturerstellung benutzt wird!
 
struktur[0].zahl = 2; 

oder
 

struktur[0].zeichen = "unsere erste Struktur";

weisen den Elementen die Werte zu. Dabei ist stets darauf zu achten,ob der Datentyp korrekt ist. Man kann, wie bisher auch, auf Felder innerhalb von Strukturen zugreifen:
 

    struct strukturname 
        {
          int zahl [10];
        } struktur[2];
    printf ("%c",struktur[0].zahl[5] );

gibt uns z.B. die 5. Zahl des Zahlfeldes aus "struktur [0]" aus.

Immer an den Stolperstein denken: Indizes fangen bei 0 an !

Das selbe Verhalten gilt analog zu fprintf !
 
 
 
Dateneingabe ( Zugriff auf Strukturelemente )

Analog zur bisherigen Eingabe können auch Strukturelemente eingelesen werden.
 

scanf ("%d",&struktur[0].zahl);

liest z.B. das Integer-Element "zahl" von struktur[0] ein.

Gleiches gilt analog für fscanf !

Da gibt es also nichts neues :-)
 
 
 
 
Zeiger als Strukturelemente

Jetzt kommen wir wieder zu dem beliebtesten Teil von C , den Zeigern. Wie bisher können beliebige Variablentypen innerhalb einer Struktur stehen. Das schließt auch Zeiger mit ein. Folgende Struktur ist also durchaus denkbar
 

struct struktur 
{
    int zahl; 
    char *zeichenkette; 
}

 
 
 
Zeiger auf Strukturelemente

Als Beispiel benutzen wir die Struktur des vorigen Beispiels und generieren folgenden Zeiger
 

struct struktur *zeiger;

Wenn wir nun auf ein Element zugreifen wollen, müssen wir
 

(*zeiger).zahl;

schreiben.

Wieso eigentlich die Klammer um den Strukturnamen ?

Da der Punkt eine größere Priorität gegenüber dem *-Operator hat, muß der erste Ausdruck in Klammern gesetzt werden.

Da das auch umständlich und unübersichtlich ist gibt es eine Vereinfachung.
 

zeiger->zahl;

ist äquivalent zu dem vorigen Elementzugriff.

Der -> Operator sorgt letztlich für ein mehr an Leserlichkeit.
 
 
 
 
 
Hausaufgaben

Für unsere private Datenbank ist die folgende Aufgabe zu dem Thema hilfreich!

Als Struktur sei gegeben:
 

struct datensatz 
{
    char *Name;
    char *Vorname; 
    char *Strassenname; 
    int Hausnummer;
    int Postleitzahl; 
    char *Ort; 
    char *Telefonnummer;
};

Schreiben sie ein Programm, welches 5 Datensätze einliest.

Jeder Datensatz besteht aus der obigen Struktur.

Das Programm sollte folgende Punkte erfüllen:

a) Schreiben der Daten in ein File.

b) Lesen der Daten aus einem File

c) Auswahl eines Datensatzes und Ausgabe des Datensatzes auf dem Bildschirm

Da das Programm etwas größer als die bisherigen wird, sei sie diesmal die einzige Aufgabe. Für den weiteren Ablauf ist ein erfolgreiches programmieren der Aufgabe wichtig - und scheuen sie nicht davor Ihr Wissen aus früheren Kursen aufzufrischen. Und denken sie immer an das Semikolon ;-)

Und nächstes mal programmieren wir weiter an unserer privaten Datenbank.
 
 
 
 
 
...das Obligatorische

Autor: Sebastian Cyris \ PCD Bascht

Dieser C-Kurs dient nur zu Lehrzwecken! Eine Vervielfältigung ist ohne vorherige Absprache mit dem Autor verboten! Die verwendete Software unterliegt der GPL und unterliegt der Software beiliegenden Bestimmungen zu deren Nutzung! Jede weitere Lizenzbestimmung die der benutzten Software beiliegt, ist zu beachten!