Лабораторная работа № 6. Записи 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа № 6. Записи



Записи

 

В информационно-поисковых системах (таких, как адресное бюро, телефонная справочная служба и т.д.) приходится хранить и обрабатывать большие объемы данных. При решении научно-технических и экономических задач обработки совокупностей большого количества значений используются массивы. Но при работе с массивами основное ограничение заключается в том, что все элементы массива должны иметь один и тот же тип данных. Иногда для решения задач. В которых возникает необходимость хранить и обрабатывать совокупности данных различного типа, используются отдельные массивы для каждого типа данных, а для установления соответствия между ними вводятся соответствующие индексы. Итак, реальные данные об объектах часто описываются величинами разных типов. Например. Товар на складе описывается следующими величинами: наименование, количество, цена, наличие сертификата качество и т.д. в этом примере наименование – величина типа string, количество – integer, цена – real, наличие сертификата качества можно описать величиной типа – boolean. Для записи комбинации объектов разных типов применяется комбинированный тип данных – запись.

Запись представляет собой наиболее общий и гибкий структурированный тип данных, так как она может быть преобразована из неоднотипных компонентов и в ней явным образом выражена связь между элементами данных, характеризующими реальный объект

Запись (англ. record) - это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов. Запись можно назвать наиболее общим сложным типом данных. Определение типа записи начинается идентификатором record и заканчивается зарезервированным словом end. Название "запись" появилось из тех соображений, что данные разного типа можно встретить в таблицах: в каждой строке записаны сразу несколько разных значений. Таким образом, одна запись соответствует одной строке данных: она имеет несколько полей, каждое из которых хранит своё значение. Объем памяти, необходимый для записи, складывается из длин полей.

Общий синтаксис объявления этого типа выглядит следующим образом:

record fieldnamel: fieldtypel; fieldname2, fieldname3: fieldtype2; case optional tagfield: required ordinal type of 1: variantnamel: varianttype3; 2, 3: variantname2: varianttype4; end;

Данное объявление состоит из фиксированной и вариантной частей. Однако вовсе не обязательно вставлять в одно объявление записи обе эти части. Обычно удобнее работать с каждой из этих частей отдельно.

Фиксированные записи

В фиксированной части записи определяется одно или несколько независимых полей. Каждому полю обязательно присваивается имя и тип:

record fieldnamel: fieldtypel; fieldname2, fieldname3: fieldtype2; end;

Имея доступ к информации в записи, можно обрабатывать всю запись целиком (все поля одновременно) или только отдельное поле. Для обращения к отдельному полю наберите имя записи, точку и идентификатор поля, например

MyRec.Fieldnamel

Для доступа ко всей записи просто укажите ее имя.

В языке С эквивалентом фиксированного типа record из Delphi является struct. В C++ также определен тип struct, синтаксис которого совместим с типом struct из С. Однако в C++ этот тип имеет дополнительные особенности, благодаря чему напоминает тип Class из Delphi.

Вариантные записи

Вариантная часть типа record дает возможность по-разному трактовать область памяти, совместно занимаемую вариантами поля:

record case optional tagfield: required ordinal type of 1: variantnamel: varianttype3; 2, 3: variantname2: varianttype4; end;

Термин вариантный в отношении записей не имеет ничего общего с типом Variant. Вариантные поля, несмотря на свое название, никогда не имеют тип Variant. Объявление этого типа в любом месте вариантной части записи запрещено.

Все варианты занимают в памяти одно место. Каждый вариант обозначается некоторой постоянной. При желании можно получать доступ ко всем полям всех вариантов одновременно, однако это может иметь смысл только в наиболее простых случаях, когда точно известно, как именно информация каждого варианта записывается в память.

Каждый вариант обозначается минимум одной константой. Все константы должны быть порядковыми и совместимыми по типу с меткой поля.

Необязательное поле — это идентификатор дополнительного поля в фиксированной части записи, общий для всех вариантов. Обычно с его помощью определяют, когда к какому варианту обращаться.

Необязательное поле можно не указывать, однако порядковый тип необходим. При отсутствии необязательного поля программе придется выбирать подходящий вариант каким-то иным образом.

Пример.

Допустим, мы хотим хранить информацию о людях, заполнивших анкету на поступление на работу. Нас интересуют: ФИО человека, возраст, образование (среднее/высшее), владение компьютером, владение иностранными языками. Все эти данные мы можем объединить в запись. Дальнейшее повествование будет основываться на этом примере.

Описание записи

Чтобы работать в программе с записями, нужно сначала описать соответствующий тип данных. Запись описывается следующим образом:

type имя_типа_записи = record {поля записи} end;

В блоке полей описание идёт точно так же, как описание переменных: указывается имя поля, далее через двоеточие тип данных этого поля. Сами поля разделяются точкой с запятой.

К выбору типов данных для полей записи нужно подходить ответственно. Если при описании переменной она хранится в единственном экземпляре, то записи, как правило, используются для хранения некоторого набора данных (таблицы с несколькими строками, образно говоря). Это значит, что каждое из полей будет храниться в памяти столько раз, сколько строк данных у вас будет. Если в таблице 1000 строк, то объём занимаемой памяти будет немалым, да и скорость работы с данными может заметно уменьшиться из-за выбора избыточных типов данных.

Для нашего примера:

type TPerson = record Name: String; Age: Byte; Education,PC: Boolean; Foreign: set of TForeignLanguages; end;

Разберём поля по порядку. Для ФИО вполне подходит текстовая строка типа String. 255 символов нам хватит сполна. Для хранения возраста целесообразно выбрать тип данных Byte (число от 0 до 255). Не думаю, что на работу будут устраиваться люди, возраст которых превышает 255) Использовать тип Integer в данном случае нецелесообразно - мало того, что у него максимальное значение превышает 32.000, да ещё и отрицательные числа поддерживаются. Для поля " образование " выбран логический тип данных. Условимся, что True - это высшее образование, False - высшего нет (т.е. среднее). PC - владение компьютером, здесь всё понятно. Для хранения иностранных языков здесь используется множество. Ведь человек может знать несколько языков, не так ли? Описание типа данных, на основе которого построено множество, следующее:

type TForeignLanguages = (flEnglish, flGerman, flFrench);

Как видно, это перечислимый тип данных с тремя возможными значениями. Если вам мало английского, немецкого и французского, можете добавить в список и другие. Так как свойство Foreign нашей записи - множество, то мы сможем легко хранить информацию, например, о том, что человек знает и английский, и немецкий. Удобно, не правда ли? Если человек не знает никаких иностранных языков, множество будет пустое.

Итак, наша запись готова. Чтобы работать с ней в программе, разместить её следует в глобальном разделе type.

Примеры других записей

Существует множество готовых записей в Delphi, которые позволяют хранить некоторые часто встречающиеся данные.

TPoint - запись с двумя полями - X и Y - служит для хранения координат точки. Описана эта запись следующим образом:

TPoint = record X: Longint; Y: Longint;end;

TRect - позволяет хранить данные о прямоугольной области. Свойства Left, Top, Right и Bottom отвечают за координаты сторон прямоугольника, а координаты TopLeft и BottomRight типа TPoint - указывают на левую верхнюю и правую нижнюю вершины соответственно (эти вершины позволяют однозначно определить прямоугольник на плоскости, стороны которого параллельны осям координат). Однако в один момент времени используется только один набор из этих свойств - либо 4 координаты, либо 2 точки. Ещё один пример - хранение даты. Дату можно разбить на число, месяц и год, и хранить каждое значение отдельно:

TDate = record Day: 1..31; Month: 1..12; Year: 1900..2100;end;

Работа с записями

Чтобы обратиться к конкретному полю записи, применяется стандартная конструкция, с которой вы давно знакомы:

имя_переменной.название_поля

Т.е. имя переменной или объекта и его поле разделяются точкой.

Чтобы работать с записью, нужно определить переменную, тип которой - наша запись. До этого мы всего лишь описали нашу запись, но на самом деле никаких значений ещё нигде нет. Описание происходит стандартным образом:

var Person: TPerson;

Имя переменной вы можете дать любое, просто логично называть всё своими именами.

Вводим анкеты - интерфейс

Для начала создадим небольшой интерфейс, который позволит нам вводить информацию из анкет:

  • ФИО - TEdit (Edit1)
  • Возраст - TEdit (Edit2)
  • Высшее образование - TCheckBox (CheckBox1)
  • Владение компьютером - TCheckBox (CheckBox2)
  • Владение иностранными языками - TCheckListBox (CheckListBox1)

Компонент TCheckListBox расположен на странице Additional. Это список, аналогичный TListBox, но в каждой строке есть TCheckBox, т.е. строка либо отмечена, либо нет. В свойство Items сразу занесите наши 3 языка, вводя каждый на отдельной строке

Чтобы было удобно вводить возраст, сделаем вот что. На странице Win32 есть компонент TUpDown - это две кнопки ("вверх-вниз" или "влево-вправо"). Если в свойстве Associate выбрать наше поле ввода Edit2, то кнопки автоматически разместятся рядом с полем и нажатие на них, будет автоматически изменять число в поле. В само поле лучше изначально вписать какой-нибудь "реальный" возраст, чтобы не пришлось долго щёлкать, добираясь до нужного значения. Например, можно вписать 25.
В поле Edit1 никакого текста быть не должно. Все галочки в остальных компонентах убраны. Таково изначальное состояние нашего интерфейса.

Осталось добавить кнопку, которая будет выполнять все действия.

Общий вид формы получился таким:

Теперь перейдём к программной части.



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 267; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.28.197 (0.013 с.)