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.


Anmelden zum Antworten