Сформировать динамическую структуру (вид структуры - список), содержащую данные по студентам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Сформировать динамическую структуру (вид структуры - список), содержащую данные по сту- дентам в следующем виде: "Фамилия Имя Группа ГР RS", где ГР – год ро- ждения, RS – средний рейтинг (не менее 5 записей). Осуществить обра- ботку структуры: все студенты со средним рейтингом от 4.0 до 5.0

Решение задачи: «Сформировать динамическую структуру (вид структуры - список), содержащую данные по студентам»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
#define COUNT_RS 5
 
typedef struct data_t {
    const char* lastname;
    const char* firstname;
    const char* middlename;
    float rs[COUNT_RS];
}   TData;
 
typedef struct node_t {
    TData value;
    struct node_t* next;
}   TList;
 
//-----------------------------------------------------------------------------
TList* Push(TList** list, const TData* value) {
    TList* node = malloc(sizeof(TList));
    node->value = *value;
    node->next = *list;
    *list = node;
 
    return node;
}
//-----------------------------------------------------------------------------
int All(const TData* value) {
    return 1;
}
//-----------------------------------------------------------------------------
int Best(const TData* value) {
    float sum = 0.0;
    size_t i;
    for (i = 0; i < COUNT_RS; ++i) {
        sum += value->rs[i];
    }
    sum /= COUNT_RS;
 
    return ((4.0 <= sum) && (sum <= 5.0));
}
//-----------------------------------------------------------------------------
void Print(const TList* list, int (*Filter)(const TData*)) {
    size_t i;
    for (; list; list = list->next) {
        if (Filter(&list->value)) {
            printf("%s\t%s\t%s", list->value.lastname,
                   list->value.firstname, list->value.middlename);
            for (i = 0; i < COUNT_RS; ++i) {
                printf("\t%.2f", list->value.rs[i]);
            }
            printf("\n");
        }
    }
}
//-----------------------------------------------------------------------------
 
int main() {
    const TData data[] = {{"Ivanov",  "Ivan",  "Ivanovich",  {4, 5, 4, 5, 4}},
                          {"Petrov",  "Petr",  "Petrovich",  {4, 3, 4, 5, 3}},
                          {"Sidorov", "Sidor", "Sidorovich", {3, 3, 3, 3, 3}},
                          {"Popov",   "Ivan",  "Ivanovich",  {5, 5, 5, 5, 5}}};
 
    TList* list = NULL;
    size_t i;
 
    for (i = 0; i < 4; ++i) {
        Push(&list, &data[i]);
    }
 
    printf("All:\n");
    Print(list, All);
    printf("\n");
 
    printf("Best:\n");
    Print(list, Best);
 
    return 0;
}

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Создаются две структуры: TData и TList.
    • TData представляет собой структуру данных о студентах, содержащую их ФИО и оценки по пяти предметам.
    • TList представляет собой структуру данных, связанную списками, в которой каждый элемент - это структура TData.
  2. Определяются две функции: Push и Print, работающие со списком.
    • Push добавляет новый элемент в список.
    • Print выводит элементы списка, удовлетворяющие определенному условию (фильтру).
  3. Создается массив data с данными о студентах.
    • Каждый элемент массива представляет собой структуру TData.
  4. Создается пустой список list.
  5. С помощью цикла for в список добавляются элементы из массива data.
  6. Вызывается функция Print для вывода всех элементов списка.
  7. Вызывается функция Print для вывода только лучших элементов списка.
    • Лучшим считается элемент, сумма оценок которого находится в диапазоне от 4 до 5.
  8. Программа завершается возвратом значения 0, что означает успешное выполнение.

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы