[C] Esercizio struct
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
"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
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.
- 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.
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ì
Infatti nel main avevo dei dubbi

Non avevo idea di come fare, a parte quel ciclo for messo lì
"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.
Alcune considerazioni.
Non serviva dare un nome alla struttura che poi rinominavi con typedef. Poteva essere fatto tutto in una riga.
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.
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.
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.
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 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]??
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ì!
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:
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; }
Hai testato il codice?
C'è qualcosa che non va nella chiamata della funzione aumento().
C'è qualcosa che non va nella chiamata della funzione aumento().
Si...pare funzioni. Ad esempio con quei dati mi verrebbe 300 e 1260
Prova a sostituire quel 5 con un 4 e fammi sapere se l'output risulta ancora accettabile.
In effetti stampa solo il codice e lo stipendio del primo dipendente...
Invece dovrebbe farlo anche del secondo
Invece dovrebbe farlo anche del secondo

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].
Giusto!
Ora va tutto bene. Grazie mille per la pazienza ad entrambi
Ora va tutto bene. Grazie mille per la pazienza ad entrambi
