Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Brauche dringend HILFE!!!!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.01.2010, 11:35 Uhr
~needHelp
Gast


Hallo Leute. Ich habe ein GROßES Problem..... Ich habe eine Aufgabe bekommen die ich nicht gelöst bekomme. Habe den ersten Punkt der Aufgabe gelöst aber die anderen zwei bekomme ich einfach nicht hin. Das Problem ist, ich muss das Programm bis Donnerstag abgeben. Könnt ihr mir vieleicht weiter helfen???

BITTE!!!!

Aufgabe:

Zitat:

Entwickeln Sie ein interaktives C-Programm zur
Kontrolle der Vertragstreue von Lieferanten

Unter Nutzung der vorhandenen Datei VERTRAG.DAT sind wahlweise anzuzeigen:

1. die Namen aller Hauptlieferanten (Vertragsmenge im Bsp. > 500)

2. alle Angaben zu Verträgen mit einem Lieferanten, vom Nutzer aus einer
alphabetisch sortierten Liste aller Lieferanten zu wählen, geordnet nach Artikeln
und unter Auflistung der Gesamtvertragsmenge bei Mehrfachlieferung eines
Artikels,

3. die Namen aller Lieferanten bei denen bis zu einem, vom Nutzer einzugebenden
Termin keine Abweichungen zwischen Vertrags- und Liefermenge auftraten.

Hinweis:
Die Datei VERTRAG.DAT befindet sich auf dem Server (Unterverzeichnis
Aufgaben/Daten). Lesen Sie dazu auch die Datei Hinweise.doc / .pdf!

Die Datei hat dabei folgende Struktur:

struct Satz
{
char Vertragsnummer[7];
char Artikel[21];
char Lieferant[21];
short Vertragsmenge;
short Liefertermin[3];
short Liefermenge;
};



Und soweit bin ich bis jetzt. Und komme einfach mit Punkt 2 und 3 nicht zurecht.

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;

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:");
        
    }
    
    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);
};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.01.2010, 13:12 Uhr
0xdeadbeef
Gott
(Operator)


Das packed-Attribut ist deshalb notwendig, weil die structs flach aus einer Binärdatei gelesen werden. Ansonsten fiel mir noch auf:

C++:
switch(atoi(&Auswahl))


funktioniert höchstens zufällig. Auswahl ist ein Zeichen, und was dahinter im Speicher steht, weißt du nicht, also kannst du seine Adresse nicht wie einen nullterminierten String benutzen. Besser:

C++:
switch(Auswahl - '0')



Außerdem macht der Teil, den du implementiert hast, nicht das, was er machen soll - zumindest wenn ich das richtig lese; ich habe ja die vertrag.dat nicht da. Wenn ich das richtig verstehe, ist in der vertrag.dat eine lange Liste von Verträgen gespeichert, von denen durchaus mehrere mit dem gleichen Lieferanten sein können. Dementsprechend wirst du dir merken müssen, welche Lieferanten du schon ausgegeben hast, um Duplikate zu vermeiden.

Das ganze sieht mir nach einer Aufgabe aus, der einige Vorlesungen über Datenorganisation vorhergegangen sein dürften. Hast du vielleicht von vorherigen Aufgaben noch Code, der die Sachlage sinnvoll darstellen könnte?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.01.2010, 16:26 Uhr
~needHelp
Gast


Hallo und danke erstmal für eure Posts.
Hier mal der Inhalt der VERTRAG.DAT

Struktur:
struct vertrag
{
char vertrnr[7];
char art[21];
char liiferant[21];
unsigned short vertagsmenge;
unsigned short liefertermin[3];
unsigned short liefermenge;
};

Inhalt:
EAN: 512621
Beteichnung: Schokorosinen
Lieferant: Waldbaur
Bestand: 300
Liefermenge: 200

EAN: 512622
Beteichnung: Ritter-Rum
Lieferant: Ritter
Bestand: 280
Liefermenge: 290

EAN: 512623
Beteichnung: Ritter-Sport
Lieferant: Ritter
Bestand: 935
Liefermenge: 935

EAN: 512624
Beteichnung: MonCheri
Lieferant: Ferrero
Bestand: 100
Liefermenge: 100

EAN: 512625
Beteichnung: Raffaello
Lieferant: Ferrero
Bestand: 520
Liefermenge: 0

EAN: 512626
Beteichnung: Pr„sent
Lieferant: Piasten
Bestand: 130
Liefermenge: 0

EAN: 512627
Beteichnung: Weinbrandbohnen
Lieferant: Wissoll
Bestand: 255
Liefermenge: 235

EAN: 512628
Beteichnung: Goldb„ren
Lieferant: Harribo
Bestand: 95
Liefermenge: 0

EAN: 512629
Beteichnung: Elisenlebkuchen
Lieferant: Schmidt
Bestand: 850
Liefermenge: 0

EAN: 512630
Beteichnung: Teefix-Zitrone
Lieferant: Teekanne
Bestand: 150
Liefermenge: 50

EAN: 572311
Beteichnung: Earl-Grey-Tea
Lieferant: Milford
Bestand: 50
Liefermenge: 0

EAN: 572312
Beteichnung: Darjeeling-Tea
Lieferant: Messmer
Bestand: 750
Liefermenge: 0

EAN: 572313
Beteichnung: Frchtetee
Lieferant: Flensburger Teekonto
Bestand: 30
Liefermenge: 30

EAN: 572314
Beteichnung: Hibiskus-Tee
Lieferant: Mller KG
Bestand: 95
Liefermenge: 95

EAN: 572315
Beteichnung: Erdbeer-Frchtetee
Lieferant: Tropical
Bestand: 200
Liefermenge: 30

EAN: 572316
Beteichnung: Grner Chinatee
Lieferant: Milford
Bestand: 300
Liefermenge: 305

EAN: 572317
Beteichnung: Assam-Tea
Lieferant: Messmer
Bestand: 225
Liefermenge: 0

EAN: 572318
Beteichnung: Raffaello
Lieferant: Ferrero
Bestand: 775
Liefermenge: 0

EAN: 572319
Beteichnung: Capuccino Tasse
Lieferant: Krger GmbH & Co. KG
Bestand: 940
Liefermenge: 0

EAN: 572320
Beteichnung: Kaba-Schokotrunk
Lieferant: Nestl‚
Bestand: 300
Liefermenge: 0


Ich habe aber keine Ahnung wie ich Aufagbe 2 und 3 als Quellcode hinbekomme. Ich brauch aber diese blöde Aufgabe sonst darf ich keine Prüfung mitschreiben. Sitze mittlerweile eine halbe ewigkeit an der Aufgabe und komme nicht weiter.

Könnt ihr mir BITTE helfen....sonst kann ich meine Prüfung vergessen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.01.2010, 16:28 Uhr
~needHelp
Gast


Hier mal ein link mit der enthaltenen VERTRAG.DAT

http://rapidshare.com/files/333681544/aufgabe.rar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.01.2010, 16:34 Uhr
0xdeadbeef
Gott
(Operator)


Äh...wenn das so in der vertrag.dat drinsteht, kommst du mit

C++:
fread(&vertrag, sizeof(vertrag),1, Dateiptr)


auf keinen Fall hin. Das hätte dir aber spätestens im Debugger auch selbst auffallen müssen.

Eigentlich dürfte das in der Form nicht mal kompilieren, weil getch() dem gcc nicht bekannt ist, während msvc mit __attribute__((packed)) nichts anfangen kann.

Die Aufgabe sieht mir immer noch sehr danach aus, als baue sie auf vorhergegangenen Aufgaben auf. Kuck doch mal, ob du Code aus vorherigen Aufgaben darin verwenden kannst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 12.01.2010 um 16:39 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.01.2010, 16:41 Uhr
~needHelp
Gast


Also beim Kompilieren hatte ich weder Probleme noch Fehler. Konnte das Programm auch ohne Probleme ausführen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.01.2010, 16:44 Uhr
0xdeadbeef
Gott
(Operator)


Ich kann die Aufgabe grad nicht runterziehen, rapidshare meint, seine Server seien überlastet, also muss ich noch mal nachfragen: Ist vertrag.dat eine Textdatei im Format wie oben beschrieben, oder eine Binärdatei, in der die Structs flach drinstehen?

Kompilieren kann ich das ansonsten hier nicht. Beim gcc steigt mir der Linker aus, und msvc mag das Struct-Attribut nicht. Welchen Compiler benutzt du?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 12.01.2010 um 16:46 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.01.2010, 16:50 Uhr
~needHelp
Gast


Weißt du wo ich das noch uploaden kann???
sc**** RapidShare. Ehhh...also ich glaub die .dat is ne Binärdatei. Ich benutze Dev-Cpp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.01.2010, 17:32 Uhr
~f.-th.
Gast


Der gcc 4.3.2 unter Windows übersetzt den Quelltext und schreibt mir 6 Lieferanten untereinander.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: