Schwierige Java Array Aufgabe wer kann mir helfen Siehe Foto?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:eigene Erfahrung – Hobby und teilweise beruflich

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 15:56

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

nobytree2  13.07.2019, 15:58
@Nichtsnutz12

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.

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:01
@nobytree2

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.

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:17
@nobytree2

Du hast reeeevht

Ejjj du hattest recht mit Zettel kann man es richtig gut herausfinden ok hab mein Fehler gefunden:

https://ibb.co/W6Rn2Gb

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:

https://ibb.co/9rPqm4t

nobytree2  13.07.2019, 16:48
@Nichtsnutz12

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;
Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:53
@nobytree2

Ehhmm ok danke ehh sprichst du von meiner neuen funktionierenden Lösung oder von der von der Frage?😅😅😅

nobytree2  13.07.2019, 16:56
@Nichtsnutz12

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.

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 17:03
@nobytree2

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;
  
  	}
  
Woher ich das weiß:Berufserfahrung – Programmierer

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.


nobytree2  13.07.2019, 15:53

Nicht gut: Die schließende 7 wird bei Dir mit dazugezählt! Anders die Aufgabe

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 15:58
@nobytree2

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

nobytree2  13.07.2019, 15:59
@Nichtsnutz12

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.

regex9  13.07.2019, 15:59
@nobytree2

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:
  # ...
Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:03
@regex9

Was macht Continue eigentlich das heißt ja bloß Schleife fortsetzen aber die wird doch sowieso fortgesetzt

regex9  13.07.2019, 16:05
@Nichtsnutz12

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.

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:17
@regex9

Ejjj du hattest recht mit Zettel kann man es richtig gut herausfinden ok hab mein Fehler gefunden:

https://ibb.co/W6Rn2Gb

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:

https://ibb.co/9rPqm4t

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 15:52

Ok aber was macht mein Code falsch der macht das eigentlich richtig hab auch mit Papier und Stift durchgegangen müsste passen komisch

regex9  13.07.2019, 16:04
@Nichtsnutz12

Dann schreibe hier einmal jeden Schritt für den Testcase 6 auf.

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:06
@regex9

Ok ich mach das jetzt warte ich mach auf Blatt

regex9  13.07.2019, 16:07
@Nichtsnutz12

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.

Woher ich das weiß:eigene Erfahrung – Hobby und teilweise beruflich

Nichtsnutz12 
Beitragsersteller
 13.07.2019, 16:18

Hmm danke

nobytree2  13.07.2019, 16:21
@Nichtsnutz12

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 ...