codice:
#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
codice:
myClass.elenco[myClass.numEffettivoStudenti]=studLetto;
	myClass.numEffettivoStudenti++;
Qui
codice:
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.