Сформировать динамическую структуру (вид структуры - список), содержащую данные по студентам - 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, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д