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

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.

Пример 11-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 полученные данные на экран вместе с общей суммой зарплат бригады.

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

Программа Vedom реализует процесс обработки данных. Программу занесения данных в фалы Rab1, Rab2, Rab3, Tarif напишите сами.

program VEDOM; {программа к примеру 11-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.

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

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

Задание 11.1. Имеются две произвольные матрицы A(32) и B(32). Составить программу вычисления суммы этих матриц в матрице S(32). Записать матрицу S в файл sum.

Задание на курсовую работу

Вариант задания определяется числом, образованным двумя последними цифрами шифра студента, следующим образом. Если это число меньше 20, из перечня вариантов берется вариант с идентичным номером, если больше или равно, то из числа, взятого из шифра вычитается 20 до тех пор, пока не останется число <20. Например, для шифра 55 необходимо выполнить 15-ый вариант (55-20-20=15), для 94 это 94-80=14.

В курсовой работе требуется

I. Составить программу, которая в матрице A(N,N) произвольной размерности разместит в порядке убывания все элементы в направлении указанном на рисунке. Первоначально матрица заполнена случайными целыми числами. В качестве исходных данных сначала удобно брать числа натурального ряда (т.е. 1,2,3,…). Тогда легче выполнять отладку. В программе должна быть предусмотрена выдача на печать исходных и преобразованных матриц. Если решение задачи критично к факту четности/нечетности числа столбцов/строк N, студент сам выбирает этот параметр.

II. Полученные результаты должны быть занесены в последовательный файл и доступны для просмотра из него.

III. Составить программу, которая в графическом режиме рисует таблицу-матрицу (без наполнения), на которой отбражается заданная вариантом траектория движения.

Варианты заданий.

В матрице A(N,N) разместить в порядке убывания все элементы в направлении указанном на рисунке.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Оформление работы. Работа должна содержать формулировку задания, краткие объяснения по его решению и, подробно прокомментированный текст, программы. Следует также нарисовать исходную и преобразованную матрицы (аналогично рисункам к примеру 6.4). Работа должна быть напечатана на листах формата А4 и помещена в пластиковый файл. Каждый оператор программы должен быть размещен на отдельной строке. На титульном листе следует указать обычные реквизиты студента.

При изучении дисциплины кроме материалов, содержащихся в методических указаниях, желательно использовать любую доступную книгу, содержащую сведения по алгоритмическому языку Паскаль.

* * *

Курсовая работа выполняется в межсессионный период и сдается на кафедру. Лабораторные работы являются строго обязательной формой учебного процесса. Их пропуск влечет последующую отработку в дополнительное время.

На кафедре ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ в течение учебного года осуществляются консультации и прием академических задолженностей по понедельникам и пятницам с 17 до 18.30.