Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика ЗКМЗКЕ_1курс / Основы алг-ции и прог-ие.doc
Скачиваний:
80
Добавлен:
05.06.2015
Размер:
1.88 Mб
Скачать
    1. Описание записи (record).

Запись – это структура данных, состоящая из фиксированного числа компонент, называемых полями. Каждое поле имеет свой идентификатор и тип. К компонентам записи возможен прямой доступ и они могут выборочно обновляться. Идентификатор в самой записи должен быть уникальным. Для обращения к отдельным полям записи указываются составные имена: имя записи, после которого ставится точка и записывается идентификатор поля. Запись можно передавать в качестве параметра процедуры или функции, но значением функции запись быть не может.

В общем виде описание типа для записи можно представить:

TYPE <идентификатор типа>= RECORD

<идентификатор 11>[,< идентификатор 12>,…]: <тип 1>;

< идентификатор 21>[,< идентификатор 22>,…]: <тип 2>;

. . .

END;

Например,

TYPE TA= RECORD

P1 : REAL;

P2 : CHAR;

P3 : BYTE

END;

VAR A: ARRAY[1..10] OF TA;

Здесь описан одномерный массив, каждый элемент которого представляет собой запись, имеющую структуру типа TA.

Запись может объявляться и непосредственно в разделе описания переменных.

VAR C : RECORD

P1 : REAL;

P2 : CHAR;

P3 : BYTE

END;

Рассмотрим пример. Дан массив записей со следующей структурой:

  • шифр группы;

  • номер зачетной книжки;

  • код дисциплины;

  • оценка.

Требуется определить средний балл студентов группы ДС101. При вводе массива последняя запись имеет шифр группы «99999».

Program srball;

type zap=record

shg:string[5];

nzk:integer;

kd:1..100;

oc:2..5

end;

var mas:array[1..100] of zap;

k,n,i:byte;

sum:real;

begin

i:=0;

repeat

inc(i);

readln (mas[i].shg, mas[i].nzk, mas[i].kd,

mas[i].oc)

until mas[i].shg='99999';

n:=i; sum:=0; k:=0;

for i:=1 to n do

if mas[i].shg='ДС101' then

begin

sum:=sum+mas[i].oc;

inc(k)

end;

if k<>0 then sum:=sum/k;

writeln ('Средний балл в группе ДС-101=',sum)

end.

    1. Оператор присоединения.

При обращении к компонентам записи используются составные имена. Для сокращения имен и повышения удобства работы с записями применяется оператор присоединения WITH.

WITH <идентификатор переменной типа RECORD> DO

< оператор >;

Тогда в операторе при ссылке на компоненты записи имя переменной можно опускать.

При использовании оператора присоединения фрагмент рассмотренной ранее программы будет выглядеть:

. . .

i:=0;

repeat

inc(i);

WITH MAS[I] DO

readln(shg,nzk,kd,oc)

until mas[i].shg='99999';

n:=i; sum:=0; k:=0;

for i:=1 to n do

WITH MAS[I] DO

if shg='ДС101' then

begin

sum:=sum+oc;

inc(k)

end;

. . .

Возможны вложенные описания записи и вложенные конструкцииWITH. Рассмотрим пример вложенных описаний. Пусть запись о студентах содержит следующие поля:

  • номер по порядку;

  • ФИО (содержит в свою очередь поля – фамилия, имя, отчество),

  • номер зачетной книжки;

  • дата рождения (содержит поля –год, месяц, день).

Тогда в виде графа структуру записи можно изобразить следующим образом:

Программа ввода и подсчета количества введенных записей такой структуры может выглядеть:

uses crt; или uses crt;

type zap=record type zap=record

npp:byte; npp:byte;

fio:record fio:record

f,i,o:string[15]; f,i,o:string[15];

end; end;

nzk:word; nzk:word;

dtr:record dtr:record

g:1970..2000; g:1970..2000;

m:string[3]; m:string[3];

d:1..31 d:1..31

end; end;

end; end;

var a:zap; var a:zap;

k,n:byte; k,n:byte;

begin clrscr; begin clrscr;

k:=0; k:=0;

with a do with a,fio,dtr do

with fio do repeat

with dtr do inc(k);

repeat writeln('ввод ');

inc(k); readln(npp);

writeln('ввод '); readln(f);

readln(npp); readln(i);

readln(f); readln(o);

readln(i); readln(nzk);

readln(o); readln(g);

readln(nzk); readln(m);

readln(g); readln(d);

readln(m); until d=99;

readln(d); writeln(k);

until d=99; readkey

writeln(k); end.

readkey

end.