Schwierige Java Array Aufgabe wer kann mir helfen Siehe Foto?
2 Fälle klappen nicht ich weiß nicht warum
Mit freundlichen Grüßen
4 Antworten
Ich würde jetzt nicht die nums umschreiben, sondern einfach nur aussetzen, bis wieder die 7 kommt. Dieses break ist mir unverständlich, da die übrigen nicht weitergezählt werden. Nach 6 hört bei Dir der normale Summierungslauf auf. Das ist falsch, da er nach 7 wieder einsetzen soll!
Also
public int sum67(int nums[])
{
int summe=0;
bool sum_bilden=true;
for(int=0;i<nums.length;++i){
if(sum_bilden && nums[i]!=6)summe+=nums[i];
else sum_bilden=false;
if(!sum_bilden&&nums[i]==7)sum_bilden=true;
}
}
Nicht getestet, einfach mal geraten.
Aber dann zählst Du die schließende 7 mit. Die darf auch nicht mit. Erst nach der ersten 7 geht es weiter.
Und Du gehst mit dem alten i weiter, denn Du zählst mit z weiter.
Bsp. Bei i=12 ist nums[i==12] = 6. Jetzt zählst Du mit z weiter. Nach dem break geht es aber mit i=13 weiter. Macht keinen Sinn.
Ahsoo hmm aber ich schreib doch an stelle der 7 die 0 und noch was das mit den i und z : das dürfte kein Problem bereits weil ich in der z Schleife überall 0 überschreibe dann summiert i halt eben immer + 0.
Du hast reeeevht
Ejjj du hattest recht mit Zettel kann man es richtig gut herausfinden ok hab mein Fehler gefunden:
Also meine zweite Schleife ejjjj ich bin so dumm die startet bei z = 0, hab sie jetzt ab der gefunden pos6 starten lassen jetzt klappt alles jetzt klappt alles:
So, und jetzt habe ich auch herausgefunden, wo die Differenz ist, bei den beiden roten Fällen:
Du rechnest zuerst die erste 2 zur Summe
Dann modifiziert Du die Ketten zu
27626727 --> 0020727 --> ergibt in Summe 18. Da Du am Anfang jedoch noch die 2 hattest in der Summe, ist diese 2 + 18 = 20.
2762627 --> 0002027, am Anfang hast Du aber noch die 2 und die 7 in der Summe = 9, bei der ersten 6 wird diese herausgelöscht und die erste beiden Ziffern, also 0002627. Dann kommt die mittlere 2 dazu, ergibt 11. Dann kommt wieder eine 6, wir sind bei 0002027, diese wird bis nach hinten durch gelöscht, weil am Ende die 7 ist. Alter Falter, das ist eine komplexe Tour!!!!
Dein doppeltes nums[z+1]=0 ist wiedersinnig, da es sowohl in der Bedingung als auch im else ist --> vor das if ziehen, das wird dann zu
nums[z+1]=0;
if(nums[z+1]==7)break;
Ehhmm ok danke ehh sprichst du von meiner neuen funktionierenden Lösung oder von der von der Frage?😅😅😅
Die von der Frage.
Ich habe das mit VBA nachgezeichnet und mir dann jeweils die Summen sowie die nums[]-Inhalte anzeigen lassen, eine sehr gute Variante, um den Fehler zu finden. So sah die Entwicklung sowohl der Summe als auch der nums-Inhalte vom Start bis zum Ende des Programms - dann sieht man sofort, wo sich der Fehler eingeschlichen hat.
Ich programmiere inzwischen recht viel und muss daher viel debuggen. Es ist wichtig, dass man die Zwischenschritte sich anzeigen lässt, damit man weiß, was das Programm so macht.
Ich programmiere auch ein Schachspiel, dabei habe ich auch ein den Inhalt modifizierenden Algo. Inhalt ist dabei das Schachbrett mit seinen Figuren drauf. Der war ein Fehler im Algo, Du kannst Dir vorstellen, wie das Schachbrett dann aussah zum Schluss, komplettes Chaos auf dem Brett :-) (wobei ich dann nicht gelacht habe). Um den Fehler zu finden, musste ich mir aber die Ergebnisse der einzelnen Schritte anzeigen lassen.
Ok danke für die Mühe ich gebe dir den Stern falls ich’s nicht vergesse
Wieder, du brauchst eigentlich logisch gesehen nur eine Schleife, und musst dann schauen, ob du dich gerade hinter einer 6 befindest.
Wenn dem so ist, dann summierst du die Zahlen so lange nicht, bis du auf eine 7 stößt. Wenn die 7 kommt, dann summierst du weiter. Achte insbesondere darauf, dass du eine 'normale' 7, die nicht hinter einer 6 steht speziell abdecken musst.
Das hast du denke ich nicht beachtet.
Wieder eine andere mögliche Lösung mit meiner oben geschilderten Denkweise:
public int sum67(int[] nums) {
int sum = 0;
boolean active = false;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
if (num == 6) {
active = true;
} else if ((num == 7) && active) {
active = false;
} else if (!active) {
sum = sum + num;
}
//Bist du hinter einer 6 (active), aber es kommt irgendeine Zahl passiert nichts
}
return sum;
}
Das Verfahren zur Lösung dieser Aufgabe braucht nicht so sehr von dem deiner vorherigen Aufgabe abzuweichen. Erneut musst du lediglich schauen, wann eine Sektion beginnt und endet. Dies lässt sich mit einem Flag markieren.
Pseudocode:
sum = 0
add = true
for i in nums.length:
if nums[i] == 6:
add = false
continue
if nums[i] == 7:
add = true
continue
if add:
sum += nums[i]
Wieso bei dir die beiden Testfälle versagen, kannst du ermitteln, indem du deinen Algorithmus konkret mit den gegebenen Werten einmal durchspielst.
Nicht gut: Die schließende 7 wird bei Dir mit dazugezählt! Anders die Aufgabe
Eeehmm wo wird die schließende 7 dazugezählt also ich mein bei der zweiten for Schleife hab ich ja geschrieben bei Else das da wo die 7 auftaucht auch eine 0 überschrieben wird und dann mit Break Schleife beenden
Bei der Lösung von regex9 geht es direkt mit 7 gleich weiter (da add sofort auf true gesetzt wird).
Bzw. regex9 hat recht, er hat ein continue gesetzt.
Nein, wird sie nicht. Ich habe aber einen anderen Fehler gemacht: Die 7 muss mitgezählt werden, wenn es keine vorherige 6 gab. Also:
...
if nums[i] == 7 && !add:
# ...
Was macht Continue eigentlich das heißt ja bloß Schleife fortsetzen aber die wird doch sowieso fortgesetzt
Sie bricht den aktuellen Schleifendurchlauf ab und startet mit dem nächsten. Ich möchte ja in den Fällen, wo ich es eingesetzt habe, nicht den nachfolgenden Code ausführen. Sonst würde bspw. die 6 und die 7 zur Summe mit addiert werden.
Ejjj du hattest recht mit Zettel kann man es richtig gut herausfinden ok hab mein Fehler gefunden:
Also meine zweite Schleife ejjjj ich bin so dumm die startet bei z = 0, hab sie jetzt ab der gefunden pos6 starten lassen jetzt klappt alles jetzt klappt alles:
Ok aber was macht mein Code falsch der macht das eigentlich richtig hab auch mit Papier und Stift durchgegangen müsste passen komisch
Dann schreibe hier einmal jeden Schritt für den Testcase 6 auf.
Ok ich mach das jetzt warte ich mach auf Blatt
Nimm besser ein pastebin oder schreibe es hier innerhalb eines Code-Snippets </>.
Bei Dir geht immer noch eine 2 mit.
Und zwar änderst Du die Folge ab! Und zwar das Folgeelement! Das z muss mit i anfangen und nicht mit 0.
Damit zerschießt Du Dir die Folgen! Vermeide solche modifying algos, mache sie nur, wenn nötig.
Du kannst natürlich die Zahlen auch im Algo verändern. Nur das dann zu durchdenken, ist recht schwer. Denn Du veränderst die zukünftigen Zahlen, nämlich nums[z+1]. Dann musst Du aber sehen, dass Du damit auch das zukünftige Verhalten des algos abänderst.
Kann man machen, ist aber schon recht kompliziert. Mitunter macht man das bewusst, um den Algo bewusst abzuändern.
Ich schränke daher meine Aussage ein. Man kann es machen, die Zahlenkette zu ändern während des Algos, es ist aber komplizierter als es nicht zu tun.
Zumindest habe ich mich etwas schwer getan, das nachzurechnen: Denn die erste 2 rechnest Du (bei den Beispielen, die nicht ok waren) rechnetest Du ein, dann wurden diese über nums[z=0] auf 0 gesetzt, das ist schon hart zu verstehen ...
Ehm der hört auf und wenn eine 7 kommt beende ich die zweite Schleife mit Break, dann geht es normal wieder weiter und wird weiter aufsummiert