Hola jimgom,
Para manejar tantas variables, es decir, variables que van de 1 a 5, o de 1 a 20, lo mejor que se me ocurre es usar vectores. Por ejemplo, para declarar una variable que sea un vector de enteros, usamos:
De este modo tenemos, en la misma variable, las tres notas de un alumno.
Además de esto, podemos declarar variables personalizadas, a modo de registros, que contienen variables simples (u otras variables personalizadas), como por ejemplo:
-   
- struct TEstudiante{ 
-     char nombre[30]; 
-     int nota[4]; 
- }; 
-   
-   
Utilizando esta idea, se me ocurre un pequeño programa que te podría ser de gran ayuda para conseguir realizar tu propósito:
-   
- #include <iostream> 
- using namespace std; 
-   
- enum { MAX_ESTUDIANTES = 10 }; 
-   
- struct TEstudiante{ 
-     char nombre[30]; 
-     int nota[4]; 
- }; 
-   
- int main(){ 
-     TEstudiante estudiante[MAX_ESTUDIANTES]; 
-      
-     for(int i = 0; i < MAX_ESTUDIANTES; i++){ 
-         cout << "Estudiante n. " << i+1 << ":" << endl; 
-         cout << "Nombre? "; 
-         cin >> estudiante[i].nombre; 
-         cout << "Nota 1? "; 
-         cin >> estudiante[i].nota[0]; 
-         cout << "Nota 2? "; 
-         cin >> estudiante[i].nota[10]; 
-         cout << "Nota 3? "; 
-         cin >> estudiante[i].nota[2]; 
-         cout << "Nota 4? "; 
-         cin >> estudiante[i].nota[3]; 
-         cout << endl; 
-     } 
- } 
-   
-   
El código anterior crea una estructura (una variable personalizada, que llamo yo) con el nombre y las notas de un alumno. Esa misma variable personalizada la convierte en un vector, así podrá contener el nombre y las notas de varios alumnos.
Espero que sea un ejemplo muy sencillo y comprensible.