CALIFICACIONES - ESPECIFICACIÓN INFORMAL

Se pide construir un programa que calcule la calificación finalde un examen. Para cada alumno se conoce el nombre y tres notas, cuyo valormedio será la calificación final buscada. El programa debepedir por teclado los datos de cada alumno, para después mostrarla lista de alumnos, sus calificaciones y la calificación (media)final. Considerar un grupo de cinco alumnos.


Análisis del problema
Este ejercicio requiere leer, para cada alumno, su nombrey tres calificaciones. Una vez finalizada la fase de adquisiciónde datos, se pasa a la fase de cálculo; esta se limita a calcularla nota media para cada alumno. Por último, en la fase de impresiónde resultados, se muestra el nombre de cada alumno y la calificaciónmedia obtenida.

Diseño del programa
Este programa es rigurosamente secuencial, y se va a construir sin emplear funciones. Las variables se pueden declarar fuera o dentrodel programa principal, sin que haya resultados adversos. Es preciso tenercuidado a la hora de iniciar las variables.

Nota: ¿Seríaposible tener una sola variable de calificación para el alumno? Pista: basta con tener una variable general de lectura, y acumular resultadosen la variable de calificación del alumno; una vez acumuladas lastres calificaciones se halla la media que también se almacenaráen esa variable. Es interesante representar gráficamente la cantidad de memoria ocupada en cada caso, especialmente si el número de alumnoses elevado. Evidentemente este método de consumo reducido seríainviable si fuera preciso almacenar las calificaciones individuales de cada alumno.

Implementación
La implementación podría hacerse como sigue:
/*
 CALIFICACIONES
 Se pide construir un programa que calcule la calificación final de un examen.
 Para cada alumno se conoce el nombre y tres notas, cuyo valor medio será
 la calificación final buscada. El programa debe pedir por teclado los datos
 de cada alumno, para después mostrar la lista de alumnos, sus calificaciones
 y la calificación (media) final. Considerar un grupo de cinco alumnos.

 */

#include <stdio.h>

/* DECLARACION DE VARIABLES */

/* ALUMNO 1 */
    char nombre1[80];
    float n11, n12, n13, media1;

/* ALUMNO 2 */
    char nombre2[80];
    float n21, n22, n23, media2;

/* ALUMNO 3 */
    char nombre3[80];
    float n31, n32, n33, media3;

/* ALUMNO 4 */
    char nombre4[80];
    float n41, n42, n43, media4;

/* ALUMNO 5 */
    char nombre5[80];
    float n51, n52, n53, media5;


int main(void)
{
    /* PETICION DE INFORMACION */
    
    /* ALUMNO 1 */
    
    printf("Escriba el nombre del alumno 1: ");
    gets(nombre1);
    printf("\nEscriba la primera calificación del alumno 1: ");
    scanf("%f", &n11);
    printf("Escriba la segunda calificación del alumno 1: ");
    scanf("%f", &n12);
    printf("Escriba la tercera calificación del alumno 1: ");
    scanf("%f%*c",&n13);
    /* Obsérvese que mediante %*c descartamos el \n */
    
    /* ALUMNO 2 */
    
    printf("\nEscriba el nombre del alumno 2: ");
    gets(nombre2);
    printf("\nEscriba la primera calificación del alumno 2: ");
    scanf("%f", &n21);
    printf("Escriba la segunda calificación del alumno 2: ");
    scanf("%f", &n22);
    printf("Escriba la tercera calificación del alumno 2: ");
    scanf("%f%*c",&n23);
    
    
    /* ALUMNO 3 */
    
    printf("\nEscriba el nombre del alumno 3: ");
    gets(nombre3);
    printf("\nEscriba la primera calificación del alumno 3: ");
    scanf("%f", &n31);
    printf("Escriba la segunda calificación del alumno 3: ");
    scanf("%f", &n32);
    printf("Escriba la tercera calificación del alumno 3: ");
    scanf("%f%*c",&n33);
    
    
    /* ALUMNO 4 */
    
    printf("\nEscriba el nombre del alumno 4: ");
    gets(nombre4);
    printf("\nEscriba la primera calificación del alumno 4: ");
    scanf("%f", &n41);
    printf("Escriba la segunda calificación del alumno 4: ");
    scanf("%f", &n42);
    printf("Escriba la tercera calificación del alumno 4: ");
    scanf("%f%*c",&n43);
    
    
    /* ALUMNO 5 */
    
    printf("\nEscriba el nombre del alumno 5: ");
    gets(nombre5);
    printf("\nEscriba la primera calificación del alumno 5: ");
    scanf("%f", &n51);
    printf("Escriba la segunda calificación del alumno 5: ");
    scanf("%f", &n52);
    printf("Escriba la tercera calificación del alumno 5: ");
    scanf("%f%*c",&n53);
    
    /* FASE DE CALCULOS */
    
    media1 = (n11 + n12 + n13) / 3.0;
    media2 = (n21 + n22 + n23) / 3.0;
    media3 = (n31 + n32 + n33) / 3.0;
    media5 = (n41 + n42 + n43) / 3.0;
    media5 = (n51 + n52 + n53) / 3.0;
    
    /* FASE DE IMPRESION DE RESULTADOS */
    
    printf("\n\nEl alumno 1, D. %18s, tiene la calificación %3.2f.\n",
             nombre1, media1);
    printf("El alumno 2, D. %18s, tiene la calificación %3.2f.\n",
             nombre2, media2);
    printf("El alumno 3, D. %18s, tiene la calificación %3.2f.\n",
             nombre3, media3);
    printf("El alumno 4, D. %18s, tiene la calificación %3.2f.\n",
             nombre4, media4);
    printf("El alumno 5, D. %18s, tiene la calificación %3.2f.\n",
             nombre5, media5);
    
    /* Obsérvese el uso de %18s y de %3.2f. ¿Qué significan? */
    /* Fase de terminación */
    printf("\n\nTerminación normal del programa.\n\n");
    return 0;
}
Comentarios .- Como puede apreciarse, existe un elevado número de repeticiones. De hecho, lo que se hace para un alumno debe repetirse después paratodos los demás, facilitando la aparición de errores y alargandoinnecesariamente el código. El uso de matrices y funciones puedereducir sorprendemente la cantidad de código, facilitando al mismotiempo la comprobación de su correción.

Comprobación y Depuración
La forma más sencilla de comprobar un programacomo este consiste en introducir datos cuyos resultados sean conocidosde antemano. De este modo se podrán contrastar los resultados obtenidoscon los esperados. La validez aparente de nuestro programa puede comprobarse mediante una ejecución como la siguiente:
Escriba el nombre del alumno 1: Juan Uno Uno

Escriba la primera calificación del alumno 1: 1
Escriba la segunda calificación del alumno 1: 1
Escriba la tercera calificación del alumno 1: 1

Escriba el nombre del alumno 2: Juan Dos Dos

Escriba la primera calificación del alumno 2: 2
Escriba la segunda calificación del alumno 2: 2
Escriba la tercera calificación del alumno 2: 2

Escriba el nombre del alumno 3: Juan Tres Tres

Escriba la primera calificación del alumno 3: 3
Escriba la segunda calificación del alumno 3: 3
Escriba la tercera calificación del alumno 3: 3

Escriba el nombre del alumno 4: Juan Cuatro Cuatro

Escriba la primera calificación del alumno 4: 4
Escriba la segunda calificación del alumno 4: 4
Escriba la tercera calificación del alumno 4: 4

Escriba el nombre del alumno 5: Juan Cinco Cinco

Escriba la primera calificación del alumno 5: 5
Escriba la segunda calificación del alumno 5: 5
Escriba la tercera calificación del alumno 5: 5


El alumno 1, D.       Juan Uno Uno, tiene la calificación 1.00.
El alumno 2, D.       Juan Dos Dos, tiene la calificación 2.00.
El alumno 3, D.     Juan Tres Tres, tiene la calificación 3.00.
El alumno 4, D. Juan Cuatro Cuatro, tiene la calificación 0.00.
El alumno 5, D.   Juan Cinco Cinco, tiene la calificación 5.00.


Terminación normal del programa.
Comentarios .- Todo parece ir bien. Sin embargo, ¿qué sucede si no se inserta un nombre válido? ¿Qué ocurre si las calificaciones fueran sobre cien, y no sobre diez? Lamentablemente,las especificaciones del programa, aparentemente válidas, no eran suficientemente precisas. Moraleja: es preciso asegurarse de que las especificaciones describan de forma unívoca el problema. De lo contrario, en el mejor de los casos será preciso rehacer porciones notables del programa antes de su comercialización. Considere el lector las consecuenciasde un programa incorrecto que se envía más allá deMarte: es posible, y de hecho se hace, enviar una versión corregida. Pero no resulta rentable.

Nota.- Este programa contiene al  menos un error.

Documentación
Este programa admite los nombres y calificacionesde cinco alumos, para después mostrar la media de calificacionesobtenidas. El programa admite nombres cuya longitud máxima no supere los 79 caracteres, y requiere precisamente tres calificaciones por alumno. La salida quedará encolumnada si los nombres de los alumnos no superan los 18 caracteres; las calificaciones se muestran siempre con dos decimales. No se efectúa una verificación de los valores introducidos.