Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9 - PascalABC.NET
Формулировка задачи:
Даны оценки группы студентов на экзаменах по 4 предметам: алгебре, геометрии, философии, информатике. Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9.
Решение задачи: «Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9»
textual
Листинг программы
const
LessonsCount = 4;
Lessons : array [1..LessonsCount] of String[15] =
('алгебра', 'геометрия', 'философия', 'информатика');
type
tStudents = class
Name : String[20];
Ball : array [1..LessonsCount] of Byte;
Next : tStudents;
constructor (N : Integer);
begin
Name := ReadLnString('Введите ФИО студента № ' + N.ToString + ' :');
for var L := 1 to LessonsCount do
Ball[L] := ReadLnInteger('Введите оценку за предмет «' + Lessons[L] + '» =');
Next := nil;
end;
function SumBalls : Integer;
begin
Result := 0;
for var L := 1 to LessonsCount do
Result += Ball[L];
end;
procedure OutStudent(N : Integer);
begin
Write(N:5, Name:20);
for var L := 1 to LessonsCount do
Write(' ', Lessons[L], ' : ', Ball[L]);
WriteLn;
end;
end;
function ContinueEntering : Boolean;
begin
var S : String;
repeat
S := ReadLnString(NewLine +
'1 / Y - yes / Д - да : Продолжить ввод следующего студента' + NewLine +
'0 / N - no / Н - нет : Закончить ввод данных' + NewLine +
'Ваш выбор:');
until (S.Length > 0) and '1yYдД0nNнН'.Contains(S[1]);
Result := '0nNнН'.IndexOf(S[1]) < 0;
end;
function InputGroup : tStudents;
begin
var N := 1;
Result := new tStudents(N);
var Last := Result;
while ContinueEntering do
begin
N += 1;
Last.Next := new tStudents(N);
Last := Last.Next;
end;
end;
procedure OutNumbersOfBalls(List : tStudents);
begin
WriteLn;
var Sum := ReadLnInteger('Сколько баллов:');
WriteLn('Список студентов, набравших ', Sum, ' баллов:');
var Count := 0;
repeat
if List.SumBalls = Sum then
begin
Count += 1;
List.OutStudent(Count);
end;
List := List.Next;
until List = nil;
if Count = 0 then
WriteLn('Нет таких студентов.');
end;
var
List : tStudents;
begin
List := InputGroup;
OutNumbersOfBalls(List);
end.
Объяснение кода листинга программы
- В начале кода объявлены две константы: LessonsCount (количество предметов) и Lessons (массив строк, представляющих названия предметов). Значения по умолчанию для этих констант не указаны, поэтому предполагается, что они задаются в теле программы.
- Далее определён тип данных tStudents, представляющий студента. У этого типа есть свойства Name (имя студента) и Ball (массив оценок по предметам), а также методы SumBalls (сумма оценок) и OutStudent (вывод информации о студенте).
- Затем определена функция ContinueEntering, которая считывает ввод пользователя и проверяет, соответствует ли он одному из двух допустимых вариантов: '1yYдД0nNнН' или '0nNнН'. Если ввод корректен, функция возвращает значение 'true', иначе - 'false'.
- Функция InputGroup создаёт новый узел в списке студентов и добавляет его в конец списка. Затем она считывает данные для нового студента и добавляет его в список. Этот процесс повторяется до тех пор, пока пользователь не введёт '0nNнН'.
- Функция OutNumbersOfBalls выводит общее количество баллов, которое нужно найти, а затем перебирает список студентов, начиная с первого, и проверяет, совпадает ли сумма баллов студента с заданным значением. Если да, то выводит информацию о студенте.
- В конце кода определён основной список студентов List, который инициализируется вызовом функции InputGroup. Затем вызывается функция OutNumbersOfBalls для этого списка.
- Код не содержит явных ошибок, но его можно улучшить, например, добавив обработку ошибок при считывании данных или выводя более информативные сообщения об ошибках.