Sortieralgorithmus funktioniert nicht, warum?
-
Hi,
mein Sortierlagorithmus will nicht so richtig. Nach der ersten Eingabe stürzt er ab.
Vermute der Fehler liegt irgendwo im Eingabemodul und hängt mit den Typen und getchar zusammen. Wenn ich zahlen einlesen und nach jeder Eingabe mit <Enter> bestätigen will, welche Funktion muss ich dann nehmen (zeichengepuffert); oder muss ich das mit "... =='\n'" überprüfen?#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 25 void swap(double* , double* ); //Deklaration void selsort(double*, int); void main(void) { int i; char j; double v[MAX]; /*Eingabemodul*/ puts("Bitte geben sie ein Folge von Zahlen ein (maximal 25)\n Druecken Sie nach jeder Eingabe <Enter>.\nFertig mit <Q>\n\n\n"); for(i=0 ; (i<=strlen(v))||((j=getchar())=='q')||((j=getchar())=='Q') ; i++) if(sizeof(j) == sizeof(double)) v[i]=getchar(); /*Sortieralgorithmus Selection Sort (als Pointervariante)*/ selsort(v, strlen(v)); //Aufruf } //Ende main /*Funktionen*/ void swap(double *p1, double *p2) { double temp; temp = *p1; *p1 = *p2; *p2 = temp; //Ringtausch } void selsort(double *a, int len) { register double *b, *minp; double *last; last = a + (len-1); //zeigt auf letztes Element for(;a<=last;a++) //jeweils ab der Stelle a das kleinste Element suchen { minp = a; //minp zeigt auf das bis dahin kleinste Element for(b=a+1; b<=last; b++)//Restvektor auf Element kleiner *minp suchen if( *b<*minp ) minp = b; swap(a, minp); //und anschließend mit *a vertauschen } }
Danke
-
Hab das Abbruchkriterium der for-Schleife editiert
/*Eingabemodul*/ puts("Bitte geben sie ein Folge von Zahlen ein (maximal 25)\n Druecken Sie nach jeder Eingabe <Enter>.\nFertig mit <Q>\n\n\n"); for(i=0 ; (i<=MAX)&&((j=getchar())!='q')&&(j!='Q') ; i++) if(sizeof(j) == sizeof(double)) v[i]=getchar();
-
Bei deinem Eingabemodul kracht es, ja. Ich habe aber keine Ahnung, was du dir dabei gedacht hast, daher kann ich nur die Fehler anstreichen, nicht korrigieren, denn das macht alles keinen Sinn für mich.
strlen(v)
Fehler: v ist ein double Feld.if(sizeof(j) == sizeof(double))
Fehler: Das wird nie (oder immer) true.`
v[i]=getchar();`
Fehler: v[i] ist vom Typ double.Viele getchars:
Fehler: Jedes getchar wird ein neues Zeichen von der Eingabe holen.Ist bestimmt noch mehr falsch, aber dies sollte dir erstmal einige Ansätze geben.
-
[quote="SeppJ"]Bei deinem Eingabemodul kracht es, ja. Ich habe aber keine Ahnung, was du dir dabei gedacht hast, daher kann ich nur die Fehler anstreichen, nicht korrigieren, denn das macht alles keinen Sinn für mich.
strlen(v)
Fehler: v ist ein double Feld.Hast recht, macht keinen Sinn. Das Abbruchkriterum sollte auch mit i<= MAX funktionieren.
if(sizeof(j) == sizeof(double))
Fehler: Das wird nie (oder immer) true.Ok, wollte die Eingabevariable auf den Typen überprüfen. Nur ins array zuweisen, falls j ein double ist, falls char und q oder Q, dann break. Muss ich das casten oder wie würdest du das machen?
`
v[i]=getchar();`
Fehler: v[i] ist vom Typ double.Ok, welche zeichengepufferte Eingabefunktion könnte man verwenden?
Viele getchars:
Fehler: Jedes getchar wird ein neues Zeichen von der Eingabe holen.Dann brauch ich ne eingabevariable oder... hmm
-
Du verwendest Einzelzeichenauswertung, dabei kann es Probleme geben, siehe zu diesem Thema auch "fflush(stdin)" oder auch http://www.c-plusplus.net/forum/viewtopic-var-t-is-272289.html. Ein Problem ist weiterhin, dass du in einer Abfrage sowohl gültige Werte für double als auch für Abbruchbedingung char[] gestattest, dies macht die Implementierung aufwändiger.
void main() ist kein Standard.int i=0; char j[81]; double v[MAX]; /*Eingabemodul*/ puts("Bitte geben sie ein Folge von Zahlen ein (maximal 25)\n Druecken Sie nach jeder Eingabe <Enter>.\nFertig mit <Q>\n\n\n"); while( i<MAX && 1==scanf("%80s",j) ) { char *error; if( !strcmp(j,"q") || !strcmp(j,"Q") ) break; v[i]=strtod(j,&error); if( error && !*error ) ++i; } /*Sortieralgorithmus Selection Sort (als Pointervariante)*/ selsort(v, i); //Aufruf
-
Ok, ich versuche mal deinen Teil zu kommentieren, um mein Verständnis zu prüfen.
int i=0; char j[81]; double v[MAX]; /*Eingabemodul*/ puts("Bitte geben sie ein Folge von Zahlen ein (maximal 25)\n Druecken Sie nach jeder Eingabe <Enter>.\nFertig mit <Q>\n\n\n"); while( i<MAX && 1==scanf("%80s",j) ) //Schleife solange ausführen, wie i<Max und j kein char ist { char *error; if( !strcmp(j,"q") || !strcmp(j,"Q") ) //die Bedingung in der While-Schleife schließt q oder Q doch schon aus? break; v[i]=strtod(j,&error); ///verstehe if( error && !*error )//ich nicht ++i; } /*Sortieralgorithmus Selection Sort (als Pointervariante)*/ selsort(v, i); //Aufruf
Kannst du mir nochmal helfen?
-
Lies die Spezifikation zu scanf, strcmp, strtod und den Link zur zeichenweise Eingabe. Ich gebe hier keinen Kurzexkurs zu ANSI C Standardfunktionen.