Salve a tutti, sto implementando una classe dipendente.. questa è la traccia:
Questa è la classe:07/01/2012
Traccia:
Scrivere un programma Java adatto a rappresentare i dipendenti di una azienda.
Implementare le seguenti funzionalità:
1) Inserimento da terminale in un array dei dati:
nome
cognome
stipendio
tipologia (direttore,impiegato, lavoratore a cottimo).
2) ordinamento dei dati secondo un criterio di ordinamento scelto a run time dall'utente tra cognome-tipologia stipendio;
3) visualizzazione dei dati in forma tabellare;
4) popolamento di array finale che contenga tutti i dati relativi ai dipendenti di due distinte filiali il cui stipendio supera i 1000 euro.
5) calcolo e visualizzazione delle seguenti statistiche aziendali;
-stipendio medio dei dipendenti per tipologia;
-spesa annua per il personale.
e questo è il tester:codice:public class Dipendente { /**Scrivere un programma Java adatto a rappresentare * i dipendenti di una azienda.*/ public Dipendente(String name, String sur, double stip, String type) { nome=name; cognome=sur; stipendio=stip; tipo=type; } public String getName() { return nome; } public void setName(String v) { nome=v; } //___________________________________ public String getSur() { return cognome; } public void setSur(String v) { cognome=v; } //___________________________________ public String getType() { return tipo; } public void setType(String v) { tipo=v; } //___________________________________ public double getStip() { return stipendio; } public void setStip(double v) { stipendio=v; } //___________________________________ //ORDINAMENTO PER COGNOME //(ISERTION SORT) public static void ordSur(Dipendente[]v) { Dipendente temp; for (int i=1;i<v.length;i++) { for(int j=i;j>0;j--) { if((v[j].cognome).compareToIgnoreCase(v[j-1].cognome)<0) { temp=v[j]; v[j]=v[j-1]; v[j-1]=temp; } } } } //__________________________________ //ORDINAMENTO PER TIPOLOGIA //(ISERTION SORT) public static void ordType(Dipendente[]v) { Dipendente temp; for (int i=1;i<v.length;i++) { for(int j=i;j>0;j--) { if((v[j].tipo).compareToIgnoreCase(v[j-1].tipo)<0) { temp=v[j]; v[j]=v[j-1]; v[j-1]=temp; } } } } //__________________________________ //ORDINAMENTO PER STIPENDIO //(ISERTION SORT) public static void ordStip(Dipendente[]v) { Dipendente temp; for (int i=1;i<v.length;i++) { for(int j=i;j>0;j--) { if((v[j].stipendio)<(v[j-1].stipendio)) { temp=v[j]; v[j]=v[j-1]; v[j-1]=temp; } } } } //_____________________________________________ //VISUALIZZAZIONE DEI DATI IN FORMA TABELLARE public static void showTab(Dipendente[]v) { for(int i=0; i<v.length;i++) { System.out.println(v[i].cognome+", "+v[i].nome+ ", "+v[i].stipendio+", "+v[i].tipo+ "\t"); } } //STAMPA NORMALE public static void stampa(Dipendente[]v) { for(int i=0; i<v.length;i++) { System.out.println(v[i].nome+", "+v[i].cognome+", " +v[i].stipendio+", "+v[i].tipo); } } //_____________________________________________ //popolamento di array finale che contenga tutti i //dati relativi ai dipendenti di due distinte filiali //il cui stipendio supera i 1000 euro. public static Dipendente[] merge1000(Dipendente[]v1,Dipendente[]v2) { //mi ricavo 2 vett ognuno ha gli //stipendi >1000 Dipendente[] j = Dipendente.conta1000(v1); Dipendente[] y = Dipendente.conta1000(v2); Dipendente[] nuovo = new Dipendente[j.length+y.length]; Dipendente.ordStip(j); Dipendente.ordStip(y); int iFirst=0; int iSecond=0; int cont=0; if(j[iFirst].stipendio<y[iSecond].stipendio) { nuovo[cont]=j[iFirst]; iFirst++; } else { nuovo[cont]=y[iSecond]; iSecond++; } cont++; //copia in a tutti i valori rimasti nel primo array System.arraycopy(j,iFirst,nuovo,cont,j.length-iFirst); //copia in a tutti i valori rimasti nel secondo array System.arraycopy(y,iSecond,nuovo,cont,y.length-iSecond); return nuovo; } //___________________________________________ private static Dipendente[] conta1000(Dipendente[]v) { int contatore=0; for(int i=0;i<v.length;i++) { if(v[i].stipendio>1000) { contatore++; } } Dipendente[] vettore = new Dipendente[contatore]; for(int i=0;i<v.length;i++) { if(v[i].stipendio>1000) { vettore[i]=v[i]; } } return vettore; } //_________________________________________________ //calcolo e visualizzazione delle seguenti //statistiche aziendali: //-stipendio medio dei dipendenti per tipologia; //-spesa annua per il personale. //-------------- //SPESA ANNUA PER IL PERSONALE: public static double SpesaAnnua(Dipendente[]array) { double somma=0; for(int i=0;i<array.length;i++) { somma = somma + array[i].stipendio; } return somma; } //-------------- //STIPENDIO MEDIO PER IMPIEGATO public static double mediaImp(Dipendente[]array) { double somma=0; int cont=0; for(int i=0;i<array.length;i++) { if((array[i].tipo).equalsIgnoreCase("impiegato")) { somma = somma+array[i].stipendio; cont++; } } double media = somma/cont; return media; } //-------------- //STIPENDIO MEDIO PER DIRETTORE public static double mediaDiret(Dipendente[]array) { double somma=0; int cont=0; for(int i=0;i<array.length;i++) { if((array[i].tipo).equalsIgnoreCase("direttore")) { somma = somma+array[i].stipendio; cont++; } } double media = somma/cont; return media; } //-------------- //STIPENDIO MEDIO PER LAVORATORE A COTTIMO public static double mediaCott(Dipendente[]array) { double somma=0; int cont=0; for(int i=0;i<array.length;i++) { if((array[i].tipo).equalsIgnoreCase("cottimo")) { somma = somma+array[i].stipendio; cont++; } } double media = somma/cont; return media; } //___________________________________________ //campi esemplare private String nome; private String cognome; private double stipendio; private String tipo; }
Sto impazzendo da parecchie ore sul punto 6 del menu, ovvero quello dell'unione in un array di tutti i dipendenti con stipendio >1000.codice:import java.util.Scanner; public class Dipendente_tester { public static void main(String[] args) { // TODO Auto-generated method stub int scelta; Scanner in = new Scanner(System.in); System.out.println("QUANTI DIPENDENTI VUOI INSERIRE " + "NELLA PRIMA FILIALE?"); int num = in.nextInt(); Dipendente[] filiale1 = new Dipendente[num]; System.out.println("QUANTI DIPENDENTI VUOI INSERIRE " + "NELLA SECONDA FILIALE?"); int num1 = in.nextInt(); Dipendente[] filiale2 = new Dipendente[num1]; Dipendente[] nuov ; do { System.out.println("Scegli tra le seguenti azioni:" +"\n1.Inserimento dei dati di due filiali" +"\n2.Ordinamento dei dati per cognome" +"\n3.Ordinamento dei dati per tipologia" +"\n4.Ordinamento dei dati per stipendio" +"\n5.Visualizzazione dei dati in forma tabellare" +"\n6.Raggruppamento dei dati di dipendenti con" +"\n stipendio superiore a 1000€" +"\n7.Stipendio medio Direttori" +"\n8.Stipendio medio Impiegati" +"\n9.Stipendio medio Lavoratori a cottimo" +"\n10.Spesa annuale per il personale" +"\n11.Terminare programma"); scelta = in.nextInt(); switch(scelta) { case 1: System.out.println("+__PRIMA FILILE__+"); for(int i=0;i<filiale1.length;i++) { System.out.println("Nome dipendente"+(i+1)+": "); String nome = in.next(); System.out.println("Cognome dipendente"+(i+1)+": "); String cognome = in.next(); System.out.println("Stipendio dipendente"+(i+1)+": "); int stipendio = in.nextInt(); System.out.println("tipologia dipendente"+(i+1)+": "); String tipo = in.next(); Dipendente dip = new Dipendente(nome,cognome,stipendio,tipo); filiale1[i]=dip; } //_________________________________ System.out.println("+__SECONDA FILILE__+"); for(int i=0;i<filiale2.length;i++) { System.out.println("Nome dipendente"+(i+1)+": "); String nome = in.next(); System.out.println("Cognome dipendente"+(i+1)+": "); String cognome = in.next(); System.out.println("Stipendio dipendente"+(i+1)+": "); int stipendio = in.nextInt(); System.out.println("tipologia dipendente"+(i+1)+": "); String tipo = in.next(); Dipendente dip = new Dipendente(nome,cognome,stipendio,tipo); filiale2[i]=dip; } break; //____________________________________ case 2: Dipendente.ordSur(filiale1); System.out.println("ORDINAMENTO PER COGNOME FIL 1"); Dipendente.stampa(filiale1); Dipendente.ordSur(filiale2); System.out.println("ORDINAMENTO PER COGNOME FIL 2"); Dipendente.stampa(filiale2); break; case 3: Dipendente.ordType(filiale1); System.out.println("ORDINAMENTO PER TIPO FIL 1"); Dipendente.stampa(filiale1); Dipendente.ordType(filiale2); System.out.println("ORDINAMENTO PER TIPO FIL 2"); Dipendente.stampa(filiale2); break; case 4: Dipendente.ordStip(filiale1); System.out.println("ORDINAMENTO PER STIPENDIO FIL 1"); Dipendente.stampa(filiale1); Dipendente.ordStip(filiale2); System.out.println("ORDINAMENTO PER STIPENDIO FIL 2"); Dipendente.stampa(filiale2); break; case 5: //visualizz in forma tabellare System.out.println("_TABELLA FILIALE 1_"); Dipendente.showTab(filiale1); System.out.println("_TABELLA FILIALE 2_"); Dipendente.showTab(filiale2); break; case 6: nuov= Dipendente.merge1000(filiale1, filiale2); Dipendente.stampa(nuov); break; case 7: System.out.println("STIPENDIO MEDIO DIRETTORI"); nuov= Dipendente.merge1000(filiale1, filiale2); System.out.println(Dipendente.mediaDiret(nuov)); break; case 8: System.out.println("STIPENDIO MEDIO IMPIEGATI"); nuov= Dipendente.merge1000(filiale1, filiale2); System.out.println(Dipendente.mediaImp(nuov)); break; case 9: System.out.println("STIPENDIO MEDIO LAV.COTT"); nuov= Dipendente.merge1000(filiale1, filiale2); System.out.println(Dipendente.mediaCott(nuov)); break; case 10: System.out.println("SPESA ANNUA DEL PERSONALE"); nuov= Dipendente.merge1000(filiale1, filiale2); System.out.println(Dipendente.SpesaAnnua(nuov)); } }while(scelta!=11); System.out.println("Programma terminato!"); } }
Questo è il messaggio che mi si presenta quando inserisco la scelta s dello switch:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Dipendente.conta1000(Dipendente.java:176)
at Dipendente.merge1000(Dipendente.java:134)
at Dipendente_tester.main(Dipendente_tester.java:111)
precisamente a queste linee:
....
Dipendente[] vettore = new Dipendente[contatore];
for(int i=0;i<v.length;i++)
{
if(v[i].stipendio>1000)
{
vettore[i]=v[i];
}
}
return vettore;
....
Qualcuno potrebbe aiutarmi a capire dov'è il problema?? Il mio cervello si sta fondendo :/

Rispondi quotando