Скачать 122.86 Kb.
|
Конспект по теме: «Записи в Паскале» Учитель информатики: Батракова Л.В. _____________________________________________________________________________________ Массив описывает набор однотипных компонент, но иногда надо решать задачи, где используются данные разных типов, жестко связанные между собой. В этом случае используются записи. Они, как и массивы, относятся к произвольным сложным (структурированным) типам. Определение: Запись – непрерывная последовательность разнотипных компонент, имеющая имя. Описание записи в Паскале Произвольный тип запись (Record) описывается следующим образом: TYPE TZ = record <имя_поля_1>: <тип_ поля_1>; <имя_поля_2>: <тип_поля_2>; … <имя_поля_n>: <тип_поля_n> 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 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; Операции над записями
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. Рассмотрим для начала простейший пример заполнения записи Паскаля и вывода ее на экран. Пусть нам необходимо заполнить сведения о студенте (Ф.И.О., дата рождения, адрес, курс и группа), а затем вывести эти сведения на экран. 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:
Предусмотреть в программе запись списка в файл и чтение из файла, редактирование списка и вывод в виде таблицы. Структура записи:
Дополнительный материал Записи с вариантной частью В пределах одного типа можно задать несколько разных структур при помощи вариантных частей записи. Например, внутри типа Персона задать варианты "работник", "учащийся", "иждивенец" или внутри типа Фигура - "окружность", "прямоугольник", "треугольник". Подструктуры различаются значением особого поля - селектора, для которого мы описываем жесткий набор сигнальных значений. В записи можно описать поля, общие для всех вариантов, и свой набор полей для каждой подструктуры. Каждый вариант определяется константой выбора, за которой следует двоеточие и список полей, заключенный в круглые скобки. В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями. Например, для геометрических фигур структура может выглядеть так:
Фиксированное поле figtype - это и есть селектор. Его значение определяет выбранный нами вариант, а значит, состав вариантных полей
В переменной-записи на каждом этапе "работает" только один из всех возможных вариантов, описанных в типе, или ни один из них. Однако в памяти все возможные поля располагаются, начиная с одного адреса (общий объем будет равен самому длинному составу полей), поэтому мы запросто получаем ошибку при неправильных действиях с вариантами.
Мы увидим, что работа с неправильными полями изменит отдельные части ячеек, относящихся к другим полям. Все поля записи доступны одновременно, и следить за правильностью значения селектора и выбора нужной подструктуры приходится самому программисту. Рассмотрим процедуру заполнения массива фигур, описанных ранее: 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; . . . Так как задач, для которых использование записей с вариантными частями действительно увеличивает эффективность, очень мало, то записи с вариантами используются редко. |
Конспект по теме: ‘Строковый тип данных в паскале’ Планирование составлено на основе : «Программы воспитания и обучения в детском саду» под редакцией М. А. Васильевой, В. В гербовой,... | Конспект урока по теме: "Способы записи алгоритмов". Фио (полностью)... Цель урока: Создание условий для формирования целостного представления и навыка работы по способам записи алгоритмов | ||
Конспект по теме: "Графика в Турбо Паскале" Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов специальности 030501. 65 «Юриспруденция»... | Конспект открытого урока математики по теме "Доли". 3-й класс Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной... | ||
Конспект открытого урока «Уходит жизнь приходит память. И память возрождает жизнь» Кроме того, при записи прочитанного формируется навык свертывания информации. И наконец, чередование чтения и записи уменьшает усталость,... | Конспект урока на тему "Алгоритм. Свойства алгоритмов. Виды алгоритмов... ... | ||
Конспект урока математики Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной... | Конспект урока математики, 3 класс Учитель начальных классов Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной... | ||
Конспект урока по математике, 4 класс. Тема: «Сумма дробей с одинаковым знаменателем» Образовательная: Выработать (создать) алгоритм сложения и вычитания смешанных чисел на основе знаний записи числа в виде неправильной... | Конспект урока тема: построение графиков функций в паскале авс. Цель... Воспитательная: воспитание информационной культуры учащихся, внимательности, аккуратности, дисциплинированности, усидчивости | ||
Внимательно прочитайте теоретический материал по новой для вас теме,... Цель урока: Обобщение знаний по разделу «Профессиональное образование и самоопределение» в систему. Активизация процесса профессионального... | Конспект по теме «Ландшафтные исследования за рубежом» Составить конспект по теме «Влияние геологического и тектонического строения земной коры на ландшафт» | ||
Заполнение полей при создании многоуровневой библиографической записи Приложение №2 к инструкции «Создание библиографической записи в Корпоративном электронном каталоге» | Конспект занятия по теме «Прошивание угла» Конспект занятия по теме... Методические разработки к программе дополнительного образования «Играем в экологию» | ||
Правила составления плана Кроме того, при записи прочитанного формируется навык свертывания информации. И наконец, чередование чтения и записи уменьшает усталость,... | Конспект по теме «Россия в начале 20 века» Конспект по теме «Русско-японская война» Царствование последнего российского императора Николая II. Кризис власти. Россия в годы трех российских революций |