[C] Esercizio struct

Messaggioda nick_10 » 25/11/2018, 22:14

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 :(
Codice:
#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;
}
nick_10
Average Member
Average Member
 
Messaggio: 336 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Esercizio struct

Messaggioda Super Squirrel » 26/11/2018, 01:13

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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 313 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio struct

Messaggioda nick_10 » 26/11/2018, 22:36

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ì
nick_10
Average Member
Average Member
 
Messaggio: 339 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Esercizio struct

Messaggioda Super Squirrel » 26/11/2018, 23:26

nick_10 ha scritto: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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 314 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio struct

Messaggioda vict85 » 27/11/2018, 19:19

Alcune considerazioni.

Non serviva dare un nome alla struttura che poi rinominavi con typedef. Poteva essere fatto tutto in una riga.
Codice:
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.
Codice:
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.
vict85
Moderatore
Moderatore
 
Messaggio: 9443 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] Esercizio struct

Messaggioda nick_10 » 28/11/2018, 14:00

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]??
nick_10
Average Member
Average Member
 
Messaggio: 342 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Esercizio struct

Messaggioda Super Squirrel » 28/11/2018, 14:34

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:
Codice:
aumento(&DIP, percentuale);


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

Sì!
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 315 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio struct

Messaggioda nick_10 » 29/11/2018, 10:25

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:
Codice:
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;
}
nick_10
Average Member
Average Member
 
Messaggio: 343 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Esercizio struct

Messaggioda Super Squirrel » 29/11/2018, 14:36

Hai testato il codice?
C'è qualcosa che non va nella chiamata della funzione aumento().
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 316 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Esercizio struct

Messaggioda nick_10 » 29/11/2018, 19:13

Si...pare funzioni. Ad esempio con quei dati mi verrebbe 300 e 1260
nick_10
Average Member
Average Member
 
Messaggio: 344 di 754
Iscritto il: 17/11/2016, 16:21

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite