// Repaso de struct: copia al asignar, copia al pasar, y arreglos de struct.
#include <stdio.h>

#define NAME_SIZE 20
#define N_GRADES 3

struct student {
    char name[NAME_SIZE];
    int grades[N_GRADES];
};

// Cambia su copia: quien llama no lo nota.
void reset_first(struct student s) {
    s.grades[0] = 0;
    printf("En la función: %d\n", s.grades[0]);
}

// Devuelve la copia cambiada: quien llama decide si la guarda.
struct student with_first(struct student s, int grade) {
    s.grades[0] = grade;
    return s;
}

// Recibe un arreglo: cambia los elementos de quien llama.
void reset_all_first(struct student list[], int n) {
    for (int i = 0; i < n; i++) {
        list[i].grades[0] = 0;
    }
}

void print_student(struct student s) {
    printf("%s: %d %d %d\n", s.name, s.grades[0], s.grades[1], s.grades[2]);
}

int main(void) {
    struct student a = {"Ana", {14, 9, 17}};
    struct student b = a;
    b.grades[1] = 20;
    print_student(a);
    print_student(b);

    reset_first(a);
    print_student(a);
    a = with_first(a, 16);
    print_student(a);

    struct student list[2] = {a, b};
    reset_all_first(list, 2);
    print_student(list[0]);
    print_student(list[1]);
    print_student(a);
    return 0;
}
