Вывести сведения о студентах-хорошистах и подсчитать их количество - Pascal ABC
Формулировка задачи:
Решение задачи: «Вывести сведения о студентах-хорошистах и подсчитать их количество»
const
EXCOUNT = 3;
type
TStudent = record
name, group: String;
exams: Array[1..EXCOUNT] Of 1..5;
end;
TStudentFile = File Of TStudent;
procedure InputStudent(var s: TStudent);
var
i: 1..EXCOUNT;
begin
with s do
begin
Write('ФИО: '); ReadLn(name);
Write('Группа: '); ReadLn(group);
for i := 1 to EXCOUNT do
begin
Write('Оценка за ', i, '-й экзамен: ');
ReadLn(exams[i]);
end;
end;
end;
function IsGoodStudent(const s: TStudent): Boolean;
var
Result: Boolean; //удалить строку при ошибке повторного идентификатора
i: 1..EXCOUNT + 1;
begin
i := 1;
repeat
Result := (s.exams[i] > 3);
Inc(i);
until (Not Result Or (i > EXCOUNT));
IsGoodStudent := Result;
end;
function OpenFileWithCheck(var f: TStudentFile): Boolean;
begin
Assign(f, 'f.dat');
{$I-}
Rewrite(f);
{$I+}
OpenFileWithCheck := (IOResult = 0);
end;
var
ar: Array[Byte] Of TStudent;
f: TStudentFile;
i, count: Byte;
n: Integer;
openOk: Boolean;
begin
repeat
Write('Введите количество студентов (1..256): ');
ReadLn(n);
until ((n > 0) And (n < 257));
for i := 0 to n - 1 do
InputStudent(ar[i]);
WriteLn;
openOk := OpenFileWithCheck(f);
if (Not openOk)
then
WriteLn('Ошибка открытия файла. Запись в файл не будет производиться!');
WriteLn;
WriteLn('Список хорошистов:');
count := 0;
for i := 0 to n - 1 do
if (IsGoodStudent(ar[i]))
then
begin
Inc(count);
WriteLn(ar[i].name);
if (openOk)
then
Write(f, ar[i]);
end;
WriteLn('----------------------------------------------');
if (count <> 0)
then
WriteLn('Всего: ', count)
else
WriteLn('Не найдено ни одного хорошиста!');
if (openOk)
then
Close(f);
end.
Объяснение кода листинга программы
const EXCOUNT = 3; type TStudent = record name, group: String; exams: Array[1..EXCOUNT] Of 1..5; end; TStudentFile = File Of TStudent; procedure InputStudent(var s: TStudent); var i: 1..EXCOUNT; begin with s do begin Write('ФИО: '); ReadLn(name); Write('Группа: '); ReadLn(group); for i := 1 to EXCOUNT do begin Write('Оценка за ', i, '-й экзамен: '); ReadLn(exams[i]); end; end; end; function IsGoodStudent(const s: TStudent): Boolean; var Result: Boolean; //удалить строку при ошибке повторного идентификатора i: 1..EXCOUNT + 1; begin i := 1; repeat Result := (s.exams[i] > 3); Inc(i); until (Not Result Or (i > EXCOUNT)); IsGoodStudent := Result; end; function OpenFileWithCheck(var f: TStudentFile): Boolean; var ar: Array[Byte] Of TStudent; f: TStudentFile; i, count: Byte; n: Integer; openOk: Boolean; begin repeat Write('Введите количество студентов (1..256): '); ReadLn(n); until ((n > 0) And (n < 257)); for i := 0 to n - 1 do begin InputStudent(ar[i]); if (IsGoodStudent(ar[i])) then begin Inc(count); WriteLn(ar[i].name); if (openOk) then Write(f, ar[i]); end; end; WriteLn('----------------------------------------------'); if (count <> 0) then WriteLn('Всего: ', count) else WriteLn('Не найдено ни одного хорошиста!'); if (openOk) then Close(f); end; var ar: Array[Byte] Of TStudent; f: TStudentFile; i, count: Byte; n: Integer; openOk: Boolean; begin repeat Write('Введите количество студентов (1..256): '); ReadLn(n); until ((n > 0) And (n < 257)); for i := 0 to n - 1 do begin InputStudent(ar[i]); end; WriteLn; openOk := OpenFileWithCheck(f); if (Not openOk) then WriteLn('Ошибка открытия файла. Запись в файл не будет производиться!'); WriteLn; WriteLn('Список хорошистов:'); count := 0; for i := 0 to n - 1 do begin if (IsGoodStudent(ar[i])) then begin Inc(count); WriteLn(ar[i].name); if (openOk) then Write(f, ar[i]); end; end; WriteLn('----------------------------------------------'); if (count <> 0) then WriteLn('Всего: ', count) else WriteLn('Не найдено ни одного хорошиста!'); if (openOk) then Close(f); end;