Top.Mail.Ru

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.