Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Leute,
ich hab ein Problem, ich muss ein Programm schreiben, welches die Ducci-Folge einer Reihe von Zahlen ausgibt. Soweit klappt alles, bis auf die Tatsache, dass die Folge nicht stoppt, wenn alle Werte in einer Zeile gleich sind und ich weiß nicht wieso, könnt ihr mir bitte helfen??
Java:
public class Ducci {
public static boolean allegleich(int[] ducci) {
for(int i=0; i<ducci.length-1; i++) {
if(ducci[i] == ducci[i+1]) {
return false;
}
} return true;
}
public static void main (String[] a) {
if(a.length < 3) {
System.out.println("ERROR: Bitte geben Sie mindestens 3 Zahlen ein!");
System.exit(1);
}
int[] ducci = new int[a.length];
for (int i=0; i < a.length; i++) {
ducci[i] = Integer.parseInt(a[i]);
System.out.printf("%2d ", ducci[i]);
}
System.out.println();
while(allegleich(ducci)) {
int s = 0;
for(int zeile=0; zeile < ducci.length; zeile++) {
s++;
int firstElement = ducci[0];
int x;
for(int i=0; i < ducci.length; i++) {
if(i == ducci.length-1) {
ducci[i] = Math.abs(ducci[i] - firstElement);
}
else {
ducci[i] = Math.abs(ducci[i] - ducci[i+1]);
}
System.out.printf("%2d ", ducci[i]);
} System.out.println();
} System.out.println("Terminiert nach "+ s +" Schritten !");
}
}
}
TKlausL hat recht, du musst aber außerdem noch [c]while(! allegleich(ducci)) { [/c] schreiben.
Kiri's Antwort stimmt nicht.
Tipp: Wenn man noch einen Schritt weiter als "alle Zahlen sind gleich" rechnet, hat man die Abbruchbedingung "alle Zahlen sind null", was noch einfacher zu testen ist.
Ich würde das Programm besser gliedern, für den "Überschlag" im Array den Modulo-Operator % verwenden, zur Ausgabe des Arrays die Klasse [c]java.util.Arrays[/c] verwenden:
Java:
public class Ducci {
private static boolean allegleich(int[] ducci) {
for (int n : ducci) {
if (n != ducci[0]) {
return false;
}
}
return true;
}
private static void argumentTest(String[] a) {
if (a.length < 3) {
System.out.println("ERROR: Bitte geben Sie mindestens 3 Zahlen ein!");
System.exit(1);
}
}
private static int[] initArray(String[] a) {
int[] ducci = new int[a.length];
for (int i = 0; i < a.length; i++) {
ducci[i] = Integer.parseInt(a[i]);
}
System.out.println(java.util.Arrays.toString(ducci));
return ducci;
}
private static void step(int[] ducci) {
for (int i = 0; i < ducci.length; i++) {
ducci[i] = Math.abs(ducci[i] - ducci[(i + 1) % ducci.length]);
System.out.println(java.util.Arrays.toString(ducci));
}
}
public static void main(String[] a) {
argumentTest(a);
int[] ducci = initArray(a);
int s;
for (s = 0; ! allegleich(ducci); s++) {
step(ducci);
}
System.out.println("Terminiert nach " + s + " Schritten !");
}
}
Normalerweise würde ich statt der ganzen statischen Methoden ein Ducci-Objekt verwenden, aber ich weiß nicht, ob ihr das schon hattet.
erstmal danke für eure hilfe,
aber mein problem besteht immer noch, also die Schleife hört immer auf, wenn
[JAVA=26] for(int zeile=0; zeile < ducci.length; zeile++) { [/code]
erreicht ist
und wenn ich jetzt 3 bzw 5 zahlen eingebe wird die ducci-folge immer wieder unendlich lang ausgegeben
wieso??
@landei du magst vielleicht recht haben, aber ich bin totaler anfänger und ich muss mein programm auch erklären können und deshalb belass ich es lieber bei meiner version
das mit den zahlen hat sich erledigt, die zahlen die ich eingegeben hab terminieren einfach nie weil die abstände nie gleich werden!
aber warum stoppt es immer noch nicht wenn alle werte gleich sind?