Struktury

Vytvořte strukturu Student, která bude obsahovat atributy pro jeho věk, jméno, počet bodů a nejlepšího přítele (to bude také student). Dále naimplementujte tyto funkce:

/**
 * Nainicializujte studenta se zadaným věkem a jménem.
 * Počet bodů i nejlepší přítel by měli být nastaveni na nulu.
 */
void student_init(Student* student, int age, const char* name) {}

/**
 * Spočítejte, kolik studentů v předaném poli má maximálně zadaný věk.
 * Příklad:
 *   Student students[3];
 *   students[0].age = 18;
 *   students[1].age = 19;
 *   students[2].age = 16;
 *
 *   count_young_students(students, 3, 18); // 2
 */
int count_young_students(Student* students, int count, int maximum_age) {}

/**
 * Přiřaďte studentům body na základě výsledků testů.
 * V poli `points` jsou body pro jednotlivé studenty v poli `students`.
 * Parameter `count` obsahuje počet studentů a testů.
 */
void assign_points(Student* students, const int* points, int count) {}

/**
 * Vraťe v parametru `good_students` pole studentů, kteří mají alespoň 51 bodů a v
 * parametru `good_student_count` jejich počet.
 * Budete muset dynamicky naalokovat nové pole s odpovídající velikostí.
 */
void filter_good_students(
    const Student* students,
    int count,
    Student** good_students,
    int* good_student_count
);

/**
 * Otestujte, jestli je student šťastný.
 * Student je šťastný, pokud:
 * 1) Má alespoň 51 bodů, a zároveň
 * 2) Jeho nejlepší přítel je šťastný
 *
 * Pokud student nemá nejlepšího přítele, pokládejte podmínku 2) za splněnou.
 */
int student_is_happy(Student* student) {}

K otestování vaší implementace můžete použít následující testovací program1:

1Implementace svých funkcí v tomto programu umístěte nad main a program spusťte s Address sanitizerem. Pokud program nic nevypíše, máte implementaci pravděpodobně správně.

Testovací program
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Zde vložte implementace funkcí

int main()
{
    Student jirka;
    student_init(&jirka, 18, "Jiri Novak");
    assert(jirka.age == 18);
    assert(!strcmp(jirka.name, "Jiri Novak"));
    assert(jirka.points == 0);
    assert(jirka.best_friend == NULL);

    Student students[3];
    for (int i = 0; i < 3; i++)
    {
        student_init(students + i, 17 + i, "");
    }
    assert(count_young_students(students, 3, 18) == 2);

    int points[] = { 10, 15, 3 };
    assign_points(students, points, 3);
    assign_points(students, points, 1);
    assert(students[0].points == 20);
    assert(students[1].points == 15);
    assert(students[2].points == 3);

    Student a = {}, b = {}, c = {};
    a.points = 51;
    b.points = 50;
    c.points = 50;
    assert(student_is_happy(&a));
    a.best_friend = &b;
    assert(!student_is_happy(&a));
    b.points = 51;
    assert(student_is_happy(&a));
    b.best_friend = &c;
    assert(!student_is_happy(&a));
    c.points = 100;
    assert(student_is_happy(&a));

    Student students2[3] = {};
    students2[0].age = 15;
    students2[2].age = 18;
    int points2[] = { 51, 20, 60 };
    assign_points(students2, points2, 3);

    Student* good_students;
    int good_students_count;
    filter_good_students(students2, 3, &good_students, &good_students_count);
    assert(good_students_count == 2);
    assert(good_students[0].age == 15);
    assert(good_students[1].age == 18);

    free(good_students);

    return 0;
}