[C] Esercizio struct

nick_10
Ciao! Ho iniziato a fare i primi esercizi sulle struct in particolare questo:
"Si vuole gestire un insieme di dipendenti di un’azienda identificati da un codice. Di ogni dipendente interessa lo stipendio e il mese e l’anno di assunzione all’interno dell’azienda. Si scriva una procedura che aumenti lo stipendio di tutti i dipendenti assunti prima del 5/2000 di una certa percentuale passata come parametro alla funzione.
Si testi la funzione scrivendo un main che legga i dati di 2 dipendenti e la percentuale dell’aumento e chiamando la funzione cambi gli stipendi dei dipendenti assunti prima del maggio del 2000. Nel main si stampi infine il codice e lo stipendio dei dipendenti che guadagnano piu’ di 1200 euro."
Io ho provato a scrivere questo ma il programma non va :(
#include <stdio.h>
struct dipendente{
    int codice;
    int mese;
    int anno;
    float stipendio;
};
typedef struct dipendente Dipendente;
void aumento(Dipendente *p,int percentuale){
    int incremento;
    incremento=(p->stipendio)*percentuale/100;
    if(((p->mese)<5) && ((p->anno)<2000)) p->stipendio=p->stipendio+incremento;
}
int main() {
    Dipendente DIP,*p;
    p=&DIP;
    int percentuale;
    int i=0;
    while(i<2) {
        scanf("%d",&(DIP.codice));
        scanf("%d",&(DIP.mese));
        scanf("%d",&(DIP.anno));
        scanf("%f",&(DIP.stipendio));
        i++;
    }
    scanf("%d",&percentuale);
    for (i=0; i<2; i++) {
        aumento(p,percentuale);
        if(DIP.stipendio>1200) printf("%d %f\n",DIP.codice,DIP.stipendio);
    }
    return 0;
}

Risposte
Super Squirrel
Alcune considerazioni:
- la condizione dell'if all'interno della funzione aumento() è sbagliata... ipotizziamo un'assunzione avvenuta nel settembre del 1998, stando al tuo codice l'aumento viene calcolato?
- nel main sei sicuro di analizzare i dati relativi a 2 diversi dipendenti?
- la variabile incremento nella funzione aumento() e il puntatore p nel main() non sono necessari.

nick_10
Giusto! La condizione dell'if la modificherò.

Infatti nel main avevo dei dubbi :(
Non avevo idea di come fare, a parte quel ciclo for messo lì

Super Squirrel
"nick_10":
Infatti nel main avevo dei dubbi :(
Non avevo idea di come fare, a parte quel ciclo for messo lì

Bastava mettere il contenuto dei due cicli in un unico ciclo.

vict85
Alcune considerazioni.

Non serviva dare un nome alla struttura che poi rinominavi con typedef. Poteva essere fatto tutto in una riga.
typedef struct
{
    int codice;
    int mese;
    int anno;
    float stipendio;
} Dipendente;

oppure potevi anche ignorare il typedef e invece scrivere struct tutte le volte.

Considerando che stipendio è un float, la tua funzione poteva essere semplificata parecchio.
void aumento(Dipendente *d, int percentuale)
{
    if (d->anno * 100 + d->mese <= 200005)
    {
        d->stipendio *= (1.0f + percentuale * 0.01);
    }
}
ma il test per la data poteva anche essere fatto in maniera meno creativa.

Per quanto riguarda il main puoi o usare un ciclo unico oppure salvarti i dati in un array. Ti suggerisco di migliorare l'interfaccia: è difficile capire che valori stai inserendo nella funzione.

nick_10
Un paio di domande.
@Super Squirrel perché il puntatore p non è necessario? Come faccio a passare i miei dati alla procedura void?

Poi per entrambi...se metto tutto in un unico ciclo leggerei anche la percentuale due volte.
Invece per l'array? Dovrei dichiarare un array del tipo Dipendente v[DIM]??

Super Squirrel
se metto tutto in un unico ciclo leggerei anche la percentuale due volte.

Se non è nel tuo intento allora mettila fuori dal ciclo la scanf() relativa alla percentuale...

@Super Squirrel perché il puntatore p non è necessario? Come faccio a passare i miei dati alla procedura void?

Dal main:
aumento(&DIP, percentuale);


Invece per l'array? Dovrei dichiarare un array del tipo Dipendente v[DIM]??

Sì!

nick_10
Alla fine ho sistemato così il main...
Prima dico una cosa che magari dovevo dir prima. Questi sono esercizi che svolgo e poi autoverifico su una piattaforma che vuole precisione sull'input e sull'output.
In questo particolare esercizio l'input ad esempio doveva essere inserito cosi:
300
9
1999
1050
301
5
2000
1200
20
Di cui i primi 8 dati sono relativi ai due dipendenti e l'ultimo è la percentuale.

Detto questo ecco il nuovo main:
int main() {
    Dipendente DIP[2];
    int percentuale;
    int i=0;
    while(i<2) {
        scanf("%d",&DIP[i].codice);
        scanf("%d",&DIP[i].mese);
        scanf("%d",&DIP[i].anno);
        scanf("%f",&DIP[i].stipendio);
        i++;
    }
    scanf("%d",&percentuale);
    for (i=0; i<2; i++) {
        aumento(DIP,percentuale);
        if(DIP[i].stipendio>1200) printf("%d %2.f\n",DIP[i].codice,DIP[i].stipendio);
    }
    return 0;
}

Super Squirrel
Hai testato il codice?
C'è qualcosa che non va nella chiamata della funzione aumento().

nick_10
Si...pare funzioni. Ad esempio con quei dati mi verrebbe 300 e 1260

Super Squirrel
Prova a sostituire quel 5 con un 4 e fammi sapere se l'output risulta ancora accettabile.

nick_10
In effetti stampa solo il codice e lo stipendio del primo dipendente...
Invece dovrebbe farlo anche del secondo :(

vict85
Esiste un legame tra array e puntatori, il tuo codice compila per questo motivo. Ma di fatto stai mandando sempre un puntatore al primo elemento. Puoi risolvere usando la notazione per puntatori [inline]array + i[/inline] oppure mandare direttamente l'indirizzo dell'elemento [inline]&array[/inline].

nick_10
Giusto!
Ora va tutto bene. Grazie mille per la pazienza ad entrambi ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.