Sortierschleife bricht mit Fehler ab
-
Also erstmal zum System. Windows XP, Dev-C++ 4.9.9.2.
Ich hab Programmierung grad als Nebenfach an der Uni und bin zwar nicht absolut unwissend aber es fehlt doch häufig noch am Grundverständnis der Funktionsweise.
Also wir sollen in C max. 100 Zahlen (long int) einlesen und diese dann der Größe nach sortieren.
Ich weiß nicht ob meine Methode geht, denn nach dem Einlesen hängt er sich mit einer unspezifischen Fehlermeldung auf. (Fehler...muss beendet werden blabla)
Mich würde jetzt erstens brennende interessieren WARUM? und wie man es zweitens machen könnte, die Eingabe der Zahlen zu beenden, indem man zB einen Buchstaben statt einer Zahl eintippt, denn so mit JA oder NEIN ist das recht umständlich.Also ich will keine Hilfe bei der Sortierung. Das muss ich ja selber hinkriegen.
Danke schonmal für die prof. Hilfe.
#include <stdio.h>
#include <stdlib.h>int main()
{
int i,a=-1,b,c,test,ende=0;
long int zahl[99],zahl2;for (i=0;i<=99;i++)
{
printf("Geben Sie die %i von 100 Zahlen ein! ",i+1);
scanf("%li",&zahl[i]);
a++;printf("\nNoch eine Zahl? Ja(1) Nein(2) "); scanf("%i",&test);
switch (test)
{
case 1 : break;
case 2 : ende++; break;
}if (ende==1) break;
system("cls");
}system("cls");
a=b;for (a;a!=0;a--)
{
a=c;
for (c;c!=b;c++)
{
if (zahl[c]<=zahl[c-1])
{
zahl2=zahl[c];
zahl[c]=zahl[c-1];
zahl[c-1]=zahl2;
}
}
}system("pause");
return 0;
}
-
Beim 2. Versuch bitte den Code schön formattiert in [cpp]-Tags packen.
-
OK
-
Was jetzt schon beim ersten überfliegen auffällt:
for(a;a!=0;a--) { a=c; ...
Damit überschreibst du den Inhalt der Zählvariablen mit dem Inhalt von c - und c wurde vorher nicht einmal initialisiert. Sowas kann nur in die Hosen gehen.
(hast du eventuell die Operanden vertauscht? Andersrum (
c=a;
) würde die Anweisung nämlich Sinn ergeben)PS: Der Ausdruck "a" als Initialisierung der for()-Schleife ist übrigens sinnlos (weil ohne Wirkung).
-
debugge doch bitte mal den code.
guck dir nochmal arrays an. deins hat nen fehler.
switch fuer 2 faelle? ueberleg nochmal.
dein bubblesort ist auch kaputt. einfach mal debuggen.
-
Oh ja
c=a. Habs geändert. Fehler vom Amt. Danke.
for(a;.... hab ich auch zu for(;.... geändert.
Es bricht aber immer noch ab.
-
musst du halt debuggen. schon mal gemacht?
-
c.rackwitz schrieb:
debugge doch bitte mal den code.
guck dir nochmal arrays an. deins hat nen fehler.
switch fuer 2 faelle? ueberleg nochmal.
dein bubblesort ist auch kaputt. einfach mal debuggen.
Debuggen? Ich drück auf Programm ausführen und fertig. Wie macht man das?
Bubblesort? Sorry da fehlt es schon....
-
Valmar schrieb:
c.rackwitz schrieb:
debugge doch bitte mal den code.
guck dir nochmal arrays an. deins hat nen fehler.
switch fuer 2 faelle? ueberleg nochmal.
dein bubblesort ist auch kaputt. einfach mal debuggen.
Debuggen? Ich drück auf Programm ausführen und fertig. Wie macht man das?
Ci hweiß nicht, was Dev-C++ kann, aber die meisten IDEs bieten einen integrierten Debugger - damit hast du die Möglichkeit, "live" zu beobachten, was dein Programm wirklich macht.
Bubblesort? Sorry da fehlt es schon....
Du benutzt einen Algorithmus und weißt nicht einmal, wie er heißt? Da solltest du schleunigst deine Wissenslücken auffüllen (gib mal "Bubblesort" bei google oder wikipedia ein, die sollten ausreichend Informationen ausspucken).
Edit: Und das "a=b;" über der Sortierschleife sieht auch falsch aus (und ist nebenbei die einzige Stelle, an der b auftaucht).
-
Naja ich hab das Sortierding eben selbst ausgedacht. Hab jetzt aber nachgelesen.
Ich kann auf Fehlersuche gehen und das durchlaufen lassen. Seh das Programm dann ganz normal, aber einzelne Schritte finde ich nicht aufgelistet. Aber wenn ich das so durchlaufen lasse bricht es nicht ab....
-
Hehe hab den gleichen Fehler doch glatt zweimal gemacht. Ok das hätte nun wirklich nicht sein müssen. Aber gestern um 23 Uhr war nicht mehr drin.
Hab das a=b zu b=a gemacht und jetzt geht es durch.
Ich hab mir hier sonstwas für einen Kopf gemacht, was der nun hat.
Danke an alle Beteiligten für die nette Hilfe.....
-
Valmar schrieb:
Naja ich hab das Sortierding eben selbst ausgedacht.
Echt? Darf man erfahren, was für Vorkenntnisse du hast?
-
Also ich hatte 1 Semester Einführung in die Informatik. 0101110, LOAD, ADD Boot-Algo. und sowas.
Und jetzt fast ein Semester C. Obwohl die VL langweilig ist und ich nie hingehe.
Wir kriegen halt ständig Aufgaben zum Lösen.
Habs jetzt auch fertig. Nur eine Frage muss ich noch klären. Bei der Eingabe der Zahlen kann man ja zB 4 oder 435 oder 573748 eingeben. Leider hat er bei den großen Zahlen noch Werte im Buffer und somit überspringt er eine Eingabe. Ich hab diesen fflush(stdin); Befehl gefunden (UND AUCH DIE GANZEN HINWEISE DAZU), aber es klappt halt und sonst wüsste ich nicht wie ich das Problem lösen könnte. Mit getchar(); getchar(); geht es nicht. Da will er bei 4 immer noch einen Wert haben und wenn ich ein getchar weglasse, dann geht es wieder nicht mit großen Zahlen....#include <stdio.h> #include <stdlib.h> int main() { int i,a=-1,b,c,test,ende=0; long int zahl[99],zahl2; for (i=0;i<=99;i++) { printf("Geben Sie die %i von 100 Zahlen ein! ",i+1); scanf("%li",&zahl[i]); a++; fflush(stdin); printf("\nNoch eine Zahl? Ja(1) Nein(2) "); scanf("%i",&test); if (test==1); else break; system("cls"); } system("cls"); b=a; for (;a!=0;a--) { c=a; for (;c<=b;c++) { if (zahl[c]<=zahl[c-1]) { zahl2=zahl[c]; zahl[c]=zahl[c-1]; zahl[c-1]=zahl2; } } } for (i=0;i<=b;i++) { printf("%li -> ",zahl[i]); } system("pause"); return 0; }
-
http://www.c-plusplus.net/forum/viewtopic.php?t=39349
dein code ist immernoch nicht ganz richtig.
du hast ein [99] array. was ist der index des ersten und letzten elements?
dein eines if-else... sag mal wird der code benotet?was erhoffst du dir mit deinem teuren studium?
-
man: getchar() liest ein einziges Zeichen ein - das mußt du also so oft aufrufen, bis du am Zeilenende angekommen bist, um allen "Müll" aus dem Tastaturpuffer zu werfen:
while(getchar()!='\n'); //oder mit ausführlicherer Fehlerkontrolle: int input; while((input=getchar())!=EOF && input!='\n');
Übrigens solltest du die system()-Aufrufe auch weglassen. Für system("cls"); kenne ich zwar keinen systemunabhängigen Ersatz, aber vermutlich sieht dein Programm auch noch gut aus, wenn du es weglässt.
PS: Und das Konstrukt "if(test==1);else..." habe ich auch noch nicht gesehen
Wenn nur in einem der möglichen Fälle etwas passieren soll, pack diesen Teil in den if-Zweig: "if(test!=1) break;"
-
Haha ein Unigegner. Eigentlich studiere ich Biologie (Diplom). Info mach ich nur aus Spaß als Nebenfach. Und was ich mir davon erhoffe? Ich weiß, ich sollte jetzt schreiben, dass ich viel Geld verdienen will aber ich bin nicht so fehlgeleitet. Dann hätte ich BWL gemacht.
Ich spiele an den Genen rum. Hauptsächlich von Pflanzen aber auch Mikroorganismen und fliege dafür durch die ganze Welt. Also ein Hauch Ökologie ist auch dabei. Das ist tausendmal schöner als ein Unternehmen zu haben.
Teuer ist das Studium übrigens nicht. Zweimal im Jahr 50 Euro Beitrag.Und mit einem HIWI Job und ab August sogar Werkstudent kriegt man vom Max-Planck auch mal schnell 800 Euro pro Monat
(PS: Vitamin
Ich steh auch nicht in der Botanik rum und schau mir Blumen an. Laborarbeit trifft es eher. Man soll es nicht glauben, aber einige denken doch immer noch, dass Biologie nur zum Pflanzen und Tiere Anschauen da ist.
Wir schicken hier zB als einzige Uni Europas Planzen mit Genen aus extrem widerstandsfähigen Bakterien (isoliert aus dem Kühlwasser vom Atomkraftwerken) ins All und zwar ausserhalb des Magnetfeldes. Volle Strahlung, trotzdem kamen einige heil zurück. Also ich finde das ziemlich interessant und etwas Schöneres kann ich mir nicht vorstellen. Meine Freundin ist da derselben Meinung. (Biologin)
Jetzt mal zu diesem flush. Undefiniertes Verhalten? Man weiß nicht was es macht aber undefinierbar ist im Rechner faktisch unmöglich. Begrenzte Sichtweise des Users ok, aber mehr nicht. Naja es klappt halt trotzdem. Erklärt mir mal warum.
-
CStoll schrieb:
man: getchar() liest ein einziges Zeichen ein - das mußt du also so oft aufrufen, bis du am Zeilenende angekommen bist, um allen "Müll" aus dem Tastaturpuffer zu werfen:
while(getchar()!='\n'); //oder mit ausführlicherer Fehlerkontrolle: int input; while((input=getchar())!=EOF && input!='\n');
Übrigens solltest du die system()-Aufrufe auch weglassen. Für system("cls"); kenne ich zwar keinen systemunabhängigen Ersatz, aber vermutlich sieht dein Programm auch noch gut aus, wenn du es weglässt.
PS: Und das Konstrukt "if(test==1);else..." habe ich auch noch nicht gesehen
Wenn nur in einem der möglichen Fälle etwas passieren soll, pack diesen Teil in den if-Zweig: "if(test!=1) break;"
Ok das ist doch mal ein Wort. Danke.
-
printf("Druecken Sie eine beliebige Taste zum Fortfahren!"); getchar(); getchar();
für system("pause")
Ich brauch das drin, denn meine Konsole schliesst sich am Ende immer sofort ohne das ich was sehen kann.
Aber jetzt klappt es schon super. Nur halt dieses dumme "neue Zahl? JA NEIN" nervt noch.
-
c.rackwitz schrieb:
http://www.c-plusplus.net/forum/viewtopic.php?t=39349
dein code ist immernoch nicht ganz richtig.
du hast ein [99] array. was ist der index des ersten und letzten elements?
dein eines if-else... sag mal wird der code benotet?von [0] bis [99]
keine Noten. Nur um zu sehen, dass man auch mitmacht, weil VL ist keine Pflicht.
-
Valmar schrieb:
printf("Druecken Sie eine beliebige Taste zum Fortfahren!"); getchar(); getchar();
für system("pause")
Ich brauch das drin, denn meine Konsole schliesst sich am Ende immer sofort ohne das ich was sehen kann.
Dann schau mal in den obersten Thread der Konsolen-FAQ - dort stehen wesentlich bessere Alternativen drin.
Valmar schrieb:
c.rackwitz schrieb:
du hast ein [99] array. was ist der index des ersten und letzten elements?
dein eines if-else... sag mal wird der code benotet?von [0] bis [99]
Setzen - Sechs. Die gültigen Indizes in einem "Typ array[n];" gehen von "array[0]" bis "array[n-1]" - array[n] liegt hinter dem Array-Ende.