Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УПП Программирование 2102,2202.doc
Скачиваний:
17
Добавлен:
20.04.2015
Размер:
760.32 Кб
Скачать

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. Составить программу чтения и вывода из файла этой информации.

10. ПОДПРОГРАММЫ

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

PROCEDURE имя_процедуры (список_параметров)

FUNCTION имя_функции (список_параметров): тип_результата

Внутрь подпрограмм через список параметров передаются пере­менные для обработки. Для каждой из них указывается тип. Функция отличается от проце­дуры тем, что результат переда­ется через ее имя. Ниже приведены примеры процедуры и функции, выполняющие одну и ту же операцию суммирования.

procedure Sum(x,y,s:real); function Sum(x,y:real):real;

begin begin

s:=x+y sum:=x+y

end; end;

Для обращения к процедуре нужно использовать оператор вида sum(a,b,c). Здесь переменные a,b,c называются фактическими пара­метрами, x,y,z – фор­мальными. При исполнении процедуры значения a,b присваиваются перемен­ным x,y и выполняются вычисления. Их результат через переменную с передается в вызывающую процедуру. К функции можно обращаться, используя оператор вида c:=sum(a,b).

Задание 10.1. Вычислить N элементов ряда:

y=x11!/2!–x32!/3!+x43!/4!–x54!/5!+... для Х<1 в двух вариантах.

При вычислении факториала использовать: 1). процедуру, 2). функцию.

11. ГРАФИКА

Графический режим ПК зависят от типа монитора и видиоадап­тера. Мы будем использовать лучший доступный в Паскале режим: VGA, максимальное разрешение 640х480 точек (пикселей), 16 цветов. Соответствующий драйвер находится в файле EgaVga.bgi. Графичес­кий режим определяет команда

InitGraph(драйвер, мода, путь_к_файлу_драйвера)

здесь: драйвер – номер драйвера (для VGA это 9), мода – номер режима (для 640х480 это 2), путь к файлу драйвера на диске. Если файл находится в директории Паскаля, путь можно не указывать, а ввести пустые кавычки. Параметры драйвер и моду можно не задавать. Тогда они будут определены автоматически.

Возврат в текстовый режим экрана:

CloseGraph

Отсчет экранных координат начинается с левого верхнего угла: Х – вправо, Y – вниз.

 Паскаль располагает функциями, позволяющими осуществ­лять элемен­тарные графические построения:

GetMaxY

Вертикальный размер экрана по оси Y

(в режиме VGA =479, поскольку отсчет точек от 0).

GetMaxX

Горизонтальный размер экрана по оси Х

(в режиме VGA =639, поскольку отсчет от 0).

MoveTo(x,y)

Переместит курсор в позицию x,y.

MoveRel(dx,dy)

Переместит курсор от текущей точки

на расстояние dx,dy.

ClearDevice

Очищает экран.

PutPixel(x,y,цвет)

Выводит заданным цветом точку в координатах x,y.

Line(x1,y1,x2,y2)

Проводит прямую от точки с координатами

x1,y1 до x2,y2

LineTo(x,y)

Проводит прямую от текущей точки до точки

с координатами x,y.

LineRel(dx,dy)

Проводит прямую от текущей точки на

расстояние dx,dy.

Rectangle(x1,y1,

x2,y2)

Строит контур прямоугольника с координатами левого верхнего (x1,y1) и правого нижнего (x2,y2) углов.

Bar(x1,y1,x2,y2)

Закрашивает прямоугольную область с координата­ми левого верхнего (x1,y1) и правого нижнего (x2,y2) углов, установленным командой SetFillStyle, цветом.

Cyrcle(x,y,r)

Строит круг с центром в точке x,y и радиусом r.

Ellipse(x,y, угол1,

угол2,Rx,Ry)

Строит эллиптическую дугу с центром в точке x,y от начального угла1 (в градусах) до угла2. Rx и Ry задают горизонтальный и вертикальный радиусы эллипса.

PieSlice(x,y,

угол1,угол2,r)

Строит сектор круга с центром в точке х,у радиусом r от угла1 (в целых градусах) до угла2.

Заполнение и закрашивание секторов

осуществляется функцией SetFillStyle.

SetFillStyle(

заполнение,

цвет)

Определяет тип заполнения (0 нет, 1 сплошное, 2 горизонтальное, 3 штриховка /, 4 толстая штриховка / , 5 толстая штриховка \, 6 штриховка \, 7 +, 8 x, 9 клетка, 10 точки, 11 частые точки) и цвет заполнения фигур.

SetColor(цвет)

Устанавливает текущий цвет линий и символов: Black – 0, Blue – 1, Green – 2, Cyan – 3, Red – 4, Magenta – 5, Brown – 6, LightGray – 7, DarkGray – 8, LightBlue – 9, LightGreen – 10, LightCyan – 11, LightRed – 12, LightMagenta – 13, Yellow – 14, White – 15.

SetBkColor(

цвет)

Устанавливает текущий цвет фона.

SetLineStile(тип,

вид, толщина)

Устанавливает стиль линий. Тип: 0 – сплошная ли­ния, 1– точечная, 2 – штрих-пунктир, 3 – пунктир. Вид: 0. Толщина: 1 или 3 пикселя.

 Тест. 11.1. Какую фигуру нарисует компьютер? 1). Крест, Квадрат, 3). Ромб.

moveto(0,0); lineto(10,0); lineto(10,10);lineto(0,10);lineto(0,0);

Пример 11-1. Нарисовать на экране: 1). Две диагонали, пересекающиеся в центре. 2) Четыре концентри­ческих окружности с центрами в центре экрана и радиусами 50, 100, 150, 200.

PROGRAM P11_1;

uses graph;