Lupuz.de: Artikel-Portal / Magazin

Zurück   Postpla.net - die Forum Community > PC, Internet und Technik > Coder's Area

Fehler im Java-Programm suchen

Anzeigen:

Antwort
 
Themen-Optionen
distressed
Alt 14.01.2008, 22:23   #1
Standard Fehler im Java-Programm suchen

... und ich finde ihn nicht -.-

import java.util.Scanner;

public class B10A4 {

public static void main(String[] args) {
Scanner eingabe = new Scanner(System.in);
....int[] topTen = new int[10];
....int[] umordnen = new int[10];
....int zahl;
....do{
........System.out.print("Punktzahl eingeben: ");
........zahl = eingabe.nextInt();
........boolean inserted = false;
........for ( int i = 0; i < topTen.length; i++) {
............if (zahl <= topTen[i]) {
................umordnen[i] = topTen[i];
............}
............else {
................if ( ! inserted) {
................inserted = true;
................umordnen[i] = zahl;
................}
................if ( i+1 < topTen.length) {
................umordnen[i+1] = topTen[i];
................}
............}
........}
........topTen = umordnen;
....} while (zahl > 0);
....System.out.println("TOP TEN:");
....for ( int i = 0; i < topTen.length; i++) {
........System.out.println(i+1+". "+topTen[i]);
....}
}
}
Nunja es soll:

Bei Eingabe von
3
2
1
0
ausgeben:
1. 3
2. 2
3. 1
4. 0
5. 0
...

Es macht aber bei der gleichen Eingabe:
1. 3
2. 2
3. 2
4. 1
5. 1
6. 0
7. 0
...

Ich bin das ganze mal in einem Zeigerdiagramm durchgegangen, auf dem Blatt geht es komischerweise.
-> Anscheinend ist nur ein Befehl falsch geschrieben.

Ich finde den Fehler einfach nicht.
Kann jemand einen Tipp geben?
 
 
Nach oben
Sidolin
Alt 15.01.2008, 01:33   #2
Standard

Also, mal vorweg es ist spätabends und ich hab nicht so 100% den Sinn des Programms verstanden

Die Ausgabe passt, also muss der Fehler irgendwo vorher beim Einfügen sein. Ich tippe auf das
Code:
................if ( ! inserted) {
................inserted = true;
................umordnen[i] = zahl;
................}
................if ( i+1 < topTen.length) {
................umordnen[i+1] = topTen[i];
................}
probiers mal mit
Code:
................if ( ! inserted) {
................inserted = true;
................umordnen[i] = zahl;
................} else {
................umordnen[i] = topTen[i-1];
................}
Naja, keine Garantie drauf, wenns nicht passt schau ich mir das ganze Morgen nochmal an.
 
 
Nach oben
F@S
Alt 15.01.2008, 08:46   #3
Standard Tötet Java.

Zitat von Sidolin
probiers mal mit
Code:
................if ( ! inserted) {
................inserted = true;
................umordnen[i] = zahl;
................} else {
................umordnen[i] = topTen[i-1];
................}
Knapp. Für die geforderte Funktion bei "Eingabe von 3 2 1 0" musst du iirc _nur_ die beiden obigen ehemaligen ifs umdrehen, wenn das doch mehr können sollte wäre die genaue Aufgabenstellung sicher hilfreich.

Damit das auch mit aufsteigenden und gemischten Werten funktioniert hab ich, nachdem ich irgendwann absolut keinen Bock mehr hatte, den einen kleinen nicht-logischen Fehler da drin zu finden Folgendes produziert:

Code:
import java.util.Scanner;

public class B10A4 {

	public static void main(String[] args) {

		Scanner eingabe = new Scanner(System.in);

		int[] topTen = new int[10];
		int[] umordnen = new int[10];
		int zahl;

		do{
			System.out.print("Punktzahl eingeben: ");
			zahl = eingabe.nextInt();

			for ( int i = 0; i < 10; i++) {

				if (zahl <= topTen[i]) {

					umordnen[i] = topTen[i];

				} else {

					int wtf = umordnen[i];

					for (int amarsch = topTen.length - 1; amarsch > i; amarsch--) {

						umordnen[amarsch] = umordnen[amarsch-1];

					}

					umordnen[i] = zahl;
					umordnen[i+1] = wtf;
					break;

				}

			}

			topTen = umordnen;

		} while (zahl > 0);

		System.out.println("TOP TEN:");

		for ( int i = 0; i < 10; i++) {

			System.out.println(i+1+". "+topTen[i]);
		}

	}

}
Ob das nun überhaupt noch ein vergleichbarer Sortieralgorithmus ist, möge sich der geneigte Coder selbst überlegen.. ¬.¬

--edit--
Was auch immer ich da mit dem Vertauschungskram zusätzlich wollte.. Bei halbwegs wacher Betrachtung, einfach das in jedem Eingabe-durchlauf schon monoton absteigende Array abgrasen bis und sofern die passende Stelle gefunden wurde Eingabe einfügen, freunde der Perfektion:

Code:
import java.util.Scanner;

public class IS {

	public static void main(String[] args) {

		Scanner eingabe = new Scanner(System.in);

		int[] topTen = new int[10];
		int zahl;

		do{
			System.out.print("Punktzahl eingeben: ");
			zahl = eingabe.nextInt();

			for (int i = 0; i < topTen.length; i++) {

				if (zahl > topTen[i]) {

					for (int j = topTen.length - 1; j > i; j--) {

						topTen[j] = topTen[j-1];

					}

					topTen[i] = zahl;
					break;

				}

			}

		} while (zahl > 0);

		System.out.println("TOP TEN:");

		for (int i = 0; i < topTen.length; i++) {

			System.out.println(i+1+". "+topTen[i]);
		}

	}

}
Hat natürlich noch weniger mit dem ursprünglichen Code zu tun..

Akademische Frage: wäre das der Definition nach immer noch O(n), da ja logisch betrachtet immer höchstens 10 Durchläufe stattfinden? Lala.

Anyway, je nachdem wie weit "Fehler" da nun interpretiert werden darf usw, tötet Java.

Geändert von F@S (15.01.2008 um 17:31 Uhr).
 
 
Nach oben
distressed
Alt 15.01.2008, 14:16   #4
Standard

Tötet Java.
gerne.

Aufgabe lautet, den Fehler zu finden
Bzw gibt man der Reihe nach immer irgendeine Zahl ein - Nach der Eingabe dortiert der ja erstmal ne Weile um - und wenn man eine Zahl <= 0 eingibt, werden die 10 höchsten Zahlen ausgegeben.

Das mit 3 2 1 0 war auch ungünstig gewählt - damit meine ich eine beliebige Zahlenfolge - wie auch 56 2 5 1 8 0 <- 0 dann zum abbrechen und ausgeben.

Mit Sidolins Idee klappts schon ein wenig besser - scheint es. Er gibt die Zahlen nicht mehr doppelt aus sondern überspringt welche^^

Danke F@s, damit lässt sich doch was machen
(bzw. meinte ich damit das ist genau das, was es tun soll - Nur muss ich es noch den Wünschen des Übungsleiters anpassen)
 
 
Nach oben
distressed
Alt 22.01.2008, 22:35   #5
Standard

Nur der Vollständigkeit halber:

Der Fehler lag hier:
topTen = umordnen;
Nein, das Array topTen übernimmt nicht die Werte des anderen Arrays, sondern nur die Adresse.
Also schön Zählschleife und alle einzelnen Werte übergeben.
-.-
 
 
Nach oben
Sidolin
Alt 22.01.2008, 23:25   #6
Standard

Hmm, das ists natürlich. Und richtig blöd zu finden.

Aber es sollt doch was besseres geben als manuell zu kopieren, vielleicht ne .copy() funktion von dem Array? Stichwort deep copy. Aber dafür kann ich einfach zu wenig Java.
 
 
Nach oben
Ähnliche Themen, die dich vielleicht interessieren
Thema Autor Forum Antworten Letzter Beitrag
Java Programm Entschlüsselung mit bekanntem Schlüssel Wollito Coder's Area 15 11.02.2008 15:29
JAVA für Mozilla Firefox ??? wo und wie??? Sonic Betriebssysteme und Software 10 15.07.2005 10:53
Backup Programm! Bjoern Betriebssysteme und Software 0 06.02.2003 19:36
Anzeigen:
Antwort

Themen-Optionen



Alle Zeitangaben in WEZ +2. Es ist jetzt 03:00 Uhr.


Lupuz.de - wir können auch anders!
©1998 - 2008, Lupuz:Information-Network
Powered by vBulletin Version 3.7.1 (Deutsch), Jelsoft Enterprises Ltd.
Grüne Links?

SEO by vBSEO 3.1.0 ©2007, Crawlability, Inc.