Problem bei einer Aufgabe
-
Wenn das auch nicht klappt übergebe für jedes Array (int [] array, int position, int länge). Durch den zusätzlichen Parameter position kannst du einen Pointer simulieren. Du musst dann nur jedes array[zahl] durch array[zahl + position] ersetzen.
-
@bauko
schreib doch bitte nicht ständig c4 das gibts wirklich, nicht nur als sprengstoff
-
Aja
Muss sagen so langsam wirds echt zu hoch für mich.
Soll ich nun nur mergesort ändern oder das komplette programm?
Kann ich nicht für die Position array[1] usw nehmen?
-
Klar kannst du array[1] benutzen, aber du musst irgendwie "liste + laenge / 2" ausdrücken. liste ist ein Pointer auf ein int Array und der Pointer wird um laenge / 2 hochgezählt. Aber bei dir gibt es keine Pointer, also musst du sie simulieren.
Ich hab mal deinen Code kopiert und entsprechend geändert:
prog aufgabe4neu void merge(int [] a1, int pos1, int l1,int [] a2, int pos2, int l2){ int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] array; array= new int [20]; int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2+pos2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1+pos1]; p1=p1+1; i=i+1;} if (a1[p1+pos1] > a2[p2+pos2]) {temparray[i] = a2[p2+pos2]; p2=p2+1; i=i+1;} else temparray[i] = a1[p1+pos1]; p1=p1+1; i=i+1; } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g+pos1] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1+pos2] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int pos, int laenge){ if (laenge>1){ mergesort(liste, pos, laenge / 2); mergesort(liste, pos + laenge / 2, (laenge+1) / 2); merge(liste, pos, laenge / 2, liste, pos + laenge / 2, (laenge+1) / 2); } } { int [] array; array= new int [20]; int [] temparray; temparray= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 0, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
Ich hoffe mal dass ich nichts übersehen habe. Mit etwas Glück läuft es so.
Mir fällt gerade auf dass ihr dynamische Arrays habt. Vielleicht ist es Cleverer für die Listen jeweils neue Arrays zu bauen und diese zurückzugeben. Ich habe leider keine Ahnung wie weit diese dynamischen Arrays definiert sind.
-
Ja werde dein Code gleich mal testen, hatte grade selberprobiert und eben versucht in der merge funktion die listen durch hilfsarrays zu ersetzen.
void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[]; if (laenge>1){ int i; i=0; int g; g=laenge/2; while(i<laenge/2){ helpliste[i]=liste[g]; i=i+1; g=g+1;} mergesort(liste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(liste, laenge / 2, helpliste, (laenge+1) / 2); } }
dann läuft das Programm zwar bricht aber mit einer arrayoutofbounceexception ab
-
@bauko
gibts den c4 compiler zum download? bzw. kannst mal nen link posten was du da verwendest?
-
Also hab grad deinen Code getestet, ist wie bei mir. Er bricht ab in Zeile 24 mit der arrayoutofbounceexception ab.
@noobLolo http://swt.informatik.uni-halle.de/lehre/2009ws/oop/
dort sind unten die bisherigen Skripte zu C1 bis C4.
SInd eben einfache Vorsprachen um langsam zu c# heranzuführen.
mit einem C4 compiler kann ich leider nicht diehnen,da es nur dateien gibt, um im Linux terminal zu kompilieren
-
Hab es jetzt nochmal geändert.Mein Code sieht nun so aus:
prog aufgabe4neu void merge(int [] a1, int l1,int [] a2, int l2){ int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} if (a1[p1] > a2[p2]) {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} else temparray[i] = a1[p1]; p1=p1+1; i=i+1; } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[laenge/2]; int [] addliste; addliste= new int[laenge/2]; if (laenge>1){ int i; i=0; int a; a=0; int g; g= laenge/2; while(i<laenge/2){ addliste[i]=liste[i]; i=i+1;} while(i>=laenge/2){ helpliste[a]=liste[g]; a=a+1; g=+1;} mergesort(addliste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(addliste, laenge / 2, helpliste, (laenge+1) / 2); } } { int [] array; array= new int [20]; int [] temparray; temparray= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
Leider bricht er mit folgender Fehlermeldung ab:
line 60:27: Error: ArrayIndexOutOfBoundException
Im Skript steht dazu:
Für Indexzugriffe idx auf eine Reihung x muss
0 <= idx < x.Length gelten
+ Ansonsten bricht das Programm mit einer
ArrayIndexOutOfBoundException ab.
Jemand noch eine Idee, erkenne nämlich wirklich nicht warum mein array überläuft...
-
evtl. weil du i nicht änderst und in ne endlos schleife rennst?
while(i>=laenge/2){ helpliste[a]=liste[g]; a=a+1; g=+1; }
-
prog aufgabe4neu void merge(int [] a1, int l1,int [] a2, int l2){ int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} if (a1[p1] > a2[p2]) {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} else temparray[i] = a1[p1]; p1=p1+1; i=i+1; } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[laenge/2]; int [] addliste; addliste= new int[laenge/2]; if (laenge>1){ int i; i=0; int a; a=0; int g; g= laenge/2; while(i<laenge/2){ addliste[i]=liste[i]; i=i+1;} if(i==10){ while(i<laenge){ helpliste[a]=liste[g]; a=a+1; g=g+1; i=i+1;} } mergesort(addliste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(addliste, laenge / 2, helpliste, (laenge+1) / 2); } } { int [] array; array= new int [20]; int [] temparray; temparray= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
So jetzt läuft es schonmal im mergesort-Teil,nur im merge-Teil kommt jetzt der Fehler.Langsam verzeifel ich echt.
line 19:32: Error: ArrayIndexOutOfBoundException Aborted
Da läuft nun auch noch ein array über -.-
-
Setz mal den else-Zweig auch in geschweifte Klammern:
void merge(int [] a1, int l1,int [] a2, int l2){ (...) while (i < l1 + l2){ (...) else {temparray[i] = a1[p1]; // <- hier p1=p1+1; i=i+1;} // <- und da }
-
ALso mein Programm zeigt mir jetzt keine Fehler mehr an , aber nach der EIngabe der 20 Zahlen passiert absolut nichts
Das Programm wird einfach beendet...ich krieg echt eine Krise, kann mir bitte einer erklären warum das passiert?Ist doch absolut traurig.prog aufgabe4neu void merge(int [] a1, int l1,int [] a2, int l2){ a1= new int[20]; a2= new int[20]; int p1; p1= 0; int p2; p2= 0; //positionen in der Liste int [] temparray; temparray= new int [20]; int i; i=0; while (i < l1 + l2){ if (p1 == l1) //erste liste zuende {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} if (p2 == l2) //zweite liste zuende {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} if (a1[p1] > a2[p2]) {temparray[i] = a2[p2]; p2=p2+1; i=i+1;} else {temparray[i] = a1[p1]; p1=p1+1; i=i+1;} } //rückkopieren in array int g;//Hilfsvariable g=0; while (g < l1){ a1[g] = temparray[g]; g=g+1;} int j;//Hilfsvariable j=l1; while(j < l1 + l2){ a2[j-l1] = temparray[j]; j=j+1;} } void mergesort(int [] liste, int laenge){ int [] helpliste; helpliste= new int[laenge/2]; int [] addliste; addliste= new int[laenge/2]; if (laenge>1){ int i; i=0; int a; a=0; int g; g= laenge/2; while(i<laenge/2){ addliste[i]=liste[i]; i=i+1;} if(i==10){ while(i<laenge){ helpliste[a]=liste[g]; a=a+1; g=g+1; i=i+1;} } mergesort(addliste, laenge / 2); mergesort(helpliste, (laenge+1) / 2); merge(addliste, laenge / 2, helpliste, (laenge+1) / 2); } } { int [] array; array= new int [20]; int i; i=0; while (i < 20) { read(array[i]); i=i+1; } mergesort(array, 20); int g; g=0; while ( g < 20) { print(array[g]); print("\n"); g=g+1;} }
-
Bau dir eine Funktion printArray(int [] array, int length) mit der du Arrays ausgeben kannst. Dann gebe Zwischenergebnisse aus: Das eingelesene Array, das Array das mergesort bekommt, die Teilarrays die mergesort übergibt, die Arrays die merge bekommt, Zwischenarrays und so weiter. Dann siehst du an welcher Stelle der Fehler auftritt und kannst ihn beheben.
-
BAUKO schrieb:
... aber nach der EIngabe der 20 Zahlen passiert absolut nichts
Das unsortierte "array" wird zwar an "mergesort" übergeben, aber
-> an keiner Stelle im Programm wird nach "array" etwas zurückgeschrieben. Weder direkt noch indirekt via Zeiger o.ä.
-
Hab es versucht gleich nach dem einlesen der 20 Zahlen die wieder auszugeben. das passiert aber schon nicht. sehr merkwürdig...woran kann das liegen?
-
// print(array[g]); printArray(array[g]);
-
ok hab jetzt den fehler erstmal gefunden warum der gar nichts ausgegeben hat,
lag an der Zeile 90: print("\n");
das löscht irgendwie alles oder so
ABer nun wird mir am Ende nur die 20 Zahlen ausgegeben, wie ich sie eingegeben habe???
Liegt das vielleicht daran was mergemann geschrieben hat?:Das unsortierte "array" wird zwar an "mergesort" übergeben, aber
-> an keiner Stelle im Programm wird nach "array" etwas zurückgeschrieben. Weder direkt noch indirekt via Zeiger o.ä.
-
Eigentlich sollte es eine neue Zeile anfangen, also quasi ein Enterzeichen.
Stimmen denn die Arrays innerhalb von merge und mergesort?
-
nwp2 schrieb:
also quasi ein Enter
das hab ich doch schon irgendwann von irgendwem gehört *rofl*
-
hmm nee, hab versucht die helpliste auszugeben noch vor Zeile 68,bekomme aber nix raus.nur 0000000000, also 10 nullen... noch eine idee?