sortieralgorithmus
-
hallo,
ich habe ein kleine problem mit einem programm,
dieses soll zu beginn die daten aus einer datei "Lager.dat" einlesen
diese werden dann in einem Array abgelegt. anschließend soll der user
die auswahl treffen wie er die daten sortiert haben will.
ob nach der bezeichnung, der artikel nummer oder der anzahl des jeweiligen artikels.
darin besteht mein problem. wie kann ich es realiseiren das das eindimensionale array komplett geordnet wird, also das die bezeichnung vor der richtigen artikelnummer und der anzahl steht?den quelcode poste ich einfach mal mit dazu.
#include "stdafx.h" #include <stdio.h> #include <string.h> struct Teil { char Bezeichnung[81]; int Teilenummer; int Anzahl; }; typedef Teil *Lagerliste; int LeseTeil(FILE *f, Teil &t) { char buffer[256]; if(!fgets(buffer,255,f)) return EOF; for(char *d = t.Bezeichnung, *s = buffer;(*d = *s)&&(*d != '\n');d++,s++); if(*d == '\n') *d = '\0'; if(!fscanf(f,"%d\n",&t.Teilenummer)) return EOF; if(!fscanf(f,"%d\n",&t.Anzahl)) return EOF; return 1; } void SchreibeTeil(FILE *f, const Teil &t) { fprintf(f,"%s\n",t.Bezeichnung); fprintf(f,"%d\n",t.Teilenummer); fprintf(f,"%d\n",t.Anzahl); } void SchreibeTeilFormatiert(const Teil &t) { printf("| %-30s | %8d | %4d |\n",t.Bezeichnung,t.Teilenummer,t.Anzahl); } void LeseListe(FILE *f,Lagerliste &Liste, int &n) { fscanf(f,"%d\n",&n); Liste = new Teil[n]; for(int i = 0; i < n; i++) { LeseTeil(f,Liste[i]); } } void SchreibeListe(FILE *f, Lagerliste Liste, int n) { fprintf(f,"%d\n",n); for(int i = 0; i < n; i++) { SchreibeTeil(f,Liste[i]); } } void SchreibeListeFormatiert(Lagerliste Liste, int n) { system("CLS"); printf("| Bezeichnung | TeileNr. | Anz. |\n"); printf("+--------------------------------+----------+------+\n"); for(int i = 0; i < n; i++) { SchreibeTeilFormatiert(Liste[i]); } printf("+--------------------------------+----------+------+\n"); } // Unterprogramme zum Sortieren int _tmain(int argc, _TCHAR* argv[]) { FILE *Bestand; Lagerliste liste; int AnzTeile; // Code zum Oeffnen der Datei "Lager.dat" mit Lesezugriff und Dateivariable Bestand LeseListe(Bestand,liste,AnzTeile); SchreibeListeFormatiert(liste,AnzTeile); system("PAUSE"); char ende; do { int ausw; do { system("CLS"); printf("Aktionsauswahl:\n"); printf("\t1\tSortieren nach Bezeichnung\n"); printf("\t2\tSortieren nach Teilenummer\n"); printf("\t3\tSortieren nach Anzahl\n"); printf("\t4\tNeuer Eintrag\n"); printf("\t5\tSpeichern\n"); printf("Bitte Auswahl eingeben: "); scanf("%d",&ausw); fflush(stdin); } while (ausw > 5 || ausw < 1); switch(ausw) { /* case 1 : // Sortieren nach Bezeichnung break; case 2 : // Sortieren nach Teilenummer break; case 3 : // Sortieren nach Anzahl break; case 4 : { // Neuen Eintrag anlegen } break; */ case 5: { // Speichern fclose(Bestand); // Schließen der Datei system("CLS"); SchreibeListeFormatiert(liste,AnzTeile); char s; printf("Bestand speichern:[j/n]"); s = getchar(); if (s == 'j' || s == 'J') { // Code zum Oeffnen der Datei "Lager.dat" mit Schreibzugriff und Dateivariable Bestand SchreibeListe(Bestand,liste,AnzTeile); printf("Bestand gespeichert...\n"); system("PAUSE"); } fflush(stdin); } break; default : printf("Noch nicht implmentiert"); } system("CLS"); SchreibeListeFormatiert(liste,AnzTeile); system("PAUSE"); printf("Neue Aktion? [j/n] : "); ende = getchar(); } while (ende != 'n' && ende != 'N'); return 0; }
dazu ist noch der inhalt der Lager.dat datei:
11 Stradivari Geige 102367 27 Gibson LesPaul 451045 1 Tama Bassdrum 678934 2 Korg Polysix 894567 3 Fender Jazzbass 462300 5 Paiste Highhat 689055 3 Marshal Verstaerker 907855 4 Steinway Fluegel 138756 2 Yamaha Piano 896789 4 Klarinette 207612 5 Harpsi 567890 9
es wäre echt super wenn mir vielleicht jemand eine idee hat bzw mir ein tipp geben kann.
-
Ich glaube, du bist im falschen Forum, hier gehts um C++.
Kann das einer der Moderatoren verschieben?
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ich vermute, das ruft danach, daß du qsort verwendest.
-
kannst du mir näher erklären wie ich das genau verwenden kann?
und wie die Funktion funktioniert?
-
dub schrieb:
kannst du mir näher erklären wie ich das genau verwenden kann?
indem du sie aufrufst und dabei einen zeiger auf den anfang der daten, die größe eines datenblocks, die anzahl der datenblöcke und eine vergleichsfunktion übergibst, oder so.
siehe http://support.microsoft.com/kb/73853/de
das beispiel sollte es klären.und wie die Funktion funktioniert?
mit dem berühmten quicksort-algorithmus.
-
ich hab mir gerade das Beispiel angeschaut.
ich versteh wie es funktioniert, nur leider ist da noch eine Kleinigkeit.
dort werden jeweils nur die einzelnen werte verglichen, also die verschiedenen Tier Name und diese geordnet. nur leider hab ich das Problem das bei mir in diesem Fall noch Eigenschaften zu den einzelnen Musikinstrumenten gehören.
so ist das Ordnen der Namen nicht das Problem, sondern der zugehörigen Artikelnummer und er anzahl.
-
ich komme einfach nicht weiter kann mir bitte vielleicht irgnedjemand ein tipp geben wie die aufgabe realiseiren kann. denn mit dem qsort-algorytmus komm ich nicht weiter.
ich ver auch nicht wie die daten bzw wo die daten gespeichert werden.
ich wäre echt dankbar für die hilfe.