Структуры. Распечатать анкетные данные студентов, обучающихся на "4" и "5" - C (СИ)
Формулировка задачи:
Решение задачи: «Структуры. Распечатать анкетные данные студентов, обучающихся на "4" и "5"»
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <wchar.h> #include <locale.h> #define NSBJ 3 // Число предметов // Описание структуры, содержащей описание предмета // Она будет частью другой структуры struct Subject { wchar_t *subject; // название предмета unsigned short score; // оценка по предмету }; // Описание структуры, содержащей информацию о студенте struct Student { wchar_t *fname; // Имя wchar_t *lname; // Фамилия unsigned int born; // Год рождения unsigned int class; // Текущий класс unsigned short n_sbj; // Число предметов struct Subject sbj[NSBJ]; // Информация о предметах // В этом месте лучше объявить указатель на структуру // и с помощью malloc() и free() добовлять и удалять // информацию о предметах // Данное объявление сделанно исключительно вцелях простоты // определения объекта структуры }; // Функция определяет является ли ученик отличником. // Принимает описание студента в качестве указателя на структуру std // Возвращает true, ученик отличник иначе - false bool is_excellent(struct Student *std) { // просматриваем оченки по предметам // поскольку std является указателем, то используем // коственную операцию пренадлежности "->" к элементу структуры // std->n_sbj for(unsigned int i = 0; i < std->n_sbj; ++i) { // поскольку sbj является массивом структур, то выражение sbj[i] // есть обращение к i-му объекту массива структур. // И раз sbj[i] является объектом структуры, то доступ к элементу // структуры происходит через операцию принадлежности "." if(3 >= std->sbj[i].score) { return false; } } return true; } // Функция выводит на печать информацию о студентах, прошедших проверку // Входящая информация - число студентов (размер массива) n, массив // структур с описаниями о студентах std[n] void print_excellent_student(unsigned int n, struct Student std[n]) { for(unsigned int i = 0, j; i < n; ++i) { // Определяем является ли студент отличником, для этого передаём // в функцию is_excellent() указатель на текущий элемент в массиве // структур (std[i]). Используем для этого операцию получения адреса - & if(true == is_excellent(&std[i])) { // Выводим на печать элементы структуры, ипользуя операцию принадлежности "." fwprintf(stdout, L"---------------------------------------------\n"); fwprintf(stdout, L" Фамилия: %ls\n", std[i].lname); fwprintf(stdout, L" Имя: %ls\n", std[i].fname); fwprintf(stdout, L"Год рождения: %u\n", std[i].born); fwprintf(stdout, L" Класс: %u\n", std[i].class); fwprintf(stdout, L"\nГодовые оценки по предметам:\n\n"); fwprintf(stdout, L" Предмет | Оценка\n"); for(j = 0; j < std[i].n_sbj; ++j) { // std[i] является объектом структуры содержащим масив // объектов структур sbj. Поэтому ипользуем операцию принадлежности "." // для доступа sbj // // std[i].sbj // // Но sbj[j] сам является объектом структуры, поэтому к // доступу элементов, которые он содержит, так же // используем операцию принадлежности "." // // std[i].sbj[j].subject // fwprintf(stdout, L" %-10ls | %3hu\n", std[i].sbj[j].subject, std[i].sbj[j].score); } fwprintf(stdout, L"---------------------------------------------\n"); } } } int main(int argc, char *argv[]) { setlocale(LC_ALL, "ru_RU.UTF-8"); // Объявляем массив структур std и инициализируем элементы структуры struct Student std[] = { // Открывающая скобка массива структур std { // Открывающая скобка инициализации элементов структуры std L"Василий" // fname ,L"Иванов" // lname ,1999 // born ,7 // class ,NSBJ // n_sbj ,{ // Открывающая скобка массива структур sbj { // Открывающая скобка инициализации элементов структуры sbj L"Русский", // subject 3 // score }, // Закрывающая скобка инициализации элементов структуры sbj // следующий элемент массива структур sbj {L"Математика", 4}, {L"Химия", 3} } // Закрывающая скобка массива структур sbj }, // Закрывающая скобка инициализации элементов структуры sdt // следующий элемент массива структур std {L"Максим" ,L"Белозёрский" ,1998 ,7 ,3 ,{{L"Русский", 5}, {L"Математика", 5}, {L"Химия", 4}}}, {L"Елена" ,L"Кузнецова" ,2000 ,7 ,NSBJ ,{{L"Русский", 5}, {L"Математика", 4}, {L"Химия", 4}}}, {L"Марина" ,L"Красильникова" ,1999 ,7 ,NSBJ ,{{L"Русский", 4}, {L"Математика", 4}, {L"Химия", 3}}}, {L"Вячеслав" ,L"Бочаров" ,1999 ,7 ,NSBJ ,{{L"Русский", 3}, {L"Математика", 4}, {L"Химия", 4}}}, }; // Закрывающая скобка массива структур std unsigned int SIZE = sizeof(std) / sizeof(std[0]); // получаем размер массива структур std print_excellent_student(SIZE, std); return EXIT_SUCCESS; }
Объяснение кода листинга программы
В коде реализована структура Студент
, которая содержит поля: имя, фамилия, год рождения, текущий класс и массив структур Предмет
, содержащий информацию об оценках по различным предметам.
Также в коде определена функция is_excellent
, которая проверяет, является ли студент отличником, и функция print_excellent_student
, которая выводит на печать информацию о студентах, прошедших проверку.
В основной функции программы создается массив структур Студент
с пятью элементами, каждый из которых инициализируется соответствующими значениями. Затем вызывается функция print_excellent_student
с этим массивом в качестве аргумента.
В результате выполнения программы на экран будет выведена информация о студентах, которые получили отличные оценки по всем предметам.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д