[PROGRAMMA C] - Struct impiegati

ilyily87
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

    

#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
lorven
Una procedura per l'aggiornamento dovrebbe, più o meno, effettuare questo lavoro:
//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.
:-)

gigilatrottola2
Ci sono dei vincoli particolari sulla realizzazione del programma? ...ad es. l'utilizzo di memoria allocata dinamicamente o liste

ilyily87
@ 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
:wink: ila

lorven
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. ;-)

lorven
Il programma modificato come da richieste diventa il seguente:
#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! :D

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