001
12.01.2010, 12:29 Uhr
Hans
Library Walker (Operator)
|
Hi,
was mir auf die schnelle so auffällt:
C++: |
#include <stdio.h>
struct vertrag //Einlesen der Struktur { char vertrnr[7]; char art[21]; char liiferant[21]; unsigned short vertagsmenge; unsigned short liefertermin[3]; unsigned short liefermenge; }__attribute__((packed))vertrag;
|
da stimmt die Aussage des Kommentars nicht. Die Struktur wird nicht eingelesen, sondern es wird dem Compiler mitgeteilt, das es eine gibt und wie sie aussieht. Im C-Jargon nennt man das auch deklarieren. Andere Frage: Was soll das "__attribute__((packed))"? - Das ist doch eine compilerspezifische Erweiterung zur Optimierung von Speicherplatz, schätze ich. Muss die sein?
C++: |
int main(int argc, char *argv[]) { char Auswahl; int i; i=0; FILE*Dateiptr; char *datei_auswahl= "vertrag.dat"; printf("\n\t============\n"); printf("\t=== Aufgabe ===\n"); printf("\t=============\n\n");
if (!(Dateiptr = fopen(datei_auswahl,"rb"))) { printf("Beim oeffnen der Datei %s ist ein Fehler aufgetreten.\n", datei_auswahl); getch(); } else { printf("Menue:\n"); printf("\tNamen aller Hauptlieferanten: (1)\n"); printf("\tBeenden: (4)\n"); printf("\tAuswahl:"); }
|
Was ist das denn für eine Logik? - Wenn das öffnen der Datei klappt, gibst du ein Menü aus, ansonsten nicht? Hier ist ein Fehler in der Logik. Das Menü solltest Du immer ausgeben, denn das weitere Programm arbeitet ja nach Eingaben, die der Benutzer anhand der Menüvorgaben macht. Und was passiert, wenn das öffnen der Datei nicht klappte? Dann gibst du zwar eine Fehlermeldung aus, und lässt sie von Benutzer bestätigen. Aber danach läuft das Programm in der Menüabfrage weiter. Der Benutzer sieht dann zwar kein Menü, aber das Programm erwartet eine Eingabe, die auf eine Auswahl aus dem Menü beruht. Das ist auch ein Logikfehler.
C++: |
putch(Auswahl = getch()); switch (atoi(&Auswahl)) { case 1:printf("\n\n\n\tName aller Hauptlieferanten:\n\n"); while (fread(&vertrag, sizeof(vertrag),1, Dateiptr) == 1) { if (vertrag.vertagsmenge>500) { i++; printf("\t\t- %s\n",vertrag.liiferant); } } break; case 4:printf("\n\n\n\tBeliebige Taste druecken zum beenden!"); break; } getch(); return(0); };
|
Ein wichtiger Punkt: Du öffnest die Datei zwar, vergisst aber, sie am Ende auch wieder zu schliessen. Das mag beim lesen nicht weiter tragisch erscheinen, aber spätestens dann, wenn Du auch Daten in Dateien schreiben willst, bekommst Du Probleme. Das kann soweit gehen, das die Daten gar nicht in der Datei auf der Platte landen, sondern im Nirvana, weil die Datei nicht ordentlich, im schlimmsten Fall gar nicht geschlossen wurde.
Was die Datei selbst angeht: Wieviele Datensätze stehen denn da drin? Und sind die sortiert? Unter Punkt 2 ist von einer "alphabetisch sortierten Liste aller Lieferanten" die Rede. Möglicherweise ist es nötig diese Sortierung selbst vorzunehmen. Von daher empfiehlt es sich, erst mal die komplette Datei in den Speicher zu holen. Dann kann man sie schneller und einfacher sortieren, oder auch mal umsortieren.
Bei Punkt 3 ist es auch wieder nötig, die gesamte Datei zu durchforsten, was auch wieder schneller geht, wenn sie ganz im Speicher steht. Dann sind zwei Werte aus der Struktur (d.h. dem Datensatz) miteinander zu vergleichen. Wenn sie gleich sind dann einen dritten "Wert", den Lieferantennamen ausgeben, ansonsten weiter suchen. Dabei natürlich die Benutzereingabe berücksichtigen. Die ist schliesslich das Abbruchkriterium für die Suche. Soweit mal meine Anmerkungen.
Hans -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 12.01.2010 um 12:36 Uhr von Hans editiert. |