Страница 2 из 2 2. Программа, которая содержит процедуру, которая выводит к файлу фамилии учеников, которые имеют средний балл выше заданного Текст программыprogram Prg10; { https://nataliya.kiev.ua } type ekz = record matan,dmat,prog,linalg:1..5; end; st = record name:string[20]; age:byte; st:char; e:ekz; end; tf=file of st; var fname1,fname2:string; q:char; sr:real; procedure p(fname1,fname2:string; sr:real); var stud:st; f1,f2:tf; begin assign(f1,fname1); reset(f1); assign(f2,fname2); rewrite(f2); while not eof(f1)do begin read(f1,stud); if (stud.e.matan+stud.e.dmat+stud. e.linalg+stud.e.prog)/4>=sr then write(f2,stud) end; close(f1);close(f2); end; procedure displ(fname:string); var f:tf; s:st; begin assign(f,fname); reset(f); writeln('фамилия':10,'Возраст':7,'Пол':7, 'Математика':10,'Физика':10, 'Химия':10,'Литература':10); while not eof(f) do begin read(f,s); with s do writeln(name:9,age:7,st:7,e.matan:10,e.dmat:10 ,e.prog:10,e.linalg:10); end; close(f); end; begin writeln('Введите имя файла1:'); readln(fname1); writeln('Введите имя файла2:'); readln(fname2); writeln('Введите средний балл:'); readln(sr); p(fname1,fname2,sr); writeln('Вывести на экран первый файл?'); readln(q); if (q='Y')or(q='y') then displ(fname1); writeln('Вывести на экран второй файл?'); readln(q); if (q='Y')or(q='y') then begin writeln('Ученики с средним баллом высшим за ',sr:0:3); displ(fname2); end; end. Результат работы программы1) Введите имя файла1: file1.txt Введите имя файла2: temp Введите имя файла: 4 Вывести на экран первый файл? y фамилия Возраст Пол Математика Физика Химия Литература Иванов 18 м 3 3 3 3 Петров 17 ж 4 4 4 4 Сидоров 18 м 4 4 3 4 Васильев 17 м 5 4 5 4 Вывести на экран второй файл? y Ученики с средним баллом высшим за 4.000 фамилия Возраст Пол Математика Физика Химия Литература Петров 17 ж 4 4 4 4 Васильев 17 м 5 4 5 4 2) Введите имя файла1: file2.txt Введите имя файла2: t.txt Введите средний балл: 4 Вывести на экран первый файл? y фамилия Возраст Пол Математика Физика Химия Литература Сергеев 18 ж 3 3 3 3 Николаев 18 ж 5 5 5 4 Пугачев 18 м 5 5 5 5 Белов 17 м 4 4 4 5 Смирнов 3 м 3 4 4 3 Вывести на экран второй файл? y Ученики с средним баллом высшим за 4.000 фамилия Возраст Пол Математика Физика Химия Литература Николаев 18 ж 5 5 5 4 Пугачев 18 м 5 5 5 5 Белов 17 м 4 4 4 5 3) Введите имя файла1: file2.txt Введите имя файла2: f Введите средний балл: 5 Вывести на экран первый файл? n Вывести на экран второй файл? y Ученики с средним баллом высшим за 5.000 фамилия Возраст Пол Математика Физика Химия Литература Пугачев 18 м 5 5 5 5 Теория к программеРабота с структурированным файлом. Структурированный тип - запись Тип запись содержит отдельные поля, количество и тип которых должны быть определенными. Типы отдельных полей могут быть разными. Описание записи содержит перечень идентификаторов всех полей и их типов. Запись может иметь постоянную и переменную части Общий вид записи, которая имеет только постоянную часть: TYPE <идентификатор типа>=RECORD <идентификатор поля 1>:<тип поля 1>; : <идентификатор поля N>:<тип поля N> end; Если некоторые поля имеют одинаковые типы, их идентификаторы могут быть перечислены через запятую: TYPE <идентификатор типа>=RECORD <идентификатор поля 1>:<тип поля 1>; <идентификатор поля 2>,<идентификатор поля 3>:<тип полей 2, 3>; vend; Рядом с фиксированной запись может иметь переменную часть, которая имеет вид: case <идентификатор признака>:<тип> of <константа 1>:(<список полей и их типов 1>); : <константа k>:(<список полей и их типов k>); где <идентификатор признака> может быть переменной только перечислимого типа. В зависимости от ее значения принимается тот или другой перечень полей. Соответствующие списки полей имеют общее расположение в памяти, длина переменной части определяется по длине наибольшего из списков. Переменные типа запись описываются общим порядком. Обращение к полю записи: <идентификатор переменной>.<идентификатор поля> Значение признака при обращении к полям не проверяется, поэтому за корректностью данных нужно следить самостоятельно: f.size:=5; => f.height:= 5; => f.radius:=5; Поле записи в свою очередь тоже может быть структурированного типа Обращение к полю в таком случае: r.m.p:=true; Обращение к элементу массива: v.date[3]:=5; Оператор присоединения WITH Общий вид: WITH <ссылка на переменную> do <оператор>; где <ссылка на переменную> - идентификатор переменной типа запись. Если эта запись есть составной частью (полем) другой записи, то идентификаторы можно перечислять через запятую последовательно от внешнего уровня к внутреннего Оператор используется для сокращенного обращения к полям записи. При этом можно указывать только идентификаторы полей, опуская идентификатор самой переменной. Ссылка на несколько вложенных переменных типа запись имеет общий вид: WITH V1,V2,..,Vn do S; что эквивалентно WITH V1 do WITH V2 do : WITH Vn do S; Массивы записей могут использоваться для образования "баз данных". Типизированные файлы var f: file of <тип элементов> Типизированный файл - это файл, каждая запись которого имеет структуру и размер, которые определяются <типом элемента>. Ввод / вывод READ(f:file_type;var S1,..,Sn:type_of_zap); Последовательно считываются записи S1, ...,Sn, указатель текущей записи устанавливается на очередную после Sn запись type_of_zap - тип элемента типизированного файла, который определяется описанием соответствующей файловой переменной WRITE(var f:file_type;var S1,...,Sn:type_of_zap); Записи поочередно записываются в файл. Каждая запись типизированного файла обрабатывается по общим правилам работы в соответствии с его типом (типом элемента). Внутренняя организация файла определяется при его создании и о ней надлежит помнить при обработке файла, в особенности при изменении типа файловой переменной Процедуры и функции, связанные с позиционированием паказателя текущей записи Для выполнения любой из этих процедур и функций файл надо открыть seek(var f:file_type;n:longint); - найти запись с номером n и установить на него указатель текущей записи filepos(var f:file_type):longint; - функция возвращает номер текущей записи (на который установлен указатель). filesize(var f:file_type):longint; - функция возвращает количество записей в файле. Пустой файл имеет 0 записей truncate(var f:file_type); - файл усекается в соответствии с текущим положением указателя, в это место записывается метка конца файла. < |