|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
[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);
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
cosí velocemente noto che:
1) se una funzione torna void non serve "return (void)" se vuoi uscire prima dalla funzione fai return; 2) Codice:
printf("Nome utente %d: %c\n",i, (array+i)->nome);
3) Codice:
scanf("%c", name);
ma la funzione is_empty non c'é
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8896
|
dopo mangiato proverò a guardarlo ... ma sei sicuro che puoi scrivere in quel modo il typedef? mi sembra strano che puoi chiamare la stessa cosa utente utente
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
il compilatore capisce questo: typedef struct utente utente;
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
Quote:
mmm nel complesso come logica e organizzazione delle funzioni per te com'è fatto?mi avrebbe promossuto secondo te? |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8896
|
devo controllare ... non mi sembra ansi c89 ... mi sembra più c++ ... in c le struct non andavano per forza sotto typedef struct .... ??
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
esame lunedi
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
premetto di non conoscere struct,typedef e classi,
ma perche hai fatto struct utente {...}; typedef struct utente utente; se poteva fare typedef struct utente{...} utente; ? |
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
Quote:
|
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
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);
}
}
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 564
|
Allora, ci sono due errori di battitura:
nella riga 68 hai chiuso il commento con *( invece che con */ in riga 81 non hai chiuso l'if |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 564
|
sempre nella funzione is_empty hai usato il punto al posto della -> per la struttura
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 564
|
minghia quanti errori
in main negli if hai usato il simbolo di assegnazione '=' invece che di comparazione '==' adesso l'inserimento funziona, devo ancora indagare sulla visualizzazione... |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
le condizioni nel for per la visualizzazione vanno in AND
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 564
|
esatto, anche nel ciclo for nella funzione is_empty, ora funzica
|
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 38
|
Quote:
Grazie |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2005
Messaggi: 564
|
ecco qua
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);
}
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:41.




















