Язык программирования TurboPascal
- Григоренко Г. Н.
- Просмотров: 6890
Turbo Pascal. Записи
Запись - структура данных, состоящая из фиксированного числа элементов разного типа
Записи позволяют объединить в одну группу различные по типу и смыслу элементы.
Элементы, составляющие запись называются полями записи. В отличие от массива поля записи могут быть разного типа. В записи каждое поле имеет собственное имя. Чтобы описать запись, необходимо указать ее имя, имена полей и их типы.
Формат записи:
Type
<имя записи>=Record
<поле 1>:<тип 1>
<поле 2>:<тип 2>
<поле N>:<тип N>
end;
Служебное слово Record (запись) выполняет роль открывающей скобки, а оператор end – закрывающей скобки.
Понятие записи рассмотрим на примере ведомости списка учащихся с оценками.
№ | Фамилия И.О. | Оценка№1 | Оценка №2 | Оценка №3 |
1 | Иванов И.И. | 5 | 4 | 3 |
2 | Степанов С.С. | 4 | 4 | 4 |
3 | Петров П.П. | 5 | 5 | 5 |
4 | Сидоров С.С. | 3 | 4 | 3 |
Каждая строка в этой ведомости состоит из данных разного типа:
а) Порядковый номер – целое число;
б) Фамилия И.О. – строка символов;
в) Оценки – целое число.
Эти данные можно объединить в одну группу, называемой записью.
Введем обозначения:
Ved – имя записи,
N – номер записи,
Fio – фамилия и инициалы,
Mark – оценки.
Наша ведомость, представленная в таблице, состоит из четырех записей, которые представляются массивом записей. Рассмотрим, каким образом описать дну запись и массив записей.
Одна запись описывается следующим образом:
Type
Tved = Record
n:integer;
fio:string[30];
mark:array[1..3] of integer;
end;
Var
Ved of of Tved;
Обращения к записи записывается так:
Формат обращения:
<имя переменной>.<имя поля>
Пример
Ved.fio:=’Иванов И.И.’;
Ved.mark[1]:=4;
Ved.mark[2]:=4;
Ved.mark[3]:=5;
Массив записей объявляется следующим образом.
Var
klass:array[1..4] of Tved;
При работе с массивами записей доступ к элементам возможен двумя способами:
1. Обычный – ранее рассмотренный
for i:=1 to 4 do
begin
readln(klass[i].fio;
readln(rlass[i].mark[1];
readln(rlass[i].mark[2];
readln(rlass[i].mark[3];
end;
2. С использованием оператора присоединения, который позволяет осуществить доступ к полям, таким образом, как если бы они были простыми переменными.
Формат оператора
with <имя записи> do
begin
<оператор>
<оператор>
end;
Пример.
for i:=1 to 4 do
with klass[i] do
begin
readln(fio);
readln(mark[1];
readln(mark[2];
readln(mark[3];
end;
ЗАДАЧА 1. Написать программу, которая описывает ведомость успеваемости учебной группы. Ведомость содержит: фамилии учащихся, три оценки за последнюю четверть. Программа должна обеспечить ввод, вывод информации и вычисление средней оценки каждого учащегося.
Program zap2
Type
Tved = record
fio:string[30]; {фио}
mark:array[1..3] of integer; {оценки}
sr:real; {средняя оценка}
End;
Tklass=array[1..30] of Tved;
function readmark( var n:integer):integer {функция ввода оценок}
begin
repeat
readln(n);
if ((n5))then writeln('Ошибка, повторите ввод!') else readmark:=n;
until ((n>0) and (n<6));
End;
var
kol:integer; {кол-во учащихся}
klass: Tklass;
i:integer;
begin
writeln('Введите количество учащихся kol<=30:');
readln(kol);
writeln('Введите данные учащихся:');
for i:=1 to kol do
with klass[i] do {ввод исходных данных c клавиатуры с помощью оператора with}
begin
nz:=i
writeln('Введите ФИО: '); readln(fio);
writeln('Введите 1 оценку: ');
readmark(mark[1]);
writeln('Введите 2 оценку: ');
readmark(mark[2]);
writeln('Введите 3 оценку: ');
readmark(mark[3]);
sr:= (mark[1]+mark[2]+mark[3])/3;
End;
for i:=1 to kol do
with klass[i] do begin {вывод исходных данных на экране с помощью оператора with}
writeln(i,fio:30,mark[1]:6,mark[2]:6,
mark[3]:6,sr:6:2)
end
end.
Результат работы программы:
1 Петров Ф.П. 3 4 4 3.67
2 Сидоров С.С. 4 4 4 4.00
3 Степанов С.С. 4 5 5 4.67
ЗАДАЧА 2. Разработать программу «Учет товаров». Программа должна создавать файл, содержащий: наименование, стоимость и количество товара. Программа должна иметь меню, позволяющее выполнять следующие операции с файлом: чтение товара из файла, запись товара в файл, изменение характеристик товара, добавление товара в файл, удаление товара из файла.
Program zap_file;
type
TF=record
name:string[20];
price:integer;
count:integer;
end;
var
fz:file of TF;
zap:TF;
v:integer;
{-----процедура записи в файл------}
procedure fwrite;
var
ch:char;
begin
{открываем файл для записи (создаем)}
rewrite(fz);
writeln('окончание ввода в файл - 0');
repeat
{ввод исходных данных c клавиатуры с помощью оператора with}
with zap do begin
write('Введите наименование: '); readln(name);
write('Введите стоимость: '); readln(price);
write('Введите количество: '); readln(count);
end;
{занесение записи в файл}
write(fz,zap);
writeln('Continue? (y/n)');
readln(ch);
until ch='n';
end;
{-----процедура чтения записей из файла------}
procedure fread;
var
i:integer;
begin
{открываем файл для чтения}
reset(fz);
{читаем запись из файла}
i:=0;
while not eof(fz) do begin
i:=i+1;
read(fz,zap);
{вывод записи с помощью оператора with}
with zap do begin
writeln(i:3,name:15,price:10,count:6);
end;
end;
{закрываем файл}
close(fz);
end;
{-----процедура добавления записей в файл------}
procedure fappend;
var
ch:char;
begin
{открываем файл для чтения}
reset(fz);
writeln('окончание ввода в файл - 0');
{ устанавливаем указатель последнею запись в файле}
seek(fz,filesize(fz));
repeat
{ввод исходных данных c клавиатуры с помощью оператора with}
with zap do begin
write('Введите наименование: '); readln(name);
write('Введите стоимость: '); readln(price);
write('Введите количество: '); readln(count);
end;
{занесение записи в файл}
write(fz,zap);
writeln('Continue? (y/n)');
readln(ch);
until ch='n';
{закрываем файл}
close(fz);
end;
{-----процедура изменения записи в файле------}
procedure fcorrect;
var
ch:char;
n:integer;
begin
{ перед изменением записи - выводим все записи на экран}
fread;
reset(fz); {открываем файл для чтения}
writeln('окончание ввода в файл - 0');
writeln('Введите номер записи для изменения: ');
readln(n);
seek(fz,n-1);{устанавливаем указатель на требуемую запись в файле}
repeat
{читаем с клавиатуры новые значения}
with zap do begin
write('Введите наименование: '); readln(name);
write('Введите стоимость: '); readln(price);
write('Введите количество: '); readln(count);
end;
{новую запись записываем на место старой записи}
write(fz,zap);
writeln('Continue? (y/n)');
readln(ch);
until ch='n';
end;
{-----процедура удаления записи из файла------}
procedure del;
var
k, n:integer;
j,i:integer;
f:file of TF;
begin
{подготовка к удалению записей: переименование исходного
файла и открытие нового файла с тем же именем}
rename(fz,'sclad.bak'); {переименовываем файл}
reset(fz); {открываем файл для чтения}
assign(f,'sclad.dat'); {связываем новый файл с переменной}
rewrite(f); {открываем новый файл для записи}
write('Введите номер удаляемой записи n= ');
readln(n);
i:=0;
while not eof(fz) do begin
{читаем запись из файла}
read(fz,zap);
{если запись не подлежит удалению, то записываем ее в новый файл}
if in-1 then write(f,zap);
i:=i+1;
end;
close(fz); {закрываем файлы}
close(f);
reset(f); {открываем новый файл для чтения}
rewrite(fz); {открываем старый файл для записи}
while not eof(f) do begin
{записываем данные в старый файл}
read(f,zap); write(fz,zap);
end;
close(fz); {закрываем файлы}
close(f);
erase(f); {удаляем новый файл}
rename(fz, 'sclad.dat'); {переименовываем файл}
end;
begin
Assign(fz,'sclad.dat');
repeat
writeln(' MENU ');
writeln('1-Write '); {запись в файл}
writeln('2-Read '); {чтение записей из файла}
writeln('3-Append '); {добавление записей в файл}
writeln('4-Correct'); {изменение записи в файле}
writeln('5-Del '); {удаление записи из файла}
writeln('6-Exit '); {выход из меню}
readln (v);
case v of
1: fwrite;
2: fread;
3: fappend;
4: fcorrect;
5: del;
6: exit;
end;
until v=6;
end.