Типы данных и записи
| English | Русский |
|---|---|
| data type/ˈdeɪtə taɪp/ | тип данных |
| field/fiːld/ | поле |
| record/ˈrekɔːd/ | запись |
| record structure/ˈrekɔːd ˈstrʌktʃə/ | структура записи |
| dot notation/dɒt nəʊˈteɪʃn/ | точечная нотация |
Самое дорогое решение по выбору типа данных в истории
- В 1960-х годах память стоила дороже, чем программисты. Чтобы сэкономить два символа на дату, годы хранились двумя цифрами:
99означало 1999. - Никто не ожидал, что код переживет столетие. Он это сделал, и на 1 января 2000 все эти поля отображали бы 1900. Правительства и компании потратили, по оценкам, $300 миллиардов на проверку и исправление этой проблемы.
- Баг не был опечаткой. Это был тип данных, выбранный для памяти 1965 года и сохраненный для дат 2000 года.
- Этот урок о том, как выбрать тип, подходящий для данных, и как объединять связанные вместе значения в запись (record).
Шесть основных типов
| Тип | Хранит | Использовать для |
|---|---|---|
INTEGER |
целое число, 42, -7 |
подсчеты, индексы, ID |
REAL |
число с дробной частью, 3.14 |
измерения, средние значения |
CHAR |
один символ, 'A' |
буквенная оценка, выбор в меню |
STRING |
символы в кавычках, "Hello" |
текст |
BOOLEAN |
TRUE или FALSE |
флаги |
DATE |
календарную дату | даты рождения, дедлайны |

Псевдокод также называет два структурных типа: ARRAY и FILE
Какой тип данных лучше всего подходит для хранения флага да/нет, такого как «в наличии»?
У флага два состояния, поэтому BOOLEAN (TRUE/FALSE) — точный выбор, а не строки "yes"/"no".
Для хранения измерения, такого как температура, следует использовать вещественный (с плавающей точкой) тип.
Целые количества используют целочисленный тип; измерения используют вещественный тип.
Выбор по способу использования значения
- Тип определяется тем, что программа будет делать со значением, а не тем, как оно выглядит.
- Количество студентов — это
INTEGER; средняя оценка класса — этоREAL, потому что она имеет дробную часть; оплатил ли студент — этоBOOLEAN. - Индекс массива всегда является
INTEGER. Одна буква оценки — этоCHAR; адрес электронной почты — этоSTRING. - Номер телефона — это
STRING: он начинается с0, и никто никогда не складывает два номера телефонов.
Сопоставьте каждое значение с лучшим типом данных для него.
Выберите точный тип: BOOLEAN для флага, REAL для дробных значений, INTEGER для целых количеств, STRING для текста.
Какой тип данных следует использовать для хранения номера телефона, такого как 07700 900123?
INTEGER убрал бы ведущий ноль, и ни одна программа не складывает и не умножает номера телефонов. Цифры — это текст.
Разбор примера: укажите соответствующий тип данных
| Данные | Тип | Причина |
|---|---|---|
| количество товаров на складе | INTEGER |
целое количество |
| цена товара | REAL |
содержит пенни, дробную часть |
| является ли товар акционным | BOOLEAN |
только два состояния |
код категории элемента, 'F' |
CHAR |
ровно один символ |
| имя поставщика | STRING |
текст |
| дата поставки товара | DATE |
календарная дата |
- Укажите название псевдокода, а не язык программирования, который вы знаете:
BOOLEAN, а неbool;REAL, а неfloat.
Тип данных индекса массива всегда ____.
Индекс считает позиции, поэтому это целое число. Names[2.5] не имеет смысла.
Записи (структуры)
- Запись (структура записи) хранит набор элементов данных различных типов под одним идентификатором. Каждый элемент называется полем.
- Используйте её, когда несколько значений всегда описывают одно и то же: товар на складе, клиент, студент.
TYPE TStockItem
DECLARE ItemID : INTEGER
DECLARE Category : STRING
DECLARE ItemCost : REAL
DECLARE InStock : BOOLEAN
ENDTYPE

Один идентификатор, четыре поля, четыре типа
Запись используется для того, чтобы:
Запись объединяет поля (возможно) разных типов, описывающие одну сущность. Массив хранит много значений одного типа.
Объявление и использование записи
TYPE … ENDTYPEопределяет тип. Затем объявите переменные этого типа, по одной или в виде массива:
DECLARE Item1 : TStockItem
DECLARE Items : ARRAY[1:100] OF TStockItem
- Обратитесь к полю с помощью точечной нотации, чтобы записать или прочитать значение:
Item1.Category ← "Fruit"
OUTPUT Item1.Category, " costs ", Item1.ItemCost
Items[7].InStock ← FALSE
Запись группирует поля под одним именем
Запись объединяет связанные поля вместе. Каждое поле — это именованная метка, к которой вы обращаетесь через точечную нотацию — Item1.Category — а не по числовому индексу.
Чтобы установить поле Category переменной-записи Item1, вы пишете:
Точечная нотация record.field позволяет обратиться к полю записи.
Разобранный пример: файл членства клуба
- Клуб хранит для каждого студента ID студента (строку), имя, дату рождения и до трёх номеров клуба. Объявите тип записи, массив на 3000 студентов и сохраните имя в первом элементе.
TYPE Student
DECLARE StudentID : STRING
DECLARE Name : STRING
DECLARE DateOfBirth : DATE
DECLARE Club : ARRAY[1:3] OF INTEGER
ENDTYPE
DECLARE Membership : ARRAY[1:3000] OF Student
Membership[1].Name ← "Li Wei"
- Оценки:
TYPEс идентификатором иENDTYPE; каждое поле объявлено с подходящим типом; массив со своими границами иOF Student; обращение к полю через индекс и точку.
Расставьте строки объявления членства клуба в правильном порядке.
Определите тип, закройте его, объявите переменную или массив этого типа, затем используйте индекс и точку для обращения к полю.
Разобранный пример: укажите ошибку в объявлении
TYPE TBooking
DECLARE Seats : INTEGER
DECLARE Price
DECLARE Total : STRING
- Три ошибки, каждая стоит балл: у типа нет
ENDTYPE; у поляPriceнет типа данных; аTotalбудет хранитьSeats * Price, арифметический результат, поэтому он не может бытьSTRING. - Типичные три ошибки экзаменатора: отсутствующий
ENDTYPE, поле без типа, поле неправильного типа для выполняемой с ним операции.
Какие из этих вариантов являются ошибками в объявлении записи? Выберите все подходящие варианты.
Разные типы в одной записи — это вся суть записи. Остальные три — это ошибки, которые экзаменаторы закладывают.
Запись, массив или обычные переменные
- Значения, которые всегда принадлежат вместе и имеют разные типы: запись.
- Множество значений одного типа под одним именем: массив (следующий урок).
- Таблица строк, где каждая строка имеет смешанные поля: массив записей,
Members[i].Name. - Невзаимосвязанные значения: отдельные переменные. Их объединение ничего не дает.
Массив записей позволяет одному идентификатору хранить таблицу, где каждая строка имеет поля разных типов.
Members[i] — это одна строка (запись); Members[i].Name — это одна ячейка. Массив дает строки, запись дает смешанные столбцы.
Потерянные баллы
- Значение «да/нет» — это
BOOLEAN, а не строки"yes"и"no". - Номер телефона или ID, начинающийся с
0, являетсяSTRING, никогда неINTEGER. - Деньги в
REALнакапливают ошибки округления; многие системы хранят целые копейки какINTEGER. - Каждое поле — это строка
DECLAREс типом, а тип заканчиваетсяENDTYPE. Индекс ставится на массив, точка — на поле:Members[3].Name.
Вы поняли
- шесть базовых типов:
INTEGER,REAL,CHAR,STRING,BOOLEAN,DATE, выбираются в зависимости от того, как программа обрабатывает значение - запись хранит поля разных типов под одним идентификатором:
TYPE … DECLARE field : type … ENDTYPE - объявите переменные или массивы этого типа и обратитесь к полю с помощью точечной нотации:
Membership[1].Name ← "Li Wei" - ошибки, которые задает экзаменатор: отсутствие
ENDTYPE, поле без типа, поле неправильного типа для его использования