Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прграммирование и основы алгоритмизации. Прграм...doc
Скачиваний:
1
Добавлен:
23.09.2019
Размер:
839.68 Кб
Скачать

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; {вывод данных по запросу к примеру 9-2}

uses crt;

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 ведомости на оп­лату, где будут собраны сведения о всех работниках и сделаны необходимые вычисле­ния.

файл

Tarif

файл

Rab1

файл

Rab2

файл

Rab3

tb

im

tr

tb

ch

tb

ch

tb

ch

таб №

имя

тариф

таб №

часы

таб №

часы

таб №

часы

35

Иван

50

8

30

15

40

35

50

48

Петр

30

20

50

48

20

8

40

8

Лена

25

15

10

35

10

20

Вася

35

8

50

15

Олег

20

массив

MT

массив

MR

tb

im

tr

tb

ch

файл

Ved

tb

im

ch

zr

nl

vd

таб №

имя

часы

з

арплата

налог

выдать

8

Лена

120

3000

390,0

2610,0

15

Олег

50

1000

130,0

870,0

20

Вася

50

1750

227,5

1522,5

35

Иван

60

3000

390,0

2610,0

48

Петр

20

600

78,0

522,0

всего

300

9350

1215,5

8134,5

Рис.

9.2

Последовательность действий:

1. Предварительно создать на диске и заполнить файлы с именами Rab1, Rab2, Rab3 и Tarif.

2. Последовательно считать все три файла в массив Mr[1..15].

3. Отсортировать массив по табельному номеру (по полю mr.tb). Повторяю­щиеся номера объединить (часы суммиру­ются) в одну строку.

4. Считать файл Tarif в массив Mt[1..6]. Исходя из индивидуальных тарифов, рассчитать зарплату, налог и сумму к выдаче каждого и записать в файл Ved.

5. Вывести из Ved полученные данные на экран вместе с общей суммой зарплат бригады.

Исходные данные и результаты показаны на рис 9.2. Над колонками приведены названия полей, принимающих соответствующие данные.

Программа 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.

Замечание. Предложенное решение имеет недостаток. Хотя данные и хранятся в файлах, обрабатываются они в массивах. Т.е., если объем данных велик и они не могут быть размещены в основной памяти (в виду ограни­ченности ее размера), этот метод непригоден. На практике, возможно, придется обрабатывать данные непосредственно в файлах.

В приведенной программе для наглядности предусмотрен вывод всех про­межуточных данных.

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