PDA

Visualizza la versione completa : [C] Assegnazione di valori di tipo struttura compatibili


{-_-}
28-10-2007, 20:05
#include <stdio.h>
#include <conio.h>
#define MAXCHAR 30
#define MAXSTUDENTI 200


// definizioni di tipi: mettiamole PRIMA del main

typedef char stringa [MAXCHAR];

typedef struct {
stringa via;
int numCivico;
} tIndirizzo;

typedef struct {
stringa nome;
tIndirizzo indiriz;
int voto;
} tStudente;

typedef struct {
tStudente elenco [MAXSTUDENTI];
int numEffettivoStudenti;
} tClasse;

int main () {

char carLetto;
char inutile;
int i;

tClasse myClass; // un'istanza del tipo tClasse!
tStudente studLetto; // per l'inserimento
myClass.numEffettivoStudenti = 0;


do {
printf ("*** MENU PRINCIPALE ***\n\n");
printf ("scegli la tua opzione:\n");
printf ("1: inserisci uno studente nella classe\n");
printf ("2: visualizza tutta la listozza di studenti\n");
printf ("3: svuota il listone\n");
printf ("4: uscita\n\n");

// filtro l'input
do carLetto = getch(); while (carLetto < '1' || carLetto > '4');

switch (carLetto) {
case '1':
printf ("***INSERIMENTO DI UNO STUDENTE***\n\n");
printf ("inserisci il nome: ");
scanf ("%s", studLetto.nome);
printf ("inserisci la via: ");
scanf ("%s", studLetto.indiriz.via);
printf ("inserisci il num. civico: ");
scanf ("%d", &studLetto.indiriz.numCivico);
printf ("inserisci il voto: ");
scanf ("%d", &studLetto.voto);

myClass.elenco[myClass.numEffettivoStudenti]=studLetto;
myClass.numEffettivoStudenti++;
// nota bene: manca il test per vedere se e' gia' pieno, andrebbe aggiunto

printf ("\n\nPREMI UN TASTO PER CONTINUARE");
inutile = getch(); break;


case '2':
printf ("***LISTA TOTALE GLOBALE DEGLI STUDENTI***\n\n");

if (myClass.numEffettivoStudenti == 0)
printf ("La lista e' vuota!");

for (i=0; i<myClass.numEffettivoStudenti; i++) {

printf ("%d: %s abitante in via %s n. %d - voto %d\n",
i+1 ,
myClass.elenco[i].nome,
myClass.elenco[i].indiriz.via,
myClass.elenco[i].indiriz.numCivico,
myClass.elenco[i].voto );

}

printf ("\n\nPREMI UN TASTO PER CONTINUARE");
inutile = getch(); break;


case '3':
myClass.numEffettivoStudenti = 0;
printf ("Ho svuotato l'array");
printf ("\n\nPREMI UN TASTO PER CONTINUARE");
inutile = getch(); break;


case '4': break;

// impossibile raggiungere questo caso se il
// filtro sull'input funziona
default: printf ("errore, qualcosa non va"); break;

} // fine switch

} while (carLetto != '4');

printf ("\naddio. buon proseguimento di lezione, amico!\n");
}



non mi chiaro cosa faccia il soprastante codice qui


myClass.elenco[myClass.numEffettivoStudenti]=studLetto;
myClass.numEffettivoStudenti++;

Qui


myClass.numEffettivoStudenti = 0;




non ho ben capito come fa il codice a inserire i vari studenti nell'elengo, io avrei usato un for con indice i per l'inserimento, non capisco.

oregon
28-10-2007, 21:00
Perche' il for?

Quella riga copia i dati della struttura temporanea di uno studente in uno degli elementi del vettorei di strutture studente ...

{-_-}
28-10-2007, 21:02
ma quando definisco un tipo, posso fare tipo1 = tipo

se tipo1 strutturato come tipo ?

e anche se in tipo ho delle stringhe ?

oregon
28-10-2007, 21:28
S ... puoi farlo ... e potevi farlo anche negli altri esempi, ma mi sembrava che tu dovessi trattare i campi singolarmente perche' specificato nell'esercizio ...

duonovembre
28-10-2007, 21:34
puoi fare a = b se il tipo di a e' lo stesso di b o se a e b sono tipi convertibili (int, char ecc.)



in questo caso



elenco e' un array di studenti

studLetto e' uno studente

e questa riga di codice :


myClass.elenco[myClass.numEffettivoStudenti]=studLetto;


assegna alla prima posizione libera lo studente appena creato
e questa:


myClass.numEffettivoStudenti++;

aumenta il numero degli studenti inseriti

duonovembre
28-10-2007, 21:36
Originariamente inviato da oregon
S ... puoi farlo ... e potevi farlo anche negli altri esempi, ma mi sembrava che tu dovessi trattare i campi singolarmente perche' specificato nell'esercizio ...

ma in che senso se i tipi sono diversi si puo' fare un assegnamento

mi fai un esempio plz? nn ho ben chiaro il concetto:)

oregon
28-10-2007, 21:42
Originariamente inviato da duonovembre
ma in che senso se i tipi sono diversi si puo' fare un assegnamento

mi fai un esempio plz? nn ho ben chiaro il concetto:)

No ... un attimo ... non parlo di tipi diversi ma di due variabili diverse

v e v1

di uno stesso tipo struttura ... almeno questo e' quello che, secondo me, {-_-} intendeva dire con

tipo1 = tipo

( infatti, se rileggi, lui ha scritto: "se tipo1 strutturato come tipo" )

{-_-}
28-10-2007, 21:55
si esatto quello che intendo

ad esempio



typedef struct {char nome_albero[30];
int anni;
char genere[300];
...
...
...
}t_bosco;

t_bosco foresta_nera[999999] ;



la mia domanda era posso fare cose del tipo



t_bosco foresta_nera[9] = t_bosco foresta_nera[11] ;


anche se nella struct ho una serie di "stirnghe" ?

la risposta credo sia si

in tal caso ho capito il codice.

questo un modo elegante, anche se io avrei fatto


for (i=0; i<99; i++){
scanf ("%d", %fattore_1[i] )
scanf ("%d", %fattore_2[i] )
}


perche non sapevo si potessero fare assegnamenti fra tipi defini dall'utente

ma potrei fare qualcosa del genere se non uso i tipi, ma solo struct, ovvero posso fare assegnamenti fra struct simili?

non so se mi sono spiegato bene

grazie :)

oregon
28-10-2007, 22:00
Originariamente inviato da {-_-}
si esatto quello che intendo

Ok



ad esempio

...


S, puoi farlo ...



ma potrei fare qualcosa del genere se non uso i tipi, ma solo struct, ovvero posso fare assegnamenti fra struct simili?

Le struct devono essere uguali non solo simili ...

(per capirci, elementi di una stessa struttura ...)

{-_-}
28-10-2007, 22:02
avendo


struct t_bosco{char nome_albero[30];
int anni;
char genere[300];
...
...
...
};

struct t_bosco foresta_nera[999999] ;

struct t_bosco foresta_nera[9] = struct t_bosco foresta_nera[17] ;




posso farlo ?

Grazie

Loading