Цель: Рассмотреть цикл задач, связанных с типизированным типом файлом, в том числе задачу на создание простейшей базы данных.
Задача 1. Создать простейшую базу данных на основе типизированных файлов записей. Требуется - создать файл записей с заданным именем, поместив в него сведения о студентах потока (номер группы, фамилия, имя и три отметки за семестр). На основе файла выяснить процент успеваемости на "4" и "5" (количество студентов без "3", отнесенное к общему числу учащихся). Требуется также создать файл записей с заданным именем, поместив в него сведения о плохо успевающих студентах потока (с оценками "2" и "3") — номер группы, фамилия, имя, средний балл семестра, и вывести его записи на экран.
uses crt;
type stud=record
group:byte;
surname:string[20];
name:string[20];
{массив оценок: за семестр ставятся 3 оценки (от 2 до 5 баллов)}
oc:array[1..3] of 2..5;
end;
foolstud=record
group:byte;
surname:string[20];
name:string[20];
srarif:real;
end;
file_typ1=file of stud; file_typ2=file of foolstud;
var f1:file_typ1;f2:file_typ2;
namefile1,namefile2:string[12];
s:stud;
fs:foolstud;
i,nomrec:integer;
procedure read_data(var s:stud);
{Ввод записи по студенту}
begin
clrscr;
with s do
begin
writeln('Окончание ввода -0, как n группы');
write('N группы: '); readln(group);
if group <>0 then
begin
write('Фамилия:');readln(surname);
write('Имя:');readln(name);
writeln('Оценки:');for i:=1 to 3 do read(oc[i]);
end;
end;
end;
procedure copy_data(s:stud;var fs:foolstud);
{Копирование записи по студенту - задолжнику}
begin
with fs do
begin
group:=s.group; surname:=s.surname; name:=s.name;
{вычисление среднего арифметического элеиентов массива оценок}
srarif:=(s.oc[1]+s.oc[2]+s.oc[3])/3;
end;
end;
procedure write_list(var f:file_typ2);
{вывод записей по плохо успевающим студентам на экран}
begin
reset(f); seek(f,0);
writeln('Плохо успевающие:');
writeln('Группа ','Фамилия':16,'Имя':8,'Средний балл':18);
while not eof(f) do
begin
{чтение текущей записи из файла }
read(f,fs);
{вывод текущей записи на экран}
with fs do writeln(group:4,surname:15,name:10,srarif:16:2);
end;
end;
procedure create_file(var f:file_typ1; var n:integer);
{ввод записей по всем студентам в файл}
begin
n:=0; rewrite(f); read_data(s);
while s.group<>0 do
begin
{вывод текущей записи в файл}
write(f,s); inc(n);
{ввод записи по новому студенту}
read_data(s);
end;
close(f);
end;
procedure write_data(var f1:file_typ1;var f2:file_typ2;n:integer);
{вывод записей по плохо успевающим студентам в файл}
{подсчет % успевающих студентов}
var priz:char; k:integer;
begin
reset(f1); rewrite(f2); k:=0;
while not eof(f1) do
begin
read(f1,s);
{ПРИЗНАК УЧЕБЫ СТУДЕНТА}
PRIZ:='n';
for i:=1 to 3 do if (s.oc[i]>=2) then priz:='y';
if priz='y' then
begin
copy_data(s,fs);write(f2,fs) end
else inc(k);
end;
close(f1);close(f2);
clrscr;writeln('На "4" и "5" учатся',k/n*100:3:0,'%студентов');
end;
begin
clrscr;
write('Введите имя файла общей ведомости:');readln(namefile1);
assign(f1,namefile1);
create_file(f1,nomrec);
write('Введите имя файла ведомости задолжников:');readln(namefile2);
assign(f2,namefile2);
write_data(f1,f2,nomrec);
write_list(f2);
end.
Комментарии
Для каждого студента данные о номере его группы, фамилии, имени и отметках содержатся в полях записи stud: переменных group, surname, name и массиве ос соответственно. Для плохо успевающего студента данные о номере его группы, фамилии, имени и среднем балле содержатся в полях записи foolstud: переменных group, surname, name и sredarif соответственно. Создание типизированного файла базы данных на студентов потока выполняется процедурой create_file, а заполнение полей записи по отдельному студенту - процедурой read_data. Формирование типизированного файла базы данных на плохо успевающих студентов потока выполняется процедурой write_data, которая также подсчитывает процент обучающихся на "4" и "5". Процедура copy_data выполняет вспомогательную роль, копируя поля записи студента в соответствующие поля записи задолжника и вычисляя средний балл по оценкам семестра. Данные из файла задолжников выводятся процедурой write_list.
Дата: 2019-12-22, просмотров: 422.