Структуры. Распечатать анкетные данные студентов, обучающихся на "4" и "5" - C (СИ)

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

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

Распечатать анкетные данные студентов, обучающихся на "4" и "5". Заранее спасибо.

Решение задачи: «Структуры. Распечатать анкетные данные студентов, обучающихся на "4" и "5"»

textual
Листинг программы
#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 с этим массивом в качестве аргумента. В результате выполнения программы на экран будет выведена информация о студентах, которые получили отличные оценки по всем предметам.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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