Salve a tutti, sto implementando una classe che si chiama Libretti. La traccia è questa:
Questa è la classe:gli studenti hanno un libretto per il primo semestre e un libretto per il secondo semestre,
sui libretti vanno scritti il nome degli insegnamenti sostenuti, le date(gg/mm/aaaa) degli esami,il voto e i CFU.
Creare quindi un menù per la scelta tra:
1)Inserimento dei dati per il popolamento dei libretti da input.
2)Ordinamento (a scelta) in base al nome dell'insegnamento per ogni libretto.
3)Fusione dei due libretti in un unico libretto annuale(attraverso il metodo merge(NON MERGESORT)e stampa del libretto annuale.
Ps:Stampa dei libretti sia dopo l'acquisizione dei dati sia dopo l'ordinamento.
E questo il codice del tester:codice:public class Libretto { /** * gli studenti hanno un libretto per il primo semestre * e un libretto per il secondo semestre. * sui libretti vanno scritti il nome degli insegnamenti * sostenuti, le date(gg/mm/aaaa) degli esami,il voto * e i CFU. */ //Costruttore oggetti della classe public Libretto(String mater, String date, int mark, int CFU) { materia=mater; data=date; voto=mark; cfu=CFU; } public String getSub() { return materia; } public void setSub(String v) { materia=v; } //___________________________________ public String getData() { return data; } public void setData(String v) { data=v; } //________________________________ public int getVoto() { return voto; } public void setVoto(int v) { voto =v; } //______________________________ public int getCfu() { return cfu; } public void setCfu(int v) { cfu =v; } //________________________________ //metodo ordinamento per materia //(INSERTION SORT) public static void ordSub(Libretto[] v) { Libretto temp; for (int i=1; i<v.length;i++) { for(int j=i;j>0;j--) { if((v[j].materia).compareToIgnoreCase(v[j-1].materia)<0) { temp=v[j]; v[j]=v[j-1]; v[j-1]=temp; } } } } //___________________________________ //Metodo che stampa public static void stampa(Libretto[] array) { for(int i=0;i<array.length;i++) { System.out.println(array[i].materia+", "+array[i].data+", " +array[i].voto+", "+array[i].cfu); } } //____________________________________ //Fusione dei due libretti in un unico libretto annuale //(prima primo semestre, poi secondo semestre) public static void merge(Libretto[]v1, Libretto[]v2, Libretto[]nuovo) { nuovo = new Libretto[v1.length+v2.length]; System.arraycopy(v1, 0, nuovo, 0, v1.length); System.arraycopy(v2, 0, nuovo, v1.length, v2.length); } //campi esemplare private String materia; private String data; private int voto; private int cfu; }
Il mio problema è questo:appena lancio il programma e inserisco la scelta 1, il computer mi chiede contemporaneamente Materia 1 e data 1, con la possibilità di scrivere una sola cosa. Appena premo invio poi mi chiede voto 1 separatamente e infine cfu 1.codice:import java.util.Scanner; public class Libretto_tester { public static void main(String[] args) { // TODO Auto-generated method stub int scelta; Libretto[] lib1 = new Libretto[3]; Libretto[] lib2 = new Libretto[4]; Scanner in=new Scanner(System.in); do { //MENU PER LA SCELTA DELLE AZIONI System.out.println("Scegli tra le seguenti azioni: " +"\n[1]Inserimento dei dati per il popolamento dei libretti da input." +"\n[2]Ordinamento in base al nome dell'insegnamento per ogni libretto." +"\n[3]Fusione dei due libretti in un unico libretto annuale"); scelta = in.nextInt(); switch(scelta) { case 1: lib1 = new Libretto[3]; //___________________________ System.out.println("PRIMO LIBRETTO: "); for (int i=0;i<lib1.length;i++){ System.out.println("Inserire Materia "+(i+1)+": "); String materia = in.nextLine(); System.out.println("Inserire Data "+(i+1)+": "); String data = in.nextLine(); System.out.println("Inserire Voto "+(i+1)+": "); int voto = in.nextInt(); System.out.println("Inserire CFU "+(i+1)+": "); int cfu = in.nextInt(); //immetto nell'oggetto materia 1 i dati acquisiti Libretto sub = new Libretto(materia,data,voto,cfu); lib1[i]=sub; }//fine del for //__________________________________________ lib2 = new Libretto[4]; //___________________________ System.out.println("SECONDO LIBRETTO: "); for (int i=0;i<lib2.length;i++){ System.out.println("Inserire Materia "+(i+1)+": "); String materia = in.nextLine(); System.out.println("Inserire Data "+(i+1)+": "); String data = in.nextLine(); System.out.println("Inserire Voto "+(i+1)+": "); int voto = in.nextInt(); System.out.println("Inserire CFU "+(i+1)+": "); int cfu = in.nextInt(); //immetto nell'oggetto materia 1 i dati acquisiti Libretto sub = new Libretto(materia,data,voto,cfu); lib2[i]=sub; }//fine del for //STAMPA (PRIMA DELL'ORDINAMENTO System.out.println("__Libretto primo semestre:__ "); Libretto.stampa(lib1); System.out.println("__Libretto secondo semestre:__ "); Libretto.stampa(lib2); break; case 2: Libretto.ordSub(lib1); System.out.println("LIBRETTO PRIMO SEMESTRE ORDINATO PER MATERIA: "); Libretto.stampa(lib1); Libretto.ordSub(lib2); System.out.println("LIBRETTO SECONDO SEMESTRE ORDINATO PER MATERIA: "); Libretto.stampa(lib2); break; case 3: System.out.println("FUSIONE DEI DUE LIBRETTI: "); Libretto[] annuale = new Libretto[7]; Libretto.merge(lib1, lib2, annuale); Libretto.stampa(annuale); } }while(scelta!=4); System.out.println("Programma terminato!"); } }
Come posso risolvere?
__________________________________________________ ________
EDIT: P.s. se può essere utile, ho notato che il problema non è nella nextLine :/ Ho provato a cambiare l'ordine degli input ma a prescindere da questo, mi chiede sempre le prime due insieme. Anche voto 1 e data 1, per esempio. Io ho eseguito tutto il case, ed effettivamente l'array lo riempie, ma ovviamente lascia vuoto il campo della prima scelta, perchè giustamente non lo si riesce a riempire.
__________________________________________________ __________
EDIT2: Scusate per il doppio edit, ma nel frattempo continuavo a provare. Dovrei aver risolto. Ho usato in.next() invece di nextLine per le stringhe..e a desso sembra funzionare. Ma qualcuno mi spiega come mai? E' la prima volta che ho problemi di quest genere :/

Rispondi quotando

