Лабораторная работа №21. Решение задач на типизированные файлы.
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Цель: Рассмотреть цикл задач, связанных с типизированным типом файлом, в том числе задачу на создание простейшей базы данных.

           Задача 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, просмотров: 398.