- •Www.Msta.Ru
- •Москва – 2005
- •1 Цель и задачи дисциплины
- •2 Тематическое содержание программы
- •3 Перечень рекомендуемых лабораторных работ
- •4 Экзаменационные вопросы по дисциплине
- •1. Введение
- •Var a,d: integer; X: real; d: string;.
- •2. Простейшие операторы языка
- •3. Организация ветвлений
- •Var a,b,c: real;
- •4. Логические функции
- •5. Организация циклов
- •Program p5_2; {другой вариант}
- •Var X,y: real;
- •С помощью этого оператора гораздо проще решить пример 5-2 (program p5_2). Оператор цикла с постусловием:
- •6. Массивы
- •Var X,z: array [1..8] of real;
- •Var I,j: integer;
- •Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;
- •Var n,I,j,st,kl,k:integer;
- •7. Символьные данные
- •Var n:integer;y:string;
- •Var X:string[1]; d:string; I:integer;
- •8. Записи
- •Var X:vr; y:array [1..5] of vr;
- •9. Файлы
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
- •10. Подпрограммы
- •11. Графика
- •Var d,I,m,rx,ry:integer;
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real; msy,msx:real;
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. Составить программу чтения и вывода из файла этой информации.