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





Скачать 122.86 Kb.
НазваниеКонспект по теме: «Записи в Паскале»
Дата публикации10.10.2013
Размер122.86 Kb.
ТипКонспект
100-bal.ru > Информатика > Конспект

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

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

_____________________________________________________________________________________


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

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

Произвольный тип запись (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;

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




Добавить документ в свой блог или на сайт

Похожие:

Конспект по теме: «Записи в Паскале» iconКонспект по теме: ‘Строковый тип данных в паскале’
Планирование составлено на основе : «Программы воспитания и обучения в детском саду» под редакцией М. А. Васильевой, В. В гербовой,...
Конспект по теме: «Записи в Паскале» iconКонспект урока по теме: "Способы записи алгоритмов". Фио (полностью)...
Цель урока: Создание условий для формирования целостного представления и навыка работы по способам записи алгоритмов
Конспект по теме: «Записи в Паскале» iconКонспект по теме: "Графика в Турбо Паскале"
Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов специальности 030501. 65 «Юриспруденция»...
Конспект по теме: «Записи в Паскале» iconКонспект открытого урока математики по теме "Доли". 3-й класс
Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной...
Конспект по теме: «Записи в Паскале» iconКонспект открытого урока «Уходит жизнь приходит память. И память возрождает жизнь»
Кроме того, при записи прочитанного формируется навык свертывания информации. И наконец, чередование чтения и записи уменьшает усталость,...
Конспект по теме: «Записи в Паскале» iconКонспект урока на тему "Алгоритм. Свойства алгоритмов. Виды алгоритмов...
...
Конспект по теме: «Записи в Паскале» iconКонспект урока математики
Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной...
Конспект по теме: «Записи в Паскале» iconКонспект урока математики, 3 класс Учитель начальных классов
Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной...
Конспект по теме: «Записи в Паскале» iconКонспект урока по математике, 4 класс. Тема: «Сумма дробей с одинаковым знаменателем»
Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной...
Конспект по теме: «Записи в Паскале» iconКонспект урока тема: построение графиков функций в паскале авс. Цель...
Воспитательная: воспитание информационной культуры учащихся, внимательности, аккуратности, дисциплинированности, усидчивости
Конспект по теме: «Записи в Паскале» iconВнимательно прочитайте теоретический материал по новой для вас теме,...
Цель урока: Обобщение знаний по разделу «Профессиональное образование и самоопределение» в систему. Активизация процесса профессионального...
Конспект по теме: «Записи в Паскале» iconКонспект по теме «Ландшафтные исследования за рубежом»
Составить конспект по теме «Влияние геологического и тектонического строения земной коры на ландшафт»
Конспект по теме: «Записи в Паскале» iconЗаполнение полей при создании многоуровневой библиографической записи
Приложение №2 к инструкции «Создание библиографической записи в Корпоративном электронном каталоге»
Конспект по теме: «Записи в Паскале» iconКонспект занятия по теме «Прошивание угла» Конспект занятия по теме...
Методические разработки к программе дополнительного образования «Играем в экологию»
Конспект по теме: «Записи в Паскале» iconПравила составления плана
Кроме того, при записи прочитанного формируется навык свертывания информации. И наконец, чередование чтения и записи уменьшает усталость,...
Конспект по теме: «Записи в Паскале» iconКонспект по теме «Россия в начале 20 века» Конспект по теме «Русско-японская война»
Царствование последнего российского императора Николая II. Кризис власти. Россия в годы трех российских революций


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск