- •1. Введение
- •2. Простейшие операторы языка
- •3. Организация ветвлений
- •4. Логические функции
- •5. Организация циклов
- •Var X,I: integer;
- •Var X,y,I: integer;
- •Операторы итерационных циклов. Их несколько типов. Оператор цикла с предусловием имеет вид
- •С помощью этого оператора гораздо проще решить пример 5-2 (program p5_2n). Оператор цикла с постусловием:
- •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 I,j,m,n: integer; X:array [1..10] of integer;
- •Var n,I,j,st,kl,k:integer; a:array [1..10,1..10] of integer;
- •7. Символьные данные
- •Var X:string[1]; d:string; I:integer;
- •Var X,n1,n2,k:integer; st,pr:string;
- •8. Графика
- •9. Подпрограммы
- •10. Записи
- •Var X:vr; y:array [1..5] of vr;
- •11. Файлы
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
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(32) и B(32). Составить программу вычисления суммы этих матриц в матрице S(32). Записать матрицу 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.