Sie sind auf Seite 1von 5

Beck, Dausmann, Warendorf

Blatt 2 Dynamische Speicherverwaltung; Satzweise Ein- und


Ausgabe mit Dateien

Aufgabe 2.1 Die Funktion malloc(), verkettete Listen


a) Testen Sie das folgende Programm:

/* Dateiname: malloc1.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)


{
struct produkt { char name [20];
double preis;
} * zeiger;
zeiger = malloc (sizeof (struct produkt));
printf ("\n\nGib den Produktnamen ein: ");
gets (zeiger -> name);
printf ("\nGib den Preis in Euro ein: ");
scanf ("%lf", &(zeiger->preis));
printf ("\nAusgabe der Produktdaten: ");
printf ("Das Produkt %s kostet %5.2lf EUR",
zeiger->name, zeiger->preis);
free (zeiger);
return 0;
}
b) Erweitern Sie das Programm so, dass zuerst eingelesen wird, wie viele Produkte eingelesen
werden sollen. Damit ist die Anzahl der Produkte dynamisch und die eingelesenen Produkte
sollen in einer verketteten Liste verwalten werden. Ferner soll die Ausgabe der Druckdaten in
einer eigenen Funktion erfolgen:
void ausgabe (struct produkt * pointer)

Aufgabe 2.2 Trennen von Nutz- und Verwaltungsdaten, Modularisierung


a) Die Aufgabe 2.1 diente zum Erlernen des Umgangs mit verketteten Listen. Jetzt kommt
noch der Aspekt Modularisierung hinzu: Erstellen Sie 3 Module (main, produktliste,
produktinfo). Die Header-Dateien für produktliste (prodlist.h) und produktinfo
(prodinfo.h) sind vorgegeben und zu verwenden!

Erstellen Sie die C-Dateien, wobei Sie viele Code-Passagen aus 2.1 verwenden können.

Labor Informatik 2 - Blatt 2 Seite 1 Version 1.2 vom 24.10.2006


Beck, Dausmann, Warendorf

b) Ändern Sie das Hauptprogramm so, dass zuerst eingelesen wird, wie viele Produkte
eingelesen werden sollen. Die Produktdaten sollen dann wie folgt erstellt werden: der Name
setzt sich aus "Einem Namen" gefolgt von einer fortlaufenden Zahl zusammen. Der Preis wird
mit Hilfe eines Zufallsgenerators gesetzt (siehe Hinweis zu Aufgabe 1.4).

Aufgabe 2.3 Dynamisches Array mit calloc()

In Aufgabe 1.3 aus Blatt 1 wurde ein char-Stack mit Hilfe eines Arrays mit fester Größe
realisiert. Fügen Sie in den Stack-Modul eine Funktion void create(int n) ein, die einen
char-Stack der Größe n mit Hilfe der Funktion calloc()einrichtet. Zum Testen des
dynamisch eingerichteten Stacks müssen Sie nur Ihr Hauptprogramm aus Aufgabe 1.3 noch
leicht modifizieren.

Aufgabe 2.4 Schreiben einer verketteten Liste

Die Produktdaten aus Aufgabe 2.2 werden nun in einer Datei gespeichert und sollen in
Aufgabe 2.5 wieder eingelesen werden. Beachten Sie dazu folgenden Hinweis.

Hinweis: Wenn Sie als Dateiname bei der Funktion fopen() einen String wie etwa
"TEST.DAT" angeben, wird die Datei im aktuellen Arbeitsverzeichnis abgelegt. Was das
gerade ist, hängt davon ab, wie Sie Ihr Programm starten, welche Entwicklungsumgebung Sie
benutzen, etc. Falls Sie diese Datei dann im Teil c einlesen wollen, müssen Sie wissen, wo
sich die Datei befindet. Suchen Sie die Datei mit dem Windows-Explorer, damit Sie wissen,
wo solche Dateien abgelegt werden.
Um diese Probleme zu umgehen, ist es üblich, dass 2 Programme (vgl. Aufgabe 2.5) über ein
festes Verzeichnis miteinander kommunizieren, in dem die gemeinsam bearbeiteten Dateien
abgelegt werden. Legen Sie in Ihrem Home-Verzeichnis ein Verzeichnis "Blatt2" an und
verwenden Sie dieses für die folgenden Aufgaben ebenso. Geben Sie dann als String bei
fopen() "Z:/Blatt2/TEST.DAT" an. Da Sie diesen String in mehrere Programmen
benötigen, ist es üblich eine Datei (Name etwa globaldefs.c) zu verwenden, in der der
String definiert wird.

a) In Aufgabe 2.2 haben Sie Module für eine verkettete Liste aus Produkten erstellt. Ändern
Sie das Hauptprogramm ab, so dass jetzt die gefüllte Liste (der Übersicht halber mit 4-5
Elementen) aus Produkten in eine Datei geschrieben wird. Dabei interessieren nur die
Nutzdaten (Produktinfo) und nicht die Verwaltungsdaten (Produktliste). Geben Sie die Liste
auch auf dem Bildschirm aus. Löschen Sie die komplette Liste im Arbeitsspeicher.
Positionieren Sie die Datei an den Anfang, lesen Sie die Produkte wieder ein, in dem Sie
wieder eine verkettete Liste erstellen und geben Sie die neue Liste wieder auf dem Bildschirm
aus.

b) Erklären Sie das Verhalten.

Labor Informatik 2 - Blatt 2 Seite 2 Version 1.2 vom 24.10.2006


Beck, Dausmann, Warendorf

Aufgabe 2.5 Satzweises Ändern einer Datei mit FSeek

Basis dieser Aufgabe sind die Moduln und die Datei, die Sie in Aufgabe 2.4 erstellt haben.

Erstellen Sie ein neues Hauptprogramm (Modifikation des Programms aus Aufgabe 2.4) wie
folgt: Erzeugen Sie eine neue Produktbeschreibung und überschreiben Sie in der Datei den 3.
Satz. Erzeugen Sie wiederum eine neue Produktbeschreibung und überschreiben Sie den
ersten Satz. Sie brauchen noch eine neue Produktbeschreibung, die Sie an die Datei anhängen
sollen. Lesen Sie alle Datensätze ein und geben Sie sie auf dem Bildschirm aus, damit Sie
sehen können, ob Ihre Modifikationen in der Datei stehen.

Verwenden Sie Fseek.

Aufgabe 2.6 Satzweises Löschen in einer Datei

a) Nehmen Sie die Produktdatei aus der vorherigen Aufgabe als Grundlage. Angenommen,
Sie wollen den 3. Satz in der Datei löschen. Überlegen Sie sich zuerst die Vorgehensweise.
Was ist das Problem?

b) Schreiben Sie ein Hauptprogramm, das eine Satznummer einliest und den entsprechenden
Satz aus der Datei löscht.

Labor Informatik 2 - Blatt 2 Seite 3 Version 1.2 vom 24.10.2006


Beck, Dausmann, Warendorf

Hinweis zum Benutzen des Visual Studio

Es kommt in diesem und den folgenden Aufgabenblättern häufiger vor, dass Sie auf
vorherigen Aufgaben aufsetzen müssen. Dazu gibt es zwei mögliche Vorgehensweisen:

1) Sie legen ein neues Projekt an, legen neue C-Dateien, bzw. H-Dateien an und kopieren
dann mittels Cut+Paste die Quelltexte aus dem alten in das neue Projekt. Beide Projekte
haben dann nachher nichts miteinander zu tun. So haben Sie es wahrscheinlich bisher schon
gemacht.

2) Sie legen ein neues Projekt an. Sie nehmen die existierenden Quelldateien in das neue
Projekt auf über Add -> Add existing item.

Im folgenden Bild links sieht man das neue Projekt depend. Jetzt wählen Sie das Projekt
aus, von dem Sie Quellen übernehmen möchten, im Bild links das Projekt Basic. Es
erscheint das Bild rechts und Sie können die Quellen markieren, die Sie übernehmen wollen.

Es wird keine Kopie gemacht! Diese Quelldateien gibt es nur einmal, nämlich im
Originalprojekt. Änderungen, die Sie jetzt machen, gelten also auch für das Originalprojekt.

Labor Informatik 2 - Blatt 2 Seite 4 Version 1.2 vom 24.10.2006


Beck, Dausmann, Warendorf

Diese Vorgehensweise empfiehlt sich, wenn Sie Dateien unverändert übernehmen wollen,
beispielsweise wenn Sie nur ein neues Hauptprogramm schreiben wollen, das auf Moduln
basiert, die schon in einem anderen Projekt entwickelt wurden. Dann fügen Sie die Moduln
(C- und H-Datei) in das neue Projekt ein, lassen das alte Hauptprogramm im alten Projekt
(Nicht ins neue einfügen!) und schreiben ein neues Hauptprogramm für das neue Projekt. Die
Vorgehensweise empfiehlt sich auch dann, wenn Module nur erweitert werden beispielsweise
um neue Schnittstellenfunktionen. Dann ist es unschädlich, dass die Änderung auch im
Originalprojekt vorgenommen wird.

Labor Informatik 2 - Blatt 2 Seite 5 Version 1.2 vom 24.10.2006