Основы программирования (947332), страница 24
Текст из файла (страница 24)
Над записями возможно выполнение следующих операций.Доступ к полям записи. Синтаксическая диаграмма доступа к полям записи представлена на рис. 4.35.Например, к полям переменной Sotr типа Human, объявленного выше,можно обратиться следующим образом:Sotr. BirthDay Day: =-25;т: =SotKBirthDay.
Year;...В том случае, если доступ к полям записи осуществляется многократно,целесообразно обращаться к полям записи с использованием оператора присоединения with (рис. 4.36). Например, для переменной Sotr типа Human возможны следующие варианты доступа к полю Day с применением оператораwith:withИдентификаторзаписи / поляГтЧ^)чИдентификаторполяКЕНЗначениеРис. 4.36. Синтаксическая диаграмма <Оператор присоединения>1384. Структурные типы данныха)б)в)r)withwithwithwithSotr do BirthDay.Day:=30;SotnEirthDay do Day: =24;Sotn BirthDay do Daay:=31;Sotr dowith BirthDay do Day:= 7;...Присваивание записей.
Операция возможна при совпадении типов записей и выполняется последовательно поле за полем. Например:OtdelfiJ—Sotr;...Ввод записей с клавиатуры и вывод их на экран выполняются по полямпо правилам ввода переменных соответствующих типов.Пример 4.23. Разработать программу, которая вводит в массив записейинформацию о студентах учебной группы: фамилию и дату рождения. Организовать поиск информации о студенте, фамилия которого вводится с клавиатуры.Program ex;Typedata=record(тип запись данные о дате}year: word; {год}month:LJ2; {месяц}day:L.31;{день}end;zap-record{тип запись о студенте}fam:stringfl 6J; {фам ил ия}birthday: data;{дата рождения}end;Var fb:array[L.25] of zap; { массив данных о группе студентов}fff:string; {строка для ввода фамилии}ij,m,n:byte;key.'boolean; {ключ поиска, если фамилия найдена - true}BeginWriteLnCВведите данные о количестве студентов п<=25');ReadLn(n);т:=0;{ввод исходных данных с клавиатуры поле за полем}repeatт:=т-^1;Write(*Beedume фамилию :');Readln(fb[m].fam);Write(*Введите год роэюдения : '); Readln(fb[m]Mrthday.year);WriteCмесяц: ');ReadLn(fb[m].birthday.month);WriteCдень: *);ReadLn(fb[m].birthday.day);until n=m;WriteLn;139Часть /.
Основы алгоритмизации и процедурное программирование{вывод исходных данных на экране с помощью оператора with}WnteLn('Список студентов группы '); WriteLn;for /;=7 to т dowithfbfijdobeginWrite(i:2,fam:17);with birthday doWriteLn(year:6, month:4y day:4);end;WriteLn;{поиск данных в массиве записей}WriteLn('Beedume фамилию');ReadLniffJ):i:=0;key:=false; {признак «данные не найдены»}repeat i: =1+1 ;if/bfij.fam =fffthen key: = trueuntil key or( i=m);{вывод результата}if key then {если такой студент найден, то выводим данные}withfb[i]dobeginWriteLnCДaнныe о студенте : ');Write(fam:18/ ');with birthday doWriteLn(day:2,': \month:2, V \year:5,' года');endelse WriteLn('Данных о студенте : \fff:18,' нет.');End.Записи с вариантами.
Иногда бывает удобно и естественно рассматривать несколько типов данных как варианты одного, т. е. в пределах одной записи иметь различную информацию в зависимости от конкретного значениянекоторых полей. Для обеспечения такой возможности запись кроме фиксированного списка полей может иметь еще и вариантную часть (4.37).Из диаграммы видно, что вариантная часть может содержать несколькоальтернатив, в каждой из которых задается список полей, присущих данномуварианту.
Каждой альтернативе предшествует константа, идентифицирующая соответствующий вариант.Рассмотрим несколько примеров определения записей с вариантами:• без предварительного описания типа:1404. Структурные типы данныхТиппеременнойcase\<УИдентификатор]переменнойЗначениеконстантыИдентификаторполяhGKDHООh©iТипполяОРис.
4.37. Синтаксическая диаграмма <Вариантная часть записи>Var М: recordcase {вариантная часть}byte of {тип констант для идентификации вариантов}0: (by: array [0..3J of byte); {массив из 4 байт}1: (wo: array [O..IJ of word); {массив из 2 слов}2: (lo: longint); {переменная длиной 4 байта}end;...• с предварительным объявлением типа:ТуреFigure = (Square, Triangle, Circle); {перечисляемый тип}Paramf^" record{тип ~ запись с вариантами}X,Y: real;{фиксированные поля}case{вариантная часть}Fig:Figure of { переменная и типидентифицирующих констант}Square:(Side: real);Triangle: (Sidel,Side2,Side3: real);Circle:(Radius: real);end;Var Param: Paramf; {объявление переменной}Конкретное значение переменной типа «запись с вариантами» присваивается точно так же, как и обычной записи: вводом с клавиатуры, с помощьюлитеральной константы и с помощью типизированной константы.
Однакопри объявлении инициализированной переменной для вариантной части задается только один вариант.141Часть ]. Основы алгоритмизации и процедурное программированиеНапример, пусть запись должна содержать либо данные о человеке, либо о корабле (так, Георгий Седов - это и имя человека, и название корабля).Для этого опишем следующую запись с вариантамиТуреForma = record {запись места прописки человека и корабля}case {вариантная часть}boolean of {тип констант, идентифицирующих варианты}{вариант для человека}True: (Birthplace: string[40]; {место проживания}{вариант для корабля}False: (Country: stringf20J; {страна}EntryPort: string[20]; {порт}EntryDate: array[L.3] of word; {дата}Count: word) {водоизмещение}end;.,.Типизированные константы для задания исходных данных двух записей:Object2 - сведения о человеке. Object 1 - сведения о корабле определяютсятак:ConstObject J: Forma = (Country: 'Польша*;EntryPort: 'Ленинград';EntryDate: (16,3,89);Count: 12);Object2: Forma = (BirthPlace: 'Москва');...Следует отметить, что идентификаторы полей во всех вариантах должны быть различны, а также не совпадать с именами полей фиксированной части.
Для некоторых значений констант, идентифицирующих вариант, поля ввариантной части записи могут отсутствовать, тогда после двоеточия можнопоместить пустой список «()».Кроме того, при использовании записей с вариантами необходимо учитывать некоторые особенности. Так, для размещения переменной типа запись всегда отводится фиксированный объем памяти в соответствии с объемом, занимаемым самым большим из вариантов, т. е. различные вариантыразмещаются на одном участке памяти, как бы «накладываясь» друг на друга.Следует также учитывать, что транслятор языка не содержит никакихсредств контроля корректной обработки вариантных записей.
Это означает,что в любое время возможен доступ ко всем полям во всех вариантах. За соответствием хранимой информации и вариантом доступа к ней должен следить сам программист. Однако именно эта особенность записей с вариантами может быть использована для неявного преобразования типов данных.1424. Структурные типы данныхПоскольку различные варианты ссылаются на один участок памяти, как бы«накладываясь» друг на друга, можно обращаться к содержимому памятипоочередно, то как к переменной одного типа, то как к переменной другого.Например:ТуреРегет= record {запись с вариантами}case byte of0: Wo:word;{переменная типа word}1: Lodongint; {переменная типа longint}2: Re:real;{переменная типа real}end;Var OPerem;Begin...C.Lo:=0; {очищаем область}C.Wo:=10; {в вариантное поле по шаблону целого без знака записываем число 10}WriteLn(C.Lo:10);...
{печатается содержимое вариантного поля пошаблону длинного целого}В этом примере под поля будет выделено 6 байт памяти в соответствии с самым длинным типом во внутреннем представлении. Пользовательможет работать с этим полем по любому из шаблонов, используя идентификаторы соответствующих полей записи.Задания для самопроверкиЗадание 1. Разработайте профамму, которая, используя тип запись, формируетмассив данных о сотрудниках отдела, содержащий следующую информацию: фамилию, год поступления в отдел, стаж работы в отделе, общий стаж работы. Затем сортирует полученный массив в соответствии со стажем работы в отделе и выводит первые пять фамилий из отсортированного списка.
После чего определяет среди первыхпяти сотрудников сотрудника, у которого общий стаж наибольший.Задание 2. Разработайте программу, которая формирует массив записей о студентах некоторой группы, содержащий следующую информацию: фамилию, оценкиза последнюю сессию по четырем предметам и размер стипендии. Фамилию и отметки программа должна вводить с клавиатуры, а размер стипендии считать исходяиз оценок: все «5» - повышенная (+ 25%), есть одна «4» - повышенная (+10%), неттроек - обычная стипендия, есть одна тройка - социальная стипендия (-15%), больше одной тройки - стипендия 0. После чего программа должна сортировать массивпо размеру стипендии и выводить его на экран.