Распечатать данные студентов, получивших в сессию все оценки "5" - C (СИ)
Формулировка задачи:
Задача.
Вывести информацию о K студентах группы. Информация содержит ФИО студента, год рождения, четыре оценки за экзамены последней сессии. Распечатать данные студентов, получивших в сессию все оценки "5"
Решение задачи: «Распечатать данные студентов, получивших в сессию все оценки "5"»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME 16
#define MAX_SURNAME 16
#define MAX_GIVENAME 16
struct Date{
int Day ;
int Month;
int Year ;
};
struct StudentInfo{
char Name [MAX_NAME ];
char Surname [MAX_NAME ];
char Givename [MAX_GIVENAME];
Date DateOfBorn ;
int Mark1 ;
int Mark2 ;
int Mark3 ;
int Mark4 ;
};
int main()
{
int student_count = 0 ;
StudentInfo* student_arr = NULL;
int i ;
printf("Students count: ");
scanf("%d", &student_count);
while(student_count < 1){
printf("Student count must be more then unit. Retry input: ");
scanf("%d", &student_count);
}
student_arr = (StudentInfo*)malloc(sizeof(StudentInfo)*student_count);
if(student_arr == NULL){
printf("Memory error. Exit...");
system("pause");
return 1;
}
for(i = 0; i < student_count; ++i){
printf("***Student #%i***\n", i + 1);
printf("Surname: ");
scanf("%s", student_arr[i].Surname);
printf("Name: ");
scanf("%s", student_arr[i].Name);
printf("Givenname: ");
scanf("%s", student_arr[i].Givename);
printf("Date of birth (dd/mm/yyyy): ");
scanf("%d/%d/%d", &student_arr[i].DateOfBorn.Day, &student_arr[i].DateOfBorn.Month, &student_arr[i].DateOfBorn.Year);
printf("Mark 1: ");
scanf("%d", &student_arr[i].Mark1);
printf("Mark 2: ");
scanf("%d", &student_arr[i].Mark2);
printf("Mark 3: ");
scanf("%d", &student_arr[i].Mark3);
printf("Mark 4: ");
scanf("%d", &student_arr[i].Mark4);
}
printf("***Students honours pupils***\n");
for(i = 0; i < student_count; ++i)
if(student_arr[i].Mark1 == 5 &&
student_arr[i].Mark2 == 5 &&
student_arr[i].Mark3 == 5 &&
student_arr[i].Mark4 == 5){
printf("***Student #%i***\n", i + 1);
printf("Surname: %s\n" , student_arr[i].Surname );
printf("Name: %s\n" , student_arr[i].Name );
printf("Givenname: %s\n", student_arr[i].Givename);
printf("Date of birth: %d/%d/%d\n" , student_arr[i].DateOfBorn.Day, student_arr[i].DateOfBorn.Month, student_arr[i].DateOfBorn.Year);
}
free(student_arr);
system("pause");
}
Объяснение кода листинга программы
- Подключаются необходимые библиотеки: stdio.h и stdlib.h.
- Определяются макросы MAX_NAME, MAX_SURNAME и MAX_GIVENAME, которые определяют максимальную длину полей структуры StudentInfo.
- Создается структура Date, которая содержит поля Day, Month и Year для хранения даты рождения студента.
- Создается структура StudentInfo, которая содержит поля Name, Surname, Givename, DateOfBorn и Mark1, Mark2, Mark3, Mark4 для хранения информации о студенте.
- В функции main() инициализируется переменная student_count, которая будет хранить количество студентов.
- С помощью функции scanf() считывается значение student_count.
- Создается пустой массив student_arr типа StudentInfo*.
- С помощью цикла while проверяется корректность введенного значения student_count. Если оно меньше 1, то пользователю предлагается ввести корректное значение.
- Выделяется память под массив student_arr с помощью функции malloc().
- В цикле for считываются данные о каждом студенте: фамилия, имя, отчество, дата рождения и оценки.
- В конце программы выводится список студентов, получивших все оценки
5. - Выделяется память под массив student_arr с помощью функции free().
- Программа завершается с помощью команды system(
pause).