В массиве структур (записей) найти всех студентов, не имеющих двоек - Turbo Pascal
Формулировка задачи:
В массиве структур (записей) найти всех студентов, не имеющих двоек, и сформировать из них новый массив. Полученный массив упорядочить по возрастанию среднего балла. Структура (запись) содержит поля: фамилия, количество оценок, массив оценок (не более пяти), средний балл, который вычисляется при вводе данных. Вывести исходный и полученные массивы.
Решение задачи: «В массиве структур (записей) найти всех студентов, не имеющих двоек»
textual
Листинг программы
type
TPerson = record ...
MrkCnt: Integer;
Mrks: array [0..4] of Integer;
AvgMrk: Real;
end;
TMatchFunc = function (const p: TPerson): Boolean;
TLessFunc = function (const p1, p2: TPerson): Boolean;
procedure WritePerson(const p: TPerson);
begin
with p do begin
WriteLn( ...
end;
end;
procedure WritePersons(const p: array of TPerson; n: Integer);
begin
for n:=0 to n-1 do WritePerson(p[n]);
end;
procedure SelectPersons(
const src: array of TPerson; n: Integer;
var dst: array of TPerson; var m: Integer;
IsMatch: TMatchFunc);
begin
m:=0;
for n:=0 to n-1 do
if IsMatch(src[n]) then begin
dst[m]:=src[n]; Inc(m);
end;
end;
procedure SortPersons(var a: array of TPerson; n: Integer; IsLess: TLessFunc);
begin
...
if IsLess(p[i],p[j]) then ...
...
end;
{$F+}
function MatchNo2(const p: TPerson): Boolean;
var i: Integer;
begin
i:=MrkCnt-1; while (i>=0) and (p.Mrks[i]<>2) do Dec(i);
IsMatch:=i<0;
end;
function LessByAvg(const p1, p2: TPerson): Boolean;
begin
IsLess:=p1.MrkAvg<p2.MrkAvg;
end;
var
p1, p2: array [1..MAXN] of TPerson;
...
SelectPersons(p1,n1,p2,n2,MatchNo2);
SortPersons(p2,n2,LesByAvg);
WritePersons(p2);
Объяснение кода листинга программы
- В функции
MatchNo2мы уменьшаем значение переменнойiдо тех пор, пока она не станет меньше нуля или покаp.Mrks[i]не станет равным двум. Таким образом, мы находим индекс первого студента без двоек в массиве. - В функции
LessByAvgмы сравниваем среднюю оценку двух студентов. Если средняя оценка первого студента меньше, чем у второго, то мы возвращаемTrue, иначе -False. - В процедуре
WritePersonмы записываем информацию о студенте в файл. - В процедуре
WritePersonsмы записываем информацию о нескольких студентах в файл. - В процедуре
SelectPersonsмы выбираем студентов, которые соответствуют условию, заданному в функцииIsMatch. Мы проходим по массиву студентов и, если студент соответствует условию, копируем его в новый массив. - В процедуре
SortPersonsмы сортируем студентов по среднему баллу. Мы используем рекурсивную функцию для сравнения студентов. - В конце программы мы вызываем функцию
MatchNo2, чтобы найти первого студента без двоек, затем вызываем функциюLessByAvg, чтобы отсортировать студентов по среднему баллу, и, наконец, вызываем процедуруWritePersons, чтобы записать отсортированных студентов в файл.