C Buchstaben sortieren

Another Day

Cadet 2nd Year
Dabei seit
Dez. 2007
Beiträge
22
Hallo CB,

habe da mal eine Frage zum programmieren.
Und zwar muss ich einen String mit Buchstaben sortieren.


So steht beispielsweise in Datei.txt:

zahjut

muss aber hinterher korrekt ausgegeben werden:

ahjtuz


also nach dem Alphabet sortiert.
Habe da was von Bubble Sort gehört. Aber so richtig funktionieren wills nicht.
Beim ausgeben habe ich da auch so meine Probleme...


Könnt ihr mir vllt. helfen?


Danke.
 

arterius

Commander
Dabei seit
Jan. 2004
Beiträge
2.931
Warum sortierst du nicht nach den asci Werten der Buchstaben?

Kombiniert mit dem bubble sort Algorithmus solltest du doch ans Ziel kommen. :)
 

Another Day

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
22
ja, nur die Frage ist, wie kann ich den Wert vorher und das Ergebnis nachher ausgeben?
für C habe ich da keine lösung bisher gefunden.

Das schreiben in die datei ist erstmal zweitrangig.
 

arterius

Commander
Dabei seit
Jan. 2004
Beiträge
2.931
Du speicherst den Anfangzustand in einen String.

Danach legst du eine Kopie davon an und greifst auf die einzelnen Elemente zu.

Sortiert wird mir bubble sort. :)
 

Another Day

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
22
also mal langsam, bislang sieht mein code so aus:

Code:
#include "stdio.h"
#include "string.h"

main () 
{
	char satz[200];
	printf("\nBitte geben Sie einen Satz ein\n");
	gets(satz);
	printf("\n%s", satz);			
}

das mit dem bubble sort habe ich noch nicht ganz verstanden.
finde nur code für vb oder c++.
 

arterius

Commander
Dabei seit
Jan. 2004
Beiträge
2.931
Wie weit bist du eigentlich mit C?

Dir fehlen noch ein paar Grundlagen und die würde ich nachlesen.

Sagen dir Kontrollstrukturen/Vektoren etwas?
 

Another Day

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
22
so.. sortiert aber nur ziffern und keine buchstaben :(

Code:
#include <stdafx.h>
#include <stdio.h>

#define FALSE 0
#define TRUE 1
#define listLength ( sizeof list / sizeof list[0] )

char list[] = {  56, 23, 1, 89, 58, 20, 125, 86, 3 };

void bubbleSort (char list[], char len);

int main ()
{
	bubbleSort (list, listLength);

	{
		char i;
		for (i = 0; i < listLength; ++i)
		printf ("list[%d] = %d\n", i, list[i]);
	}

	return 0;
}


 void bubbleSort (char list[], char len)
 {
	char sorted = FALSE;

	while (!sorted)
	{
		char j;
		sorted = TRUE;
		for (j = 0; j < len - 1; j++)
		{
			if (list[j] > list[j + 1])
			{
				char t;
				sorted = FALSE;
				t = list[j];
				list[j] = list[j + 1];
				list[j + 1] = t;
			}
		}
	}
 }
 

arterius

Commander
Dabei seit
Jan. 2004
Beiträge
2.931
Ich würde es in c++ anders machen aber egal.

Wenn es mit Zahlen funktioniert bist du doch fast fertig.

Einfach eine String in asci Zahlen umwandeln und am Ende wieder zurück.

Nur aufpassen, dass du keine Großbuschstaben hast.
 

Another Day

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
22
Fertig.. najaj...
ich muss es ja noch in eine Datei schreiben und aus einer Datei lesen.
edit: der code ist c? nicht c++..
 

moagnus

Ensign
Dabei seit
Juli 2007
Beiträge
189
Sagen dir Kontrollstrukturen/Vektoren etwas?
Ein Vektor ist ein Klassentyp und Klassen gibt's in C nicht.

Ich würde vorschlagen, dass du 'ne Sortierfunktion aus der Standardbibliothek nimmst. Die ist optimiert und hat keine Fehler.
Mein Vorschlag:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mycmp(const void *a, const void *b) {
	char x = * (char *) a;
	char y = * (char *) b;
	return (x < y) ? -1 : (x > y) ? 1 : 0;
}

int main(int argc, char **argv) {
	if(argc != 3) {
		fprintf(stderr, "Usage: %s input.txt output.txt", argv[0]);
		exit(EXIT_FAILURE);
	}
	
	FILE *input, *output;
	input = fopen(argv[1], "r");
	output = fopen(argv[2], "w+");
	if(input == NULL) {
		fprintf(stderr, "Could not open %s", argv[1]);
		exit(EXIT_FAILURE);
	}
	if(output == NULL) {
		fprintf(stderr, "Could not open %s", argv[2]);
		exit(EXIT_FAILURE);
	}
	
	int max_line_length;
	printf("Enter maximum line length: ");
	scanf("%d", &max_line_length);
	max_line_length += 2; // for additional '\0' and '\n'
	char buffer[max_line_length];
	while(fgets(buffer, max_line_length, input) ) {
		qsort(buffer, sizeof(buffer)-2, sizeof(char), mycmp); // -2: do not sort '\0' and '\n'
		fputs(buffer, output);
	}
	
	exit(EXIT_SUCCESS);
}
 
Zuletzt bearbeitet:
Top