Информация в компьютере хранится в файлах (обычно на диске). Файловая система состоит из двух уровней: физического файла и логического файла. Физический файл – это собственно файл данных на диске, порт, принтер, любое устройство. Логический файл – файловая переменная (типа String), описанная в программе в разделе переменных. В зависимости от способа объявления формируется один из следующих типов файлов:
1. Типизированные файлы. Состоят из данных одного, объявленного типа.
Объявление файла: [имя]: file of [тип];Примеры: A: file of string[80]; F1: file of char; F2: file of real;
2. Текстовые файлы. Состоят из символов. Объявление текстового файла: [имя]: text;.Пример: f3: text;
В типизированных файлах информация хранится в двоичном виде, а в текстовых – в естественном. Элемент файла – запись (не путать с понятием record). Обычно, это строка файла.
Подлинное имя дискового файла используется только чтобы связать его с внутренним именем в программе, с которым она далее и работает. Для работы с файлами всех типов используется ряд процедур и функций:
assign(фп, файл)
Связывает файл с файловой переменной (ФП).
reset(фп)
Открывает существующий файл для чтения из него.
rewrite(фп)
Создает и открывает файл для записи в него.
close(фп)
Закрывает файл.
erase(фп)
Стирает файл (файл должен быть закрыт).
eof(фп)
Признак конца файла (True, если конец).
Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
read(f,x1,x2,…xn)илиreadln(f,x1,x2,…xn) – чтение информации х1,х2,…,xn из логического файла f.
write(f,x1,x2,…xn)илиwriteln(f,x1,x2,…xn) – запись информации х1,х2,… хn в логический файл f.
Для управления текстовыми файлами используется процедуры и функции:
append(фп)
Открывает файл для дополнения.
eoln(фп)
Признак конца строки (True, если конец).
read(фп,переменные)
Считывает данные из файла.
readln(фп,переменные)
Считывает данные из файла, переходит на следующую строку.
write(фп,переменные)
Записывает данные в файл.
writeln(фп,переменные)
Записывает данные в файл, переходит на следующую строку.
Для нетекстовых файлов:
filesize(фп)
Число записей в файле.
filepos(фп)
Номер текущей записи.
seek(фп,номер)
Устанавливает указатель на запись с заданным номером.
truncate(фп)
Усекает файл до текущей позиции.
Различают два способа доступа к файлам. Последовательный, когда к конкретной записи можно перейти, только перебрав все предыдущие, и прямой (или произвольный) доступ к любой записи по ее номеру. Текстовые файлы могут иметь в каждой строке записи произвольной длины и поэтому реализуют только последовательный доступ. Другие типы файлов имеют записи фиксированной длины. В виду этого здесь можно вычислить положение любой записи на диске, т.е. организовать прямой доступ.
Задача 9-1. а). Вычислить по точкам функцию y=x/2для x=0,0.5,1.0,…..4 и записать результаты в текстовый файл с именем func. Текстовый файл удобен тем, что его можно просмотреть в любом текстовом редакторе и, при желании откорректировать данные. Файлу не обязательно иметь расширение. Мы придали ему расширение txt с тем, чтобы проще было его просматривать в Проводнике или WinCommander (эти программы для файлов с расширением txt автоматически вызывают Блокнот). Физическому файлу дадим имя func.txt, а логическому имя f, и именно с ним будем работать.
б). Cоставить программу чтения из файла func.txt записанной ранее в него информации.
program 9_1a;{запись вычисленной функции в файл}
var f:text;{объявлен текстовый логический файл f}
x,y:real;
begin
{логический файл f связывается с физическим func.txt}
assign(f,'func.txt');
rewrite(f);{файл f открывается для записи в него}
x:=0;
while x<=4 do begin{вычисление в цикле функции}
y:=x/2; x:=x+0.5;
writeln(f,x:3:1,y:4:1);{запись в файл переменных х и у}
end;
close(f);{закрытие файла}
end.
program 9_1b;{чтение записанных ранее данных из файла}
var f:text;{объявлен текстовый файл f}
x,y:real; i:integer;
begin
assign(f,'func.txt');
reset(f);{открытие файла для чтения}
for i:=1 to 9 do begin
read(f,y,x);{чтение из файла в память}
{вывод на монитор, считанной из файла информации}
writeln('y=',y:3:1,' x=',x:4:1);
end;
close (f);{закрытие файла}
end.
файл
Vir
файл
Ved
tab
im
tarif
dn
im
zar
nalog
vid
таб
имя
тариф
дни
имя
зарплата
налог
выдать
Иван
Иван
Петр
Петр
Олег
Олег
Задача 9-2.Посчитать зарплату рабочих. Сведения об их месячной выработке находятся в типизированном (типа record) файле VIR: табельный номер tab, имя im (длиной до 4-х знаков), дневной тариф tarif работника, число отработанных им за месяц дней dn. Эти данные вводятся оператором. На основании их компьютером подсчитывается и заполняется файл ведомости VED, содержащий имя im, зарплату zar (=tarif*dn), налог nalog (=13%*zar) и сумму к выдаче vid (=zar-nalog). Далее содержимое файла выводится с подсчетом итоговых сумм. Здесь придется написать две программы. Программой Vvod выполняется следующая последовательность действий: 1). Заполняется файл Vir. 2). Считывается содержимое Vir в массив V. 3). Выполняются все расчеты и заносятся в массив R. 4). Данные из R сохраняются в файле Ved. Программа Vivod реализует только два действия: вывод всей ведомости к оплате или вывод сведений только об одном работнике по запросу (по имени).
program Vvod;{ввод данных и сохранение результата}
uses crt;{к задаче 9-2}
const n=3;
type vr=record{объявление записи для Выработки}
tab: integer;{табель}
im: string[4];{имя}
tarif, dn: real;
end;
vd=record{объявление записи для Ведомости}
im: string[4];
zar, nalog, vid: real;
end;
var vir: file of vr;{объявление файла Выработки}
ved: file of vd;{объявление файла Ведомости}
v: array[1..n] of vr;{массив V для ввода}
r: array[1..n] of vd;{массив R для расчета}
i: integer;
begin
clrscr;
{связывание логического и физического файлов}
assign(vir,'vir'); assign(ved,'ved');
rewrite(vir);{открытие файла Vir для записи}
writeln('введите!');
writeln('табель, имя, тариф, дни');
for i:=1 to n do begin
readln(v[i].tab); readln(v[i].im);
readln(v[i].tarif); readln(v[i].dn);
writeln(v[i].tab:2, v[i].im:6, v[i].tarif:3:0, v[i].dn:4:0);
write(vir,v[i]);{занесение в файл Vir очередной записи}
end;
reset(vir);{открытие файла Vir для чтения}
rewrite(ved);{открытие файла Ved для записи}
for i:=1 to n do begin{вычисления}
read(vir,v[i]);{чтение записи из файла Vir}
r[i].im:=v[i].im; r[i].zar:=v[i].tarif*v[i].dn;
r[i].nalog:=0.13*r[i].zar; r[i].vid:=r[i].zar-r[i].nalog;
write(ved,r[i]);{занесение записи в файл Ved}
end;
reset(ved);{открытие файла Ved для чтения}
for i:=1 to n do begin{печать}
read(ved,r[i]);{чтение записи из файла Ved}
writeln(r[i].im:4, r[i].zar:5:0, r[i].nalog:7:2, r[i].vid:8:2);
end;
close(ved);close(vir);{закрытие файлов}
end.
program Vivod; {вывод данных по запросу}
uses crt;{к задаче 9-2}
const n=3;
label m;
type
vd=record{объявление записи для Ведомости}
im: string[4];
zar, nalog, vid: real;
end;
var ved: file of vd;{объявление файла Ведомости}
r: array[1..n] of vd;{массив R для вывода}
xz,xn,xv:real;{итоги: зарплата, налог, выдать}
i: integer;
x:string[4];{искомое имя}
begin
clrscr;
assign(ved,'ved.txt');
write('показать всех (0) или одного (имя)? '); readln(x);
writeln(' имя зарплата налог выдать');
reset(ved);{открытие файла Ved для чтения}
if x='0' then begin{вывод всех работников}
for i:=1 to n do begin
read(ved,r[i]);{чтение записи из Ved}
writeln(r[i].im:4, r[i].zar:9:0, r[i].nalog:7:2, r[i].vid:8:2);
{подсчет итогов}
xz:=xz+r[i].zar; xn:=xn+r[i].nalog; xv:=xv+r[i].vid;
end;
writeln('Итог',xz:9:0,xn:7:2,xv:8:2) {вывод итогов}
end;
if x<>'0' then begin{поиск и вывод одного имени}
for i:=1 to n do begin
read(ved,r[i]);
if x=r[i].im then begin{если найдено - вывод и конец}
writeln(r[i].im:4, r[i].zar:9:0, r[i].nalog:7:2, r[i].vid:8:2);
goto m{выход из цикла поиска}
end;
end;
writeln('Не найдено имя: ',x);
m:end;
close(ved)
end.
Задача 9-3.Положим, в течение месяца работники бригады выполняли различные виды работ (пусть три), сведения о которых хранятся в трех файлах с именами Rab1, Rab2, Rab3. Кроме того, имеется справочный файл тарифов работников Tarif. Необходимо создать файл Ved ведомости на оплату, где будут собраны сведения о всех работниках и сделаны необходимые вычисления. Последовательность действий:
1. Предварительно создать на диске и заполнить файлы с именами Rab1, Rab2, Rab3 и Tarif.
2. Последовательно считать все три файла в массив Mr[1..15].
3. Отсортировать массив по табельному номеру (по полю mr.tb). Повторяющиеся номера объединить (часы суммируются) в одну строку.
4. Считать файл Tarifв массив Mt[1..6]. Исходя из индивидуальных тарифов, рассчитать зарплату, налог и сумму к выдаче каждого и записать это в файл Ved.
5. Вывести из Ved полученные данные на экран вместе с общей суммой зарплат бригады.
Исходные данные и результаты показаны ниже. Над колонками приведены названия полей, принимающих соответствующие данные.
файл
Tarif
файл
Rab1
файл
Rab2
файл
Rab3
файл
Ved
tb
im
tr
tb
ch
tb
ch
tb
ch
tb
im
ch
zr
nl
vd
таб №
имя
тариф
таб №
часы
таб №
часы
таб №
часы
таб №
имя
часы
заработок
налог
выдать
Иван
Лена
390,0
2610,0
Петр
Олег
130,0
870,0
Лена
Вася
227,5
1522,5
Вася
Иван
390,0
2610,0
Олег
Петр
78,0
522,0
Ü
Ü
всего
1215,5
8134,5
массив
MT
массив
MR
tb
im
tr
tb
ch
Программа Vedom реализует процесс обработки данных. Программу занесения данных в фалы Rab1, Rab2, Rab3, Tarifнапишите сами.
program VEDOM;{программа к задаче 9-3}
uses crt;
type{создание типов записей}
rab=record tb,ch:integer end;{тип записи Работы}
tar=record tb,tr:integer; im:string[4] end; {тип записи Тарифы}
ved=record tb,ch,zr:integer; im:string; nl,vd:real end;{тип записи Ведомость}
var{создание файлов, рабочих записей и переменных}
r1,r2,r3:file of rab;{файлы Работ}
mr:array [1..15] of rab;{массив записей для приема данных из файлов Работ}
x: rab; {запись типа Rab, необходимая для сортировки}
t:file of tar;{файл тарифов}
mt:array [1..6] of tar; {массив записей для приема данных из файла Тарифов}
v:file of ved;{файл Ведомости}
mv:ved; {запись Ведомости}
sch,szr:integer; snl,zvd:real; {переменные для накопления итоговых сумм в Ведомости}