[PROGRAMMA C] - Struct impiegati
Ciao a tutti, sono sempre io....
purtroppo il c proprio non mi risulta facile!
Sto provando a fare questo dannato esercizio da un sacco di tempo ma sono riuscita a fare solo la parte iniziale (tralaltro sotto consiglio del prof)
vi posto la traccia:
Scrivere un progrmma C per la gestione degli impiegati di un'azienda.
Degli impiegati si vogliono trattare le informazioni relative a :
- matricola aziendale
- nome
- cognome
- stipendi della mensilità dell'anno 2005
In particolare si vogliono implementar le seguenti funzioni :
1) INSERIMENTO DI UN NUOVO IMPIEGATO
2) RICERCA DI UN IMPIEGATO IN BASE AL COGNOME
3) GESTIONE DEGLI AGGIORNAMENTI DEGLI STIPENDI
vi posto quello che sono riuscita a fare
il problema, come potete capire, è nella funzione aggiornamento.
non riesco a stampare a video il vettore contenente gli stipendi! nè prima nè tantomeno dopo l'aggiornamento
spero possiate aiutarmi
grazie
ila
purtroppo il c proprio non mi risulta facile!

Sto provando a fare questo dannato esercizio da un sacco di tempo ma sono riuscita a fare solo la parte iniziale (tralaltro sotto consiglio del prof)
vi posto la traccia:
Scrivere un progrmma C per la gestione degli impiegati di un'azienda.
Degli impiegati si vogliono trattare le informazioni relative a :
- matricola aziendale
- nome
- cognome
- stipendi della mensilità dell'anno 2005
In particolare si vogliono implementar le seguenti funzioni :
1) INSERIMENTO DI UN NUOVO IMPIEGATO
2) RICERCA DI UN IMPIEGATO IN BASE AL COGNOME
3) GESTIONE DEGLI AGGIORNAMENTI DEGLI STIPENDI
vi posto quello che sono riuscita a fare
#include <stdio.h> #include <conio.h> #include <string.h> #define DIM_MAX 100 #define NUM_MESI 12 #define STR_MAX 51 typedef char stringa[STR_MAX]; typedef float vettore[NUM_MESI]; typedef struct IMPIEGATO{ int matricola; stringa nome; stringa cognome; vettore stipendi; }; typedef IMPIEGATO archivio[DIM_MAX]; //definisco un array di record int num_impiegati=0; //gestisce l'inserimento di un nuovo impiegato void inserimento(archivio a){ int n; register int i,j; printf("\nInserisci il numero di impiegati da immettere nell'archivio :"); scanf("%d",&n); while(n<=0 || n>=100){ printf("\nAttenzione!Il numero degli impiegati deve essre compreso tra 0 e 100!\nInserisci nuovamente il numero di impiegati da immettere nell'archivio :"); scanf("%d",&n); } for(i=num_impiegati;i<n;i++){ printf("\n\nInserisci il numero di matricola aziendale dell'impiegato: "); scanf("%d",&a[i].matricola); printf("\n\nInserisci il nome dell'impiegato %d:",i+1); scanf("%s",a[i].nome); printf("\nInserisci il cognome dell'impiegato %d:",i+1); scanf("%s",a[i].cognome); printf("\nInserisci lo stipendio dell'impiegato %d \n",i+1); for(j=0;j<NUM_MESI;j++){ printf("del mese %d = ",j+1); scanf("%g", &a[i].stipendi[j]); } } num_impiegati=n; return; } //RICERCA UN IMPIEGATO IN BASE AL COGNOME void ricerca(archivio a){ register int i; stringa cogn; printf("\nInserisci il cognome dell'impiegato da ricercare nell'archivio : >"); scanf("%s",cogn); bool trovato=false; for(i=0;i<num_impiegati;i++){ if(strcmp(cogn,a[i].cognome)==0){ trovato=true; printf("L'impiegato e' presente nell'archvio: "); printf("\nNOME: %s ",a[i].nome); printf("\nCOGNOME: %s",a[i].cognome); printf("\nMATRICOLA: %d",a[i].matricola); break; } if(trovato=false) printf("\nIl cognome dell'impiegato inserito non e' presente nell'archivio!"); } } //aggiorna gli stipendi degli impiegati void aggiornamento(archivio a){ stringa cogn; bool trovato; printf("\ndi quale impiegato si desidera aggiornare lo stipendio?\ninserire cognome -> "); scanf("%s",cogn); if (trovato==true) printf("L'impiegato e' presente nell'archvio "); else printf("\nIl cognome dell'impiegato inserito non e' presente nell'archivio!"); } int main(){ archivio a; inserimento(a); ricerca(a); aggiornamento(a); getch(); return(0); }
il problema, come potete capire, è nella funzione aggiornamento.
non riesco a stampare a video il vettore contenente gli stipendi! nè prima nè tantomeno dopo l'aggiornamento
spero possiate aiutarmi
grazie
ila
Risposte
Una procedura per l'aggiornamento dovrebbe, più o meno, effettuare questo lavoro:
Comunque modificherei almeno il main, visualizzando un menu che attivi, a scelta dell'utente, le varie procedure.
//aggiorna gli stipendi degli impiegati void aggiornamento(archivio a){ stringa cogn; bool trovato; int i,j; printf("\ndi quale impiegato si desidera aggiornare lo stipendio?\ninserire cognome -> "); scanf("%s",cogn); for(i=0;i<num_impiegati;i++) if(strcmp(cogn,a[i].cognome)==0){ trovato=true; printf("\nNOME: %s ",a[i].nome); printf("\nCOGNOME: %s",a[i].cognome); printf("\nMATRICOLA: %d",a[i].matricola); printf("\n============================"); printf("\nInserisci il nuovo stipendio \n"); for(j=0;j<NUM_MESI;j++){ printf("del mese %d ",j+1); printf("\nprecedente = %g ",a[i].stipendi[j]); printf("; nuovo? "); scanf("%g", &a[i].stipendi[j]); } printf("\n========================"); printf("\naggiornamento effettuato"); break; } if(trovato==false) printf("\nIl cognome dell'impiegato inserito non e' presente nell'archivio!"); }
Comunque modificherei almeno il main, visualizzando un menu che attivi, a scelta dell'utente, le varie procedure.

Ci sono dei vincoli particolari sulla realizzazione del programma? ...ad es. l'utilizzo di memoria allocata dinamicamente o liste
@ lorven:
Grazie mille!
Volevo chiederti 2 cose:
- è possibile richiamare la procedura ricerca nella funzione aggiornamento, evitando così di riscrivere parti di codice uguali a quelle nella procedura ricerca?
- idem per stampare a video il vettore contentente tutti e 12 gli stipendi aggiornati e non.
volevo se era possibile farlo richiamando qualche procedura
@gigilatrottola :
non ci sono vincoli particolari sulla realizzazione del programma.
l'esame purtroppo è quello di fondamenti di informatica, non ancora programmazione
grazie ancora
ila
Grazie mille!
Volevo chiederti 2 cose:
- è possibile richiamare la procedura ricerca nella funzione aggiornamento, evitando così di riscrivere parti di codice uguali a quelle nella procedura ricerca?
- idem per stampare a video il vettore contentente tutti e 12 gli stipendi aggiornati e non.
volevo se era possibile farlo richiamando qualche procedura
@gigilatrottola :
non ci sono vincoli particolari sulla realizzazione del programma.
l'esame purtroppo è quello di fondamenti di informatica, non ancora programmazione
grazie ancora

Non solo è possibile, ma è anche preferibile una procedura di aggiornamento che attivi la ricerca già presente;quest'ultima però dovrebbe:
- ricevere in input, come parametro, il cognome;
- ritornare la posizione del record trovato nell'array, e consentire quindi la visualizzazione e la modifica dello stesso, oppure segnalarne l'assenza.
Analogamente per la stampa.
Ribadisco l'opportunità di ristrutturare il main; inoltre, nella procedura "ricerca", si potrebbe utilizzare la ricerca binaria, anzichè quella sequenziale, previo, naturalmente, ordinamento della tabella.
Spero di aver fornito qualche utile spunto.
- ricevere in input, come parametro, il cognome;
- ritornare la posizione del record trovato nell'array, e consentire quindi la visualizzazione e la modifica dello stesso, oppure segnalarne l'assenza.
Analogamente per la stampa.
Ribadisco l'opportunità di ristrutturare il main; inoltre, nella procedura "ricerca", si potrebbe utilizzare la ricerca binaria, anzichè quella sequenziale, previo, naturalmente, ordinamento della tabella.
Spero di aver fornito qualche utile spunto.

Il programma modificato come da richieste diventa il seguente:
A questo punto, ilyily87, apporta le modifiche che ti ho indicato nel post precedente!
Ciao
p.s. sarebbe più corretto anche:
#include <stdio.h> #include <conio.h> #include <string.h> #define DIM_MAX 100 #define NUM_MESI 2 #define STR_MAX 51 typedef char stringa[STR_MAX]; typedef float vettore[NUM_MESI]; typedef struct IMPIEGATO{ int matricola; stringa nome; stringa cognome; vettore stipendi; }; typedef IMPIEGATO archivio[DIM_MAX]; //definisco un array di record int num_impiegati=0; //gestisce l'inserimento di un nuovo impiegato void inserimento(archivio a){ int n; register int i,j; printf("\nInserisci il numero di impiegati da immettere nell'archivio :"); scanf("%d",&n); while(n<=0 || n>=100){ printf("\nAttenzione!Il numero degli impiegati deve essre compreso tra 0 e 100!\nInserisci nuovamente il numero di impiegati da immettere nell'archivio :"); scanf("%d",&n); } for(i=num_impiegati;i<n;i++){ printf("\n\nInserisci il numero di matricola aziendale dell'impiegato: "); scanf("%d",&a[i].matricola); printf("\n\nInserisci il nome dell'impiegato %d:",i+1); scanf("%s",a[i].nome); printf("\nInserisci il cognome dell'impiegato %d:",i+1); scanf("%s",a[i].cognome); printf("\nInserisci lo stipendio dell'impiegato %d \n",i+1); for(j=0;j<NUM_MESI;j++){ printf("del mese %d = ",j+1); scanf("%g", &a[i].stipendi[j]); } } num_impiegati=n; return; } // VISUALIZZA I DATI DI UN IMPIEGATO void visual(archivio a,int p){ int j; printf("\nNOME: %s ",a[p].nome); printf("\nCOGNOME: %s",a[p].cognome); printf("\nMATRICOLA: %d",a[p].matricola); printf("\n==================\nSTIPENDIO ATTUALE:\n"); for(j=0;j<NUM_MESI;j++){ printf("\nmese %d ",j+1); printf("--> %g",a[p].stipendi[j]); } printf("\n======================================================="); return; } // STAMPA TUTTI I RECORD void stampa(archivio a){ int i; for(i=0;i<num_impiegati;i++) visual(a,i); getch(); return; } // Procedura ausiliaria per ricerca int ric(archivio a, stringa cognome){ register int i; int posiz; posiz=-1; for(i=0;i<num_impiegati;i++) if(strcmp(cognome,a[i].cognome)==0){ posiz=i; printf("L'impiegato e' presente nell'archvio: "); visual(a,i); break; } return posiz; } //RICERCA UN IMPIEGATO IN BASE AL COGNOME void ricerca(archivio a) { stringa cogn; int posiz; printf("\nInserisci il cognome dell'impiegato da ricercare nell'archivio : >"); scanf("%s",cogn); posiz=ric(a,cogn); if(posiz<0) printf("\nIl cognome dell'impiegato inserito non e' presente nell'archivio!"); return; } //aggiorna gli stipendi degli impiegati void aggiornamento(archivio a){ int i,j,posiz; stringa cogn; printf("\ndi quale impiegato si desidera aggiornare lo stipendio?\ninserire cognome -> "); scanf("%s",cogn); posiz=ric(a,cogn); if (posiz >= 0) { printf("\n============================"); printf("\nInserisci il nuovo stipendio \n"); for(j=0;j<NUM_MESI;j++){ printf("del mese %d ",j+1); printf("\nprecedente = %g ",a[posiz].stipendi[j]); printf("; nuovo? "); scanf("%g", &a[posiz].stipendi[j]); } printf("\n========================"); printf("\naggiornamento effettuato"); } else printf("\nIl cognome dell'impiegato inserito non e' presente nell'archivio!"); } int main(){ int posiz; stringa cogn; archivio a; inserimento(a); stampa(a); ricerca(a); aggiornamento(a); stampa(a); getch(); return(0); }
A questo punto, ilyily87, apporta le modifiche che ti ho indicato nel post precedente!
Ciao

p.s. sarebbe più corretto anche:
- - inserire i dati di un impiegato per volta, verificando l'unicità della matricola;
- gestire le omonimie nella ricerca per cognome;
- gestire l'aggiornamento fornendo la matricola, non il cognome, che non è univoco;
- ottenere l'output su video o su stampante;
- ...

[/list:u:1vrqmgqw]
Ri-ciao!
