Tsarkamparararam Δημοσ. 10 Απριλίου 2011 Δημοσ. 10 Απριλίου 2011 Έχω να κάνω ένα πρόγραμμα στη Java στο οποίο πρέπει και καλά να φτιάξω το λογισμικό ενός ραδιοφωνικού σταθμού σχετικά με το Τοπ10 του σταθμού.... Βασικά θα ποστάρω απο κάτω την εκφώνηση μαζί με τον κώδικα μου και θα καταλάβεται.... Παρόλο που μεταφράζεται κανονικά στην μεταγλώτιση μου βγάζει το εξής μήνυμα : "Exception in thread "main" java.lang.NullPointerException at MyUtils.seq_search(TestSong.java:154) at menu.gemisma(TestSong.java:102) at menu.gemisma(TestSong.java:92) at TestSong.main(TestSong.java:53) " όταν κάνω αναζήτηση με βάση τον καλιτέχνη ή τη θέση του τραγουδιού.... Υποθέτω ότι κάτι παίζει με την αρχικοποίηση του πίνακα.... Δηλαδή κάνω κάποια λάθος δλήλωση... Μπορεί να είναι και χαζό λαθάκι,αλλά δεν μου έρχεται έμπνευση τώρα κι άμα κάποιος μπορεί/έχει όρεξη (εξαιτίας του μεγέθους του κώδικα!) ας το δεί λίγο! ΕΚΦΩΝΗΣΗ : Να δημιουργήσετε το λογισμικό ενός ραδιοφωνικού σταθμού για το Top Ten της εβδομάδας. ∆ημιουργείστε σε Java μία κλάση με όνομα Song με τα παρακάτω attributes: • Αύξων Αριθμός • Τίτλος • Καλλιτέχνης • Τύπος Τραγουδιού (Jazz, Rock, Hip hop , κτλ) • Θέση στη δεκάδα ∆ημιουργείστε την κλάση “MyUtils” στην οποία ορίστε τις παρακάτω μεθόδους: ♦ seq_search: Σειριακή μέθοδο αναζήτησης (υπερφορτωμένη για ακεραίους και String) ♦ bin_search: ∆υαδική μέθοδο αναζήτησης (υπερφορτωμένη για ακεραίους και String) Στο κυρίως πρόγραμμα αρχικά δημιουργείται ένας πίνακας “TopTen” με 10 θέσεις (προσοχή χωρίς τη δημιουργία αντίστοιχων αντικειμένων) και μετά εμφανίζεται η παρακάτω λίστα επιλογών (menu): Αρχικό Μενού 1.Προσθήκη τραγουδιού 2.Εμφάνιση Στοιχείων Τραγουδιού 3.Λίστα Top-Ten 4.Έξοδος ∆ώστε Επιλογή (1-4) : Όταν ο χρήστης επιλέγει την πρώτη επιλογή (Προσθήκη Τραγουδιού) δίνεται η δυνατότητα εισαγωγής ενός τραγουδιού στην πρώτη δεκάδα του σταθμού. Πριν την εμφάνιση της κατάλληλης προτροπής για εισαγωγή στοιχείων απαιτείται ο έλεγχος ύπαρξης κενής θέσης στη δεκάδα (Το Top-Ten δε μπορεί να περιλαμβάνει το ενδέκατο δημοφιλέστερο τραγούδι, διότι οι θέσεις έχουν ήδη συμπληρωθεί). Αν δεν υπάρχει κενή θέση, να εμφανίζεται το κατάλληλο μήνυμα και να γίνεται επιστροφή στο Κεντρικό Μενού. Επίσης, επιστροφή στο Κεντρικό Μενού γίνεται μετά την επιτυχή εισαγωγή των στοιχείων ή όταν ο χρήστης πληκτρολογήσει 'esc' κατά τη διάρκεια εισαγωγής στοιχείων. Ο Αύξων Αριθμός μετράει ανά πάσα στιγμή το πόσα τραγούδια έχουν προστεθεί στη λίστα του Top-Ten. Στην επιλογή 2 (Εμφάνιση Στοιχείων Τραγουδιού) δίνεται η δυνατότητα εμφάνισης των στοιχείων ενός συγκεκριμένου τραγουδιού. Η αναζήτηση γίνεται με βάση τον Καλλιτέχνη ή τη θέση στη δεκάδα (ανάλογα με τα ορίσματα της μεθόδου που θα κληθεί- Υπερφόρτωση). Η αναζήτηση με βάση τη θέση στη δεκάδα υλοποιείται με τη ∆υαδική Αναζήτηση (τα στοιχεία θα πρέπει να εισάγονται από το χρήστη ταξινομημένα από το top δημοφιλέστερο τραγούδι μέχρι το 10ο). Η αναζήτηση με βάση τον Καλλιτέχνη γίνεται με Σειριακή Αναζήτηση. Σε περίπτωση που δεν υπάρχει κανένα καταχωρημένο τραγούδι, ή το στοιχείο που αναζητάμε δεν έχει βρεθεί, τότε να εμφανίζεται το κατάλληλο μήνυμα και να γίνεται επιστροφή στο Κεντρικό Μενού. Η επόμενη επιλογή (Λίστα Θέσεων Top-Ten) τυπώνει στην οθόνη τους τίτλους των τραγουδιών και τη σειρά δημοτικότητας τους ανά σειρά δημοτικότητας. ∆ίπλα στον κάθε αριθμό θέσης εμφανίζεται ο τίτλος του τραγουδιού ή η λέξη ‘Κενό-Παρακαλώ συμπληρώστε' αν η θέση δεν είναι κατειλημμένη. Η Επιλογή 4 (Τέλος) οδηγεί στον τερματισμό του προγράμματος. Επίσης, μετά την ολοκλήρωση οποιασδήποτε επιλογής, εμφανίζεται το Αρχικό Μενού (εκτός φυσικά από την επιλογή 4). Κώδικας : > 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 int getInteger() { //Methodos gia eisagogi Integer String line; InputStreamReader input=new InputStreamReader(System.in); BufferedReader in=new BufferedReader(input); try { line=in.readLine(); int i=Integer.parseInt(line); return i; } catch(Exception e) { return -1; } } } class Song //Δομητής { String titlos; String kalitexnis; String eidos_tragoudiou; int position; Song (String title,String name,String eidos,int pos) { titlos=title; kalitexnis=name; eidos_tragoudiou=eidos; position=pos; } } class TestSong { public static void main(String args[]) { Song TopTen[] = new Song[10]; int i=1; menu.gemisma(i,TopTen); } } class menu { static void gemisma(int i,Song TopTen[]) { String esc="esc"; System.out.println(" Αρχικό Μενού "); System.out.println("1.Προσθήκη τραγουδιού"); System.out.println("2.Εμφάνιση Στοιχείων Τραγουδιού"); System.out.println("3.Λίστα Top-Ten"); System.out.println("4.Έξοδος"); System.out.println("∆ώστε Επιλογή (1-4) : "); int epilogi_xristi = UserInput.getInteger(); if (i<11 && epilogi_xristi==1) //Επιλογή πρώτη { System.out.println("Dwse to tragoudi : "); String titlos = UserInput.getString(); if (titlos.equals("esc")) { menu.gemisma(i,TopTen); } System.out.println("Dwse ton kalitexni tou tragoudiou :"); String kalitexnis = UserInput.getString(); if (kalitexnis.equals("esc")) { menu.gemisma(i,TopTen); } System.out.println("Dwse to idos tou tragoudiou :"); String eidos_tragoudiou = UserInput.getString(); if (eidos_tragoudiou.equals("esc")) { menu.gemisma(i,TopTen); } System.out.println("Dwse th thesh tou tragoudiou sti dekada :"); int position = UserInput.getInteger(); TopTen[i] = new Song(titlos,kalitexnis,eidos_tragoudiou,position); menu.gemisma(i+1,TopTen); } else if (epilogi_xristi==2) //Επιλογή δεύτερη { System.out.println("Ama 8eleis h anazhthsh na ginei me vash ton Kalitexni pata 1,ama 8es na ginei me vash th 8esh sth dekada pata 2 !!"); int epil = UserInput.getInteger(); if (epil==1) //Σειριακή αναζήτηση με βάση τον καλλιτέχνη { System.out.println("Dwse to onoma tou kalitexni pou psaxneis"); String key1 = UserInput.getString(); int ret_key1 = MyUtils.seq_search(key1,TopTen); if ( ret_key1!=-1 ) { System.out.println("O kalitexnis pou edwses den htan mesa sto TopTen!!!"); menu.gemisma(i,TopTen); } else { System.out.println("O kalitexnis pou edwses einai mesa sto TopTen sth thesi :" + TopTen[ret_key1].position); } } else if (epil==2) //Διαδική αναζήτηση με βάση τη θέση στη δεκάδα { System.out.println("Dwse th thsi sth dekada sthn opoia thes na deis to tragoudi pou uparxei ekei!! "); int key2 = UserInput.getInteger(); int ret_key2 = MyUtils.bin_search(key2,TopTen); if (ret_key2!=-1) { System.out.println("Sth thesi pou zitises vrisketai to tragoudi : " + TopTen[ret_key2].titlos); } else { System.out.println("Den edwses kapoia thesi apo ton arithmo 1 mexri to 10"); } } else { System.out.println("Edwses lathos epilogh!!"); menu.gemisma(i,TopTen); } } else if (epilogi_xristi==3) // Επιλογή τρίτη { for (int k=1; k<11; k++) { System.out.println(" ΘΕΣΗ : " + k + " TΙΤΛΟΣ : " + TopTen[k].titlos); } } else if (epilogi_xristi==4) //Επιλογή τέταρτη { System.out.println("Telos programmatos!!"); return; } } } class MyUtils { public static int seq_search(String key1,Song TopTen[]) { int z=-1; for (int i=1; i<11; i++) if (TopTen[i].kalitexnis.equals(key1)) { z=i; } return z; } public static int bin_search(int key2,Song TopTen[]) { int left =1; int right = TopTen.length; return MyUtils.search(key2,TopTen,left,right); } public static int search(int key2,Song TopTen[],int left,int right) { int thesi=-1; int index = (left+right)/2; if (TopTen[index].position > key2) { return MyUtils.search(key2,TopTen,index++,right); } else if (TopTen[index].position < key2) { return MyUtils.search(key2,TopTen,left,index++); } else { thesi = index; } return thesi; } }
Tsarkamparararam Δημοσ. 10 Απριλίου 2011 Μέλος Δημοσ. 10 Απριλίου 2011 Ναι,ξέρω.... Απλά άμα δώσεις την επιλογή 3 δεν θέλουμε να μας εμφανίζει το Τοπ10 αρχίζοντας απο το 0 και να πηγαίνει στο 9,αλλά να αρχίζει από το 1 και να πηγαίνει στο 10 το έκανα έτσι.... Και απο το 0 που το είχα κάνει πιό πριν πάλι το ίδιο λάθος έβγαζε!!!! :/
virxen75 Δημοσ. 10 Απριλίου 2011 Δημοσ. 10 Απριλίου 2011 κοίτα τις αλλαγές που έκανα και φτιάξε το υπόλοιπο > 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 int getInteger() { //Methodos gia eisagogi Integer String line; InputStreamReader input=new InputStreamReader(System.in); BufferedReader in=new BufferedReader(input); try { line=in.readLine(); int i=Integer.parseInt(line); return i; } catch(Exception e) { return -1; } } } class Song //Δομητής { String titlos; String kalitexnis; String eidos_tragoudiou; int position; Song (String title,String name,String eidos,int pos) { titlos=title; kalitexnis=name; eidos_tragoudiou=eidos; position=pos; } } class TestSong{ public static void main(String args[]){ Song TopTen[] = new Song[10]; menu.gemisma(0,TopTen); } } class menu{ static void gemisma(int i,Song TopTen[]){ String esc="esc"; System.out.println(" Αρχικό Μενού "); System.out.println("1.Προσθήκη τραγουδιού"); System.out.println("2.Εμφάνιση Στοιχείων Τραγουδιού"); System.out.println("3.Λίστα Top-Ten"); System.out.println("4.Έξοδος"); System.out.println("∆ώστε Επιλογή (1-4) : "); int epilogi_xristi = UserInput.getInteger(); if (i<10 && epilogi_xristi==1){ //Επιλογή πρώτη System.out.println("Dwse to tragoudi : "); String titlos = UserInput.getString(); if (titlos.equals("esc")) { menu.gemisma(i,TopTen); } System.out.println("Dwse ton kalitexni tou tragoudiou :"); String kalitexnis = UserInput.getString(); if (kalitexnis.equals("esc")) { menu.gemisma(i,TopTen); } System.out.println("Dwse to idos tou tragoudiou :"); String eidos_tragoudiou = UserInput.getString(); if (eidos_tragoudiou.equals("esc")) { menu.gemisma(i,TopTen); } System.out.println("Dwse th thesh tou tragoudiou sti dekada :"); int position = UserInput.getInteger(); TopTen[i] = new Song(titlos,kalitexnis,eidos_tragoudiou,position); menu.gemisma(i+1,TopTen); } else if (epilogi_xristi==2){ //Επιλογή δεύτερη if (i<1) System.out.println("Η λιστα είναι άδεια!"); else{ System.out.println("Ama 8eleis h anazhthsh na ginei me vash ton Kalitexni pata 1,ama 8es na ginei me vash th 8esh sth dekada pata 2 !!"); int epil = UserInput.getInteger(); if (epil==1){ //Σειριακή αναζήτηση με βάση τον καλλιτέχνη System.out.println("Dwse to onoma tou kalitexni pou psaxneis"); String key1 = UserInput.getString(); int ret_key1 = MyUtils.seq_search(key1,TopTen,i); if ( ret_key1!=-1 ){ System.out.println("O kalitexnis pou edwses den htan mesa sto TopTen!!!"); menu.gemisma(i,TopTen); }else{ System.out.println("O kalitexnis pou edwses einai mesa sto TopTen sth thesi :" + TopTen[ret_key1].position); } }else if (epil==2){ //Διαδική αναζήτηση με βάση τη θέση στη δεκάδα System.out.println("Dwse th thsi sth dekada sthn opoia thes na deis to tragoudi pou uparxei ekei!! "); int key2 = UserInput.getInteger(); int ret_key2 = MyUtils.bin_search(key2,TopTen,i); if (ret_key2!=-1){ System.out.println("Sth thesi pou zitises vrisketai to tragoudi : " + TopTen[ret_key2].titlos); }else{ System.out.println("Den edwses kapoia thesi apo ton arithmo 1 mexri to 10"); } }else { System.out.println("Edwses lathos epilogh!!"); menu.gemisma(i,TopTen); } }}else if (epilogi_xristi==3){ // Επιλογή τρίτη for (int k=0; k<i; k++){ System.out.println(" ΘΕΣΗ : " + k + " TΙΤΛΟΣ : " + TopTen[k].titlos); } } else if (epilogi_xristi==4) //Επιλογή τέταρτη { System.out.println("Telos programmatos!!"); return; } menu.gemisma(i,TopTen); }} class MyUtils { public static int seq_search(String key1,Song TopTen[],int ii) { int z=-1; if (ii<1) return z; for (int i=0; i<ii; i++) if (TopTen[i].kalitexnis.equals(key1)) { z=i; } return z; } public static int bin_search(int key2,Song TopTen[],int i){ if (i<1) return -1; int left =0; int right = i-1; return MyUtils.search(key2,TopTen,left,right); } public static int search(int key2,Song TopTen[],int left,int right) { int thesi=-1; int index = (left+right)/2; if (TopTen[index].position > key2) { return MyUtils.search(key2,TopTen,index++,right); } else if (TopTen[index].position < key2) { return MyUtils.search(key2,TopTen,left,index++); } else { thesi = index; } return thesi; } }
Tsarkamparararam Δημοσ. 10 Απριλίου 2011 Μέλος Δημοσ. 10 Απριλίου 2011 Καταρχάς σ'ευχαριστώ που ασχολήθηκες και ωφείλω να σε ενημερώσω πως το πρόγραμμα δουλεύει!!! Θέλεις να μου εξηγήσεις και τι ακριβώς είχα λάθος???
virxen75 Δημοσ. 11 Απριλίου 2011 Δημοσ. 11 Απριλίου 2011 1) πίνακες αρχίζουν από την θέση 0 2) -το Song j[]=new Song[10] π.χ. δημιουργεί ένα πίνακα 10 θέσεων δεν αρχικοποιεί όμως τα περιέχόμενα των θέσεων αυτών -για να ξεφύγεις από αυτό έχεις το i που το περνάς σαν παράμετρο και δηλώνει πόσες θέσεις είναι αρχικοποιημένες(έχουν τραγούδια) -αν i<1 λίστα άδεια -αντι TopTen.length χρησιμοποιείς το i
Tsarkamparararam Δημοσ. 13 Απριλίου 2011 Μέλος Δημοσ. 13 Απριλίου 2011 Εντάξει φίλε μου το κατάλαβα..... Και πάλι σ'ευχαριστώ!!!!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.