PDA

Visualizza la versione completa : [c] strutture


processore
15-06-2009, 14:21
devo fare questo esercizio:

Definire le strutture necessarie a ospitare le informazioni relative all'anagrafica di
studenti e insegnanti. È sufficiente una rappresentazione semplificata delle
informazioni che effettivamente si vorrebbe potere memorizzare.
Riutilizzare per quanto possibile membri comuni. Per esempio l’indirizzo, che
potrebbe essere composto dei membri via_corso_piazza, numero_civico,
cap, citta, nazione è comune sia agli studenti sia agli insegnanti.
Definire inoltre la struttura necessaria a descrivere i libri (titolo, autore/i, editore,
ISBN, argomento, anno di pubblicazione, indirizzo web, etc.).
Definire una struttura corso, contenente uno o più insegnanti, un numero variabile
di studenti, e uno o più libri di testo.
ATTENZIONE! È necessario definire tutti gli oggetti complessi. Per esempio
l'indirizzo, membro delle strutture studenti e insegnanti, è a sua volta una struttura.

Scrivere le funzioni per l'immissione delle informazioni relative a tutte le strutture (e
relativi membri) menzionate nell'esercizio precedente, e per la visualizzazione.
Sperimentare il passaggio delle strutture sia per valore sia per riferimento.


ho provato a fare cosi ma mi da errore




#include<stdio.h>
#include<string.h>


struct data_nascita{
int giorno;
char mese[10];
int anno;
};

struct indirizzo{
char via[300];
int numero;
int CAP;
char nazione[30];
char citta[30];
char provincia[2];
};

struct studenti{
char nome[20];
char cognome [20];
struct data_nascita d_t;
struct indirizzo ind;
int matricola;
};

struct insegnanti{
char nome[20];
char cognome [20];
struct data_nascita d_t;
struct indirizzo ind;
};

struct libri{
char titolo[30];
char autore[30];
char editore[30];
char ISBN[30];
int anno_publicazione;
};

struct corso{
struct studenti std;
struct insegnanti ins;
struct libri lib;
};

int ins (int);
void vis (struct corso *);
void vis_cor(void);

struct corso b[10];
int ind =0;
main(){


printf("1. inserisci\n 2.visualizza\n ");
int scelta;
scanf("%d",&scelta);
switch (scelta){
case 1: ind = ins(ind);
break;
case 2: vis_cor();
break;
}


}


int ins(int a){
if(a>10){
printf("non ce piu spazio");
}
printf("inserisci");
printf("studenti");
gets(b[a].std);
printf("insegnanti");
gets(b[a].ins);
printf("libri");
gets(b[a].lib);
a++;
return(a);
}

void vis(struct corso *p){
printf("studente %s", p->std);
printf("insegnante %s",p->ins) ;
printf("libro %s", p->lib);
}

void vis_cor(void){
int i;
struct corso *ps = &b[0];
for(i=0; i<ind;i++){
vis(ps++);
}
}

oregon
15-06-2009, 14:26
Se scrivi

"ho provato a fare cosi ma mi da errore"

senza dire nulla dell'errore e dove si manifesta, non ti risponderà molta gente ..

ignaziodeblasi
15-06-2009, 14:40
Guarda bene questa funzione:

void vis(struct corso *p)
{
printf("studente %s", p->std);
printf("insegnante %s",p->ins) ;
printf("libro %s", p->lib);
}

Stai cerando di fare stampare a video una struttura e non una stringa..
Questo e' un errore.
Se provi per esempio a fare printf("Nome studente: %s",(p->std).nome) l'errore scompare.

ignaziodeblasi
15-06-2009, 14:52
Poi nelle varie chiamate alla gets, per esempio gets(b[a].std), passi come argomento una struttura, mentre la funzione gets accetta una stringa,infatti e' definita cosi..char *gets(char *s).
Prova a correggere queste cose da solo,se non riesci chiedi. :ciauz:

processore
15-06-2009, 15:06
l'errore come ha detto ignaziodeblasi lo da sulla gets.
come dice il testo io dovrei fare una funzione che mi inserisca i dati nei campi delle strutture.
quindi dovrei fare una gets per ogni campo di ogni struttura .
tipo cosi :


gets(b[a].nome);
gets(b[a].cognome);
gets(b[a].indirizzo);

e cosi per tutte le altre strutture ?
facendo cosi li salva nell'array b di corso ?

oregon
15-06-2009, 15:13
Con la gets devi utilizzare le stringhe non dei valori numerici.

Studia la documentazione della gets

http://www.cplusplus.com/reference/clibrary/cstdio/gets/

ignaziodeblasi
15-06-2009, 15:22
Altrimenti prova ad usare la scanf().. :ciauz:

processore
15-06-2009, 15:23
si e vero scusa avevo sbagliato.
gli interi li posso scrivere con la scanf;

oregon
15-06-2009, 15:24
Sicuramente non puoi con la gets ...

Apporta le correzioni e fai attenzione alla sintassi della scanf ...

processore
15-06-2009, 16:23
#include<stdio.h>
#include<string.h>


struct data_nascita{
int giorno;
char mese[10];
int anno;
};

struct indirizzo{
char via[300];
int numero;
int CAP;
char nazione[30];
char citta[30];
char provincia[2];
};

struct studenti{
char nome[20];
char cognome [20];
struct data_nascita d_t;
struct indirizzo ind;
int matricola;
};

struct insegnanti{
char nome[20];
char cognome [20];
struct data_nascita d_t;
struct indirizzo ind;
char materia[30];
};

struct libri{
char titolo[30];
char autore[30];
char editore[30];
char ISBN[30];
int anno_publicazione;
};

struct corso{
struct studenti std;
struct insegnanti ins;
struct libri lib;
};

int ins (int);
void vis (struct corso *);
void vis_cor(void);

struct corso b[10];
int ind =0;


main(){


printf("1. inserisci\n 2.visualizza\n ");
int scelta;
scanf("%d",&scelta);
switch (scelta){
case 1: ind = ins(ind);
break;
case 2: vis_cor();
break;
}


}


int ins(int a){

if(a>10){
printf("non ce piu spazio");
}
printf("inserisci gli studenti\n");
printf("nome\n");
gets((b[a].std).nome);
printf("cognome\n");
gets((b[a].std).cognome);
printf("data di nascita\n");
printf("giorno");
scanf("%d", &((b[a].std).d_t).giorno);
printf("\n mese");
scanf("%d", &((b[a].std).d_t).mese);
printf("\n anno");
scanf("%d", &((b[a].std).d_t).anno);
ptintf("\n indirizzo\n");
printf("via ");
gets(((b[a].std).ind).via);
printf("\n numero");
scanf("%d", &((b[a].std).ind).numero);
printf("\nCAP");
scanf("%d", &((b[a].std).ind).CAP);
printf("\nnazione");
gets(((b[a].std).ind).nazione);
printf("\ncittà");
gets(((b[a].std).ind).citta);
printf("\nprovincia");
gets(((b[a].std).ind).provincia);
printf("\n matricola\n");
scanf("%d", &(b[a].std).matricola);

printf("inserire gli insegnanti");
printf("nome\n");
gets((b[a].ins).nome);
printf("cognome\n");
gets((b[a].ins).cognome);
printf("data di nascita\n");
printf("giorno");
scanf("%d", &((b[a].ins).d_t).giorno);
printf("\n mese");
scanf("%d", &((b[a].ins).d_t).mese);
printf("\n anno");
scanf("%d", &((b[a].ins).d_t).anno);
ptintf("\n indirizzo\n");
printf("via ");
gets(((b[a].ins).ind).via);
printf("\n numero");
scanf("%d", &((b[a].ins).ind).numero);
printf("\nCAP");
scanf("%d", &((b[a].ins).ind).CAP);
printf("\nnazione");
gets(((b[a].ins).ind).nazione);
printf("\ncittà");
gets(((b[a].ins).ind).citta);
printf("\nprovincia");
gets(((b[a].ins).ind).provincia);
printf("materia insegnata");
gets((b[a].ins).materia);

printf("libri\n");
printf("titolo");
gets((b[a].lib).titolo);
printf("\n autore");
gets((b[a].lib).autore);
printf("\n editore");
gets((b[a].lib).editore);
printf("\n ISBN");
gets((b[a].lib).ISBN);
printf("\n anno di publicazione");
scanf("%d", &(b[a].lib).anno_publicazione);
a++;
return(a);
}

void vis(struct corso *p){
printf("studente %s", (p->std).nome);
printf("insegnante %s",(p->ins).nome) ;
printf("libro %s", (p->lib).titolo);
}

void vis_cor(void){
int i;
struct corso *ps = &b[0];
for(i=0; i<ind;i++){
vis(ps++);
}
}


ho fatto cosi pero ancora non lo compila.
mi dice [Linker error] undefined reference to `ptintf'

non so cosa significa.
io uso dev-c++ per compilare.

Loading