Linguaggio C, struct e array di struct

di il
22 risposte

Linguaggio C, struct e array di struct

Definire un nuovo tipo di dato capace di rappresentare i dipendenti di una ditta: di tali dipendenti interessa il cognome, il numero degli anni di anzianità maturati e lo stipendio. Si supponga che la dimensione massima del cognome sia di 40 caratteri.
Assumere che i dati dei dipendenti della ditta siano memorizzati in un array di dimensione NUM_DIPENDENTI. Scrivere un programma in linguaggio C che realizzi le seguenti funzioni:

- int anzianita( struct dipendente dip [], char * cognome ); che, dato il cognome di un dipendente, restituisce il numero di anni di anzianità maturati;

- char * piuPagato( struct dipendente dip []); che restituisce il cognome del dipendente con stipendio massimo;

- dipendente* ottieniDipendente(struct dipendente dip [], char * cognome); che preso in input il cognome di un dipendente restituisce il puntatore al rispettivo record.


main.c
#include "definizioni.h"

int main()
{
	struct dipendente dipendenti[N_DIP]; // creazione array di tipo dipendente
	//char *cognome_da_trovare;
	//gets(cognome_da_trovare);
	
	//Inserimento dati all'interno della struttura
	strcpy(dipendenti[0].cognome, "rossi");
	dipendenti[0].anni = 3;
	dipendenti[0].stipendio = 1200;
	
	strcpy(dipendenti[1].cognome, "bianchi");
	dipendenti[1].anni = 6;
	dipendenti[1].stipendio = 1500;
	
	printf("%d\n", anzianita(dipendenti, "rossi"));
	printf("%d\n", piuPagato(dipendenti));
	struct dipendente *attuale = ottieniDipendente(dipendenti, "bianchi");
}
definizioni.h
#include <stdio.h>
#include <string.h>

#define N_DIP 1

#ifndef DIP_H
#define DIP_H

struct dipendente
{
	char cognome[40];
	int anni;
	int stipendio;
};

int anzianita( struct dipendente dip [], char * cognome );
char * piuPagato( struct dipendente dip []);
dipendente* ottieniDipendente(struct dipendente dip [], char * cognome);

#endif
funzioni.c
#include "definizioni.h"

int anzianita( struct dipendente dip[], char *cognome)
{
	int i = 0; //indice di scorrimento all'interno dell'array
	int res = -1;
	
	while(res < 0 && i < N_DIP)
	{
		if(strcmp(dip[i].cognome, cognome) == 0)
			res = dip[i].anni;
		i++;
	}
	return res;
}

char *piuPagato(struct dipendente dip [])
{
	int i;
	int massimo = 0;
	for(i = 1; i < N_DIP; i++)
	{
		if(dip[i].stipendio > dip[massimo].stipendio)
			massimo = i;
	}
	return dip[massimo].cognome;
}

dipendente* ottieniDipendente(struct dipendente dip [], char * cognome)
{
	int i = 0; //indice di scorrimento
	while(i < N_DIP)
	{
		if(strcmp(dip[i].cognome, cognome) == 0)
			return dip[i];
	}
}
In compilazione mi da i seguenti errori:

In file included from main.c:1:0:
definizioni.h:19:1: error: unknown type name ‘dipendente’
dipendente* ottieniDipendente(struct dipendente dip [], char * cognome);
^
main.c: In function ‘main’:
main.c:19:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
printf("%d\n", piuPagato(dipendenti));
^
main.c:20:31: warning: initialization from incompatible pointer type [enabled by default]
struct dipendente *attuale = ottieniDipendente(dipendenti, "bianchi");
^
In file included from funzioni.c:1:0:
definizioni.h:19:1: error: unknown type name ‘dipendente’
dipendente* ottieniDipendente(struct dipendente dip [], char * cognome);
^
funzioni.c: In function ‘piuPagato’:
funzioni.c:26:13: error: ‘minimo’ undeclared (first use in this function)
return dip[minimo].cognome;
^
funzioni.c:26:13: note: each undeclared identifier is reported only once for each function it appears in
funzioni.c: At top level:
funzioni.c:29:1: error: unknown type name ‘dipendente’
dipendente* ottieniDipendente(struct dipendente dip [], char * cognome)
^
funzioni.c: In function ‘ottieniDipendente’:
funzioni.c:35:4: error: incompatible types when returning type ‘struct dipendente’ but ‘int *’ was expected
return dip;
^
make: *** [exe] Errore 1

Perché?

22 Risposte

  • Re: Linguaggio C, struct e array di struct

    1)hai scritto dipendente* al posto di struct dipendente*

    2)%d è usato per gli int, tu tenti di stampare un char*

    3) e 4) primo punto

    5) nella funzione non hai mai dichiarato "minimo"

    6) punto 1

    7)Ritorni una struct dipendente, ma hai dichiarato la funzione come int* (ricorda che "dipendente" non esiste, punto 1)
  • Re: Linguaggio C, struct e array di struct

    Allora, vediamo. Ho risolto quasi tutto, al punto 2) ho messo %p e non mi da più il warning, va bene così?

    Il punto 7), invece, ho capito qual è il problema. Quindi, come posso ritornare l'intera struttura?

    Grazie
  • Re: Linguaggio C, struct e array di struct

    2) no, per le stringhe è %s
    Su wikipedia cerca printf() e c'è l'elenco completo

    7) scrivendo "struct studente"
  • Re: Linguaggio C, struct e array di struct

    Grazie per l'aiuto, ma ho ancora questo problema

    Funzioni.c
    struct dipendente* ottieniDipendente(struct dipendente dip [], char * cognome)
    {
    	int i = 0; //indice di scorrimento
    	while(i < N_DIP)
    	{
    		if(strcmp(dip[i].cognome, cognome) == 0)
    			return struct dipendente;
    	}
    }
    Main.c
    struct dipendente *attuale = ottieniDipendente(dipendenti, "bianchi");
    E mi da i seguenti errori:

    main.c: In function ‘main’:
    main.c:20:31: warning: initialization makes pointer from integer without a cast [enabled by default]
    struct dipendente *attuale = ottieniDipendente(dipendenti, "bianchi");
    ^
    funzioni.c: In function ‘ottieniDipendente’:
    funzioni.c:35:11: error: expected expression before ‘struct’
    return struct dipendente;
    ^
    make: *** [exe] Errore 1
  • Re: Linguaggio C, struct e array di struct

    1) non so

    2) Non devi scrivere "struct"
  • Re: Linguaggio C, struct e array di struct

    Un'ultima cosa:

    dipendente* ottieniDipendente(struct dipendente dip [], int lunghezza, char * cognome) che preso in input il cognome di un dipendente restituisce il puntatore al rispettivo record.

    Cosa vuol dire? Come faccio a ritornare il puntatore al rispettivo record?

    Riposto l'intero codice:

    main.c
    #include "definizioni.h"
    
    int main()
    {
    	dipendente dipendenti[N_DIP]; // creazione array di tipo dipendente
    
    	strcpy(dipendenti[0].cognome, "rossi");
    	dipendenti[0].anni = 3;
    	dipendenti[0].stipendio = 1200;
    	
    	strcpy(dipendenti[1].cognome, "bianchi");
    	dipendenti[1].anni = 6;
    	dipendenti[1].stipendio = 1400;
    	
    	printf("%d\n", anzianita(dipendenti, "rossi"));
    	printf("%d\n", piuPagato(dipendenti));
    	dipendente *attuale = ottieniDipendente(dipendenti, "bianchi");
    	
    	return 0;
    }
    definizioni.h
    #include <stdio.h>
    #include <string.h>
    
    #define N_DIP 2
    
    typedef struct {
    	char cognome[40];
    	int anni;
    	int stipendio;
    }dipendente;
    
    
    int anzianita( dipendente dip [], char * cognome );
    int piuPagato(dipendente dip []);
    dipendente* ottieniDipendente(dipendente dip [], char * cognome);
    
    
    funzioni.c
    #include "definizioni.h"
    
    int anzianita(dipendente dip[], char *cognome)
    {
    	int i = 0; //indice di scorrimento all'interno dell'array
    	int res = -1;
    	
    	while(res < 0 && i < N_DIP)
    	{
    		if(strcmp(dip[i].cognome, cognome) == 0)
    			res = dip[i].anni;
    		i++;
    	}
    	return res;
    }
    
    int piuPagato(dipendente dip [])
    {
    	int i;
    	int massimo = 0;
    	for(i = 0; i < N_DIP; i++)
    	{
    		if(dip[i].stipendio > dip[massimo].stipendio)
    			printf("%d", dip[i].stipendio);
    	}
    }
    
    dipendente* ottieniDipendente(dipendente dip [], char * cognome)
    {
    	int i = 0; //indice di scorrimento
    	while(i < N_DIP)
    	{
    		if(strcmp(dip[i].cognome, cognome) == 0)
    			return dip;
                    i++;
    	}
    }
    In questo modo, non mi da nessun errore in compilazione. Tuttavia, con return dip ritorno il vettore di tipo Dipendente che dovrebbe contenere i tre campi cognome, anni e stipendio. Giusto?

    Quindi, ritornando l'array, come farei a stamparlo?

    Non riesco a capire con "ritornare il record" che cosa si intenda.

    Grazie.
  • Re: Linguaggio C, struct e array di struct

    Con "ritornare il record" potrebbe significare restituire il puntatore al record, ma anche una copia del record. Decidi tu cosa sia meglio fare in base a quello che stai studiando.
  • Re: Linguaggio C, struct e array di struct

    Direi più la prima dato che l'esercizio chiede: "..restituisce il puntatore al rispettivo record":

    D'accordo, ma come posso fare? L'intestazione della funzione è:
    dipendente* ottieniDipendente(dipendente dip [], char * cognome);
    E, dall'altra parte, nel main ho messo:
    dipendente *attuale = ottieniDipendente(dipendenti, "bianchi");
    è corretto così?

    Potreste guarda il codice che è postato sopra e dirmi come restituire il puntatore al rispettivo record? Grazie
  • Re: Linguaggio C, struct e array di struct

    Restituisci l'indirizzo dell'elemento i del vettore dip trovato
  • Re: Linguaggio C, struct e array di struct

    Ho fatto così. Funziona, ma è questo quello che intendevi tu?

    main.c
    #include "definizioni.h"
    
    int main()
    {
    	dipendente dipendenti[N_DIP]; // creazione array di tipo dipendente
    	int j = 0;
    	//char *cognome_da_trovare;
    	//gets(cognome_da_trovare);
    	
    	//Inserimento dati all'interno della struttura
    	strcpy(dipendenti[0].cognome, "rossi");
    	dipendenti[0].anni = 3;
    	dipendenti[0].stipendio = 1200;
    	
    	strcpy(dipendenti[1].cognome, "bianchi");
    	dipendenti[1].anni = 6;
    	dipendenti[1].stipendio = 1400;
    	
    	printf("%d\n", anzianita(dipendenti, "rossi"));
    	printf("%d\n", piuPagato(dipendenti));
    	dipendente *attuale = ottieniDipendente(dipendenti, "bianchi", &j);
    	printf("%s %d %d", attuale[j].cognome, attuale[j].anni, attuale[j].stipendio);
    	return 0;
    }
    definizioni.h
    #include <stdio.h>
    #include <string.h>
    
    #define N_DIP 2
    
    typedef struct {
    	char cognome[40];
    	int anni;
    	int stipendio;
    }dipendente;
    
    
    int anzianita( dipendente dip [], char * cognome );
    int piuPagato(dipendente dip []);
    dipendente* ottieniDipendente(dipendente dip [], char * cognome, int *j);
    
    
    
    funzioni.c
    #include "definizioni.h"
    
    int anzianita(dipendente dip[], char *cognome)
    {
    	int i = 0; //indice di scorrimento all'interno dell'array
    	int res = -1;
    	
    	while(res < 0 && i < N_DIP)
    	{
    		if(strcmp(dip[i].cognome, cognome) == 0)
    			res = dip[i].anni;
    		i++;
    	}
    	return res;
    }
    
    int piuPagato(dipendente dip [])
    {
    	int i;
    	int massimo = 0;
    	int res;
    	for(i = 0; i < N_DIP; i++)
    	{
    		if(dip[i].stipendio > dip[massimo].stipendio)
    			res = dip[i].stipendio;
    	}
    	return res;
    }
    
    dipendente* ottieniDipendente(dipendente dip [], char * cognome, int *j)
    {
    	int i = 0; //indice di scorrimento
    	while(i < N_DIP)
    	{
    		if(strcmp(dip[i].cognome, cognome) == 0)
    		{	
    			*j = i;
    			return dip;
    		}
    		i++;
    	}
    }
  • Re: Linguaggio C, struct e array di struct

    No ... chi ti ha detto di aggiungere un altro argomento ( j ) ?

    Sai come si ottiene l'indirizzo di un elemento di un vettore?
    Devi solo restituire l'indirizzo dell'i-esimo elemento trovato con la return.
  • Re: Linguaggio C, struct e array di struct

    In questo modo dici?
    if(strcmp(dip[i].cognome, cognome) == 0)
    			return &dip[i];
    In questo modo non da errori.
    Ma nel main, la i non è visibile. Se non posso passarla alla funzione come faccio a modificarla?
  • Re: Linguaggio C, struct e array di struct

    Che vuol dire "la i non è visibile"?
  • Re: Linguaggio C, struct e array di struct

    Perché la "i" è una variabile locale, essendo dichiarata e utilizzata solo all'interno di:
    
    dipendente* ottieniDipendente(dipendente dip [], char * cognome)
    Quindi nel main non la vedo e tantomeno posso utilizzarla.
Devi accedere o registrarti per scrivere nel forum
22 risposte