Methoden Array-Sortierverfahren funktioniert nicht

  • Themenstarter Themenstarter 43q7sdaf9t8
  • Beginndatum Beginndatum
4

43q7sdaf9t8

Gast
Hallo, liebe Community!

Wenn ich Messwerte unsortiert eingebe, diese dann sortieren und ausgeben lasse, sind alle Werte bis auf den letzten = 0.0.
Ich weiß leider nicht woran es liegt.
P.S: Ich möchte keinen fertigen Sortieralgorithmus verwenden, sonernen meinen eigenen.

Hier der Code:
Java:
package paket;

import java.io.*;

public class Projekt {
	
public static void menue() {
		
		int auswahl;
		
		System.out.println("\n_______________________________________________");
		System.out.println("Menü:");
		System.out.println("[1] Messwerte eingeben");
		System.out.println("[2] Messwert ändern");
		System.out.println("[3] Messwerte sortieren");
		System.out.println("[4] Rechenfunktionen ausführen");
		System.out.println("[5] Ergebnisse ausgeben");
		System.out.println("[0] Programm beenden");
		System.out.print("Bitte wählen Sie die gewünschte Operation aus: ");
		
		auswahl = eingabe();
			
			switch (auswahl) {
			case 1: Benutzerschnittstelle.eingabe();
					menue();
					break;
			case 2: messwertAendern(Benutzerschnittstelle.eingabeVariablen);
					menue();
					break;
			case 3: messwerteSortieren(Benutzerschnittstelle.eingabeVariablen);
					menue();
					break;
			case 4: /*minimum(Benutzerschnittstelle.eingabeVariablen);
					maximum(Benutzerschnittstelle.eingabeVariablen);
					standardabweichung(Benutzerschnittstelle.eingabeVariablen);
					median(Benutzerschnittstelle.eingabeVariablen);*/
					break;
			case 5: System.out.println("Sie haben folgende Rechenfunktion gewählt: Messwerte:\n");
					for (int i=0; i<10; i++) {
						System.out.println(sortierverfahrenAufwaerts(Benutzerschnittstelle.eingabeVariablen)[i]);
					}
					break;
			case 0:	System.out.println("Sie haben folgende Rechenfunktion gewählt: Programm beenden");
					System.exit(0);
			default:	break;
			}
		}

public static double[] messwertAendern (double[] eingabeVariablen) {
	int Messwert, wertMesswert;
	
	System.out.print("\nGeben Sie den Messwert ein, den Sie ändern möchten: ");		
	Messwert = eingabe();
	
	System.out.print("\nGeben Sie den neuen Messwert ein: ");
	wertMesswert = eingabe();
	
	eingabeVariablen[Messwert] = wertMesswert;
	return eingabeVariablen;
}

public static int eingabe () {
	
	String strInput = null;
	int rechenfunktion_int = 0;
	
	BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
	try {
		strInput = input.readLine();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	rechenfunktion_int = Integer.parseInt(strInput);
	
	return rechenfunktion_int;
	
}

public static void messwerteSortieren (double[] eingabeVariablen) {
	
	String strInput, auf = "AUF", ab = "AB";
	strInput = null;
	
	System.out.println("\n Wie möchten sie Ihre Messwerte sortieren:");
	System.out.print("AUFwärts oder ABwärts? ");
	
	BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
	try {
		strInput = input.readLine();
	} catch (IOException e) {
		e.printStackTrace();
	}
			
	if (strInput.equals(auf)) {
		sortierverfahrenAufwaerts(Benutzerschnittstelle.eingabeVariablen);
	} else if (strInput.equals(ab)) {
		sortierverfahrenAbwaerts(Benutzerschnittstelle.eingabeVariablen);
	} else {
		System.out.println("Ungültige Eingabe!");
		menue();
	}
}

public static double[] sortierverfahrenAufwaerts (double[] eingabeVariablen) {
	double dreieck = 0;
	for (int i=0; i<9; i++) {
		if (eingabeVariablen[i] > eingabeVariablen[i+1]) {
			eingabeVariablen[i+1] = dreieck;
			eingabeVariablen[i+1] = eingabeVariablen[i];
			eingabeVariablen[i] = dreieck;
		}
	}
	return eingabeVariablen;
}

public static double[] sortierverfahrenAbwaerts (double[] eingabeVariablen) {
	double dreieck = 0;
	for (int i=10; i>9; i--) {
		if (eingabeVariablen[i] > eingabeVariablen[i+1]) {
			eingabeVariablen[i+1] = dreieck;
			eingabeVariablen[i+1] = eingabeVariablen[i];
			eingabeVariablen[i] = dreieck;
		}
	}
	return eingabeVariablen;
}
	public static void main(String[] args) {
		
		menue();
			
	}
}

DANKE FÜR EURE HILFE!
 
Habe mir jetzt nur einen Teil deines Codes angeguckt:
Java:
	public static double[] sortierverfahrenAufwaerts(double[] eingabeVariablen) {
		double dreieck = 0;
		for (int i = 0; i < 9; i++) {
			if (eingabeVariablen[i] > eingabeVariablen[i + 1]) {
				eingabeVariablen[i + 1] = dreieck;
				eingabeVariablen[i + 1] = eingabeVariablen[i];
				eingabeVariablen[i] = dreieck;
			}
		}
		return eingabeVariablen;
	}

	public static double[] sortierverfahrenAbwaerts(double[] eingabeVariablen) {
		double dreieck = 0;
		for (int i = 10; i > 9; i--) {
			if (eingabeVariablen[i] > eingabeVariablen[i + 1]) {
				eingabeVariablen[i + 1] = dreieck;
				eingabeVariablen[i + 1] = eingabeVariablen[i];
				eingabeVariablen[i] = dreieck;
			}
		}
		return eingabeVariablen;
	}

Du sagst zu Beginn dreieck= 0 und änderst Dreieck nie. Anschließend sagst du in der Schleife
eingabeVariablen = dreieck; // also quasi eingabeVariablen = 0;

eingabeVariablen[i + 1] = dreieck;
eingabeVariablen[i + 1] = eingabeVariablen;

Das macht auch nicht viel Sinn (wenn es so direkt hintereinander steht).
Noch einmal den Teil überdenken 🙂
 
Ja da war noch einiges verkehrt.

Also: das einlesen und ausgeben funktioniert.

eingabe:
123.0
324.0
435.0
546.0
657.0
768.0
869.0
90.0
657.0
324.0

ausgabe:
123.0
324.0
435.0
546.0
657.0
768.0
869.0
90.0
657.0
324.0

nach dem sortieren, sieht die ausgabe allerdings wie folgt aus:
123.0
324.0
435.0
546.0
657.0
768.0
0.0
0.0
0.0
869.0

also scheint das sortieren prinzipiell zu funktionieren aber irgendwie verschwinden einige werte???

code:
Java:
package paket;

import java.io.*;

class Benutzerschnittstelle {
	public static double[] eingabeVariablen = new double [10];

	public static void ausgabe (double[] eingabeVariablen) {
		for (int i=0; i<10; i++) {
			System.out.println(eingabeVariablen[i]);
		}
	}
	
	public static double[] eingabe () {
		for (int i=0; i<10; i++) {
			String eingabeWert = javax.swing.JOptionPane.showInputDialog("Bitte geben Sie Wert " + (i+1) + " ein");
			eingabeVariablen[i] = Double.parseDouble(eingabeWert);
		}
		return eingabeVariablen;
		
	}
}

public class Projekt {
	
public static void menue() {
		
		int auswahl;
		
		System.out.println("\n_______________________________________________");
		System.out.println("Menü:");
		System.out.println("[1] Messwerte eingeben");
		System.out.println("[2] Messwert ändern");
		System.out.println("[3] Messwerte sortieren");
		System.out.println("[4] Rechenfunktionen ausführen");
		System.out.println("[5] Ergebnisse ausgeben");
		System.out.println("[0] Programm beenden");
		System.out.print("Bitte wählen Sie die gewünschte Operation aus: ");
		
		auswahl = eingabe();
			
			switch (auswahl) {
			case 1: Benutzerschnittstelle.eingabe();
					menue();
					break;
			case 2: messwertAendern(Benutzerschnittstelle.eingabeVariablen);
					menue();
					break;
			case 3: messwerteSortieren(Benutzerschnittstelle.eingabeVariablen);
					menue();
					break;
			case 4: /*minimum(Benutzerschnittstelle.eingabeVariablen);
					maximum(Benutzerschnittstelle.eingabeVariablen);
					standardabweichung(Benutzerschnittstelle.eingabeVariablen);
					median(Benutzerschnittstelle.eingabeVariablen);*/
					break;
			case 5: Benutzerschnittstelle.ausgabe(Benutzerschnittstelle.eingabeVariablen);
					menue();
					break;
			case 0:	System.out.println("Sie haben folgende Rechenfunktion gewählt: Programm beenden");
					System.exit(0);
			default:	break;
			}
		}

public static double[] messwertAendern (double[] eingabeVariablen) {
	int Messwert, wertMesswert;
	
	System.out.print("\nGeben Sie den Messwert ein, den Sie ändern möchten: ");		
	Messwert = eingabe();
	
	System.out.print("\nGeben Sie den neuen Messwert ein: ");
	wertMesswert = eingabe();
	
	eingabeVariablen[Messwert] = wertMesswert;
	return eingabeVariablen;
}

public static int eingabe () {
	
	String strInput = null;
	int rechenfunktion_int = 0;
	
	BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
	try {
		strInput = input.readLine();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	rechenfunktion_int = Integer.parseInt(strInput);
	
	return rechenfunktion_int;
	
}

public static void messwerteSortieren (double[] eingabeVariablen) {
	
	String strInput, auf = "AUF", ab = "AB";
	strInput = null;
	
	System.out.println("\n Wie möchten sie Ihre Messwerte sortieren:");
	System.out.print("AUFwärts oder ABwärts? ");
	
	BufferedReader input = new BufferedReader (new InputStreamReader(System.in));
	try {
		strInput = input.readLine();
	} catch (IOException e) {
		e.printStackTrace();
	}
			
	if (strInput.equals(auf)) {
		sortierverfahrenAufwaerts(Benutzerschnittstelle.eingabeVariablen);
	} else if (strInput.equals(ab)) {
		sortierverfahrenAbwaerts(Benutzerschnittstelle.eingabeVariablen);
	} else {
		System.out.println("Ungültige Eingabe!");
		menue();
	}
}

public static double[] sortierverfahrenAufwaerts (double[] eingabeVariablen) {
	double dreieck = 0;
	for (int i=0; i<9; i++) {
		if (eingabeVariablen[i] > eingabeVariablen[i+1]) {
			eingabeVariablen[i+1] = dreieck;
			eingabeVariablen[i+1] = eingabeVariablen[i];
			eingabeVariablen[i] = dreieck;
		}
	}
	return eingabeVariablen;
}

public static double[] sortierverfahrenAbwaerts (double[] eingabeVariablen) {
	double dreieck;
	for (int i=10; i>9; i--) {
		if (eingabeVariablen[i] > eingabeVariablen[i+1]) {
			dreieck = eingabeVariablen[i+1];
			eingabeVariablen[i+1] = eingabeVariablen[i];
			dreieck = eingabeVariablen[i];
		}
	}
	return eingabeVariablen;
}
	public static void main(String[] args) {
		
		menue();
			
	}
}
 
Java:
public static double[] sortierverfahrenAufwaerts (double[] eingabeVariablen) {
    double dreieck = 0;
    for (int i=0; i<9; i++) {
        if (eingabeVariablen[i] > eingabeVariablen[i+1]) {
            eingabeVariablen[i+1] = dreieck;
            eingabeVariablen[i+1] = eingabeVariablen[i];
            eingabeVariablen[i] = dreieck;
        }
    }
    return eingabeVariablen;
}
Wenn du das so sortieren willst, geht das nicht mit nur einem Durchlauf durch das Array, denn dadurch werden ja immer nur die 2 aufeinanderfolgenden Werte abgeglichen. Google einfach mal nach Bubblesort.
Um die Werte zu tauschen musst du das wie folgt machen:
Java:
            dreieck = eingabeVariablen[i+1];
            eingabeVariablen[i+1] = eingabeVariablen[i];
            eingabeVariablen[i] = dreieck;

Java:
[B]edit: an der Stelle sind deine Werte verschwunden! Weil du dreieck nichts zuweist und immer die 0 zurück ins Array gibst.[/B]

public static double[] sortierverfahrenAbwaerts (double[] eingabeVariablen) {
    double dreieck = 0;
    for (int i=10; i>9; i--) {
        if (eingabeVariablen[i] > eingabeVariablen[i+1]) {
            eingabeVariablen[i+1] = dreieck;
            eingabeVariablen[i+1] = eingabeVariablen[i];
            eingabeVariablen[i] = dreieck;
        }
    }
    return eingabeVariablen;
}
Beim Abwärtssortieren musst du dann auch andersrum durch die Liste gehen
Code:
eingabeVariablen[i-1]
 
Zuletzt bearbeitet:
Naja, ich schrieb ja eben woran da sliegt

Code:
eingabe:               dein pseudo sortiert:
123.0                   123.0
324.0                  324.0
435.0                  435.0
546.0                  546.0
657.0                  657.0
768.0                  768.0
869.0                  0.0
90.0                    0.0
657.0                  0.0
324.0                  869.0

das liegt eben an, weil die Werte die ganze Zeit kleiner sind !! D.h. er betritt ja schon deinen if-Block nicht
if (eingabeVariablen > eingabeVariablen[i+1]) {

123 > 324 ? nein
324 > 435 ? nein
usw.
869 > 90 ? ja also setze den Wert auf 0 (warum schrieb ich ja schon--> dreieck)

Aber generell, du solltest dir mal einige Sortieralgorithmen anschauen 🙂 Weil das wird so nicht funktionieren, du vergleichst ja immer nur die Aufeinanderfolgenden...wer sagt dass später nicht noch eine kleinere/größere kommt etc....
 
boah ich tick aus
ich glaub der tag war zu lang

ich habe es jetzt mal nach selectionsort gecodet aber es klappt immernochnicht.
glaube ich bekomm heute nichts mehr hin -.-

Java:
public static double[] sortierverfahrenAbwaerts (double[] eingabeVariablen) {
	
	for (int i=0; i<eingabeVariablen.length-1; i++) {
		for (int j=i+1; j<eingabeVariablen.length; j++) {
			if (eingabeVariablen[i] > eingabeVariablen[j]) {
				double dreieck = eingabeVariablen[i];
				eingabeVariablen[i] = eingabeVariablen[j];
				eingabeVariablen[j] = dreieck;
			}
		}
	}
	return eingabeVariablen;
}
 

Zurück
Oben