Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1 курс / метод указания / Программирование в интегрированной среде Turbo Pascal. Учебное пособие.doc
Скачиваний:
116
Добавлен:
08.06.2015
Размер:
1.51 Mб
Скачать

10. Программирование с использованием записей

Для обработки информации, содержащей данные разных типов, в ТР используется структурированный тип, который получил название запись. Такой тип является основой баз данных.

Запись – это структура данных, состоящая из заранее определенного количества компонент, называемых полями.

Общий вид записей:

Type<имя типа> =record<список полей>end;

или в развернутой форме:

Type V=record

P1 :T1; {V– имя типа,

∙ ∙ ∙ ∙ ∙ ∙ Pi– имя поля,

Pn:Tn;Ti– тип поля}

end;

Например:

Type Birthday = record

date : 1..31;

month : 1..12;

year : word;

end;

Var

a , b : Birthday;

Доступ к каждому из полей записи осуществляется с использованием составного имени в виде:

<имя переменной> . <имя поля>.

Например:

a .date := 20;

a .month := 11;

a .year := 1982;

Поля могут быть вложены друг в друга, тогда поля в составном имени необходимо описывать последовательно, начиная с внутреннего.

Например, предыдущее определение типа можно дополнить следующим описанием:

Type anketa = record

name : string;

bd : Birthday;

end;

Var c : anketa;

В результате составное имя будет содержать больше полей.

Например:

c.name:= ’Иванов’;

c.bd.date:= 15;

c.bd.month:= 9;

. . . . . . . . . . . . . . . . . . .

Все значения полей одной переменной типа запись можно присваивать соответствующим полям другой переменной того же типа одним оператором присваивания:

b:=a;

С внутренними полями записи можно выполнять любые операции, применимые к типу этих полей.

Ввод записей осуществляется только по внутренним полям с помощью операторов Read иReadln.

Например:

readln (c.name);

read (c.bd.date);

read (c.bd.month);

readln (c.bd.year);

Вывод значений ведется также по внутренним полям с помощью операторов Write иWriteln.

Например:

Writeln (c.name,’ родился ’,c.bd.date,’.’,c.bd.month,’.’,c.bd.year, ’ г.’);

Для упрощения доступа к полям записи используется оператор присоединения With, который применяется, когда идет работа с одной конкретной переменной типаrecordили ее полями.

With N do begin

P1 := W1; {N – имя записи,

∙ ∙ ∙ ∙ ∙ ∙ Pi –поле записи,

Pn := Wn; Wi – выражение}

end;

Например:

With c.bd do begin

date:= 15;

month:= 11;

year:= 1982;

end;

Для удобства отладки программ, использующих записи, целесообразно использовать типизированные константы-записи. При этом перед определением типизированной константы-записи следует описать соответствующий тип-запись.

Список значений полей в определении констант-записей имеет следующий вид: имя поля, двоеточие и константа. Элементы списка отделяются друг от друга точкой с запятой.

Например:

type

anketa = record

fio : string [20];

year : 1970..2000;

end;

const

first : anketa = (fio : 'Иванов' ; year : 1985);

Поля должны указываться в той последовательности, в какой они перечислены в объявлении типа.

Пример. Составить программу, которая позволяет организовывать список в виде массива записей, содержащий информацию о товарах (наименование, цена и количество), и сортировать этот список:

а) по алфавиту наименования товара;

б) по убыванию цены товара;

в) по убыванию числа единиц товара.

Вывести отсортированный список на печать.

Исходные данные:

Наименование товара

Цена

Количество

1

2

3

4

5

Карандаш

Ручка

Линейка

Ластик

Тетрадь

1.50

3.40

0.85

1.00

1.20

12

20

10

25

30

program Zapisi;

uses Printer;

const n=5;

type tovar=record t:string[10]; {наименование товара}

p:real; {цена товара}

k:byte; {количество единиц товара}

end;

massiv=array[1..n]of tovar;

var sp:massiv;

x:tovar;

i,j:byte;

{процедура вывода списка товаров}

Procedure Output(spis:massiv);

begin

for i:=1 to n do

writeln(i,'.',spis[i].t:10,' ',spis[i].p:4:2,' ',

spis[i].k);

writeln;

end;

{процедура сортировки товаров: при ch='t' - по алфавиту,

при ch='p' - по убыванию цены,

при ch='k' - по количеству}

Procedure Sort(ch:char; var spis:massiv);

var y:tovar;

begin

for i:=1 to n-1 do

for j:=i+1 to n do

begin

if (ch='t')and(spis[i].t>spis[j].t) or

(ch='p')and(spis[i].p<spis[j].p) or

(ch='k')and(spis[i].k<spis[j].k)

then

begin

y:=spis[i]; spis[i]:=spis[j]; spis[j]:=y;

end;

end;

end;

BEGIN

{Ввод списка товаров}

for i:=1 to n do

begin

write('товар',i,':');readln(sp[i].t);

write('цена',i,':');readln(sp[i].p);

write('кол-во',i,':');readln(sp[i].k);

end;

writeln('сортировка по алфавиту');

Sort('t',sp); {Сортировка списка}

Output(sp); {Вывод отсортированного списка}

writeln('сортировка по убыванию цены');

Sort('p',sp); {Сортировка списка}

Output(sp); {Вывод отсортированного списка}

writeln('сортировка по количеству');

Sort('k',sp); {Сортировка списка}

Output(sp); {Вывод отсортированного списка}

readln;

END.

Результаты:

сортировка по алфавиту

1. Карандаш 1.50 12

2. Ластик 1.00 25

3. Линейка 0.85 10

4. Ручка 3.40 20

5. Тетрадь 1.20 30

сортировка по убыванию цены

1. Ручка 3.40 20

2. Карандаш 1.50 12

3. Тетрадь 1.20 30

4. Ластик 1.00 25

5. Линейка 0.85 10

сортировка по количеству

1. Тетрадь 1.20 30

2. Ластик 1.00 25

3. Ручка 3.40 20

4. Карандаш 1.50 12

5. Линейка 0.85 10

!! Введите текст программы Zapisi в компьютер, осуществите ее компиляцию, запустите на счет и просмотрите результаты.

Соседние файлы в папке метод указания