antenne Geschrieben 29. September 2015 Geschrieben 29. September 2015 (bearbeitet) Hallo an alle.Kurz zu mir. Ich bin 27 Jahre alt und musste nach einer Berufskrankheit den Job wechseln. Deshalb mache ich jetzt eine Umschulung zum FISI. Dadurch das es eine Umschulung ist, steige ich ins 2. Lehrjahr ein. Und habe ziemliche Probleme beim Java Unterricht. Das liegt nicht unbedingt daran, dass ich es nicht verstehe, sondern eher das der Lehrer wohl selbst nicht viel Ahnung von Java hat und daher jedes mal nur Übungen am Beamer zeigt und die Schüler es lösen sollen. Jegliche Fragen werden mit einem "hmmmm" und anschließendem langsamen entfernen von meinem Platz beantwortet... Daher versuche ich in Eigenregie Java zu lernen. Eine Gute Übung erschien mir Zahlen zu sortieren. Bei 3 Zahlen hat es mich schon gut eine Stunde gekostet und nur mit viel Hilfe durch Google hat es geklappt. Bei 4 Zahlen geht allerdings gar nichts mehr. Ich habe dann etwas geschaut und bin immer wieder auf den Algorithmus "Bubblesort" gestoßen. Ich werde allerdings überhaupt nicht schlau daraus....leider. Mit vorgegebenen Zahlen macht er dank copy und paste was er soll. Wie krieg ich es aber hin, dass er von Hand eingegebene Zahlen sortiert? Hier erstmal mein erster kläglicher entwurf ( Habe nur etwas abgeändert,der Rest ist kopiert) import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class BubbleSort { private static int[] xs; public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); { boolean unsortiert=true; int temp; while (unsortiert){ unsortiert = false; xs = null; for (int i=0; i < xs.length-1; i++) if (xs > xs[i+1]) { temp = xs; xs = xs[i+1]; xs[i+1] = temp; unsortiert = true; } } } { int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3); sortiere(zahl1,zahl2,zahl3); }} private static void sortiere(int zahl1, int zahl2, int zahl3) { // TODO Auto-generated method stub }} Die Javabegapten unter euch werden sich jetzt wahrscheinlich fragen wie man nur so ein Käse schreiben kann, ich bitte daher um etwas Verständnis Achja ich schreibe das ganze Java Zeug mit Eclipse weil wir das auch in der Schule haben. Und Eclipse gibt keine Fehler aus. Bearbeitet 29. September 2015 von antenne Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 29. September 2015 Geschrieben 29. September 2015 Mit vorgegebenen Zahlen macht er dank copy und paste was er soll.Zeig die Variante doch mal. Die sollte sich vom gezeigten Code ja nur durch die Eingabe unterscheiden, aber offenbar hast du da noch etwas anderes verändert. Zitieren
antenne Geschrieben 29. September 2015 Autor Geschrieben 29. September 2015 (bearbeitet) public class BubbleSort { public static void sortiere(int[] x) { boolean unsortiert=true; int temp; while (unsortiert){ unsortiert = false; for (int i=0; i < x.length-1; i++) if (x > x[i+1]) { temp = x; x = x[i+1]; x[i+1] = temp; unsortiert = true; } } } public static void main(String[] args) { int[] liste = {0,9,4,6,2,8,5,1,7,3}; sortiere(liste); for (int i=0; i<liste.length; i++) System.out.print(liste+" "); } }Der Originalquellcode. Habe nur rote X'e geändert, je nachdem was Eclipse vorgeschlagen hat. War aber bestimmt totaler murks. Mich wundert ja , dass keine Fehler angezeigt werden aber beim Ausführen dann dieser Fehler kommt:Exception in thread "main" java.lang.NullPointerException at BubbleSort.main(BubbleSort.java:23)(nicht beim orignialen Code sondern bei meinem Abgeänderten) Bearbeitet 29. September 2015 von antenne Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 29. September 2015 Geschrieben 29. September 2015 Zuerst eine Erkenntnis: Vorgegebene Zahlen sortiert man genau gleich wie vom Benutzer eingegebene. Klingt trivial, ist aber wichtig.Das bedeutet nämlich, dass du die Methode sortiere nicht ändern musst, nur die Methode main, wo die Zahlen herkommen. Dort wird das Array liste direkt im Code befüllt. Diesen Teil des Codes musst du durch eine Benutzereingabe ersetzen, sonst nichts.Habe nur rote X'e geändert, je nachdem was Eclipse vorgeschlagen hat.Diese Vorgehensweise bringt leider gar nichts. Der Compiler ist zufrieden, wenn er das Programm übersetzen kann. Er kann nicht erkennen, ob das Programm das Richtige tut. Zitieren
antenne Geschrieben 29. September 2015 Autor Geschrieben 29. September 2015 Diesen Teil des Codes musst du durch eine Benutzereingabe ersetzen, sonst nichts. Und wie? habe ja an so etwas gedacht: int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3);Aber natürlich kann er mit zahl1-3 und eingabe 1-3 nix anfganen weil es ja nirgends deklariert wurde. Aber wie soll es gehen das ich nur einen kleinen Teil abändere? Zitieren
Hexagon Geschrieben 29. September 2015 Geschrieben 29. September 2015 Moin,kleine GedankenHilfe: ArrayDeque. Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 29. September 2015 Geschrieben 29. September 2015 Aber natürlich kann er mit zahl1-3 und eingabe 1-3 nix anfganen weil es ja nirgends deklariert wurde. zahl1 bis zahl3 hast du deklariert.Und Code für eingabe1 bis eingabe3 hast du in deinem ersten Beitrag schon gezeigt: InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); Zitieren
antenne Geschrieben 29. September 2015 Autor Geschrieben 29. September 2015 meine idee war jetzt dieseimport java.io.BufferedReader;import java.io.InputStreamReader;public class BubbleSort { public static void sortiere(int[] x) { boolean unsortiert=true; int temp; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3); while (unsortiert){ unsortiert = false; for (int i=0; i < x.length-1; i++) if (x > x[i+1]) { temp = x; x = x[i+1]; x[i+1] = temp; unsortiert = true; } } } public static void main(String[] args) { int[] liste = {eingabe1,eingabe2,eingabe3}; sortiere(liste); for (int i=0; i<liste.length; i++) System.out.print(liste+" "); }} aber wie erwartet funktioniert das auch nicht Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 29. September 2015 Geschrieben 29. September 2015 Wie bereits gesagt: Lass die Finger von der Methode sortiere, die ist gut, so wie sie ist. Ändere main. Dort fängt das Programm an. Hexagon reagierte darauf 1 Zitieren
antenne Geschrieben 29. September 2015 Autor Geschrieben 29. September 2015 Wie bereits gesagt: Lass die Finger von der Methode sortiere, die ist gut, so wie sie ist. Ändere main. Dort fängt das Programm an.Und wie gesagt, keine Ahnung wie. Ich dachte dieses "public static void main" ist immer so. was soll ich da ändern? Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 29. September 2015 Geschrieben 29. September 2015 Das hier ist die Stelle in main, wo das Array mit den Zahlen für die Sortierung erzeugt wird:int[] liste = {0,9,4,6,2,8,5,1,7,3};Du musst das Array mit den Benutzereingaben füllen, also gehört der Code zum Einlesen davor.Und dann erstellst du das Array liste nicht aus diesen vorgegebenen Zahlen, sondern aus den Zahlen, die der Benutzer eingegeben hat. Zitieren
antenne Geschrieben 29. September 2015 Autor Geschrieben 29. September 2015 Das hier ist die Stelle in main, wo das Array mit den Zahlen für die Sortierung erzeugt wird:int[] liste = {0,9,4,6,2,8,5,1,7,3};Du musst das Array mit den Benutzereingaben füllen, also gehört der Code zum Einlesen davor.Und dann erstellst du das Array liste nicht aus diesen vorgegebenen Zahlen, sondern aus den Zahlen, die der Benutzer eingegeben hat.Sry wenn ich nerve. Bin wirklich froh, dass du mir versuchst zu helfen. Nur leider versteh ich es einfach nicht. Könntest du einen Lösungsansatz posten? Ich will natürlich so viel wie möglich selbst rausfinden aber egal was ich probiere es klappt nicht. ich hab es mit int [] liste = br.readLine{zahl1,zahl2,zahl3} probiert und ich habe br.readLine mit Integer.parseInt(eingabe1,eingabe2,eingabe3) getauscht. hat auch nix gebracht. Bin ich überhaupt nah dran oder total vorbei an der Lösung Zitieren
arlegermi Geschrieben 29. September 2015 Geschrieben 29. September 2015 (bearbeitet) Was du z.B. machen könntest, ist, die Zahlen mit Komma getrennt einzugeben und daraus das Array zu erzeugen. Dazu kannst du dir mal http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) und http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String-int- angucken. Bearbeitet 29. September 2015 von arlegermi Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 29. September 2015 Geschrieben 29. September 2015 ich hab es mit int [] liste = br.readLine{zahl1,zahl2,zahl3} probiert und ich habe br.readLine mit Integer.parseInt(eingabe1,eingabe2,eingabe3) getauscht. hat auch nix gebracht. Bin ich überhaupt nah dran oder total vorbei an der LösungDu bist nah dran, aber du versuchst zu viel in eine Zeile zu packen. Alles, was du brauchst, hattest du schon einmal in deinem Code.Zerlege dein Problem in Teilprobleme (das ist sowieso immer eine gute Idee). Aus dem Problem "Liste mit vom Benutzer eingegeben Zahlen erzeugen" wird dann:Strings vom Benutzer einlesen (das ist der Teil mit dem InputStreamReader)Eingelesene Strings in Zahlen umwandeln (das ist der Teil mit parseInt)Aus den Zahlen ein Array konstruieren (so wie in der Zeile mit den vordefinierten Zahlen)Diese drei Teile musst du einzeln umsetzen. Nacheinander. Nicht irgendwie in eine Zeile verwurschtelt.Es gibt dafür sicher auch einen eleganten Einzeiler, aber du musst zuerst die Grundlagen verstehen. Zitieren
antenne Geschrieben 30. September 2015 Autor Geschrieben 30. September 2015 Strings vom Benutzer einlesen (das ist der Teil mit dem InputStreamReader)InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); sieht bei mir so aus Eingelesene Strings in Zahlen umwandeln (das ist der Teil mit parseInt) int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3); hab ich das Aus den Zahlen ein Array konstruieren (so wie in der Zeile mit den vordefinierten Zahlen)hab ich verschiedenste sachen probiert. hat alles nix geholfen. entweder steht da, dass die variable nicht vorhanden ist, oder es geht irgendwas anderes nicht. Keine Ahnunh. Die links hab ich mir angeschaut, aber das ist noch komplizierter geschrieben als irgendwelche java tutorials. Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 30. September 2015 Geschrieben 30. September 2015 hab ich verschiedenste sachen probiert. hat alles nix geholfen. entweder steht da, dass die variable nicht vorhanden ist, oder es geht irgendwas anderes nicht. Wie gesagt: Fast alles steht schon da.Die ursprüngliche Zeile lautet int[] liste = {0,9,4,6,2,8,5,1,7,3};Wir wollen aber keine Liste mit 0, 9, 4 usw., sondern mit unseren ints. Ersetze also hier die festen Zahlen durch deine int-Variablen. Zitieren
antenne Geschrieben 30. September 2015 Autor Geschrieben 30. September 2015 Wie gesagt: Fast alles steht schon da.Die ursprüngliche Zeile lautet int[] liste = {0,9,4,6,2,8,5,1,7,3};Wir wollen aber keine Liste mit 0, 9, 4 usw., sondern mit unseren ints. Ersetze also hier die festen Zahlen durch deine int-Variablen.hab ich einmal so probiert:int[] liste = {zahl1,zahl2,zahl3};daraufhin erscheint diese Fehlermeldung:Exception in thread "main" java.lang.Error: Unresolved compilation problems: zahl1 cannot be resolved to a variable zahl2 cannot be resolved to a variable zahl3 cannot be resolved to a variable at BubbleSort.main(BubbleSort.java:35)dann habe ich die variablen nocheinmal gesetzt:int zahl1;int zahl2;int zahl3;daraufhin dann diese Meldung:Exception in thread "main" java.lang.Error: Unresolved compilation problems: The local variable zahl1 may not have been initialized The local variable zahl2 may not have been initialized The local variable zahl3 may not have been initialized at BubbleSort.main(BubbleSort.java:37) auch das hinzufügen des Befehls: Integer.parseInt(eingabe1) will er nicht haben Zitieren
arlegermi Geschrieben 30. September 2015 Geschrieben 30. September 2015 (bearbeitet) Du musst die Zahlen in main einlesen und auch da deklarieren. Nur, weil du in sortiere irgendwelche Variablen deklarierst, kennt die nicht automatisch das ganze Programm. Also irgendwie so: public static void main(String[] args){ int zahl1 = 0; int zahl2 = 0; int zahl3 = 0; // hier die Zahlen einlesen, wie du es schon in 'sortiere' machst // anschließend die Zahlen an 'sortiere' übergeben } Du solltest dich ganz dringend mit den Grundlagen von Java beschäftigen. Beispielsweise muss dir klar sein, was eine Methode und was eine Klasse ist. Und wieso eine Variable, die du in 'MethodeA' deklarierst, nicht auch in 'MethodeB' verfügbar ist. Bearbeitet 30. September 2015 von arlegermi Zitieren
antenne Geschrieben 30. September 2015 Autor Geschrieben 30. September 2015 Du musst die Zahlen in main einlesen und auch da deklarieren. Nur, weil du in sortiere irgendwelche Variablen deklarierst, kennt die nicht automatisch das ganze Programm.public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3); int[] liste = {zahl1,zahl2,zahl3}; so? er startet jetzt eine Abfrage von 3 Zahlen. danach kommt foglender Fehler:Exception in thread "main" java.lang.Error: Unresolved compilation problems: The operator > is undefined for the argument type(s) int[], int Type mismatch: cannot convert from int[] to int Type mismatch: cannot convert from int to int[] at BubbleSort.sortiere(BubbleSort.java:25) at BubbleSort.main(BubbleSort.java:48) wird wohl von folgendem verursacht: while (unsortiert){ unsortiert = false; for (int i=0; i < x.length-1; i++) if (x > x[i+1]) { temp = x; x = x[i+1]; x[i+1] = temp; unsortiert = true; Zitieren
arlegermi Geschrieben 30. September 2015 Geschrieben 30. September 2015 if(x > x[i + 1]) Du hast hier einen Fehler drin. Auf der einen Seite behandelst du 'x' wie eine Zahl, auf der anderen wie ein Array ('x[i + 1]'). Denk einmal darüber nach, was du da stehen haben willst. Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 30. September 2015 Geschrieben 30. September 2015 Ja, da ist ein Fehler. Mich wundert, dass die Variante, aus der dieser Code stammen soll, angeblich funktioniert.Falsch abgeschrieben? Zitieren
antenne Geschrieben 30. September 2015 Autor Geschrieben 30. September 2015 ohne meine von hand eingegebenen Zahlen funktioniert es ohne Probleme. Es sind zwar 3 kleine rote X' davor aber es geht trotzdem. Zitieren
schlumpfen Geschrieben 30. September 2015 Geschrieben 30. September 2015 Hallo,ich würde gerne mal den ganzen Quellcode am Stück sehen. Die Vorredner haben schon gesagt wo der Fehler liegt. Von daher kann ich mir nicht vorstellen das es an etwas anderem liegt.Grußschlumpfen Zitieren
antenne Geschrieben 30. September 2015 Autor Geschrieben 30. September 2015 Hallo,ich würde gerne mal den ganzen Quellcode am Stück sehen. Die Vorredner haben schon gesagt wo der Fehler liegt. Von daher kann ich mir nicht vorstellen das es an etwas anderem liegt.Grußschlumpfenhier mein verhunzter quellcodeimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class BubbleSort { public static void sortiere(int[] x) { boolean unsortiert=true; int temp; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3); while (unsortiert){ unsortiert = false; for (int i=0; i < x.length-1; i++) if (x > x[i+1]) { temp = x; x = x[i+1]; x[i+1] = temp; unsortiert = true; } } } public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("Erste Zahl: "); String eingabe1 = br.readLine(); System.out.print("Zweite Zahl: "); String eingabe2 = br.readLine(); System.out.print("Dritte Zahl: "); String eingabe3 = br.readLine(); int zahl1 = Integer.parseInt(eingabe1); int zahl2 = Integer.parseInt(eingabe2); int zahl3 = Integer.parseInt(eingabe3); int[] liste = {zahl1,zahl2,zahl3}; sortiere(liste); for (int i=0; i<liste.length; i++) System.out.print(liste+" "); }} Zitieren
schlumpfen Geschrieben 30. September 2015 Geschrieben 30. September 2015 Hi,und wie sieht der Code aus der kompiliert wird?Ich bekomme bei diesem Code den schon angesprochenen Fehler. s. Anlage.Grußschlumpfen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.