Массив типа "запись" - C (СИ)
Формулировка задачи:
Известны оценки каждого из 22 учеников класса по четырем предметам. Определить фамилию одного из учеников, имеющих максимальную сумму оценок.
Помогите в си,пожалйста
Решение задачи: «Массив типа "запись"»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define FMSIZE 15
#define PEOPLE 22
typedef struct
{
char family[FMSIZE];
int subject1;
int subject2;
int subject3;
int subject4;
}Student;
//Заполним данные группы
void getData(Student group[], const int people, const int fmsize);
//Определим "суммы" оценок каждого "студента"
void getTotl(const Student group[], int total[], const int people);
//Отобразить сведения о всех (фамилия, сумма оценок)
void showAll(const Student group[], const int total[], const int people);
//"Звездочки"
void charLine(void);
//Определим одного из "студентов" имеющих "высший балл"
int getBest(const int total[], const int people);
//Выведем данные об "объекте"
void showBest(const Student group[], const int total[], const int bestStud);
int main()
{
int bestStud;
int total[PEOPLE];
Student group[PEOPLE];
srand(time(NULL));
getData(group, PEOPLE, FMSIZE);
getTotl(group, total, PEOPLE);
showAll(group, total, PEOPLE);
bestStud = getBest(total, PEOPLE);
showBest(group, total, bestStud);
getchar();
return 0;
}
//Заполним данные группы
void getData(Student group[], const int people, const int fmsize)
{
int i;
char tempFamily[] = "Afamily";
for(i = 0; i < people; ++i)
{
strncpy(group[i].family, tempFamily, fmsize);
group[i].subject1 = (int)rand()%5 + 1;
group[i].subject2 = (int)rand()%5 + 1;
group[i].subject3 = (int)rand()%5 + 1;
group[i].subject4 = (int)rand()%5 + 1;
//Изменить "Префикс" фамилии: (A)family, (B)family, (C)family
tempFamily[0]++;
}
}
//Определим "суммы" оценок каждого "студента"
void getTotl(const Student group[], int total[], const int people)
{
int i;
for(i = 0; i < people; ++i)
{
total[i] = group[i].subject1 + group[i].subject2
+ group[i].subject3 + group[i].subject4;
}
}
//Показать сведения о всех (фамилия, сумма оценок)
void showAll(const Student group[], const int total[], const int people)
{
int i;
printf("%-25s%s\n", "Student Family", "Total Score");
charLine();
for(i = 0; i < people; ++i)
{
printf("%-25s%2d\n", group[i].family, total[i]);
}
charLine();
}
//"Звездочки"
void charLine(void)
{
int i;
for(i = 0; i < 30; ++i)
{
putchar('*');
}
putchar('\n');
}
//Определим одного из "студентов" имеющего "высший балл"
int getBest(const int total[], const int people)
{
int i, index, tempTotal;
tempTotal = total[0];
index = 0;
for(i = 0; i < people; ++i)
{
if(total[i] > tempTotal)
{
tempTotal = total[i];
index = i;
}
}
return index;
}
//Выведем данные об "объекте"
void showBest(const Student group[], const int total[], const int bestStud)
{
printf("One of the best student\n");
printf("%-25s%2d\n", group[bestStud].family, total[bestStud]);
charLine();
}
Объяснение кода листинга программы
- В этом коде определен массив типа
записьс именемStudent, который содержит поля для фамилии студента и оценок по четырем предметам. - Функция
getDataзаполняет этот массив случайными данными. - Функция
getTotlвычисляет сумму оценок для каждого студента и сохраняет эти значения в отдельном массивеtotal. - Функция
showAllвыводит на экран фамилию каждого студента и сумму его оценок. - Функция
charLineвыводит на экран строку из звездочек для украшения таблицы. - Функция
getBestнаходит студента с наибольшей суммой оценок и возвращает его индекс. - Функция
showBestвыводит на экран данные о лучшем студенте. - В функции
mainсоздается массивgroupиtotal, заполняются данными, вычисляются суммы оценок и выводится на экран таблица с оценками всех студентов и лучшим студентом. - Код использует функцию
srandдля инициализации генератора случайных чисел, чтобы каждый раз получать разные случайные оценки. - Код использует функцию
printfдля вывода текста и значений переменных на экран. - Код использует функцию
getcharдля ожидания нажатия клавиши после вывода последнего значения на экран. - Код возвращает 0, чтобы указать, что программа успешно завершилась.