was ist da faul ?
-
huhu, ich hab gerade für die uni ein kleines programm geschrieben, bei dem mir aber wohl ein fehler unterlaufen ist.leider weiß ich nur net wo und was - jedenfalls schmierts programm ab wenn bubblesort aufgerufen wird und ebenso wenn die funlktion bubblesort ausgeklammert wird und man nach der listenausgabe eine taste drückt ums programm zu beenden.
wäre nett wenn mal jemand drüber schauen und mir meine fehler sagen könnte ;))
gruß
vampi#include <stdio.h>
#include <string.h>struct s_person
{
int alter;
char vorname [50];
char nachname [50];
}person[10];void bubblesort (struct s_person[],int);
int main()
{
prog();
system("PAUSE");
return 0;
}int prog()
{
int i,lenght=10;
struct s_person person[10];strcpy(person[1].vorname,"michael");
strcpy(person[1].nachname,"meier");
person[1].alter=23;strcpy(person[2].vorname,"max");
strcpy(person[2].nachname,"mustermann");
person[2].alter=77;strcpy(person[3].vorname,"wendelin");
strcpy(person[3].nachname,"beck");
person[3].alter=46;strcpy(person[4].vorname,"werner");
strcpy(person[4].nachname,"müller");
person[4].alter=46;strcpy(person[5].vorname,"jessica");
strcpy(person[5].nachname,"werner");
person[5].alter=22;strcpy(person[6].vorname,"hendrik");
strcpy(person[6].nachname,"richert");
person[6].alter=22;strcpy(person[7].vorname,"albus");
strcpy(person[7].nachname,"dumbledore");
person[7].alter=87;strcpy(person[8].vorname,"frederik");
strcpy(person[8].nachname,"knigge");
person[8].alter=23;strcpy(person[9].vorname,"franz");
strcpy(person[9].nachname,"schmidt");
person[9].alter=53;strcpy(person[10].vorname,"inge");
strcpy(person[10].nachname,"morens");
person[10].alter=75;for (i=1;i<=10;i++)
{
printf("person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",i,person[i].vorname, person[i].nachname, person[i].alter);
}
bubblesort (person, lenght);}
void bubblesort (struct s_person person[], int lenght)
{
int i,j=i+1,k;for (i=1;i<=lenght;i++)
{if (strcmp(person[j].nachname, person[i].nachname)>0)
{
person[0]=person[i];
person[i]=person[j];
person[j]=person[0];
i=i-2;
}
}
for (k=1;k<=lenght;k++)
{
printf("person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",i,person[i].vorname, person[i].nachname, person[i].alter);
}}
-
sfds benutz bitte Code-Tags für Code!
Schau dir doch mal an was du machst. Du legst 10 Elemente (0..9) an und schreibst in 11 Elemente (0..10).
Ansonsten hast du length falsch geschrieben :p und deine bubblesort-Funktion ist auch kein Bubble-Sort!
-
moin,
sorry, nächstes mal setz ich natürlich die entsprechenden tags
die elementanzahl ist allerdings schonmal nicht der fehler - da kann ich beliebig ändern - immer die nette windows fehlermeldung. auch wenn ich nur 5 elemente rein schreibe statt 10.
und das ist kein bubblesort ? na was isses denn dann ? es fängt links an und vergleicht mit dem partner zur rechten. bei bedarf wird getauscht, dann wird geschaut ob man das element nicht noch eins weiter nach links schieben kann, wenn das möglich ist wird wieder getauscht, bis es nimmer geht, dann gehts mittem nächsten element weiter.
wenn ich da nen denkfehler habe oder gerade ne falsche bedeutung von bubblesort im hinterkopf habe immer raus damit und gerne gleich eine korektur dazuich bin halt nur armer maschinenbauer für den programmierung in gewisser weise eh hexenkram ist.
ich würde ja tippen dass der vogel da irgendwo falschbelegungen/doppelbelegungen bei adressen hat. nur find ich einfach nix wo ich selbst nun sagen würde "ja natürlich, das ist ja völlig falsch"
gruß
vampi
-
Natürlich ist die Elementanzahl fehlerhaft bzw der Index. Du startest bei 0 und kannst bis n-1 gehen.
Also
strcpy(person[0].vorname,"michael"); strcpy(person[0].nachname,"meier"); person[0].alter=23; ... strcpy(person[9].vorname,"inge"); strcpy(person[9].nachname,"morens"); person[9].alter=75;
-
kann ich wenn ich die elementanzahl erhöhe das element 0 nicht einfach leer lassen ?
also statt von 0-9 von 1-10 belegen ?
aktuell schauts bei mir wie folgt aus, bei weiterhin bestehendem fehler:
#include <stdio.h> #include <string.h> struct s_person { int alter; char vorname [50]; char nachname [50]; }person[20]; void bubblesort (struct s_person[],int); int main() { prog(); system("PAUSE"); return 0; } int prog() { int i,lenght=10; struct s_person person[20]; strcpy(person[1].vorname,"michael"); strcpy(person[1].nachname,"meier"); person[1].alter=23; strcpy(person[2].vorname,"max"); strcpy(person[2].nachname,"mustermann"); person[2].alter=77; strcpy(person[3].vorname,"wendelin"); strcpy(person[3].nachname,"beck"); person[3].alter=46; strcpy(person[4].vorname,"werner"); strcpy(person[4].nachname,"müller"); person[4].alter=46; strcpy(person[5].vorname,"jessica"); strcpy(person[5].nachname,"werner"); person[5].alter=22; strcpy(person[6].vorname,"hendrik"); strcpy(person[6].nachname,"richert"); person[6].alter=22; strcpy(person[7].vorname,"albus"); strcpy(person[7].nachname,"dumbledore"); person[7].alter=87; strcpy(person[8].vorname,"frederik"); strcpy(person[8].nachname,"knigge"); person[8].alter=23; strcpy(person[9].vorname,"franz"); strcpy(person[9].nachname,"schmidt"); person[9].alter=53; strcpy(person[10].vorname,"inge"); strcpy(person[10].nachname,"morens"); person[10].alter=75; for (i=1;i<=10;i++) { printf("person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",i,person[i].vorname, person[i].nachname, person[i].alter); } bubblesort (person, lenght); } void bubblesort (struct s_person person[], int lenght) { int i,j=i+1,k; for (i=1;i<=lenght;i++) { if (strcmp(person[j].nachname, person[i].nachname)>0) { person[0]=person[i]; person[i]=person[j]; person[j]=person[0]; i=i-2; } } for (k=1;k<=lenght;k++) { printf("person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",i,person[k].vorname, person[k].nachname, person[k].alter); } }
-
Vampi schrieb:
kann ich wenn ich die elementanzahl erhöhe das element 0 nicht einfach leer lassen ?
Warum solltest du das machen wollen? Man fängt eben bei Element 0 an.
-
zB könnte ich das tun wollen um später die 0 als puffer zu verwenden.
-
Wie oft würdest Du im Programm auf diesen Puffer zugreifen ? Lohnt sich das denn ?
-
ich find die 0 als puffer halt einfach schön. mir gehts aber auch weniger um kosmetik als die frage wo ist noch ein echter fehler? oder ist mein code so wirr dass ihn keiner versteht?
forderung ans programm ist halt dass ein struct hergenommen wird, eine liste mit 10 personen rein gestopft wird der quark dann an eine funktion übergeben wird, diese ein bubblesort durchführt und das ganze nach nachnamen sortiert wieder ausspuckt.
-
Vampi schrieb:
jedenfalls schmierts programm ab wenn bubblesort aufgerufen wird
void bubblesort (struct s_person person[], int lenght) { int i,j=i+1,k; // <- !!! -j- for (i=1;i<=lenght;i++) { if (strcmp(person[j].nachname, person[i].nachname)>0) // <- !!! -j- ... } ... }
-
moin merker,
irgendwie steh ich gerade derb auf dem schlauch - kannst mir vielleicht kurz sagen was an den von dir markierten stellen faul ist ? ich glaub ich seh da mittlerweile den wald vor lauter bäumen nicht mehredit: also ich hab nu halt das j raus genommen, nur weiß ich eben net was daran nun falsch war
wobei ich nun den lustigen fehler habe, dass das dos-fenster nimmer offen bleibt...
trotz system pause
-
btw. dein Bubble-Sort ist immer noch kein Bubble-Sort
und gewöhne dich einfach daran, dass das erste Element 0 ist. Siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-183109.html Mit deiner Einstellung wirst du dir nur Probleme einhandeln, zB wenn du fremden Code lesen willst oder weil du als Länge immer n+1 übergeben musst etc. Versuch nicht die Welt wegen so einer Kleinigkeit zu ändern, das ist sinnlos und du verschwendest unnütz Energie!
-
dass arrays bei 0 losgehen ist mir durchaus klar, aber warum soll ich als puffer ein n+1 nehmen wenn ich auch einfach die 0 für verwenden kann so ich sie vorher nicht genutzt habe. ich meine evtl. hab ich da ja einen denkfehler, aber naja... und mit fremden code so er nur dinge verwendet die mir bekannt sind war für mich nie ein problem bisher. halbwegs vorhandene kommentierung vorraus gesetzt.
und was das bubblesort angeht darfst mich, wie oben schon erwähnt, gern aufklären wie es richtig wäre.
ich wollts halt in so fern hübsch machen, dass es gleich bis zum anschlag nach links durchgereicht wird. (wie eine blase halt auch aufsteigt)
wenn du nun sagst einzig korrekt ists immer nur jedes element pro durchlauf maximal einmal zu tauschen dann ändere ich das sofort - so du mir da eine geeignete abbruchbedingung nennstmir fällt aus dem stehgreif da nichts brauchbares ein
-
http://de.wikipedia.org/wiki/Bubblesort
warum brauchst du überhaupt ein Puffer in einem Array? Und warum sollte der an Stelle 0 sein? Ich glaube du saugst dir da einfach etwas aus den Fingern, um deine komische Einstellung zu rechtfertigen. Aber meinetwegen handel dir Probleme für so eine Kleinigkeit ein...
-
na dann sag mir halt wie/wo/in was ich sonst was zwischenspeichern soll wenn nicht einfach in ein freies array.
und ich brauch nichts rechtfertigen. mein job wirds mal sein maschinen zu entwickeln. nicht sie zu programmieren, dafür gibts informatiker
oder ist das vielleicht auch einfach dein problem mit mir, dass ein karohemdträger im erlauchten club der 4 dioptrin jungens auftaucht? in anderen foren die ich kenne sind gerade moderatoren jedenfalls eher bemüht den leuten zu helfen und für gutes klima zu sorgen und net dazu da rumpelstilzchen zu spielen und rumzukacken. mein gott ich bin doch nicht her gekommen um grundsatzdiskussionen über persönliche vorlieben zu führen sondern einfach in der hoffnung irgendwo auf dieser welt irgend wen zu finden, der sich vielleicht noch mit C auskennt und davon mehr ahnung hat als ich.
unter komilitonen brauch ich nämlich gar net erst anfangen, da verlassen sich genügend eher darauf dass ichs ihnen schon erklären werde. und die informatiker die ich kenne ham entweder noch nicht explizit C programmiert oder sind seit 10 jahren und länger mittem studium fertig und haben die sprache seit dem nie wieder angerührt.
-
Wenn Du ein Array bei -1- beginnen lässt, dann werden Zugriffe über die "linke Arraygrenze" hinaus nicht als Fehler erkannt.
Früher oder später wirst Du Dich dann an logischen Programmfehlern dumm und dämlich suchen.
Ausserdem gibt es dann immer Probleme mit dem Index wenn Du z.B. versuchst, das folgende Beispiel an Dein eigenes Programm anzupassen :
http://en.wikibooks.org/wiki/Algorithm_implementation/Sorting/Bubble_sort#C
P.S.: -j- war nicht initialisiert !
-
also mit beginnen meinst schon "befüllen" ja ?
nur dass wir net aneinander vorbei quarken
naja mach ich mir halt ne tempvariable und zieh die grenzen eins nach linksund das wikipediadingen zu übertragen damit hab ich so oder so meine probleme
aber ich kann auch bei fremdsprachen nur schwerlich übersetzen - obwohl ich die sprachen an sich eigentlich beherrsche. ist bissl komisch bei mir.
wenn ichs -j- net anständig initialisiert hatte ists natürlich nen guter grund - wobei es mich wundert dass der compiler da nicht geschimpft hat. aber wenn der sagt "hier da passt was net" ists ja auch langweilig
edit: huch ist ja ne C version ausem englischen wiki was du verlinkt hast - na da sollt ichs wohl auf die reihe bekommen das zu "klauen"
danke
edit2: kanns eigentlich sein dass meine if bedingung eh auch kacke ist? hatte die funktion vorgegeben bekommen mit kommentar "optimal um 2 strings nach "größe" zu vergleichen" - schön klein gedruckt unten mit auf dem aufgabenblatt. nur irgendwie ist die aussage die ich da als bedingung hinstell IMMER unwahr
-
jippie - es läuft so weit
an dieser stelle mal ein danke an den merker für den wikilink - war ganz hilfreich - wobei ich mir abbruch mittels bool geschenkt hab. bei einer 10er liste find ich das nun irgendwie etwas unnötig. da soll der quatsch ruhig seine öhm 100(?) überprüfungen machen und gut ists.
als puffer hab ich mir nun auch eine eigene variable gegönnt statt dem array plätzchen. wenn ihr mir nu alle sagt anders ists unschön, mach ichs halt doch soanders fand ichs halt bequemer, weils einfach eine eigenständige variable gespart hat.
wer nun noch unschönheiten oder ähnliches findet ist herzlich eingeladen sich darüber auszulassen - aber nur wenner auch begründet dazu schreibt wies schöner geht.
an sonsten bedank ich mich schonmal für jegliche hilfe und hoffe einfach dass ich in zukunft wenn ich hier was schreibe nicht wieder von irgend einer seite einfach nur angepupt werde
ich bin ja offen für jedwede kritik - aber erstens bevorzugt wenn ich um welche bitte, zweitens nicht wenn ich gerade ein gaaanz anderes problem habe und drittens nehm ich nur anständig begründete kritik an
viele grüße
vampi#include <stdio.h> #include <string.h> struct s_person { int alter; char vorname [50]; char nachname [50]; }; void bubblesort (struct s_person[],int); int main() { prog(); system("PAUSE"); return 0; } int prog() { int i,length=10; struct s_person person[11]; strcpy(person[1].vorname,"michael"); strcpy(person[1].nachname,"meier"); person[1].alter=23; strcpy(person[2].vorname,"max"); strcpy(person[2].nachname,"mustermann"); person[2].alter=77; strcpy(person[3].vorname,"wendelin"); strcpy(person[3].nachname,"beck"); person[3].alter=46; strcpy(person[4].vorname,"werner"); strcpy(person[4].nachname,"mueller"); person[4].alter=46; strcpy(person[5].vorname,"jessica"); strcpy(person[5].nachname,"werner"); person[5].alter=22; strcpy(person[6].vorname,"hendrik"); strcpy(person[6].nachname,"richert"); person[6].alter=22; strcpy(person[7].vorname,"albus"); strcpy(person[7].nachname,"dumbledore"); person[7].alter=87; strcpy(person[8].vorname,"frederik"); strcpy(person[8].nachname,"knigge"); person[8].alter=23; strcpy(person[9].vorname,"franz"); strcpy(person[9].nachname,"schmidt"); person[9].alter=53; strcpy(person[0].vorname,"inge"); strcpy(person[0].nachname,"morens"); person[0].alter=75; bubblesort (person, length); } void bubblesort (struct s_person person[], int length) { int i,j,k; struct s_person temp; for (i=0;i<=9;i++) { printf("person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",(i+1),person[i].vorname, person[i].nachname, person[i].alter); } for (i=1;i<length;i++) { for(j=0;j<length-i;j++) { if (strcmp(person[j].nachname,person[j+1].nachname)>0) { temp=person[j]; person[j]=person[j+1]; person[j+1]=temp; } } } for (k=0;k<=length-1;k++) { printf("sortierte Person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",k+1,person[k].vorname, person[k].nachname, person[k].alter); } }
-
Perfekt. *zur tür geh* *umdreh* *zurückkomm*
In der Funktion "bubblesort ()" gibt es zwei Kleinigkeiten :// for (i=0;i<=9;i++) for (i=0;i<length;i++) // <- die Anzahl der Datensätze wird doch mit übergeben // for (k=0;k<=length-1;k++) for (k=0;k<length;k++) // <- ist einfacher
-
hallo merker, huch das erste hab ich glatt übersehen
hatte irgendwo zu testzwecken variablen minimiert die für den fall hier eh statisch sind.
zum zweiten: logo, das passiert dann wenns zu spät wird, da kommen dann völlig unnötige umständlichkeiten rein
vielen dank jedenfalls für die hinweise
gruß
vampi#include <stdio.h> #include <string.h> struct s_person { int alter; char vorname [50]; char nachname [50]; }; void bubblesort (struct s_person[],int); //-------main--------- int main() { prog(); system("PAUSE"); return 0; } //-----Programm----- int prog() { int i,length=10; struct s_person person[10]; //----personenliste------ strcpy(person[1].vorname,"michael"); strcpy(person[1].nachname,"meier"); person[1].alter=23; strcpy(person[2].vorname,"max"); strcpy(person[2].nachname,"mustermann"); person[2].alter=77; strcpy(person[3].vorname,"wendelin"); strcpy(person[3].nachname,"beck"); person[3].alter=46; strcpy(person[4].vorname,"werner"); strcpy(person[4].nachname,"mueller"); person[4].alter=46; strcpy(person[5].vorname,"jessica"); strcpy(person[5].nachname,"werner"); person[5].alter=22; strcpy(person[6].vorname,"hendrik"); strcpy(person[6].nachname,"richert"); person[6].alter=22; strcpy(person[7].vorname,"albus"); strcpy(person[7].nachname,"dumbledore"); person[7].alter=87; strcpy(person[8].vorname,"frederik"); strcpy(person[8].nachname,"knigge"); person[8].alter=23; strcpy(person[9].vorname,"franz"); strcpy(person[9].nachname,"schmidt"); person[9].alter=53; strcpy(person[0].vorname,"inge"); strcpy(person[0].nachname,"morawski"); person[0].alter=75; bubblesort (person, length); //aufruf bubblesort } //-----Bubblesort------ void bubblesort (struct s_person person[], int length) { int i,j,k,getauscht; struct s_person temp; //puffervariable vom selbst erstellten typ //------ausgabe unsortierte liste------- for (i=0;i<length;i++) { printf("person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",(i+1),person[i].vorname, person[i].nachname, person[i].alter); } do //do-while als abbruchbedingung wenn fertig sortiert { for (i=1;i<length;i++)//maximale durchlaufszahl und stetiger wiederaufruf der elementweisen prüfung { getauscht=0; for(j=0;j<length-i;j++)//array elementweise durchgehen { if (strcmp(person[j].nachname,person[j+1].nachname)>0) { temp=person[j]; person[j]=person[j+1]; person[j+1]=temp; getauscht=1; } } } } while (getauscht==1); //----ausgabe der sortierten liste----- for (k=0;k<length;k++) { printf("sortierte Person%d:\nvorname:%s\nnachname:%s\nalter:%d\n",k+1,person[k].vorname, person[k].nachname, person[k].alter); } }
-
freundlicher hinweis an die herren grüttner, welzel und andere komilitonen - ihr dürft meinen code gerne verwenden, aber ich erwarte da eine angemessene, finanzielle entlohnung - so 200kröten pro nase oder so, wenn ihr selbst schon zu faul seid
wenn ihr nur hilfe für eure EIGENEN programme gesucht habt: gut gemacht - ihr habt sie wohl gefunden
pauli hätte euch sicher aber auch gesagt wie ihr mich direkt erreichen könnt