51
C-Programm (Subject) / Struktur in C (Lesson)
Advertisement
- 1. 2. Aufbau eines Programms Der Aufbau eines Programms folgt in den meisten Fällen diesem Muster: vordefinierte Bibliotheken void main() { Variablendefinitionen Eingabe Verarbeitung der Variablen Ausgabe } Der Aufbau eines Programms folgt in den meisten Fällen diesem Muster: vordefinierte Bibliotheken void main() { Variablendefinitionen Eingabe Verarbeitung der Variablen Ausgabe }
- 2. 1. 2. Verknüpfungen von Bedingungen Es kann vorkommen, daß mehrere Bedingungen gleichzeitig erfüllt sein müssen, um einen Befehl auszuführen. Dazu müssen die Bedingungen verknüpft werden. ((Bedingung_1) verknüpfungsoperator (Bedingung_2))
- 2. 2. if und else 2. 2. 1. Die if - Anweisung 2. 2. 1. Die if - Anweisung Eine if - Anweisung ist dazu da, um Entscheidungen zu treffen. Je nach Bedingung werden dann die Befehle ausgeführt, oder auch nicht. Eine if - Anweisung ist wie folgt aufgebaut: if (Bedingung) Befehl
- 2. 2. if und else (2) 2. 2. 1. Die if - Anweisung Es ist auch möglich, daß bei einer Bedingung mehrere Befehle ausgeführt werden müssen. Dann müssen diese in geschweifte Klammern gesetzt werden. if (Bedingung) { Befehl_1; ... Befehl_n; }
- 2. 2. 2. Die else - Anweisung 2. 2. 2. Die else - Anweisung Will man aber für den Fall, daß die Bedingung nicht erfüllt ist, auch Befehle ausführen, so benötigt man die else - Anweisung. if (Bedingung) Befehl_1; else Befehl_2; Zum Lesen: Falls die Bedingung erfüllt ist, dann führe Befehl_1 aus. Ansonsten führe Befehl_2 aus.
- 2. 2. 3. Kombination aus if - und else - Anweisungen 2. 2. 3. Kombination aus if - und else - Anweisungen Sofern man mehrere Bedingungen zu untersuchen hat, empfiehlt es sich, eine Kombination aus if - und else - Anweisungen zu benutzen. if (Bedingung_1) Befehl_1; else if (Bedingung_2) Befehl_2; else Befehl_3; Zum Lesen: Falls Bedingung_1 erfüllt ist, führe Befehl_1 aus. Ansonsten, falls Bedingung_2 erfüllt ist, führe Befehl_2 aus. Ansonsten führe Befehl_3 aus.
- 2. 3. switch, case und brake 2. 3. switch, case und brake 2. 3. 1. Die switch - case - Anweisung Wenn eine Variable mehrere verschiedene Werte annehmen kann und man für jeden einzelnen Wert eine eigene Verarbeitung programmieren muß, können if - else - Anweisungen leicht unübersichtlich werden. Um dem Abhilfe zu verschaffen, verwendet man die switch - case - Anweisung. switch (variable) { case wert_1 : anweisung_1_1; ... anweisung_1_m; break; case wert_2 : anweisung_2_1; ... anweisung_2_m; break; ... case wert_n : anweisung_n_1; ... anweisung_n_m; } Zum Lesen: Für den Fall, daß die variable den wert_1 hat, führe die Anweisungenanweisung_1_1 bis anweisung_1_m aus. Für den Fall, daß die variable den wert_2 hat, führe die Anweisungenanweisung_2_1 bis anweisung_2_m aus. ... Zu beachten ist, daß man die Anweisungen, im Gegensatz zur if - else - Anweisung, nicht in die geschweiften Klammern setzen muß.
- 3. 2. Die while - Schleife 3. 2. Die while - Schleife While - Schleifen werden in der Regel für Programmteile benutzt, bei denen eine Bedingung überprüft werden muß, bevor der Programmcode innerhalb der Schleife ausgeführt wird. Dabei kann es passieren, daß dieser gar nicht ausgeführt wird. Daher eignen sich while - Schleifen für Programmteile, welche mindestens einmal ausgeführt werden müssen (z. B. Variableneingabe am Anfang eines Programms), weniger. Eine while - Schleife ist folgendermaßen aufgebaut: while (Bedingung) { Befehl_1; ... Befehl_n; } Zum Lesen: Solange die Bedingung erfüllt ist, führe die Befehle aus. Bevor die Befehle in der Schleife ausgeführt werden, wird die Bedingung überprüft. Nur wenn diese erfüllt ist, tritt das Programm in die Schleife ein und die Befehle werden ausgeführt. Da die Bedingung zuerst überprüft wird, wird die while - Schleife auch kopfgesteuerte Schleife genannt.
- 3. 3. Die do - while - Schleife 3. 3. Die do - while - Schleife Do - while - Schleifen werden in der Regel für Programmteile benutzt, bei denen die Bedingung überprüft wird, nachdem der Programmcode innerhalb der Schleife ausgeführt wurde. Der Programmcode wird also mindestens einmal ausgeführt. Sie werden daher häufig in der Variableneingabe am Anfang eines Programms eingesetzt. Ist allerdings die Überprüfung der Bedingung vor der Ausführung des Programmcodes erforderlich, so eignet sich eine do - while - Schleife nicht. Eine do - while - Schleife ist folgendermaßen aufgebaut: do { Befehl_1; ... Befehl_n; } while (Bedingung); Zum Lesen: Führe die Befehle aus, solange die Bedingung erfüllt ist. Bei der do - while - Schleife ist zu beachten, daß zuerst die Befehle einmal ausgeführt werden und dann überprüft wird, ob die Bedingung erfüllt ist. Eine do - while - Schleife wird daher auch fußgesteuertgenannt. Auch hier kann man die geschweiften Klammern einsparen, wenn man in der Schleife nur einen Befehl ausführt. Und es ist wiederum darauf zu achten, daß die Bedingung nicht immer erfüllt sein darf.
- 3. 4. Die for - Schleife 3. 4. Die for - Schleife Während wir bei while - Schleifen und do - while - Schleifen nur eine Bedingung überprüft haben, bevor oder nachdem der Programmcode innerhalb der Schleife ausgeführt wurde, arbeiten wir bei den for - Schleifen mit einer Laufvariable, deren Wert ausschlaggebend ist, für die Ausführung des Programmcodes innerhalb der Schleife. Eine for - Schleife ist folgendermaßen aufgebaut: for (laufvariable = startwert; Bedingung mit Laufvariable; Änderung der Laufvariable) { Befehl_1; ... Befehl_n; } Zum Lesen: Solange die Bedingung erfüllt ist, führe die Befehle aus. Wie man sieht, ist das Lesen der for - Schleife genauso, wie das Lesen der while - Schleife. Sie ist also ebenfalls kopfgesteuert. Der Kopf der for - Schleife beinhaltet 3 wichtige Anweisungen. Die erste Anweisung setzt die Laufvariable auf einen Startwert. Sie wird also initialisiert. Die zweite Anweisung stellt die Bedingung dar, welche erfüllt sein muß, damit der Programmcode ausgeführt wird. Diese Bedingung sollte den Wert der Laufvariable überprüfen. Tust Du das nicht, so ist die Benutzung der for - Schleife sinnlos. Die dritte Anweisung besagt, wie sich der Wert der Laufvariablen nach einem Schleifendurchlauf verändert. Du mußt Dich dort entscheiden, ob der Wert sich erhöht oder ob er kleiner wird. Wie Du eine Wertänderung in der C - Programmierung abkürzen kannst, findest Du auf der nächsten Seite.
- Advertisement
- 4. Arrays 4. 1. Allgemeines Arrays (dt. Felder) werden in der C - Programmierung verwendet, um mehrere Werte, die ein und den selben Sachverhalt beschreiben, zusammenzufassen. Eine Wetterstation nimmt beispielweise verschiedene Werte auf. Sie misst die Temperatur, den Luftdruck und die Luftfeuchtigkeit. Für jeden dieser Werte würde man eine Variable in einem C - Programm benötigen. Da aber Wetterstationen die Temperatur über einen bestimmten Zeitraum messen müssen, werden für die Temperatur, die Luftfeuchtigkeit und den Druck mehrere Werte benötigt. Dafür sind die Arrays in der C - Programmierung zuständig. Mit Hilfe eines solchen Feldes kann man beispielsweise die Temperatur der Wetterstation im Zeitraum von einer Stunde speichern. In der C - Programmierung unterscheidet man die Arrays anhand der Dimensionen. Wir behandeln in diesem Lehrgang nur ein- und zweidimensionale Arrays.
- 4. 2. 2. Definieren des eindimensionalen Arrays 4. 2. 2. Definieren des eindimensionalen Arrays Ein eindimensionales Array wird folgendermaßen definiert: datentyp feldname[feldgröße]; Beispiel: int komode[5]; /*Das Array komode (um das Beispiel aufzugreifen) kann insgesamt 5 Werte vom Datentyp integer aufnehmen.*/
- 4. 3. 2. Definieren des zweidimensionalen Arrays 4. 3. 2. Definieren des zweidimensionalen Arrays Ein zweidimensionales Array wird folgendermaßen definiert: datentyp feldname[spaltenanzahl][zeilenanzahl]; Beispiel: int tabelle[3][5]; /*Das zweidimensionale Array tabelle hat also 3 Spalten und 5 Zeilen, welche Werte vom Datentyp integer aufnehmen.*/
- 4. 3. 2. Definieren des zweidimensionalen Arrays 4. 3. 2. Definieren des zweidimensionalen Arrays Ein zweidimensionales Array wird folgendermaßen definiert: datentyp feldname[spaltenanzahl][zeilenanzahl]; Beispiel: int tabelle[3][5]; /*Das zweidimensionale Array tabelle hat also 3 Spalten und 5 Zeilen, welche Werte vom Datentyp integer aufnehmen.*/
- 5. Funktionen 5. 1. Allgemeines 5. Funktionen 5. 1. Allgemeines Funktionen werden in der C - Programmierung verwendet, um Programmtext, der sich mehrfach wiederholt, einzusparen. Hat man beispielsweise die Aufgabe, die Werte einer Meßstation auszugeben und muß man das noch einmal machen, nachdem die Werte sich geändert haben, so ist hier eine Funktion angebracht. Funktionen müßtest Du schon aus der Mathematik kennen. Eine der bekanntesten Funktionen ist wohly = f (x) = mx + n, welche eine Gerade beschreibt. Im Verlauf dieses Kapitels werde ich diese Funktion zur Hilfe nehmen, um den Sachverhalt zu verdeutlichen.
- 5. 2. Aufbau Eine Funktion der C - Programmierung hat den folgenden Aufbau: 5. 2. Aufbau Eine Funktion der C - Programmierung hat den folgenden Aufbau: rückgabedatentyp funktionsname (datentyp1 parameter1, ..., datentyp_n parameter_n) { Funktionsrumpf } Eine Funktion wird vor der Funktion main() definiert.
- 6. 2. Definition eines Zeigers 6. 2. Definition eines Zeigers Ein Zeiger wird folgendermaßen definiert: datentyp *zeigername; Zu beachten ist dabei, daß der Zeiger immer nur auf Variablen vom angegebenen Datentyp zugreifen kann. Hat der Zeiger beispielsweise den Datentyp int, so kann er nicht auf Variablen vom Datentypfloat zeigen. Es besteht wiederum die Möglichkeit, daß mehrere Zeiger vom gleichen Datentyp hintereinander definiert werden. Das kennst Du aber schon von der Definition von einfachen Variablen.
- 6. 3. Zugriff auf Zeiger 6. 3. 1. Adresse zuweisen 6. 3. Zugriff auf Zeiger 6. 3. 1. Adresse zuweisen Auf einen Zeiger kann auf 3 Arten zugegriffen werden. Man kann dem Zeiger die Adresse einer Variablen zuweisen, man kann die Adresse, auf die der Zeiger zeigt, auslesen und den Wert der Variablen, auf die der Zeiger zeigt, auslesen. Man weist einem Zeiger folgendermaßen eine Adresse zu: zeiger = &variablen; Dem Zeiger wird also die Adresse der Variablen zugewiesen.
- 6. 3. Zugriff auf Zeiger 6. 3. 2. Adresse auslesen 6. 3. 2. Adresse auslesen Um die Adresse, auf die der Zeiger zeigt, auszulesen, gibt man einfach nur den Zeigernamen an. Um die Adresse auszugeben, benötigst Du in der Funktion printf() den Formatstring %p (p = pointer, engl. Zeiger).
- 6. 3. Zugriff auf Zeiger 6. 3. 3. Wert der Adresse auslesen Wenn Du den Wert der Variablen, auf deren Adresse der Zeiger gerichtet ist, auslesen möchtest, so mußt Du den Verweisoperator vor den Zeigernamen setzen: *zeigername Diese Zeichenkette kannst Du wiederum in eine printf() - Anweisung einbinden. Du hast außerdem die Möglichkeit, den Wert der Variablen zu ändern. Wenn beispielsweise der Zeiger z auf die Variable v zeigt, so kann man den Wert der Variablen auch folgendermaßen ändern: *z = neuerWert; Der Variable v wurde also ein neuer Wert zugewiesen.
- 6. 3. Zugriff auf Zeiger 6. 4. Zeiger in Funktionen 6. 4. Zeiger in Funktionen Wie schon in Kapitel 5.5 erwähnt, werden die Werte von Parametern in Funktionen nicht geändert, auch wenn man es scheinbar tut. Hat man dies aber vor, so kann man statt der Variablen, Zeiger auf diese Variablen übergeben. Dann ist es möglich, die Werte der Parameter zu ändern. Bei der Definition der Funktion muß der Zeiger in der Parameterliste eingetragen werden: rückgabewert funktionsname(datentyp *zeigername) In der Funktion kann man auf den Wert der Variable mittels Verweisoperator * zugreifen. Im Hauptprogramm sieht der Aufruf der Funktion dann folgendermaßen aus: funktionsname(zeigername); Du hast auch die Möglichkeit, gleich die Adresse der Variablen zu übergeben. Du benötigst dann nicht extra einen Zeiger.Der Aufruf sieht dann folgendermaßen aus: funktionsname(&variablenname); Es wird also die Adresse übergeben, was ja einem Zeiger entspricht.
- 6. 5. Zeiger auf Arrays 6. 5. Zeiger auf Arrays In Kapitel 4 wurden für die einzelnen Feldelemente von Arrays Indizes benutzt. Alternativ dazu kann man auch Zeiger benutzen. Dazu wird zuerst ein Feld definiert: datentyp feldname[groesse]; Zusätzlich wird ein Zeiger definiert, der auf den gleichen Datentyp zeigen kann: datentyp *zeigername; Dieser Zeiger wird nun auf das Array gesetzt: zeigername = feldname; Diese Zeile bewirkt, daß der Zeiger auf das 1. Feldelement zeigt, also feldname[0]. Will man nun auf eines der Feldelemente zugreifen, so mußt man einfach den Index zum Zeiger hinzu addieren. *(zeigername + 3) = 10; würde dann also bewirken, daß feldname[3] den Wert 10 zugewiesen bekommen würde.
- 6. 6. Anwendung von Zeigern: dynamische Speicherplatzzuweisung 6. 6. Anwendung von Zeigern: dynamische Speicherplatzzuweisung Bei Feldern hatten wir bisher nur die Möglichkeit, die Größe am Beginn des Programms festzulegen. Dies bringt Nachteile mit sich, wenn man nicht so viele Feldelemente benötigt, oder noch schlimmer, wenn man mehr benötigt, als man vorher festgelegt hat. Dazu benutzt man die Funktion malloc(). Diese Funktion legt die Größe während des Programmablaufs fest. Wenn man beispielsweise eine Variable vom Typ Integer definiert, so wird im Hauptspeicher Platz in der Größe von 2 Byte reserviert. Genau dies macht auch die Funktionmalloc(). Als erstes wird ein Zeiger definiert: datentyp *zeigername; Die Funktion malloc() wird dann wie folgt aufgerufen: zeigername = (datentyp *) malloc (groesse * sizeof(datentyp)); Die Funktion sizeof() liefert den benötigten Speicherplatz für den jeweiligen Datentyp zurück. Im Fall Integer wäre dies also 2. Den Zeiger zeigername kannst Du nun wie einen normalen Zeiger auf ein Array benutzen. Das hast Du ja schon in Kapitel 6.5 gelernt. Wenn Du mit der Verarbeitung fertig bist, so mußt Du den Speicher wieder freigeben. Dies tust Du mit der Funktion free(). Sie wird folgendermaßen aufgerufen: free(zeigername); Wichtig! Um die Funktion malloc() benutzen zu können, mußt Du die vordefinierte Bibliothek malloc.hmit #include einbinden.
- 7. Zeichenketten 7. 1. Allgemeines 7. Zeichenketten 7. 1. Allgemeines In Kapitel 1 hast Du bereits den Datentyp char für einzelne Zeichen kennengelernt. In diesem Kapitel lernst Du, wie man ganze Worte in Variablen speichert. Dies sind Felder vom Datentyp char. Zeichenketten werden in der Programmierung auch Strings genannt.
- 7. Zeichenketten 7. 1. Allgemeines 7. 2. Definition 7. 2. Definition Ein String wird folgendermaßen definiert: char stringname[stringlaenge]; Es wird also ein Feld vom Datentyp char angelegt, welches die Größe stringlaenge hat. Der eingelesene String ist folgendermaßen aufgebaut: Dabei kennzeichnet das Zeichen '\0' das Ende der Zeichenkette. Wenn Du also einen String definierst, so mußt Du bedenken, daß bei ihm ein Zeichen für das Ende freigehalten werden muß. In Felder der Größe 20 passen demnach nur Zeichenketten der Länge 19. Dieses Zeichen für das Ende hat jedoch auch seine Vorteile. Wenn Du beispielsweise nach dem Ende einer Zeichenkette suchst, so brauchst Du nur nach diesem Zeichen zu suchen.
- 7. 3. Wichtige Funktionen für Zeichenketten (1) Funktioniert prinzipiell wie die Funktion scanf(). Du rufst die Funktion auf und sie schreibt Dir in die Zeichenkette zeichenkette den eingegebenen String. Wichtig ist natürlich, daß die Zeichenket 1. gets(zeichenkette);
- 7. 3. Wichtige Funktionen für Zeichenketten (2) Funktioniert wie die Funktion printf(). Bei Aufruf gibt die Funktion die angegebenene Zeichenkette aus. Natürlich muß auch hier vorher die Zeichenkette definiert worden sein. puts(zeichenkette);
- 7. 3. Wichtige Funktionen für Zeichenketten (3) Diese Funktion gibt Dir die Länge einer angegebenen Zeichenkette zurück. Wenn Du also eine Integer-Variable laenge hast, so wird beim Aufruf die Länge in die Variable geschrieben. Diese Funktion gib laenge = strlen(zeichenkette); strlen(zeichenkette);
- 7. 3. Wichtige Funktionen für Zeichenketten (4) Diese Funktion vergleicht zwei Zeichenketten. Sie liefert einen Wert kleiner 0 zurück, wenn die zeichenkette1 kleiner als die zeichenkette2 ist. Ist das Umgekehrte der Fall, so liefert sie einen Wert 4. strcmp(zeichenkette1, zeichenkette2);
- 7. 3. Wichtige Funktionen für Zeichenketten (5) Kopiert den Inhalt der Zeichenkette quelle in die Zeichenkette ziel. 5. strcpy(ziel, quelle);
- Advertisement
- 7. 4. Umwandlung von Zeichenketten in Zahlen Für die Umwandlung von Zeichenketten in Zahlen benötigen wir zwei Funktionen: Wandelt eine Zeichenkette in eine Zahl vom Datentyp int um. 1. integerzahl = atoi(zeichenkette);
- 7. 4. Umwandlung von Zeichenketten in Zahlen Wandelt eine Zeichenkette in eine Zahl vom Datentyp float um. 2. floatzahl = atof(zeichenkette);
- 7. 4. Umwandlung von Zeichenketten in Zahlen Wenn eine Zeichenkette nicht in eine Zahl umgewandelt werden kann (z.B. "abc"), dann wird eine Null zurückgegeben. Achtung !Um diese Funktionen nutzen zu können, mußt Du die Bibliotheken stdlib.h und math.h mit#include einbinden !
- 8. Arbeiten mit Dateien 8. Arbeiten mit Dateien 8. 1. Allgemeines Bisher haben wir Daten, die wir in unseren Programmen erzeugt und verarbeitet haben, nur über den Bildschirm ausgeben können. Nach Beendigung eines Programms gingen diese Daten unwiderruflich verloren. Mit Hilfe von Dateien läßt sich dies ändern. Die Arbeit mit einer Datei folgt immer dem gleichen Schema: Datei öffnen Daten auslesen, verändern oder anhängen Datei schließen Wie diese Vorgänge im einzelnen gehandhabt werden, wird in diesem Kapitel beschrieben.
- 8. 2. Öffnen einer Datei Bevor man eine Datei öffnen kann, benötigt man einen Zeiger auf die Struktur FILE. Eine Struktur ist eine Ansammlung von verschiedenen Variablen, die unter einem Namen zusammengefaßt werden. Strukturen werden in Kapitel FILE *zeigername; Es ist vorteilhaft, wenn man als Zeigername die Aufgabe, die er zu erfüllen hat, benutzt. Wenn man eine Datei lesen möchte, so kann man diesem Zeiger beispielsweise den Namen lesen geben. Natürlich ist es Dir freigestellt auch andere Namen zu verwenden.
- 8. 2. Öffnen einer Datei Als nächstes folgt die Öffnung der Datei. Dies geschieht mit der Funktion fopen(). Sie wird folgendermaßen aufgerufen: zeigername = fopen (dateiname, modus); Die Funktion schreibt also verschiedene Werte in die Variablen der Struktur FILE und weist die Adresse dieser Struktur dem Zeiger zeigername zu. Der Zeiger wird dabei an den Anfang der Datei gesetzt. Als Dateiname wird ein Array vom Datentyp char verwendet.
- 8. 2. Öffnen einer Datei Beim Modus gibt es verschiedene Dinge zu beachten. Die Zeichenkette modus beschreibt, wie eine Datei geöffnet werden soll. Hier sind die möglichen Modi: w write, schreibender Zugriff r read, lesender Zugriff a append, Daten an die Datei anhängen t Öffnen im Textmodus b Öffnen im Binärmodus
- 8. 2. Öffnen einer Datei Wenn Du also in eine Datei schreiben möchtest, so mußt Du als Modus "w" angeben. Möchtest Du allerding mehrere Modi gleichzeitig nutzen, z. B. lesen und schreiben, so kannst Du dies nur folgendermaßen machen: "w+" "r+" "a+" Mit diesen Zeichenfolgen kannst Du sowohl lesen, als auch schreiben.
- 8. 2. Öffnen einer Datei In die Datei datei1.txt kann also geschrieben werden. Sie kann aber auch gelesen werden. schreiben = fopen ("datei1.txt", "w+"); Achtung ! Wenn Du eine Datei mit "w" öffnest, so wird der gesamte Inhalt der Datei gelöscht.
- 8. 4. Schreiben in eine Datei Um in eine Datei schreiben zu können, muß in der Funktion fopen() der Modus schreibend angegeben worden sein. Zum schreiben in Dateien gibt es 3 wichtige Funktionen: fprintf(), fputs() und fputc(). fprintf() ist eng verwandt mit der Funktion printf(). Sie wird folgendermaßen aufgerufen: fprintf(zeigername, "text mit formatstrings",variablenname); Der Unterschied zu printf() ist offensichtlich. Vor dem Ausgabetext wird der Zeiger auf die Struktur FILE übergeben. Der Text mit den Formatstrings wird also in die Datei geschrieben.
- 8. 4. Schreiben in eine Datei fputs() ist wiederum eng verwandt mit der aus Kapitel 7 bekannten Funktion puts(). Sie wird folgendermaßen aufgerufen: fputs(zeichenkette, zeigername); Die Zeichenkette wird also in die Datei geschrieben. Im Unterschied zu fprintf() wird der Zeigername als letzter Parameter an die Funktion fputs() übergeben.
- 8. 4. Schreiben in eine Datei fputc() ist so ähnlich wie die Funktion fputs(). Allerdings wird hier nicht eine Zeichenkette, sondern nur ein Zeichen in die Datei geschrieben. Zeichen sind bekannterweise Daten vom Typ char. Die Funktion wird folgen fputc(zeichen, zeigername); Achtung ! Wenn Du eine Datei mit "w" (schreiben) öffnest, so wird der gesamte Inhalt überschrieben. Du mußt, wenn Du nicht alles überschreiben möchtest, die Datei mit "r+"oder "a" öffnen.
- 8. 5. Lesen aus einer Datei Beim Schreiben haben wir wiederum drei Funktionen, die wir schon zu kennen scheinen: fscanf(), fgets() und fgetc(). Allerdings müssen wir hier einen wichtigen Punkt berücksichtigen. Wir dürfen nur bis zum Ende der D fscanf(zeigername, "formatstring", &variablenname); Der Wert wird also aus der Datei in die Variable geschrieben.
- 8. 5. Lesen aus einer Datei Wenn der Wert gelesen wurde, so wird der Zeiger auf das Ende des Wertes gesetzt, damit der nächste Wert eingelesen werden kann. fgets() liest einen String aus der Datei aus und schreibt ihn in ein Array vom Da fgets(variablenname, laenge, zeigername); Dir wird es bestimmt aufgefallen sein, daß hier noch eine Länge angegeben werden muß. Da wir für die Variable variablenname nicht unendlich viel Speicherplatz reserviert haben, daß Array also nur eine begrenzte Größe hat, muß die Größe des Arrays angegeben werden. Es werden dann bis zu laenge - 1Zeichen eingelesen, da in das letzte Arrayelement noch das Zeichen \0 geschrieben wird. Die Funktion beendet das Einlesen außerdem, wenn das Ende einer Zeile erreicht wurde. Es wurde also das Zeichen\n eingelesen.
- 8. 5. Lesen aus einer Datei fgetc() liest ein Zeichen aus einer Datei aus. Sie wird folgendermaßen aufgerufen: variable = fgetc(zeigername); Der Wert, der aus der Datei eingelesen wurde, wird in die Variable geschrieben. Dabei ist zu beachten, daß die Variable selbstverständlich vom Datentyp char sein muß.
- 8. 6. Anhängen an eine Datei Wenn Du eine Datenbank hast, so kann es sein, daß Du in sie neue Datensätze eintragen willst. Wenn Du an eine Datei mehrere Daten anhängen willst, so mußt Du die Datei im Modus "a" öffnen. Der Zeiger wird dabei auf das !!!!
- 8. 7. Schließen der Datei Wenn Du alle Arbeiten an der Datei abgeschlossen hast, so muß die Datei wieder geschlossen werden. Du erinnerst Dich sicher aus Kapitel 6, daß Speicherbereich, welcher Zeigern mit der Funktion malloc() zugewiesen worden w fclose(zeigername); Damit wird die Datei geschlossen und kann an anderer Stelle wieder geöffnet werden.
- 9. Strukturen 9. 1. Allgemeines Wenn wir bisher einfache Aufgaben zu lösen hatten, so benötigten wir einfache Variablen. Hatten wir aber komplexe Sachverhalte, z. B. Daten von Personen, die registriert werden mußten, so benötigten wir verschied !!!!
- 9. Strukturen 9. 2. Definition einer Struktur Eine Struktur wird folgendermaßen festgelegt: 9. 2. Definition einer Struktur Eine Struktur wird folgendermaßen festgelegt: struct strukturname { datentyp1 variable1; datentyp2 variable2; ... datentyp_n variable_n; }; Die Struktur strukturname enthält also die Variablen variable1 bis variable_n.Die Definition der Struktur kann sowohl vor als auch in der Funktion main() erfolgen. Achtung !Das Semikolon nach der geschlossenen geschweiften Klammer nicht vergessen ! Der Compiler würde dies als Fehler ansehen !
- 9. Strukturen 9. 2. Definition einer Struktur Die Struktur, die nun erstellt wurde, kann wie ein normaler Datentyp behandelt werden. Du kannst also Variablen vom Datentyp der Struktur anlegen. Dies kann auf 2 verschiedenen Wegen passieren. 1. Definiere eine Variable, wie Du das bisher gemacht hast. Also wie folgt: struct strukturname variable; Die Variable ist dann vom Datentyp der Struktur. 2. Definiere die Variable bei der Definition der Struktur. struct strukturname { ... } variable1, variable2, ..., variable_n; Die Variable variable1 bis variable_n sind dann also vom Datentyp der Struktur. Die beiden Wege unterscheiden sich folgendermaßen: Beim ersten Weg hast Du die Variable nur in der Funktion main() definiert. Die Variable ist also nur in dieser Funktion gültig. Wenn Du die Variable in anderen Funktionen verwenden willst, mußt Du sie als Parameter übergeben. Beim zweiten Weg hast Du die Variable für das gesamte Programm definiert. Sie ist in allen Funktionen gültig. Du mußt also nicht extra die Variable als Parameter übergeben.