Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Степан / Информатика / Паскаль (Яньков).doc
Скачиваний:
19
Добавлен:
20.04.2015
Размер:
660.99 Кб
Скачать

8. Записи

М

TYPE имя типа=RECORD

описание элементов записи

END;

ассивы определяют однородную совокупность данных. На практике часто требуется объединять в один объект данные разных типов. Так для хранения сведений о месячной выработке работников бригады понадобятся следующие сведения: Табельный номер, Имя, Дневной тариф, число отработанных Дней. Ясно, что табельный номер должен быть целого типа, имя – строкового, тариф и дни – вещественного. Мы можем объединить эту совокупность данных (они называются полями) в объект, называемыйзапись (record). Дадим ему, например имя Vr (от слова выработка). Первоначально удобно описать тип-запись как тип данных конструкцией, изображенной слева. Позже с помощью оператора Var можно описать уже конкретные записи данного типа.

t

Пример(справа). Здесь сначала описан тип записиVr, состоящей из по­лей:tab, im, tarif, dnсоответствующих типов. Затем в разделеVarописаны уже конкретные (рабочие) записи:Xи массив записейY. Обращаться к элементам записей нужно, используя полное имя (имя записи.имя поля), напримерx.tarif, x.im. А для массива записей нужно указывать и индекс:y[3].tarif. Записи удобно использовать при работе с файлами.

ype vr=record {объявление типа записи}

tab: integer; {табель}

im: string[4]; {имя}

tarif, dn: real

end;

Var X:vr; y:array [1..5] of vr;

9. Файлы

Информация в компьютере хранится в файлах (обычно на диске). Файловая система состоит из двух уровней: физического файла и логического файла. Физический файл – это собственно файл данных на диске, порт, принтер, любое устройство. Логический файл – файловая переменная (типа 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

таб

имя

тариф

дни

имя

зарплата

налог

выдать

35

Иван

100

20

Иван

2000

48

Петр

150

30

Петр

4500

15

Олег

200

10

Олег

3000

Задача 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

таб №

имя

тариф

таб №

часы

таб №

часы

таб №

часы

таб №

имя

часы

заработок

налог

выдать

35

Иван

50

8

30

15

40

35

50

8

Лена

120

3000

390,0

2610,0

48

Петр

30

20

50

48

20

8

40

15

Олег

50

1000

130,0

870,0

8

Лена

25

15

10

35

10

20

Вася

50

1750

227,5

1522,5

20

Вася

35

8

50

35

Иван

60

3000

390,0

2610,0

15

Олег

20

48

Петр

20

600

78,0

522,0

всего

300

9350

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;{переменные для накопления итоговых сумм в Ведомости}

m,i,j,k:integer;

begin

clrscr;

{----------------------------------слияние Rab1-3 в массив записейMR------------------------------------}

assign(r1,'rab1'); assign(r2,'rab2'); assign(r3,'rab3'); reset(r1); reset(r2); reset(r3);

k:=0;

while not eof(r1) do begin k:=k+1; read(r1,mr[k]) end;

while not eof(r2) do begin k:=k+1; read(r2,mr[k]) end;

while not eof(r3) do begin k:=k+1; read(r3,mr[k]) end;

close(r1); close(r2); close(r3);

for i:=1 to k do writeln(mr[i].tb:3,mr[i].ch:4); writeln; {вывод массива MR}

{-----------------------------------сортировка MR по табельному номеру----------------------------------}

for i:=1 to k-1 do begin;

for j:=i+1 to k do if mr[i].tb>mr[j].tb then

begin x:=mr[i]; mr[i]:=mr[j];mr[j]:=x end;

end;

for i:=1 to k do writeln(mr[i].tb:3,mr[i].ch:4); writeln; {вывод отсортированного массива Работ}

{---обобщение записей с одинаковыми табельными номерами: для группы повторяющихся номеров

в первой записи производится суммирование часов, в остальных – поле номера устанавливается в 0}

i:=1;

while i<k do begin

j:=1;

while mr[i].tb=mr[i+j].tb do begin

mr[i+j].tb:=0; mr[i].ch:=mr[i].ch+mr[i+j].ch; j:=j+1 end;

i:=i+1

end;

for i:=1 to k do if mr[i].tb>0 then writeln(mr[i].tb:3,mr[i].ch:4); writeln; {вывод объединенного массива Работ}

{---------------------------------------считывание тарифов в массив Tar--------------------------------------}

assign(t,'tarif'); reset(t);

m:=0; {количество строк тарифов}

while not eof(t) do begin m:=m+1; read(t,mt[m]) end;

for i:=1 to k do writeln(mt[i].tb:3,mt[i].im:6,mt[i].tr:5); writeln;

close(t);

{----------------------------------------расчет ведомости на оплату---------------------------------------------}

assign(v,'ved'); rewrite(v);

sch:=0;szr:=0;snl:=0;zvd:=0;{суммы}

for i:=1 to k do begin

if mr[i].tb=0 then continue; {если номер пуст - пропуск}

mv.tb:=mr[i].tb; mv.ch:=mr[i].ch;

for j:=1 to m do begin {поиск табеля в массиве MT}

if mv.tb=mt[j].tb then begin {расчет}

mv.im:=mt[j].im; mv.zr:=mv.ch*mt[j].tr;

mv.nl:=mv.zr*0.13; mv.vd:=mv.zr-mv.nl;

sch:=sch+mv.ch; szr:=szr+mv.zr;

snl:=snl+mv.nl; zvd:=zvd+mv.vd;

writeln(mv.tb:2,mv.im:5,mv.ch:4,mv.zr:5,mv.nl:5:0,mv.vd:5:0);

write(v,mv); {занесение записи в ведомость Ved}

continue

end;

end; {for j}

end; {for i}

mv.tb:=0; mv.im:='Итог'; mv.ch:=sch; mv.zr:=szr; mv.nl:=snl; mv.vd:=zvd;

write(v,mv); {занесение итоговой записи в ведомость Ved}

{----------------------------------------------печать ведомости-----------------------------------------------------}

reset(v);

writeln(' Платежная ведомость');

writeln('Таб Имя Дни Зарп Налог Выдать');

while not eof(v) do begin

read(v,mv);

writeln(mv.tb:3,mv.im:5,mv.ch:4,mv.zr:6,mv.nl:7:1,mv.vd:7:1);

end;

end.

Задание. Составить программу вычисления суммыS(3х2) двух произвольных матриц А(3х2) и В(3х2) и записи матрицыSв файлsum типаInteger. Составить программу чтения и вывода из файла этой информации.