Domanda non riesco a svuotare l'array per inserire altri dati dentro

kiddyspace

Utente Bronze
14 Aprile 2021
50
12
7
37
Ultima modifica da un moderatore:
Salve, ho scritto e compilato il programma(che riassumerò sotto), funziona tutto tranne la parte che svuota l'array.
Esercizio:
devo definire il metodo della classe operaio per inserire le ore lavorative e il metodo per definire lo stipendio, inoltre questo metodo deve svuotare la lista per inserire altre ore il mese successivo.
Problema:
il codice funziona, mi inserisce venti giorni lavorativi e stampa tutto compreso lo stipendio, però se aggiungo dopo i primi venti giorni non mi da nè errore e non calcola il prossimo stipendio,
come posso fare per far in modo che dopo i venti inserimenti l'array si svuota e mi calcola gli inserimenti successivi?

se non sono stato chiaro ditemelo così vi allego la traccia completa

Java:
public class main {

    public static void main(String[] args) throws Exception {
        Operaio operaio1=new Operaio("ivo","avido" ,62,5,6);
        operaio1.inserisciOre(10);
        operaio1.inserisciOre(10);
        operaio1.inserisciOre(10);
        operaio1.inserisciOre(12);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(5);
        operaio1.inserisciOre(10);
        operaio1.inserisciOre(10);
       
        operaio1.inserisciOre(10);
        operaio1.inserisciOre(10);
        operaio1.inserisciOre(10);

        System.out.println(operaio1);
       

    }

}

import java.util.Arrays;

public class Operaio  extends Persona{
private double retribuzioneStandard;
private double retribuzioneStraordinari;
private int[] listaOre=new int[20];
private double counterRetribuzioneStandard=0;
private double counterRetribuzioneStraordinari=0;
private int index=0;

public Operaio(String c,String n,int e,double retribuzioneStandard, double retribuzioneStraordinari) throws Exception {
    super(c,n,e);
    if(retribuzioneStandard<retribuzioneStraordinari) {
        this.retribuzioneStandard=retribuzioneStandard;
        this.retribuzioneStraordinari=retribuzioneStraordinari;
    }else {
        throw new Exception("inserire retribuzione standard inferiore");
    }
}

public void inserisciOre(int n) {
       
    if(index<20 && n<=12) {
        listaOre[index]=n;
        index++;
        if(n<=8) {
            counterRetribuzioneStandard+=n*retribuzioneStandard;
        }else {
            counterRetribuzioneStandard+=8*retribuzioneStandard;
            counterRetribuzioneStraordinari+=(n-8)*retribuzioneStraordinari;
        }
        }
   
   
}

public double calcoloMensile() {
    this.svuotalista();
    return counterRetribuzioneStandard+counterRetribuzioneStraordinari ;
}

public void svuotalista() {
    for(int i=0;i<20;i++) {
        listaOre[i]=0;
    }
}
@Override
    public String toString() {
     String str="operaio: "+getCognome()+" "+getNome()+" "+"anni: "+getEta()+"\n";
     str+="lista ore: "+Arrays.toString(listaOre)+"\n";
    // for(int i=0;i<index;i++) {
        // str+=listaOre[i]+"\n";
    // }
     str+="\n"+"mensile: "+calcoloMensile();
     return str;
    }
}

public abstract class Persona {

    private String cognome;
    private String nome;
    private int eta;

    public Persona(String c, String n, int e) throws Exception {
        if (c.length()>1 && n.length()>1 && e>=0) {
            cognome = c;
            nome = n;
            eta = e;
        } else {
            throw new Exception("Persona non creata");
        }        
    }

    public String getCognome() {
        return cognome;
    }

    public String getNome() {
        return nome;
    }

    public int getEta() {
        return eta;
    }       
}
 
Ciao, non ti serve inizializzare tutte le variabili di classe, hanno già un valore di default. Inoltre esiste apposta il costruttore per inizializzarle.

Non ti funziona perchè nell'if in calcoloOre() non entra più quando index è >= 20.

A prima vista mi sembra sia sufficiente aggiungere un if in calcoloOre, come:
Java:
if(index >= 20) {
    svuotaLista();
    index = 0;
}

Devi metterlo all'inizio della funzione questo.
 
Ultima modifica:
scusa ma cosa intendi per calcoloOre()?, non ho un metodo chiamato così,poi ho provato ad inserirlo in entrambi i metodi ma non funziona
EDIT:
Ho risolto parzialmente , praticamente ho messo nella funzione insericiOre() quello che mi hai consigliato giocando con le parentesi e aggiungendo un else if e i
counter=0. e così funziona. Solo che l'esercizio voleva che il metodo calcoloMensile() facesse ciò, ho provato a fare lo stesso lì e non va
 
Volevo dire inserisciOre... è stato un lapsus.

Puoi anche richiamare il metodo calcoloMensile ma dovrai anche porre index a 0. Non mi è chiaro a quale variabile assegni però ciò che viene restituito da questo metodo.

Ps.
questo:
Codice:
   listaOre[index]=n;
        index++;

puoi anche scriverlo così listaOre[index++]=n;.
 
Certo, ciò che intendevo li sopra è solo che puoi utilizzare la funzione calcoloMensile(), come dicevi tu, ma dovrai comunque azzerare l'indice "index", altrimenti non potrai fare nuovi inserimenti.

Inoltre, visto che la funzione calcoloMensile() restituisce un double:
C:
public double calcoloMensile() {
    this.svuotalista();
    return counterRetribuzioneStandard+counterRetribuzioneStraordinari ;
}

dovrai assegnare il valore che viene restituito a una variabile.
 
ho risolto parzialmente in questo modo:
quando inserisco gli elementi viene calcolato man mano lo stipendio, quando inserisco il ventunesimo elemento l'array si svuota e poi inserendo altri elementi calcola tutto man mano. L'unico problema è che per svuotare l'array devo inserire il ventunesimo elemento e quindi questo non so se va bene.

Codice:
public void inserisciOre(int n) throws Exception {
    if(index<20 && n<=12) {
        listaOre[index]=n;
        index++;
         if(n<=8) {
            counterRetribuzioneStandard+=n*retribuzioneStandard;
        }else {
            counterRetribuzioneStandard+=8*retribuzioneStandard;
            counterRetribuzioneStraordinari+=(n-8)*retribuzioneStraordinari;
        }
        }else{
            calcoloMensile();
               counterRetribuzioneStandard=0;
            counterRetribuzioneStraordinari=0;
        }
            
        
}

public double calcoloMensile() {
    svuotalista();
    return counterRetribuzioneStandard+counterRetribuzioneStraordinari;
}

public void svuotalista() {
 index=0;
 listaOre=new int[20];
}
 
Forse è anche corretto, ma non stai facendo un gran utilizzo dell'array listaOre. Potresti anche toglierlo che tanto non cambia niente. Ti consiglio fare una cosa di questo tipo:
Java:
public class Operaio  extends Persona {
    private int giornoDelMese;              // equivalente al tuo vecchio index
    private int[] listaOre = new int[20];
    private double retribuzioneStandard, retribuzioneStraordinari;
    private double stipendioUltimoMese;

    // ...

    public void inserisciOre(int n) throws Exception {
        if (n > 12) {
            throw new Exception("non puoi fare piu di 12 ore");
        }

        listaOre[giornoDelMese] = n;
        giornoDelMese++;

        if (giornoDelMese >= 20) {
            setStipendioUltimoMese();
            svuotaListaOre();
            giornoDelMese = 0;
        }
    }

    private void setStipendioUltimoMese() {  // nota: private, non public
        stipendioUltimoMese = 0;
        for (int giorno = 0; giorno < 20; giorno++) {
            // se listaOre[giorno] <= 8 incrementa stipendioUltimoMese di ... altrimenti ...
        }
    }

    public void getStipendioUltimoMese() {
        return stipendioUltimoMese = 0;
    }

    private void svuotaListaOre() {    // equivalente al tuo svuotalista (nota: private)
        for(int i = 0; i < 20; i++) {
            listaOre[i] = 0;
        }
    }

    // ...
}
 
  • Mi piace
Reazioni: DispatchCode