Описать структуру с именем STUDENT - C (СИ) (79279)
Формулировка задачи:
Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы, номер группы, успеваемость (массив из пяти элементов). Написать программу, выполняющую след.действия:
1.ввод с клавиатуры данных в массив, состоящий их 10 структур типа STUDENT; записи должны быть упорядочены по возрастанию номера группы;
2.вывод на экран фамилий и номеров групп для всех студентов, включенных в массив, если средний бал студента больше 4.0;
3.если таких студентов нет, вывести соответствующее сообщение;
Решение задачи: «Описать структуру с именем STUDENT»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#define MAX_LENGTH_NAME 32
#define NDISCIPLINES 5
#define PROGRESS_TRESHOLD 4.0
typedef struct student_tag {
char name[MAX_LENGTH_NAME];
int group;
int marks[NDISCIPLINES];
} student_t;
#define NSTUDENTS 10
int main()
{
int i;
int j;
float avg;
student_t tmp;
student_t students[NSTUDENTS];
// ввод данных
for(i = 0; i < NSTUDENTS; ++i) {
printf("Введите фамилию и инициалы: ");
gets(students[i].name);
printf("Введите номер группы: ");
if(scanf("%d", &students[i].group) != 1) {
fprintf(stderr, "data reading error\n");
return EXIT_FAILURE;
}
printf("Введите оценки:\n");
for(j = 0; j < NDISCIPLINES; ++j) {
if(scanf("%d", &students[i].marks[j]) != 1) {
fprintf(stderr, "data reading error\n");
return EXIT_FAILURE;
}
}
fflush(stdin);
}
// Сортировка
for(i = 0; i < NSTUDENTS; ++i) {
for(j = NSTUDENTS - 1; j >= i; --j) {
if(students[j].group < students[j-1].group) {
tmp = students[j];
students[j] = students[j-1];
students[j-1] = tmp;
}
}
}
// Вывод с учетом среднего бала
printf("\nСписок студентов, средний бал у которых выше %f\n", PROGRESS_TRESHOLD);
for(i = 0; i < NSTUDENTS; ++i) {
avg = 0;
for(j = 0; j < NDISCIPLINES; ++j)
avg += students[i].marks[j];
avg /= NDISCIPLINES;
if(avg > PROGRESS_TRESHOLD) {
printf("ФИО: %s\nГРУППА: %d\nОЦЕНКИ: ", students[i].name, students[i].group);
for(j = 0; j < NDISCIPLINES; ++j)
printf("%d, ", students[i].marks[j]);
printf("\n\n");
}
}
}
Объяснение кода листинга программы
Код представляет собой программу для работы с данными студентов в университете.
- Сначала определяются макросы:
MAX_LENGTH_NAME- максимальная длина имени студента.NDISCIPLINES- количество дисциплин, по которым оценивается студент.PROGRESS_TRESHOLD- пороговый балл, студенты, у которых средний балл выше этого значения, выводятся на экран.
- Затем определяется структура
student_t, которая содержит следующие поля:char name[MAX_LENGTH_NAME]- имя студента.int group- номер группы студента.int marks[NDISCIPLINES]- массив оценок студента по дисциплинам.
- Далее объявляется переменная
NSTUDENTS- количество студентов. - В функции
main()происходит следующий процесс:- Ввод данных о студентах с помощью функций
gets()иscanf(). Имя студента считывается до тех пор, пока не будет введен символ новой строки. Номер группы и оценки по дисциплинам считываются с помощью функцииscanf(). - Выполняется сортировка массива структур
student_tпо номеру группы с помощью алгоритма сортировки пузырьком. - Выводится список студентов, у которых средний балл выше порогового значения. Для каждого студента выводится его имя, номер группы и оценки по дисциплинам, разделенные запятыми. Примечание: в коде не обрабатывается ситуация, когда ввод оценок по одной дисциплине прекращается до ввода оценок по всем дисциплинам. Это может привести к некорректным результатам в дальнейшем.
- Ввод данных о студентах с помощью функций