C Sortieren einer eingelesenen Datei

Registriert
Jan. 2008
Beiträge
232
Guten Tag, ich würde mich über euren Rat freuen.

Ich musste wieder mal ein Programm schreiben, komm aber nicht so ganz mit der Straight-Sort-Selection zurecht.

Aufgabenstellung
Schreiben sie ein Programm, dass die Werte von 10 Schrauben aus einer Datei ausliest und je nach Aufforderung des Users nach Durchmesser, Länge oder Anzahl sortiert ausgibt.
Das Sortieren soll mit dem Straight-Selection-Algorithmus durchgeführt werden und in einem Unterprogramm statt finden.

Probleme
1. Ich weiß nicht, wie ich den Straight-Selection-Code zum laufen bringe
2. Ich weiß nicht, wie ich alles in nur einem Unterprogramm sortieren lassen kann
3. Aktuell sortiert er die Länge und die Anzahl nicht vollständig

Ich lese die Werte aus einer Textdatei aus, die sieht wie folgt aus:
Code:
12	50	32
36	150	50
16	75	45
8	25	5
42	130	31
10	60	132
24	50	105
10	45	73
16	80	23
6	15	2
Daraufhin hab ich mir mühsam einen Code zusammen geschrieben und das sortieren nach einem Vorbild abgekupfert. Der Sortiervorgang ist, mein ich, aber noch nicht der gewünschte Straight-Selection.

Hier einmal der Code:
Code:
#include <stdio.h>
#include <string.h>

#define DATENSIZE 100

struct parameter
{
    int durchmesser;
    int laenge;
    int anzahl;
};

void swap(parameter *a, parameter *b)
{
    parameter t=*a; *a=*b; *b=t;
}

/*void straight-selection-sort(int *Array, int Size)
{
	int MinPos = 0;
	for(int i = 0; i < Size-1; i++)
	{
      MinPos = i;
      for(int i2 = i+1; i2 < Size; i2++)
      {
         if(Array[MinPos] > Array[i2]) MinPos = i2;
      }
      swap(&Array[i], &Array[MinPos]);
	}
}*/

void sort1(parameter arr[], int beg, int end)
{
    if (end > beg + 1)
    {
        parameter piv = arr[beg];
        int l = beg + 1, r = end;
        while (l < r)
        {
            if (arr[l].durchmesser <= piv.durchmesser)
            l++;
            else
            swap(&arr[l], &arr[--r]);
        }
        swap(&arr[--l], &arr[beg]);
        sort1(arr, beg, l);
        sort1(arr, r, end);
    }
}

void sort2(parameter arr[], int beg, int end)
{
    if (end > beg + 1)
    {
        parameter piv = arr[beg];
        int l = beg + 1, r = end;
        while (l < r)
        {
            if (arr[l].laenge <= piv.laenge)
            l++;
            else
            swap(&arr[l], &arr[--r]);
        }
        swap(&arr[--l], &arr[beg]);
        sort1(arr, beg, l);
        sort1(arr, r, end);
    }
}

void sort3(parameter arr[], int beg, int end)
{
    if (end > beg + 1)
    {
        parameter piv = arr[beg];
        int l = beg + 1, r = end;
        while (l < r)
        {
            if (arr[l].anzahl <= piv.anzahl)
            l++;
            else
            swap(&arr[l], &arr[--r]);
        }
        swap(&arr[--l], &arr[beg]);
        sort1(arr, beg, l);
        sort1(arr, r, end);
    }
}

void main()
{
	char abfrage='n';
	do															
	{
		//Lesen
		
		FILE*Lese;
		int auswahl,sortierer;
		Lese=fopen ("schraubentabelle.txt","r");

		if (Lese==NULL)
		{
			printf("Die Datei konnte nicht geoeffnet werden!\nBitte pruefen sie den Dateipfad!\n");
			getchar();
			return;
		}

		parameter daten[DATENSIZE] = {0};
		int datensatz = 0;

		printf("Durchmesser\tLaenge\tAnzahl\n");
		rewind(Lese);
		while(fscanf(Lese,"%d%d%d", &daten[datensatz].durchmesser, &daten[datensatz].laenge, &daten[datensatz].anzahl)!=EOF)
		{
			printf("M%d\t\t%dmm\t%d \n", daten[datensatz].durchmesser, daten[datensatz].laenge, daten[datensatz].anzahl);
			++datensatz;
		}	
		fclose(Lese);

		//Sortieren
		
		printf("\nDruecken Sie:\t1 um nach dem Durchmesser zu sotieren\n\t\t2 um nach der Laenge zu sortieren\n\t\t3 um nach der Anzahl zu sotieren\n");
		do
		{
			scanf("%d",&auswahl);
			if (auswahl == 1)
			{
				sort1(daten, 0, datensatz);
			}
			else if(auswahl == 2)
			{
				sort2(daten, 0, datensatz);
			}
			else if(auswahl == 3)
			{
				sort3(daten, 0, datensatz);
			}
			else
			{
				printf("Fehleingabe. Bitte geben Sie 1,2 oder 3 ein.");
			}
		}
		while (auswahl >= 4 || auswahl <= 0);

		//Áusgeben
		
		printf("Durchmesser\tLaenge\tAnzahl\n");
		datensatz = 0;
		while(datensatz < DATENSIZE && daten[datensatz].durchmesser != 0)
		{
			printf("M%d\t\t%dmm\t%d \n", daten[datensatz].durchmesser, daten[datensatz].laenge, daten[datensatz].anzahl);
			++datensatz;
		}
		fflush(stdin);

		printf("Mit j laesst sich das Programm neustarten, jede andere Eingabe,\nsowie ein leeres Enter beenden das Programm.\nMoechten sie mit dem Programm fortfahren:");
		abfrage=getchar();													
										
	}
	while(abfrage=='j');
}

Ich hoffe ihr könnt mir weiter helfen. Ich verzweifel da noch dran. ;)
 
Zuletzt bearbeitet:
Ich weiß nicht ganz, was das "Straight" bedeutet, aber Selectionsort an sich ist ja nicht sehr schwer.
Hier etwa ist ein Beispiel.

Außerdem müsstest du fragen immer konkreter stellen, da komplette Aufgabenstellungen geschlossen werden.
 
Die Aufgabenstellung dient nur zum Verständnis und hat nichts mit den Fragen zu tun...
Schau mal darunter, da hab ich die 3 Probleme aufgeschrieben.

Im Quellcode ist ab Zeile 18 bis Zeile 30 auch der Muster-Code für die Straight-Selection-Sort schon drin. Nur weiß ich nicht, wie ich die Variablen deklarieren soll, damit das Programm auch sortiert.
Wenn ich da was einstelle, kommt immer 0 raus.

€DIT

So nach einiger Mühe habe ich den Straight Selection Sort hinbekommen und das Programm läuft.

Sieht hier einer vllt noch die Möglichkeit die void sort(...) zu kürzen.
Im Prinzip macht er 3 mal das selbe, nur mit einem geänderten Array.
Code:
#include <stdio.h>
#include <string.h>

#define DATENSIZE 100

struct parameter
{
    int durchmesser;
    int laenge;
    int anzahl;
};

void swap(parameter *a, parameter *b)
{
    parameter t=*a; *a=*b; *b=t;
}

void sort(parameter arr[], int Size, int auswahl)
{
	int MinPos = 0;
	if(auswahl == 1)
	{
		for(int i = 0; i < Size-1; i++)
		{
			MinPos = i;
			for(int i2 = i+1; i2 < Size; i2++)
			{
				if(arr[MinPos].durchmesser  > arr[i2].durchmesser) MinPos = i2;
			}
			if(MinPos != i) swap(&arr[i], &arr[MinPos]);
		}
	}

	if(auswahl == 2)
	{
		for(int i = 0; i < Size-1; i++)
		{
			MinPos = i;
			for(int i2 = i+1; i2 < Size; i2++)
			{
				if(arr[MinPos].laenge  > arr[i2].laenge) MinPos = i2;
			}
			if(MinPos != i) swap(&arr[i], &arr[MinPos]);
		}
	}

	if(auswahl == 3)
	{
		for(int i = 0; i < Size-1; i++)
		{
			MinPos = i;
			for(int i2 = i+1; i2 < Size; i2++)
			{
				if(arr[MinPos].anzahl  > arr[i2].anzahl) MinPos = i2;
			}
			if(MinPos != i) swap(&arr[i], &arr[MinPos]);
		}
	}
}

void main()
{
	printf("Dieses Programm dient zu Sortierung von Werten aus einer eingelesenen Datei.\nAuf Wunsch des Benutzers kann nach dem Durchmesser, Laenge und Anzahl\nsortiert werden.\n");
	char abfrage='n';
	do               
	{
		//Lesen  
		FILE*lese;
		int auswahl,sortierer;
		lese=fopen ("schraubentabelle.txt","r");

		if (lese==NULL)
		{
			printf("\nDie Datei konnte nicht geoeffnet werden!\nBitte pruefen sie den Dateipfad!\n");
			getchar();
			return;
		}

		parameter daten[DATENSIZE] = {0};
		int datensatz = 0;

		printf("\nDurchmesser\tLaenge\tAnzahl\n");
		rewind(lese);
		while(fscanf(lese,"%d%d%d", &daten[datensatz].durchmesser, &daten[datensatz].laenge, &daten[datensatz].anzahl)!=EOF)
		{
			printf("M%d\t\t%dmm\t%d \n", daten[datensatz].durchmesser, daten[datensatz].laenge, daten[datensatz].anzahl);
			++datensatz;
		} 
		fclose(lese);

		//Sortieren  
		printf("\nDruecken Sie:\t1 um nach dem Durchmesser zu sotieren\n\t\t2 um nach der Laenge zu sortieren\n\t\t3 um nach der Anzahl zu sotieren\nEingabe:");
		do
		{
			scanf("%d",&auswahl);
			if (auswahl == 1 || auswahl == 2 ||auswahl == 3)
			{
				sort(daten, datensatz, auswahl);
			}
			else
			{
				printf("\nFehleingabe. Bitte geben Sie 1,2 oder 3 ein.\nEingabe:");
			}
		}
		while (auswahl >= 4 || auswahl <= 0);

		//Áusgeben  
		printf("\nDurchmesser\tLaenge\tAnzahl\n");
		datensatz = 0;
		while(datensatz < DATENSIZE && daten[datensatz].durchmesser != 0)
		{
			printf("M%d\t\t%dmm\t%d \n", daten[datensatz].durchmesser, daten[datensatz].laenge, daten[datensatz].anzahl);
			++datensatz;
		}
		fflush(stdin);

		printf("\nMit j laesst sich das Programm neustarten, jede andere Eingabe,\nsowie ein leeres Enter beenden das Programm.\nMoechten sie mit dem Programm fortfahren:");
		abfrage=getchar();             
          
	}
	while(abfrage=='j');
}
 
Zuletzt bearbeitet:
schreib ne kleine funktion, die nur das vergleichen übernimmt und dabei abhängig von einem gegebenen parameter nach einem bestimmten kriterium vorgeht. damit lässt du dann in der sort()-funktion sortieren und kannst über den parameter bestimmen, wonach sortiert wird.

code, der dasselbe tut, sollte möglichst auch nur ein mal geschrieben werden und dann flexibel eingesetzt werden - copy&paste-code ist unschön und auch deutlich unpraktischer.
 
Zurück
Oben