программирование на паскале2. Учебное пособие по курсу Высокоуровневые методы информатики и программирования для студентов Гуманитарноприкладного института
Скачать 0.89 Mb.
|
3.2. Тип записьПока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: платежные ведомости (фамилии и имена - символьная информация, денежные суммы - числовая), карточки больных в поликлинике, библиотечная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись. Запись - это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называются полями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя. Описание типа запись: TYPE имя_типа = RECORD список_1_имен_полей: тип_1; список_2_имен_полей : тип_2; . . . список_N_имен_полей: тип_N; END; Например: TYPE COMPLEX=RECORD{значения переменныx этого типа - комплексные числа} Re,Im:REAL {действительная и мнимая части} END; DATE = RECORD {для описания дат (число, месяц, год)} Day : 1..31; {число} Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц} Year : Integer; {год} END; BOOK = RECORD {для описания книг в каталоге библиотеки} Author,Title,Publisher:String; {автор, название, издательство} Year,Volume,Pages:Integer; {год издания,том,количество страниц} END; Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип). Для обращения к полю записи надо указать имя записи, а затем, через точку, имя поля. Например: VAR C:COMPLEX; D,D1:DATE; B:BOOK; BEGIN . . . C.Re:=5; D.Month:=January; B.Author:='Smith'; {*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*} . . . Чтобы не писать многократно имя записи при работе с ее полями, используется оператор WITH Имя_записи DO оператор Три оператора, ограниченные {*}, эквивалентны оператору: WITH D1 DO BEGIN Day:=6; Month:=June; Year:=1799 END; Пример. Ниже приведена программа для задачи §3.1.3, использующая для отображения строки таблицы тип запись (вместо типа строка) Program Toys; TYPE SVED=RECORD {тип "запись", описывающий игрушку} name:String; {название игрушки} MinAge, MaxAge,Rub:Real; {возрастные границы и стоимость} END; VAR N:Integer; {число наименований игрушек} Toy:SVED; {переменная, описывающая игрушку} max:Real; {максимальная стоимость конструктора для детей до 7 лет} namemax:String; {название искомого конструктора} i:Integer; {счетчик наименований игрушек} BEGIN Writeln(' Введите число наименований игpушек'); ReadLn(N); max:=0; For i:=1 to N Do With Toy Do {работаем с полями записи Toy} BEGIN Writeln('Введите название игpушки с номером', i:2); Readln(name); Writeln('Введите мин. и макс. возраст и стоимость'); Readln(Minage,Maxage,Rub); {вводим запись по полям} If ((Pos('констpуктоp',name)>0) or {содержит ли название} (Pos('Констpуктоp',name)>0)) and {слово "конструктор" } (MaxAge<=7) Then If Rub>max Then BEGIN max:=Rub; namemax:=name END; END; If max=0 Then WriteLn(' Констpуктоpов для детей до семи лет нет') Else BEGIN WriteLn('Cамый доpогой констpуктоp для детей до семи лет'); WriteLn(namemax); WriteLn('стоит ', max:6:0, ' pублей') END; END. Замечания:
|