Конспект по теме: «Записи в Паскале» - davaiknam.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Строки в Pascal Строковый тип данных в Паскале Строки в Паскале –... 1 59.74kb.
Справочник по программированию на Паскале. Описание языка не является... 1 104.36kb.
Конспект урока по теме «Summer Holidays» 1 47.84kb.
Урок по теме «cinema» Конспект открытого урока английского языка... 1 37.75kb.
Конспект внеклассного занятия по теме: «Прогулка в лесное царство» 1 58.01kb.
Конспект по теме «Правление Петра I» с опорой на предложенные вопросы... 1 32.68kb.
Конспект занятия по учебной дисциплине «Психология» 3 курс по теме... 1 153.18kb.
Конспект урока в 8 классе по теме «Тире между подлежащим и сказуемым» 1 82.45kb.
Конспект интегрированного занятия по теме «Русское искусство второй... 1 44.15kb.
План-конспект урока по теме: «Функциональная схема компьютера» 1 79.19kb.
Системы коммутации линий и записи переговоров Система записи переговоров... 1 145.24kb.
Ростсельмаш и Gregoire Besson готовятся установить мировой рекорд 1 14.4kb.
Направления изучения представлений о справедливости 1 202.17kb.

Конспект по теме: «Записи в Паскале» - страница №1/1


Конспект по теме: «Записи в Паскале»

Учитель информатики: Батракова Л.В.

_____________________________________________________________________________________

Массив описывает набор однотипных компонент, но иногда надо решать задачи, где используются данные разных типов, жестко связанные между собой. В этом случае используются записи. Они, как и массивы, относятся к произвольным сложным (структурированным) типам.



Определение: Запись – непрерывная последовательность разнотипных компонент, имеющая имя.
Описание записи в Паскале

Произвольный тип запись (Record) описывается следующим образом:


TYPE TZ = record

<имя_поля_1>: <тип_ поля_1>;

<имя_поля_2>: <тип_поля_2>;



<имя_поля_n>: <тип_поля_n>



end;
где: TZ – идентификатор типа, задается пользователем по правилам написания идентификатора;

имя_поля – идентификатор части записи, предназначенной для размещения информации, задается пользователем;

тип_поля показывает, какую информацию можно помещать в данное поле, определяется синтаксисом языка Паскаль. Тип поля может быть любым, кроме типа file.

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

Например, анкетные данные о студенте вуза могут быть представлены в виде информационной структуры



Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа record. Описание анкеты студента в Паскале будет выглядеть так:

Type anketa=record

fio: string[45];

pol: char;

dat_r: string[8];

adres: string[50];

curs: 1..5;

grupp: string[3];

end;


Var stud:anketa;
Так как произвольный тип может быть описан как в разделе типов, так и в разделе описания переменных, то возможно следующее описание:
Var stud: record

fio: string[45];

pol: char;

dat_r: string[8];

adres: string[50];

curs: 1..5;

grupp: string[3];

end;


Так как поля записи Паскаля могут иметь любой тип, в частности, сами могут быть записями. Такая возможность используется в том случае, когда требуется представить многоуровневое дерево (более 2 уровней). Например, те же сведения о студентах можно отобразить трехуровневым деревом.

В этом случае запись можно описать двумя способами:



1-ый способ:

Type anketa1=record

fio: string[45];

pol: char;

dat_r: record;

god: integer;

mes: string[10];

den: 1..31;

end;

adres: record



gorod: string[25];

ulica: string [20];

dom, kv: integer;

end;


curs: 1..5;

grupp: string[3];

end;

Var stud:anketa1;



Gr:array[1..30] of anketa1;
2-ой способ: Сначала описываются типы вложенных записей, а затем имена этих типов используются в определении типа общей записи.

Type data= record;

god: integer;

mes: string[10];

den: 1..31;

end;


address= record

gorod: string[25];

ulica: string [20];

dom, kv: integer;

end;

anketa1=record



fio: string[45];

pol: char;

dat_r:data;

adres: address;

curs: 1..5;

grupp: string[3];

end;

Var stud,stud1:anketa1;



Gr:array[1..30] of anketa1;
Доступ к полям записи

Как получить доступ к отдельным полям записи? Для того, чтобы обратиться к полю god в записи stud, необходимо указать, что оно находится внутри поля dat_r. В Паскале используется так называемая «точечная нотация», которая позволяет построить список имен структурных уровней записи, разделяя их одиночными точками. Каждая точка символизирует определенный уровень вложенности.


stud.dat_r.god:=1996
В точечной нотации сначала указывается имя записи, а затем через точку имена вложенных полей.
Особенности имен (идентификаторов) в записи:

  1. Имя всей записи может совпадать с именем одного из ее полей. За счет использования механизма «точечной нотации», исключается повторение идентификаторов.

  2. Каждое имя поля внутри записи должно быть уникальным. Но в разных записях имена могут совпадать, даже если они входят в одну запись.

  3. Имя любого поля может совпадать с именем обычной переменной.

Например:

V
a

a b c

a b a b
a.a.a a.a.b a.b.a a.b.b a.c

все имена будут разные
ar a:record

a:record


a:real;

b:integer;

end;

b:record

a:real;


b:char;

end;


c:real

end;


c:integer;


Операции над записями

  1. Операция присваивания. Одной записи можно присвоить другую, если они совместимы по типу, т.е. количество полей и их типы совпадают:

stud1:=stud

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

With < префикс > do S;

Где: префикс – обозначение одного или нескольких уровней записи;

S – любой оператор.

Оператор With позволяет автоматически присоединять префикс ко всем именам–компонентам соответствующей записи, которые присутствуют в операторе S.

Например:

With stud.dat_r do writeln (god, mec, den);

Это равносильно:

writeln (stud.dat_r.god, stud.dat_r.mec, stud.dat_r.den);

В операторе With префиксы можно перечислять через запятую:

With stud, dat_r do writeln (god, mec, den);

Если надо выполнить не один оператор With, а несколько, то надо поставить операторные скобки. Например:

With stud do

Begin With dat_r do writeln (god, mec, den);

With adres do writeln (gorod, ulica, dom, kv)

End;

Правильная расстановка begin … end обеспечивает присоединение нужных префиксов к именам тех или иных полей.



Замечание: Можно каждую переменную представить полной точечной нотацией и не пользоваться оператором with, но тогда текст программы становится громоздким и плохо читаемым.

Все остальные операции выполняются над полями записи в соответствии с их типом.

Например:

Stud.dat_r.god:=1996;

Stud.adres.gorod:=’Санкт-Петербург’;

Записи можно инициализировать, т.е. присваивать им начальные значения, с помощью типизированных констант:

type


RecType = Record

x,y: Word;

ch: Char;

dim: Array[1..3] of Byte

end;

const


Rec: RecType = ( x: 127;

y: 255;


ch: 'A';

dim: (2, 4, 8) );

end;
Использование записей

Записи предназначены главным образом для представления объектов, имеющих достаточно сложное неоднородное строение, и чаще всего используются при создании различного рода информационных систем, например, баз данных.



Примеры решения задач с использованием записей

Задача 1.

Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран.

Пусть нам необходимо заполнить сведения о студенте (Ф.И.О., дата рождения, адрес, курс и группа), а затем вывести эти сведения на экран.
program primer1;
type anketa=record
   fio: string[45];
   dat_r: string[8];
   adres: string[50];
   curs: 1..5;
   grupp: string[3]
end;
var student: anketa;
begin
   writeln (‘введите сведения о студенте’);
   {обратите внимание, ввод каждого поля осуществляется отдельно}
   writeln (‘введите фамилию, имя и отчество’);
   readln (student.fio);
   writeln (‘введите дату рождения’);
   readln (student.dat_r);
   writeln (‘введите адрес’);
   readln(student.adres);
   writeln (‘введите курс’);
   readln(student.curs);
   writeln (‘введите группу’);
   readln (student.grupp);
   writeln (‘ввод закончен’);
   writeln ;
   writeln (‘фамилия студента: ’, student . fio );
   writeln(‘ дата рождения : ’, student.dat_r);
   writeln(‘ адрес : ’, student.adres);
   writeln(‘ курс : ’, student.curs);
   writeln(‘ группа : ’, student.grupp);
end.
А теперь слегка усложним задачу. Пусть нам необходимо иметь сведения о многих студентах, например, целого факультета. Следовательно, необходимо организовать массив записей Паскаля. А затем из общего списка вывести фамилии студентов 2-го курса.
program primer2;
type anketa=record
   fio: string[45];
   dat_r: string[8];
   adres: string[50];
   curs: 1..5;
   grupp: string[3]
end;
var student: array [1..100] of anketa;
   I: integer;
begin
   {последовательно вводим каждую запись}
   for I:=1 to 100 do
   begin
      writeln (‘введите сведения о’, I , ‘-м студенте’);
      writeln (‘введите фамилию, имя и отчество’);
      readln (student[I].fio);
      writeln (‘введите дату рождения’);
      readln (student[I].dat_r);
      writeln (‘введите адрес’);
      readln(student[I].adres);
      writeln (‘введите курс’);
      readln(student[I].curs);
      writeln (‘введите группу’);
      readln (student[I].grupp);
   end;
   writeln (‘ввод закончен’);
   writeln ;
   {просматриваем массив записей и выбираем только студентов 2-го курса }
   for I:=1 to 100 do
      if student[I].curs=2 then
         writeln(‘ фамилия студента : ’, student[I].fio);
end.
Использование префикса упрощает текст программы:
program primer2;
type anketa=record
   fio: string[45];
   dat_r: string[8];
   adres: string[50];
   curs: 1..5;
   grupp: string[3]
end;
var student: array [1..100] of anketa;
   I: integer;
begin
   {последовательно вводим каждую запись}
   for I:=1 to 100 do

with student[I] do


   begin
      writeln (‘введите сведения о’, I , ‘-м студенте’);
      writeln (‘введите фамилию, имя и отчество’);
      readln (fio);
      writeln (‘введите дату рождения’);
      readln (dat_r);
      writeln (‘введите адрес’);
      readln(adres);
      writeln (‘введите курс’);
      readln(curs);
      writeln (‘введите группу’);
      readln (grupp);
   end;

   writeln (‘ввод закончен’);


   writeln ;
   {просматриваем массив записей и выбираем только студентов 2-го курса }
   for I:=1 to 100 do
      if student[I].curs=2 then
         writeln(‘ фамилия студента : ’, student[I].fio);
end.
Задача 2.

Создать список учеников класса, указав их фамилию, имя, дату рождения и сохранив его в виде файла.

Здесь компонентой файла будет запись. Окончанием ввода значений списка будет введение символа 'n'.
program pupilbirthday;

type pupil=record

fam,name:string;

end;


date=record

year,day:integer;

month:string[10];

end;


birthday=record

pname:pupil;

pdate:date

end;


var pb:birthday;

f:file of birthday;

fname:string[20];

ch:char;


begin

writeln('input fname');

readln(fname);

assign(f,fname);

rewrite(f);

writeln('input(y/n)?');

readln(ch);

while ch<>'n' do

begin

with pb do



begin

with pname do

begin

writeln('input fam,name');



readln(fam,name);

end;


with pdate do

begin


writeln('input year,day,month');

readln(year,day,month);

end;

end;


write(f,pb);

writeln('input(y/n)?');

readln(ch)

end;


close(f)

end.


 

  

Домашнее задание 1:




  1. Написать программу, в которой вводится текущая дата и определяются именинники. Если именинники имеются, то вывести на экран поздравление, в противном случае, вывести сообщение, что именинников нет.

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

Предусмотреть в программе запись списка в файл и чтение из файла, редактирование списка и вывод в виде таблицы.

Структура записи:



Фамилия

Имя

Класс

Русский

Алгебра

Физика

Ср. балл

Сидоров

Петр

11-1

5

4

4

4.3

Петров

Сидор

11-1

5

5

5

5

Дополнительный материал

Записи с вариантной частью

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

Например, внутри типа Персона задать варианты "работник", "учащийся", "иждивенец" или внутри типа Фигура - "окружность", "прямоугольник", "треугольник".

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

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

 

type


Figura = record

x,y : integer; {центр геометрической фигуры}



case figtype : char of {выбор типа фигуры}

'k' : (a : integer); {сторона квадрата}

'c' : (r : integer); {радиус круга}

'p' : (b,с : integer) {стороны прямоугольника}



end;

Фиксированное поле figtype - это и есть селектор. Его значение определяет выбранный нами вариант, а значит, состав вариантных полей


figtype =

k

c

p

Поля Figura

x,y,a

x,y,r

x,y,b,с

В переменной-записи на каждом этапе "работает" только один из всех возможных вариантов, описанных в типе, или ни один из них. Однако в памяти все возможные поля располагаются, начиная с одного адреса (общий объем будет равен самому длинному составу полей), поэтому мы запросто получаем ошибку при неправильных действиях с вариантами.

В нашем примере все поля имеют тип integer, поэтому в памяти a, r и b - это одна и та же ячейка, а поле с - расположено в соседней. Однако представив такой тип: 
type

AnyStructure = record

commonfield: integer;

case select:byte of

0: (a: integer; b: real);

1: (c: char; d:string[10]);

2: (e: double);



end;

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

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

Рассмотрим процедуру заполнения массива фигур, описанных ранее:
type

TFigure = record {общая запись для всех типов фигур}

x,y: integer;

color: integer;



{поле-селектор}

case figtype: char of

'c': (r: integer); {окружность}

's': (a: integer); {квадрат}

'b': (b,c: integer); {прямоугольник}



end;

var

Figures: array [1..MAXFIGURENUM] of TFigure;

num: integer;

{=================================================

Формирование случайным образом геометрических

фигур и заполнение массива записей

==================================================}

procedure CreateFigures;

var

i, f: integer;

 

begin

write('Введите количество фигур: '); readln(num);

writeln('Формируется набор геометрических фигур...');

for i:=1 to num do begin

{общие поля}

Figures[i].x := random(XM);

Figures[i].y := random(YM);

Figures[i].color := random(15)+1;



{случайно задаем тип фигуры}

f:=random(3);



case f of

0: begin

Figures[i].figtype := 'c';

Figures[i].r := random(MAXLEN);



end;

1: begin

Figures[i].figtype := 's';

Figures[i].a := random(MAXLEN);



end;

2: begin

Figures[i].figtype := 'b';

Figures[i].b := random(MAXLEN);

Figures[i].c := random(MAXLEN);

end;

end;

end;

end;

. . . 
Так как задач, для которых использование записей с вариантными частями действительно увеличивает эффективность, очень мало, то записи с вариантами используются редко.










Талант — это то, чем вы обладаете; гений — то, что владеет вами. Малколм Каули
ещё >>