страница 1 |
||||||||||||||||||||||||||||||||
Похожие работы
|
Конспект по теме: «Записи в Паскале» - страница №1/1
![]() Конспект по теме: «Записи в Паскале» Учитель информатики: Батракова Л.В. _____________________________________________________________________________________ Массив описывает набор однотипных компонент, но иногда надо решать задачи, где используются данные разных типов, жестко связанные между собой. В этом случае используются записи. Они, как и массивы, относятся к произвольным сложным (структурированным) типам. Определение: Запись – непрерывная последовательность разнотипных компонент, имеющая имя. Описание записи в Паскале Произвольный тип запись (Record) описывается следующим образом: TYPE TZ = record <имя_поля_1>: <тип_ поля_1>; <имя_поля_2>: <тип_поля_2>; …
end; где: TZ – идентификатор типа, задается пользователем по правилам написания идентификатора; имя_поля – идентификатор части записи, предназначенной для размещения информации, задается пользователем; тип_поля показывает, какую информацию можно помещать в данное поле, определяется синтаксисом языка Паскаль. Тип поля может быть любым, кроме типа file. Record … end – служебные слова, ограничивающие количество полей. Количество полей в записи может быть любым, ограничение идет по памяти. Например, анкетные данные о студенте вуза могут быть представлены в виде информационной структуры ![]() Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа 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 В точечной нотации сначала указывается имя записи, а затем через точку имена вложенных полей. Особенности имен (идентификаторов) в записи:
Например: V
a b a b
все имена будут разные
a:record
![]() ![]() ![]() b:integer; end;
a:real;
b:char; end;
c:real end;
c:integer; Операции над записями
stud1:=stud
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. Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран. Пусть нам необходимо заполнить сведения о студенте (Ф.И.О., дата рождения, адрес, курс и группа), а затем вывести эти сведения на экран.
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'.
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.
Предусмотреть в программе запись списка в файл и чтение из файла, редактирование списка и вывод в виде таблицы. Структура записи:
Дополнительный материал Записи с вариантной частью В пределах одного типа можно задать несколько разных структур при помощи вариантных частей записи. Например, внутри типа Персона задать варианты "работник", "учащийся", "иждивенец" или внутри типа Фигура - "окружность", "прямоугольник", "треугольник". Подструктуры различаются значением особого поля - селектора, для которого мы описываем жесткий набор сигнальных значений. В записи можно описать поля, общие для всех вариантов, и свой набор полей для каждой подструктуры. Каждый вариант определяется константой выбора, за которой следует двоеточие и список полей, заключенный в круглые скобки. В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями.
Фиксированное поле figtype - это и есть селектор. Его значение определяет выбранный нами вариант, а значит, состав вариантных полей
В переменной-записи на каждом этапе "работает" только один из всех возможных вариантов, описанных в типе, или ни один из них. Однако в памяти все возможные поля располагаются, начиная с одного адреса (общий объем будет равен самому длинному составу полей), поэтому мы запросто получаем ошибку при неправильных действиях с вариантами.
Мы увидим, что работа с неправильными полями изменит отдельные части ячеек, относящихся к другим полям. Все поля записи доступны одновременно, и следить за правильностью значения селектора и выбора нужной подструктуры приходится самому программисту. Рассмотрим процедуру заполнения массива фигур, описанных ранее:
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;
i, f: integer;
write('Введите количество фигур: '); readln(num); writeln('Формируется набор геометрических фигур...');
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);
. . .
|
ещё >> |