Сформировать динамическую структуру (вид структуры - список), содержащую данные по студентам - 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;
}
Объяснение кода листинга программы
В данном коде происходит следующее:
- Создаются две структуры:
TDataиTList.TDataпредставляет собой структуру данных о студентах, содержащую их ФИО и оценки по пяти предметам.TListпредставляет собой структуру данных, связанную списками, в которой каждый элемент - это структураTData.
- Определяются две функции:
PushиPrint, работающие со списком.Pushдобавляет новый элемент в список.Printвыводит элементы списка, удовлетворяющие определенному условию (фильтру).
- Создается массив
dataс данными о студентах.- Каждый элемент массива представляет собой структуру
TData.
- Каждый элемент массива представляет собой структуру
- Создается пустой список
list. - С помощью цикла
forв список добавляются элементы из массиваdata. - Вызывается функция
Printдля вывода всех элементов списка. - Вызывается функция
Printдля вывода только лучших элементов списка.- Лучшим считается элемент, сумма оценок которого находится в диапазоне от 4 до 5.
- Программа завершается возвратом значения 0, что означает успешное выполнение.