Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Esercizio su array di struct che non mi funziona... :-/

    Ciao,
    vi chiedo ancora un aiutone...Lunedi ho l'esame di laboratorio di programmazione e sono un po' nel panico...vi prego di aiutarmi se potete....

    L'esercizio è questo:

    scrivere un programma che faccia uso di un array di strutture, ogi struttura rappresenta un utente e contiene i campi: nome, cognome, età.

    Il programma deve poter inserire un utente se c'è ancora spazio libero nell'array e visualizzare la lista degli utenti....dà qualche errore in fase di compilazione. La prima parte dell'esame è su carta....mi potete dare anche un giudizio su com'è scritto il codice secondo voi?se l'organizzazioni in funzioni che ho fatto va bene o se fà pietà?insomma secondo voi con un esercizio del genere che voto mi avreste dato? hehe

    Gl errori sono:

    [root@dhcppc0 ripasso]# cc struct2.c -o struct2
    struct2.c: In function ‘set_zero’:
    struct2.c:64: error: syntax error before ‘;’ token
    struct2.c:96: error: ‘name’ undeclared (first use in this function)
    struct2.c:96: error: (Each undeclared identifier is reported only once
    struct2.c:96: error: for each function it appears in.)
    struct2.c:109: warning: ‘return’ with a value, in function returning void
    struct2.c: In function ‘read_list’:
    struct2.c:123: error: syntax error before ‘;’ token
    [root@dhcppc0 ripasso]#

    Alcuni proprio non me li spiego...perchè le variabili le HO DICHIARATE..disperazione :-/


    Il codice è:

    codice:
    #include <stdio.h>
    #include <string.h>
    
    struct utente{
    	char nome[15];
    	char cognome[15];
    	int age;
    };
    
    typedef struct utente utente;	// Crea l'alias utente del tipo di dato struct utente
    
    void set_zero(utente *);	// Riceve il puntatore ad un'array di strutture, non ritorna alcun valore
    int is_empty(utente *);		// Riceve il puntatore ad un'array di strutture e ritorna un valore intero
    int insert_user(utente *);	// Riceve il puntatore ad un'array di strutture e ritorna un valore intero
    void read_list(utente *);	// Riceve il puntatore ad un'array di strutture, non ritorna alcun valore
    
    int main(){
    	
    	int i = 0;
    	int a = 0;
    	utente vett[100];	// Dichiara un vettore di 100 strutture di tipo utente
    	
    	set_zero(vett);		// Setta a 0 la lista di utenti	
    
    	printf("\n1 per inserire un nuovo utente\n2 per visuallizzare la lista utenti\3 per terminare\n\n");
    	scanf("%d", &i);	
     
    	while(i != 3){
    		
    		if(i = 1){	// Se i uguale ad 1 prova ad inserire un utente nell'array di strutture
    			a = insert_user(vett);		// Passa il vettore alla funzione
    			if(a = -1)
    				printf("Utente non inserito, lista piena, non c'è più spazio disponibile\n\n");
    			else
    				printf("Utente inserito nella lista\n\n");
    				printf("Inserire un nuovo valore: ");
    		}
    
    		else if(i = 2){				// Leggi la lista
    			 read_list(vett);		// Passa il vettore alla funzione
    
    			 printf("Inserire un nuovo valore: ");
    		} 
    
    		else{
    			printf("Scelta errata, inserire un valore corretto: ");
    			printf("Inserire un nuovo valore: ");
    		}
    		scanf("%d", &i);
    	}
    	
    	return 0;
    }
    
    /* La funzione set_zero setta a 0 l'età degli utenti, quando un utente ha età settata a 0 significa che la 
       locazione è libera, riceve il puntatore al primo elemento della lista */
    
    void set_zero(utente *array){
    	
    	int i;
    	for(i=0; i<100; i++)
    		// Inserisci 0 nel campo age della locazione array + elemento corrente dell'array di strutture
    		(array+i)->age = 0;	
    return (void);
    }			
    
    /* La funzione is_empty riceve il puntatore al primo elemento dell'array di strutture, ritorna -1 se l'array di
       strutture è pieno o l'indice della prima locazione libera se non è ancora pieno *(
    
    int is_empty(utente *array){
    	
    	int val = -1;		// Inizialmente setta a -1 il valore di val
    	int i = 0;
    	
    	// Finchè non ha scorso tutta la lista o finchè il valore di val corrisponde a -1 scorri l'array
    	for(i=0; i<100 || val==-1; i++){
    		if((array+i).age == 0)		// Se la locazione corrente è libera
    			val = i;		// Setta val alla locazione corrente libera
    
    	return(val);		// Ritorna val: -1 se la lista è piena o prima locazione libera
    }				
    
    /* La funzione insert_user inserisce se possibile un nuovo utente nel vettore di strutture e ritorna il valore -1
       se l'array di strutture è pieno e non è riuscita ad inserire l'utente */
    
    int insert_user(utente *array){
    	
    	char name[15];
    	char surname[15];	
    	int age;
    
    	int locazione = is_empty(array);	// Metti in locazione il valore della prima locazione libera
    	
    	if(locazione != -1){		// Se può inserire un valore nell'array di strutture (la lista non è piena)
    		printf("Inserire il nome: ");
    		scanf("%c", name);
    		// Copia il nome inserito nel campo nome della struttura alla corretta locazione nell'array	
    		strcpy((array+locazione)->nome, name);  
    		printf("Inserisci il cognome: ");
    		scanf("%c", surname);
    		// Copia il cognome inserito nel campo cognome della struttura alla corretta locazione nell'array
    		strcpy((array+locazione)->cognome, surname);
    		printf("Inserire l'età: ");
    		scanf("%d", &age);
    		// Copia l'età inserita nel campo age della struttura alla corretta locazione nell'array)
    		(array+locazione)->age = age;
    	}
    	
    	return(locazione);	// Ritorna -1 se la lista è piena, altro se ha effettuato l'inserimento
    }
    
    
    void read_list(utente *array){
    
    	int i; 
    	// Leggi dall'array finchè ci sono ancora locazioni o finchè la locazione trovata non è vuota (age == 0)
    	for(i=0; i<100 || (array+i)->age != 0; i++){
    		printf("Nome utente %d: %c\n",i, (array+i)->nome);
    		printf("Cognome utente %d: %c\n",i, (array+i)->cognome);
    		printf("Età utente %d: %c\n", i, (array+i)->age);
    	}
    
    return (void);
    }
    Mille grazie
    Andrea

  2. #2
    Nelle if devi usare il doppio == (in c/c++ il doppio == è molto diverso dal = singolo).
    return (void); non ha senso, se la funzione non restituisce nulla usa semplicemente return;.
    Dove hai trovato questo codice ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    il programma l'ho scritto io...per quanto riguarda il return (void)...vabbè diciamo che è dall'esame del semestre scorso che non programmo quindi magari qualcosina ce l'ho un po' arrugginita e qualceh cavolata ce la infilo...

    per te nel complesso come programma com'è scritto?l'organizzazione in funzioni e la logica ti pare che possa andare o fà pietà? m'avrebbero "promossuto" con un compito del genere o sarei sopacciato per te? sincero..mi devo fare un'idea di come potrebbe andarmi l'esame

  4. #4
    Prova a compilare (ora dovrebbe compilare), ed esegui il programma, giudica tu stesso.
    Così ad un veloce controllo c'è ancora moolto da sistemare.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    Allora ora la lista degli errori si è abbastanza ridotta...quegli errori del %c %s che deficiente...scrivendo veloce non ho pensato...però dopo aver passato 3 giorni a scrivere funzioni operanti sulle stringhe son cose che ho chaire hehehe solo distrazione e la storia del return (void)...vabbè non toccando compilatore da 6 mesi su alcuen cose sono un po' arruginito e mi sembrava che se una funzione ritorni void andasse specificato come se riceve void (int main(void) )

    Il problema concettuale serio credo sia questo errore:
    [root@localhost ripasso]# cc struct2.c -o struct2
    /tmp/ccUPeT3s.o(.text+0x185): In function `insert_user':
    struct2.c: undefined reference to `is_empty'
    collect2: ld returned 1 exit status
    [root@localhost ripasso]#

    Credo che mi sfugga qualcosa sulla visibilità delle funzioni....ahime...cioè la funzione esiste, il prototipo è stato dichiarato all'inizio insieme agli altri prototipi e il corpo stà sotto insieme agli altri corpi di funzione....c'è qualcosa che mi sfugge...è come se la funzione insert_user() che la richiama non riuscisse a vederla...come mai?

    Questo è il codice modificato:

    codice:
    #include <stdio.h>
    #include <string.h>
    
    struct utente{
    	char nome[15];
    	char cognome[15];
    	int age;
    };
    
    typedef struct utente utente;	// Crea l'alias utente del tipo di dato struct utente
    
    void set_zero(utente *);	// Riceve il puntatore ad un'array di strutture, non ritorna alcun valore
    int is_empty(utente *);		// Riceve il puntatore ad un'array di strutture e ritorna un valore intero
    int insert_user(utente *);	// Riceve il puntatore ad un'array di strutture e ritorna un valore intero
    void read_list(utente *);	// Riceve il puntatore ad un'array di strutture, non ritorna alcun valore
    
    int main(){
    	
    	int i = 0;
    	int a = 0;
    	utente vett[100];	// Dichiara un vettore di 100 strutture di tipo utente
    	
    	set_zero(vett);		// Setta a 0 la lista di utenti	
    
    	printf("\n1 per inserire un nuovo utente\n2 per visuallizzare la lista utenti\3 per terminare\n\n");
    	scanf("%d", &i);	
     
    	while(i != 3){
    		
    		if(i = 1){	// Se i uguale ad 1 prova ad inserire un utente nell'array di strutture
    			a = insert_user(vett);		// Passa il vettore alla funzione
    			if(a = -1)
    				printf("Utente non inserito, lista piena, non c'è più spazio disponibile\n\n");
    			else
    				printf("Utente inserito nella lista\n\n");
    				printf("Inserire un nuovo valore: ");
    		}
    
    		else if(i = 2){				// Leggi la lista
    			 read_list(vett);		// Passa il vettore alla funzione
    
    			 printf("Inserire un nuovo valore: ");
    		} 
    
    		else{
    			printf("Scelta errata, inserire un valore corretto: ");
    			printf("Inserire un nuovo valore: ");
    		}
    		scanf("%d", &i);
    	}
    	
    	return 0;
    }
    
    /* La funzione set_zero setta a 0 l'età degli utenti, quando un utente ha età settata a 0 significa che la 
       locazione è libera, riceve il puntatore al primo elemento della lista */
    
    void set_zero(utente *array){
    	
    	int i;
    	for(i=0; i<100; i++)
    		// Inserisci 0 nel campo age della locazione array + elemento corrente dell'array di strutture
    		(array+i)->age = 0;	
    
    }			
    
    /* La funzione is_empty riceve il puntatore al primo elemento dell'array di strutture, ritorna -1 se l'array di
       strutture è pieno o l'indice della prima locazione libera se non è ancora pieno *(
    
    int is_empty(utente *array){
    	
    	int val = -1;		// Inizialmente setta a -1 il valore di val
    	int i = 0;
    	
    	// Finchè non ha scorso tutta la lista o finchè il valore di val corrisponde a -1 scorri l'array
    	for(i=0; i<100 || val==-1; i++){
    		if((array+i).age == 0)		// Se la locazione corrente è libera
    			val = i;		// Setta val alla locazione corrente libera
    
    	return(val);		// Ritorna val: -1 se la lista è piena o prima locazione libera
    }				
    
    /* La funzione insert_user inserisce se possibile un nuovo utente nel vettore di strutture e ritorna il valore -1
       se l'array di strutture è pieno e non è riuscita ad inserire l'utente */
    
    int insert_user(utente *array){
    	
    	char name[15];
    	char surname[15];	
    	int age;
    
    	int locazione = is_empty(array);	// Metti in locazione il valore della prima locazione libera
    	
    	if(locazione != -1){		// Se può inserire un valore nell'array di strutture (la lista non è piena)
    		printf("Inserire il nome: ");
    		scanf("%s", name);
    		// Copia il nome inserito nel campo nome della struttura alla corretta locazione nell'array	
    		strcpy((array+locazione)->nome, name);  
    		printf("Inserisci il cognome: ");
    		scanf("%s", surname);
    		// Copia il cognome inserito nel campo cognome della struttura alla corretta locazione nell'array
    		strcpy((array+locazione)->cognome, surname);
    		printf("Inserire l'età: ");
    		scanf("%d", &age);
    		// Copia l'età inserita nel campo age della struttura alla corretta locazione nell'array)
    		(array+locazione)->age = age;
    	}
    	
    	return(locazione);	// Ritorna -1 se la lista è piena, altro se ha effettuato l'inserimento
    }
    
    
    void read_list(utente *array){
    
    	int i; 
    	// Leggi dall'array finchè ci sono ancora locazioni o finchè la locazione trovata non è vuota (age == 0)
    	for(i=0; i<100 || (array+i)->age != 0; i++){
    		printf("Nome utente %d: %s\n",i, (array+i)->nome);
    		printf("Cognome utente %d: %s\n",i, (array+i)->cognome);
    		printf("Età utente %d: %d\n", i, (array+i)->age);
    	}
    
    
    }

  6. #6
    codice:
    /* La funzione is_empty riceve il puntatore al primo elemento dell'array di strutture, ritorna -1 se l'array di
       strutture è pieno o l'indice della prima locazione libera se non è ancora pieno *(
    forse è meglio che chiudi il commento con la / e non con la (

    Purtroppo bisogna imparare che il computer non sbaglia...fa solo quello che gli dici di fare

    www.netpolaris.it

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    oddio che deficiente....madonnaaaaaa non ci avrei mai pensato a leggere il commentoooo

  8. #8
    dovresti usare un editor che fa l'highlighting del codice, lo avresti visto subito quell'errore

    Purtroppo bisogna imparare che il computer non sbaglia...fa solo quello che gli dici di fare

    www.netpolaris.it

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    ehhh si il fatto è che all'uni ci fanno usare nano...insomma ho iniziato con nano da shell e ora stò continuando ad usare quello anche se mi rendo conto che non sia il massimo...

  10. #10
    codice:
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_UTENTI 2
    
    struct utente{
    	char nome[15];
    	char cognome[15];
    	int age;
    };
    
    typedef struct utente utente;	// Crea l'alias utente del tipo di dato struct utente
    
    void set_zero(utente *);	// Riceve il puntatore ad un'array di strutture, non ritorna alcun valore
    int is_empty(utente *);		// Riceve il puntatore ad un'array di strutture e ritorna un valore intero
    int insert_user(utente *);	// Riceve il puntatore ad un'array di strutture e ritorna un valore intero
    void read_list(utente *);	// Riceve il puntatore ad un'array di strutture, non ritorna alcun valore
    	utente vett[MAX_UTENTI];	// Dichiara un vettore di MAX_UTENTI strutture di tipo utente
    int main(){
    	
    	int i = 0;
    	int a = 0;
    	
    	set_zero(vett);		// Setta a 0 la lista di utenti	
    
    	printf("\n1 per inserire un nuovo utente\n2 per visuallizzare la lista utenti\n3 per terminare\n\n");
    	fflush(stdin);
    	scanf("%d", &i);	
     
    	while(i != 3){
    		
    		if(i == 1){	// Se i uguale ad 1 prova ad inserire un utente nell'array di strutture
    			a = insert_user(vett);		// Passa il vettore alla funzione
    			if(a == -1)
    				printf("Utente non inserito, lista piena, non c'è più spazio disponibile\n\n");
    			else
    				printf("Utente inserito nella lista\n\n");
    				printf("Inserire un nuovo valore: ");
    		}
    		else if(i == 2){				// Leggi la lista
    		   printf ("Leggo la lista\n\n");
    		
    			 read_list(vett);		// Passa il vettore alla funzione
    
    			 printf("Inserire un nuovo valore: ");
    		}
    		else{
    			printf("Scelta errata, inserire un valore corretto: ");
    			printf("Inserire un nuovo valore: ");
    		}
    		fflush(stdin);
    		scanf("%d", &i);
    	}
    	
    	return 0;
    }
    
    /* La funzione set_zero setta a 0 l'età degli utenti, quando un utente ha età settata a 0 significa che la 
       locazione è libera, riceve il puntatore al primo elemento della lista */
    
    void set_zero(utente *array){
    	
    	int i;
    	
    	for(i=0; i<MAX_UTENTI; i++){
    		// Inserisci 0 nel campo age della locazione array + elemento corrente dell'array di strutture
    		array[i].age = 0;
    		strcpy(array[i].cognome,"");
    	  strcpy(array[i].nome,"");
        printf ("Azzero la posizione %d",i);  
      }
      return;
    }			
    
    /* La funzione is_empty riceve il puntatore al primo elemento dell'array di strutture, ritorna -1 se l'array di
       strutture è pieno o l'indice della prima locazione libera se non è ancora pieno */
    
    int is_empty(utente *array){
    	
    	int val = -1;		// Inizialmente setta a -1 il valore di val
    	int i = 0;
    	
    	// Finchè non ha scorso tutta la lista o finchè il valore di val corrisponde a -1 scorri l'array
    	for(i=0; i<MAX_UTENTI; i++){
    		if(array[i].age == 0){		// Se la locazione corrente è libera
    			printf ("La posizione libera è %d\n\n",i);
          return i;		    // Setta val alla locazione corrente libera
        }
      }
      printf ("NON LIBERE\n\n");
    	return val;		// Ritorna val: -1 se la lista è piena o prima locazione libera
    
    }
    
    /* La funzione insert_user inserisce se possibile un nuovo utente nel vettore di strutture e ritorna il valore -1
       se l'array di strutture è pieno e non è riuscita ad inserire l'utente */
    
    int insert_user(utente *array){
    	
    	char name[15];
    	char surname[15];	
    	int age;
    
    	int locazione = is_empty(array);	// Metti in locazione il valore della prima locazione libera
    	
    	if(locazione != -1){		// Se può inserire un valore nell'array di strutture (la lista non è piena)
    		printf("Inserire il nome: ");
    		fflush(stdin);
    		scanf("%s", array[locazione].nome);
    
        printf("Inserire il cognome: ");
        fflush(stdin);
    		scanf("%s", array[locazione].cognome);
    
    		printf("Inserire l'età: ");
    		fflush(stdin);
    		scanf("%d", &array[locazione].age);
    	}
    	printf ("La locazione è %d\n\n",locazione);
    	return locazione;	// Ritorna -1 se la lista è piena, altro se ha effettuato l'inserimento
    }
    
    
    void read_list(utente *array){
    
    	int i; 
    	// Leggi dall'array finchè ci sono ancora locazioni o finchè la locazione trovata non è vuota (age == 0)
    	for(i=0; i<MAX_UTENTI && array[i].age != 0; i++){
    		printf("Nome utente %d: %s\n",i, array[i].nome);
    		printf("Cognome utente %d: %s\n",i, array[i].cognome);
    		printf("Età utente %d: %d\n\n", i, array[i].age);
    	}
    
    return;
    }
    se ti può essere utile ho fatto qualche correzione...ora dovrebbe andare.

    ora gira con una lista di max 2 utenti...basta che cambi la define in cima però per modificarlo

    Purtroppo bisogna imparare che il computer non sbaglia...fa solo quello che gli dici di fare

    www.netpolaris.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.