Ejercicio 06 — Array de 4 Alumno {nombre, nota}, muestra lista, calcula media e…

Dificultad: amarillo · Módulo 08 (Structs)

Enunciado

Array de 4 Alumno {nombre, nota}, muestra lista, calcula media e indica el mejor.

Diagrama de flujo

Diagrama de flujo del ejercicio 06

Cómo se resuelve

Aquí combinamos structs con arrays: Alumno grupo[N] es un array de structs, una tabla donde cada fila tiene nombre y nota. Para acceder a un campo de un elemento se pone primero el índice y luego el punto: grupo[i].nota, grupo[i].nombre.

El programa hace dos recorridos con for:

  1. Leer los N alumnos. Dentro del bucle: scanf("%49s %f", grupo[i].nombre, &grupo[i].nota). Fíjate en el patrón de siempre: nombre es array (sin &), nota es float (con &).
  2. Mostrar y calcular a la vez. En la misma pasada se imprime cada alumno, se acumula la suma de notas y se guarda el índice del mejor:
suma += grupo[i].nota;
if (grupo[i].nota > grupo[mejor].nota) {
    mejor = i;
}

La técnica del “mejor” es un clásico: empiezas suponiendo que el mejor es el 0 y, cada vez que encuentras uno con nota más alta, actualizas el índice. Al final grupo[mejor] es el alumno con más nota. La media es suma / N. En el printf de la lista, %-8s alinea el nombre a la izquierda en 8 columnas para que la tabla quede ordenada.

Trampa habitual: guardar el struct entero del mejor en una variable aparte en vez de solo su índice. Guardar el índice mejor es más simple y evita copias; con él llegas a cualquier campo (grupo[mejor].nombre, grupo[mejor].nota).

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 06 — PRACTICA (rellena los TODO)
 * Enunciado: Array de 4 Alumno {nombre, nota}, muestra lista, calcula media e indica el mejor.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej06_practica.c -o ej06 && ./ej06
 */
 
#include <stdio.h>
 
#define N 4
 
// TODO 1: Define typedef struct Alumno con char nombre[50] y float nota.
 
int main(void) {
    // TODO 2: Declara un array grupo de N elementos de tipo Alumno.
 
    // TODO 3: Bucle for de 0 a N-1.
    //         En cada iteracion, pide "Alumno i (nombre nota): " y lee con scanf.
    //         CUIDADO: nombre es array (sin &), nota es float (con &, usa %f).
 
    // TODO 4: Imprime el encabezado "Lista de alumnos:\n".
    //         Bucle para mostrar cada alumno con formato "  %-8s: %.2f\n".
    //         A la vez, acumula la suma de notas en una variable float.
    //         Y lleva un indice 'mejor' del alumno con nota mas alta (inicia en 0,
    //         actualiza si grupo[i].nota > grupo[mejor].nota).
 
    // TODO 5: Imprime la media: suma / N (con formato "Media: %.2f\n").
 
    // TODO 6: Imprime "Mejor nota: <nombre> (<nota>)\n" usando el indice 'mejor'.
 
    return 0;
}

Solución — cópiala y ejecútala

/*
 * Curso de C — Modulo 08: Structs
 * Ejercicio 06 — MODELO (resuelto)
 * Enunciado: Array de 4 Alumno {nombre, nota}, muestra lista, calcula media e indica el mejor.
 * Dificultad: amarillo
 * Compilar: gcc -std=c11 -Wall ej06_modelo.c -o ej06 && ./ej06
 */
 
#include <stdio.h>
 
#define N 4
 
typedef struct {
    char  nombre[50];
    float nota;
} Alumno;
 
int main(void) {
    Alumno grupo[N];
 
    // Leer los N alumnos
    for (int i = 0; i < N; i++) {
        printf("Alumno %d (nombre nota): ", i + 1);
        scanf("%49s %f", grupo[i].nombre, &grupo[i].nota);
    }
 
    // Mostrar lista y calcular media
    printf("\nLista de alumnos:\n");
    float suma = 0.0f;
    int   mejor = 0;
 
    for (int i = 0; i < N; i++) {
        printf("  %-8s: %.2f\n", grupo[i].nombre, grupo[i].nota);
        suma += grupo[i].nota;
        if (grupo[i].nota > grupo[mejor].nota) {
            mejor = i;
        }
    }
 
    printf("Media: %.2f\n", suma / N);
    printf("Mejor nota: %s (%.2f)\n", grupo[mejor].nombre, grupo[mejor].nota);
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones