
- •1. Введение
- •2. Операторы языка
- •Var Описание переменных;
- •3. Организация ветвлений
- •4. Логические функции
- •5. Организация циклов
- •Оператор цикла с предусловием имеет вид
- •Var I,j:integer; X,y,r:real;
- •Program p5_8;
- •Var y,X,z: integer;
- •6. Массивы
- •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;
- •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. Файлы
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •10. Подпрограммы
- •11. Графика
- •Var d,I,m,rx,ry:integer;
- •Initgraph(d,m,''); {переход в графику}
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real; msy,msx:real;
Какую работу нужно написать?
8. Записи
М
TYPE
имя типа=RECORD
описание
элементов записи
END;
t
Пример(справа).
Здесь сначала описан тип записиVr,
состоящей из полей:tab,
im, tarif,
dnсоответствующих
типов. Затем в разделеVarописаны уже конкретные (рабочие) записи:Xи массив записейY.
Обращаться к элементам записей нужно,
используя полное имя (имя
записи.имя поля),
напримерx.tarif,
x.im.
А для массива записей нужно указывать
и индекс:y[3].tarif.
Записи удобно использовать при работе
с файлами.
tab: integer; {табель}
im: string[4]; {имя}
tarif, dn: real
end;
Var X:vr; y:array [1..5] of vr;
9. Файлы
Информация в компьютере хранится в файлах (обычно на диске). Файловая система состоит из двух уровней: физического файла и логического файла. Физический файл – это собственно файл данных на диске, порт, принтер, любое устройство. Логический файл – файловая переменная (типа String), описанная в программе в разделе переменных. В зависимости от способа объявления формируется один из следующих типов файлов:
1. Типизированные файлы. Состоят из данных одного, объявленного типа.
Объявление файла: [имя]: file of [тип]; Примеры: A: file of string[80]; F1: file of char; F2: file of real;
2. Текстовые файлы. Состоят из символов. Объявление текстового файла: [имя]: text;. Пример:f3:text;
В типизированных файлах информация хранится в двоичном виде, а в текстовых – в естественном. Элемент файла – запись (не путать с понятием record). Обычно, это строка файла.
Подлинное имя дискового файла используется только чтобы связать его с внутренним именем в программе, с которым она далее и работает. Для работы с файлами всех типов используется ряд процедур и функций:
assign(фп, файл) |
Связывает файл с файловой переменной (ФП). |
reset(фп) |
Открывает существующий файл для чтения из него. |
rewrite(фп) |
Создает и открывает файл для записи в него. |
close(фп) |
Закрывает файл. |
erase(фп) |
Стирает файл (файл должен быть закрыт). |
eof(фп) |
Признак конца файла (True, если конец). |
Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
read(f,x1,x2,…xn) или readln(f,x1,x2,…xn)– чтение информациих1,х2,…,xnиз логического файлаf.
write(f,x1,x2,…xn) или writeln(f,x1,x2,…xn)– запись информациих1,х2,… хnв логический файлf.
Для управления текстовыми файлами используется процедуры и функции:
append(фп) |
Открывает файл для дополнения. |
eoln(фп) |
Признак конца строки (True, если конец). |
read(фп,переменные) |
Считывает данные из файла. |
readln(фп,переменные) |
Считывает данные из файла, переходит на следующую строку. |
write(фп,переменные) |
Записывает данные в файл. |
writeln(фп,переменные) |
Записывает данные в файл, переходит на следующую строку. |
Для нетекстовых файлов:
filesize(фп) |
Число записей в файле. |
filepos(фп) |
Номер текущей записи. |
seek(фп,номер) |
Устанавливает указатель на запись с заданным номером. |
truncate(фп) |
Усекает файл до текущей позиции. |
Различают два способа доступа к файлам. Последовательный, когда к конкретной записи можно перейти, только перебрав все предыдущие, и прямой (или произвольный) доступ к любой записи по ее номеру. Текстовые файлы могут иметь в каждой строке записи произвольной длины и поэтому реализуют только последовательный доступ. Другие типы файлов имеют записи фиксированной длины. В виду этого здесь можно вычислить положение любой записи на диске, т.е. организовать прямой доступ.
Задача 9-1.а). Вычислить по точкам функциюy=x/2 дляx=0,0.5,1.0,…..4 и записать результаты в текстовый файл с именемfunc. Текстовый файл удобен тем, что его можно просмотреть в любом текстовом редакторе и, при желании откорректировать данные. Файлу не обязательно иметь расширение. Мы придали ему расширениеtxtс тем, чтобы проще было его просматривать в Проводнике илиWinCommander(эти программы для файлов с расширениемtxtавтоматически вызывают Блокнот). Физическому файлу дадим имяfunc.txt, а логическому имяf,и именно с ним будем работать.
б). Cоставить программу чтения из файлаfunc.txtзаписанной ранее в него информации.
program 9_1a;{запись вычисленной функции в файл} var f:text; {объявлен текстовый логический файл f} x,y:real; begin {логический файл f связывается с физическим func.txt} assign(f,'func.txt'); rewrite(f); {файл f открывается для записи в него} x:=0; while x<=4 do begin {вычисление в цикле функции} y:=x/2; x:=x+0.5; writeln(f,x:3:1,y:4:1); {запись в файл переменных х и у} end; close(f); {закрытие файла} end. |
program 9_1b;{чтение записанных ранее данных из файла} var f:text; {объявлен текстовый файл f} x,y:real; i:integer; begin assign(f,'func.txt'); reset(f); {открытие файла для чтения} for i:=1 to 9 do begin read(f,y,x); {чтение из файла в память} {вывод на монитор, считанной из файла информации} writeln('y=',y:3:1,' x=',x:4:1); end; close (f); {закрытие файла} end. | ||||||||||
|
|
|
|
|
|
|
|
|
| ||
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
|
файл |
Vir |
|
|
|
файл |
Ved |
|
|
tab |
im |
tarif |
dn |
|
im |
zar |
nalog |
vid |
таб |
имя |
тариф |
дни |
|
имя |
зарплата |
налог |
выдать |
35 |
Иван |
100 |
20 |
|
Иван |
2000 |
|
|
48 |
Петр |
150 |
30 |
|
Петр |
4500 |
|
|
15 |
Олег |
200 |
10 |
|
Олег |
3000 |
|
|
program Vvod; {ввод данных и сохранение результата} uses crt; {к задаче 9-2} const n=3; type vr=record {объявление записи для Выработки} tab: integer; {табель} im: string[4]; {имя} tarif, dn: real; end; vd=record {объявление записи для Ведомости} 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;{вывод данных по запросу} uses crt; {к задаче 9-2} 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 ведомости на оплату, где будут собраны сведения о всех работниках и сделаны необходимые вычисления. Последовательность действий:
1. Предварительно создать на диске и заполнить файлы с именами Rab1, Rab2, Rab3 и Tarif.
2. Последовательно считать все три файла в массив Mr[1..15].
3. Отсортировать массив по табельному номеру (по полю mr.tb). Повторяющиеся номера объединить (часы суммируются) в одну строку.
4. Считать файл Tarif в массив Mt[1..6]. Исходя из индивидуальных тарифов, рассчитать зарплату, налог и сумму к выдаче каждого и записать это в файл Ved.
5. Вывести из Ved полученные данные на экран вместе с общей суммой зарплат бригады.
Исходные данные и результаты показаны ниже. Над колонками приведены названия полей, принимающих соответствующие данные.
файл |
Tarif |
|
|
файл |
Rab1 |
|
файл |
Rab2 |
|
файл |
Rab3 |
|
файл |
Ved |
|
|
|
|
tb |
im |
tr |
|
tb |
ch |
|
tb |
ch |
|
tb |
ch |
|
tb |
im |
ch |
zr |
nl |
vd |
таб № |
имя |
тариф |
|
таб № |
часы |
|
таб № |
часы |
|
таб № |
часы |
|
таб № |
имя |
часы |
заработок |
налог |
выдать |
35 |
Иван |
50 |
|
8 |
30 |
|
15 |
40 |
|
35 |
50 |
|
8 |
Лена |
120 |
3000 |
390,0 |
2610,0 |
48 |
Петр |
30 |
|
20 |
50 |
|
48 |
20 |
|
8 |
40 |
|
15 |
Олег |
50 |
1000 |
130,0 |
870,0 |
8 |
Лена |
25 |
|
15 |
10 |
|
35 |
10 |
|
|
|
|
20 |
Вася |
50 |
1750 |
227,5 |
1522,5 |
20 |
Вася |
35 |
|
|
|
|
8 |
50 |
|
|
|
|
35 |
Иван |
60 |
3000 |
390,0 |
2610,0 |
15 |
Олег |
20 |
|
|
|
|
|
|
|
|
|
|
48 |
Петр |
20 |
600 |
78,0 |
522,0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
всего |
300 |
9350 |
1215,5 |
8134,5 |
массив |
MT |
|
|
|
|
|
массив |
MR |
|
|
|
|
|
|
|
|
|
|
tb |
im |
tr |
|
|
|
|
tb |
ch |
|
|
|
|
|
|
|
|
|
|
Программа 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.
Задание. Составить программу вычисления суммыS(3х2) двух произвольных матриц А(3х2) и В(3х2) и записи матрицыSв файлsum типаInteger. Составить программу чтения и вывода из файла этой информации.