Cambiere il nome delle variabili secondo me può aiutare a capire cosa fare. Ad esempio...
1. in una classe c'è una certa quantità di studenti
2. la quantità degli studenti si può fissare in un #define, magari col nome Q_STUDENTI
3. ad ogni studente della classe viene assegnata una quantità fissa di voti, per cui torna bene un secondo #define Q_VOTI
4. a questo punto, la matrice possiamo chiamarla "classe", e sarà int classe[Q_STUDENTI][Q_VOTI]
5. i contatori per scorrere la matrice, per chiarezza, possiamo chiamarli "iSt" per "indice studente" e "iVt" per "indice voto"
I cicli dovrebbero ora essere più leggibili:
for( iSt=0; iSt<Q_STUDENTI; iSt++ ) {
// stampi il numero d'ordine dello studente (iSt+1)
for( somma_voti=0, iVt=0; iVt<Q_VOTI; iVt++ ) {
// assegni il voto casuale a classe[iSt][iVt]
// mostri in console il voto appena assegnato
// aggiungi il voto classe[iSt][iVt] alla somma
}
// calcoli la media
// la mostri in console
}
Volendo puoi ottenere lo stesso risultato anche senza la matrice, visto che a quanto pare non è richiesta la memorizzazione dei voti.
for( iSt=0; iSt<Q_STUDENTI; iSt++ ) {
int vt;
// stampi il numero d'ordine dello studente (iSt+1)
for( somma_voti=0, iVt=0; iVt<Q_VOTI; iVt++ ) {
// assegni il voto casuale alla variabile vt
// mostri in console il voto appena assegnato a vt
// aggiungi il voto vt alla somma somma_voti
}
// calcoli la media
// la mostri in console
}