- •Министерство образования российской федерации
- •Var X,y: real;
- •Var X,y: real;
- •Var t:integer; p:char;
- •0..17: Write('детство');
- •20..30: Write('молодость');
- •31..54: Write('зрелость');
- •Var s:char;
- • Оператор цикла с предусловием имеет вид
- •Program p5_8;
- •Var y,X,z: integer;
- •Var I,j:integer; X,y,r:real;
- •Var I,j: integer;
- •Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;
- •Var I,j,n,m: integer;
- •X:array [1..10] of integer;
- •Var n,I,j,st,kl,k:integer;
- •Var st: char; sm: string[32]; ss: string;
- •Var n:integer;y:string;
- •Var k,I:integer; X: string;
- •Var X:string[1]; d:string; I:integer;
- •Var X:vr; y:array [1..5] of vr;
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
- •Im:string[4]
- •Im:string;
- •Var d,I,m,rx,ry:integer;
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real;
- •Ответы на тестовые задания, имеющиеся в тексте пособия:
- •& Тесты по курсу
- •Тираж: 150. Заказ №
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;