Tsarkamparararam Δημοσ. 6 Απριλίου 2011 Δημοσ. 6 Απριλίου 2011 Λοιπόν έχω ένα πρόβλημα στη Java εδώ και κάτι ώρες και έχω σπάσει το κεφάλι μου να βρώ τη λύση αλλά δεν.... Λοιπόν έχω να ταξινομήσω ένα πίνακα με βάση το έτος εισαγωγής ενός φοιτητής και ενώ το πρόγραμμα τρέχει μου βγάζει πρόβλημα στη μεταγλώτιση... Λοιπόν ο κώδικας είναι ο : import java.io.*; class UserInput { //Class gia eisagogi dedomenwn apo to pliktrologio public static String getString() { //Methodos gia eisagogi String String line; InputStreamReader input=new InputStreamReader(System.in); BufferedReader in=new BufferedReader(input); try { line=in.readLine(); return line; } catch(Exception e) { return "Exception"; } } public static short getShort() { // Methodos gia eisagogi short String line; InputStreamReader input=new InputStreamReader(System.in); BufferedReader in=new BufferedReader(input); try { line=in.readLine(); short i=Short.parseShort(line); return i; } catch(Exception e){ return -1; } } } class Foititis{ private String name, surname; private short am, etos; Foititis(String n, String s, short a, short e){ name=n; surname=s; am=a; etos=e; } public String getSurname(){ return surname; } public short getAM(){ return am; } public void setEtos(short e){ etos=e; } public short getEtos(){ return etos; } } class MyUtils{ public static void bubbleSortEE(Foititis pin[]){ boolean flag=true; int temp; for(int i=1;i<pin.length;i++){ flag=true; for(int j=0;j<pin.length-i;j++){ if(pin[j].getEtos()<pin[j+1].getEtos()){ temp=pin[j].getEtos(); pin[j].setEtos(pin[j+1].getEtos()); pin[j+1].setEtos(pin[j].getEtos()); flag=false; } } if(flag) return; } } } class Lab2Ask2{ public static void main(String[] args){ Foititis pin[]=new Foititis[5]; for(int i=0;i<pin.length;i++){ System.out.println("Dwste onoma."); String name=UserInput.getString(); System.out.println("Dwste epitheto."); String surname=UserInput.getString(); System.out.println("Dwste Ar. Mitrwoy."); short am=UserInput.getShort(); System.out.println("Dwste etos eisagwgis."); short etos=UserInput.getShort(); pin=new Foititis(name, surname, am, etos); } System.out.println("Ta3inomisi toy pinaka twn foititwn me basi to etos eisagwgis."); MyUtils.bubbleSortEE(pin); for(int i=0;i<pin.length;i++){ System.out.println(pin);} } } Και ενώ το πρόγραμμα τρέχει κανονικά και μεταφράζεται κανονικά και βγάζει πρόβλημα στη μεταγλώτιση καθώς δεν έχω σωστά τα αποτελέσματα... Δηλαδή ταξινομημένα.... Ξέρει κανείς τι παίζει????? :/
santeron Δημοσ. 7 Απριλίου 2011 Δημοσ. 7 Απριλίου 2011 class MyUtils{ public static void bubbleSortEE(Foititis pin[]){ boolean flag=true; int temp; for(int i=1;i<pin.length;i++){ flag=true; for(int j=0;j<pin.length-i;j++){ if(pin[j].getEtos()<pin[j+1].getEtos()){ temp=pin[j].getEtos(); pin[j].setEtos(pin[j+1].getEtos()); pin[j+1].setEtos(pin[j].getEtos()); flag=false; } } if(flag) return; } } } >temp=pin[j].getEtos(); pin[j].setEtos(pin[j+1].getEtos()); pin[j+1].setEtos(temp); Μην ξεχνάς ότι έβαλες την αρχική τιμή του pin[j] στο temp PS. Όλο αυτό με το flag που χρειάζεται; Επίσης δεν χρειάζεται return είναι void η μέθοδός σου.
Tsarkamparararam Δημοσ. 7 Απριλίου 2011 Μέλος Δημοσ. 7 Απριλίου 2011 Aυτό με την αρχική τιμή δεν το κατάλαβα.... :/ Το flag το θέλω για να ξέρω πότε είναι ταξινομημένος ο πίνακας..... δηλαδή όταν μου επιστρέφει το flag true πάει να πέι ότι δεν μπήκε μέσα στην συνθήκη για να πάρει την τιμή false και συνεπώς δεν ισχύει η συνθήκη if, πράγμα που πάει να πεί ότι ο πίνακας είναι ταξινομημένος και δεν χρειάζεται να ξοδέψω άδικα και άλλη μνήμη για να ελέγξω τον πίνακα αν είναι ταξινομημένος ή όχι....
santeron Δημοσ. 7 Απριλίου 2011 Δημοσ. 7 Απριλίου 2011 Στην ουσία θέλεις να κάνεις αντιμετάθεση δύο τιμών με την χρήση μίας τρίτης σαν temp. Ας υποθέσουμε ότι έχουμε τις μεταβλητές n1 = 1,n2 = 2,temp. Πρέπει να κάνεις: temp = n1; //άρα το temp = 1 τώρα n1 = n2; //άρα το n1 = 2 τώρα n2 = temp; //άρα το n2 = 1 τώρα Οπότε οι τελικές τιμές είναι n1=2 και n2=1. Εσύ έχεις γράψει: temp = n1; //άρα το temp = 1 τώρα n1 = n2; //άρα το n1 = 2 τώρα n2 = n1; //το n1 έχει ήδη αλλάξει τιμή οπότε το n2 παίρνει την τιμή του που είναι 2. Οπότε οι τελικές τιμές είναι n1=2 και n2=2. Έχεις αποθηκεύσει την αρχική τιμή του n1 στο temp. Ok κατάλαβα την λογική του flag απλά γράψε if(flag) brake; που απλά θα βγει από το loop. Μπορεί να θέλεις να γράψεις κάτι άλλο μετά το loop και γενικά το return χρησιμοποιείται για να επιτρέψει κάποια τιμή. PS. Εννοώ ότι στην συγκεκριμένη περίπτωση δεν χρειάζεται και τόσο το return, υπάρχουν περιπτώσεις με if-else και λοιπά που μπορεί να χρειαστεί για έξοδο της μεθόδου σε διάφορα σημεία του κώδικα...
Tsarkamparararam Δημοσ. 8 Απριλίου 2011 Μέλος Δημοσ. 8 Απριλίου 2011 Μπορεί να γίνει και χωρίς break; , γιατί έτσι είναι κανονικά ο default αλγόριθμος... με return δηλαδή,απλά δεν νομίζω να επηρρεάζει αυτό..... Κάποια χαζομάρα με τις μεταβλητές παίζει,αλλά δεν τη βρίσκω..... Τέσπα.... τον παρατάω.... αρκετή ώρα απο τη ζωή μου έχει φάει αυτό το πρόγραμμα!!!! ^^
virxen75 Δημοσ. 8 Απριλίου 2011 Δημοσ. 8 Απριλίου 2011 στην κλάση σου Foititis πρόσθεσε την πιο κάτω μέθοδο > ..... @Override public String toString(){ return "name="+name+" surname="+surname+" am="+am+" etos="+etos; } ...... στην MyUtils αλλαξε την μέθοδο ταξινόμησης ως εξής > public static void bubbleSortEE(Foititis pin[]){ //boolean flag=true; Foititis temp; for(int i=1;i<pin.length;i++){ //flag=true; for(int j=0;j<pin.length-i;j++){ if(pin[j].getEtos()>pin[j+1].getEtos()){ temp=pin[j];//<-------στα αντικείμενα δεν αλλάζεις τις ιδιότητες μεταξύ τους //αλλά την θέση των αντικειμένων στον πίνακα που βρίσκονται pin[j]=pin[j+1]; pin[j+1]=temp; //flag=false; } } //if(flag) //return; } και είσαι έτοιμος.
Tsarkamparararam Δημοσ. 9 Απριλίου 2011 Μέλος Δημοσ. 9 Απριλίου 2011 Ναιιιιι...... Δουλεύειιιι!!!!!! Τελειαααααα.... Να σε πώ τώρα ρε φίλε.... Καταρχάς σε ευχαριστώ.... Ουσιαστικά εμείς δεν έπρεπε να ταξινομήσουμε με βάση το έτος εισαγωγής τον πίνακα,αλλά να αναδιοργανώσουμε όλα τα αντικείμενα με βάση το έτος εισαγωγής άμα κατάλαβα καλά.... Σωστά?????
virxen75 Δημοσ. 10 Απριλίου 2011 Δημοσ. 10 Απριλίου 2011 .........Ουσιαστικά εμείς δεν έπρεπε να ταξινομήσουμε με βάση το έτος εισαγωγής τον πίνακα,αλλά να αναδιοργανώσουμε όλα τα αντικείμενα με βάση το έτος εισαγωγής άμα κατάλαβα καλά.... Σωστά????? σωστά.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.