Простые и структурированные типы данных. Простые типы Цикл с предусловием

К простым типам относятся порядковые, вещественные типы и тип дата-время.

Порядковые типы отличаются тем, что каждый из них имеет конечное количество возможных значений. Эти значения можно определенным образом упорядочить (отсюда - название типов) и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения.

Вещественные типы, строго говоря, тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.

Тип дата-время предназначен для хранения даты и времени. Фактически для этих целей он использует вещественный формат.

Порядковые типы

К порядковым типам относятся (см. рис. 1.1) целые, логические, символьный, перечисляемый и тип-диапазон. К любому из них применима функция Ord(x), которая возвращает порядковый номер значения выражения X.

Рис. 1.1

Для целых типов функция ord(x) возвращает само значение х, т. е. Ord(X) = х для х, принадлежащего любому целому типу. Применение Ord(x) к логическому, символьному и перечисляемому типам дает положительное целое число в диапазоне от 0 до 1 (логический тип), от 0 до 255 (символьный), от 0 до 65535 (перечисляемый). Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ord(х) зависит от свойств этого типа.

К порядковым типам можно также применять функции:

pred(x) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ord (х) -1, т. е. оrd(рred(х)) = оrd(х) - 1;

succ (х) - возвращает следующее значение порядкового типа, которое соответствует порядковому номеру ord (х) +1, т. е. оrd(Succ(х)) = оrd(х) + 1.

Например, если в программе определена переменная

то функция PRED(с) вернет символ "4", а функция SUCC(с) - символ "6".

Если представить себе любой порядковый тип как упорядоченное множество значений, возрастающих слева направо и занимающих на числовой оси некоторый отрезок, то функция pred(x) не определена для левого, a succ (х) - для правого конца этого отрезка.

Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два, четыре или восемь байтов. В табл. 1.1 приводятся названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений.

Таблица 1.1 - Целые типы

Название

Длина, байт

Диапазон значений

0. .. 2 147 483 647

32 768...+32 767

2 147 483 648...+2 147 483 647

9*1018...+9*1018

0. . .4 294 967 295

Типы LongWord и Int64 впервые введены в версии 4, а типы Smallint и Cardinal отсутствуют в Delphi 1. Тип integer для этой версии занимает 2 байта и имеет диапазон значений от -32768 до +32767, т. е. совпадает с Smallint.

При использовании процедур и функций с целочисленными параметрами следует руководствоваться “вложенностью” типов, т.е. везде, где может использоваться word, допускается использование Byte (но не наоборот), в Longint “входит” Smallint, который, в свою очередь, включает в себя Shortint.

Перечень процедур и функций, применимых к целочисленным типам, приведен в табл. 1.2. Буквами b, s, w, i, l обозначены выражения соответственно типа Byte, Shortint, Word, Integer и Longint,

х - выражение любого из этих типов; буквы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.

Таблица 1.2 - Стандартные процедуры и функции, применимые к целым типам

Обращение

Тип результата

Действие

Возвращает модуль x

Возвращает символ по его коду

Уменьшает значение vx на i, а при отсутствии i - на 1

Увеличивает значение vx на i, а при отсутствии i -на 1

Возвращает старший бант аргумента

Возвращает третий по счету байт

Возвращает младший байт аргумента

Возвращает True, если аргумент-нечетное число

Как у параметра

Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0...(w-l)

Возвращает квадрат аргумента

Меняет местами байты в слове

При действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам - общему типу, который включает в себя оба операнда. Например, при действиях с shortint и word общим будет тип integer. В стандартной настройке компилятор Delphi не вырабатывает код, осуществляющий контроль за возможной проверкой выхода значения из допустимого диапазона, что может привести к недоразумениям.

Логические типы. К логическим относятся типы Boolean, ByteBool, Bool, wordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина).

Поскольку логический тип относится к порядковым типам, его можно использовать в операторе цикла счетного типа. В Delphi 32 для Boolean значение

Ord (True) = +1, в то время как для других типов (Bool, WordBool и т.д.)

Ord (True) = -1, поэтому такого рода операторы следует использовать с осторожностью! Например, для версии Delphi 6 исполняемый оператор showMessage (" --- ") в следующем цикле for не будет выполнен ни разу:

for L:= False to True do

ShowMessage ("--);

Если заменить тип параметра цикла L в предыдущем примере на Boolean, цикл будет работать и сообщение дважды появится на экране. [Для Delphi версии 1 и 2 ord (True) =+1 для любого логического типа.]

Символьный тип. Значениями символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0...255. Это число служит кодом внутреннего представления символа, его возвращает функция ord.

Для кодировки в Windows используется код ANSI (назван по имени American National Standard Institute - американского института стандартизации, предложившего этот код). Первая половина символов ПК с кодами 0... 127 соответствует таблице 1.3. Вторая половина символов с кодами 128...255 меняется для различных шрифтов. Стандартные Windows-шрифты Arial Cyr, Courier New Cyr и Times New Roman для представления символов кириллицы (без букв “ё” и “Ё”) используют последние 64 кода (от 192 до 256): “А”... “Я” кодируются значениями 192..223, “а”... “я” - 224...255. Символы “Ё” и “ё” имеют соответственно коды 168 и 184.

Таблица 1.3 - Кодировка символов в соответствии со стандартом ANSI

Символы с кодами 0...31 относятся к служебным кодам. Если эти коды используются в символьном тексте программы, они считаются пробелами.

К типу char применимы операции отношения, а также встроенные функции:

Сhаr (в) - функция типа char; преобразует выражение в типа Byte в символ и возвращает его своим значением;

UpCase(CH) - функция типа char; возвращает прописную букву, если сн - строчная латинская буква, в противном случае возвращает сам символ сн (для кириллицы возвращает исходный символ).

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

colors = (red, white, blue);

Применение перечисляемых типов делает программы нагляднее.

Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т. д. Максимальная мощность перечисляемого типа составляет 65536 значений, поэтому фактически перечисляемый тип задает некоторое подмножество целого типа word и может рассматриваться как компактное объявление сразу группы целочисленных констант со значениями 0, 1 и т. д.

Использование перечисляемых типов повышает надежность программ благодаря возможности контроля тех значений, которые получают соответствующие переменные. В Object Pascal допускается обратное преобразование: любое выражение типа Word можно преобразовать в значение перечисляемого типа, если только значение целочисленного выражения не превышает мощности этого типа. Такое преобразование достигается применением автоматически объявляемой функции с именем перечисляемого типа.

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

Тип-диапазон задается границами своих значений внутри базового типа:

<мин.знач.>..<макс.знач.>

Здесь <мин. знач. > - минимальное значение типа-диапазона; <макс. знач. > - максимальное его значение.

Тип-диапазон не обязательно описывать в разделе type, а можно указывать непосредственно при объявлении переменной.

При определении типа-диапазона нужно руководствоваться следующими правилами:

два символа “..” рассматриваются как один символ, поэтому между ними недопустимы пробелы; левая граница диапазона не должна превышать его правую границу.

Тип-диапазон наследует все свойства своего базового типа, но с ограничениями, связанными с его меньшей мощностью. В частности, если определена переменная.

В стандартную библиотеку Object Pascal включены две функции, поддерживающие работу с типами-диапазонами:

High(х) - возвращает максимальное значение типа-диапазона, к которому принадлежит переменная х;

Low (х) - возвращает минимальное значение типа-диапазона.

Вещественные типы

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

Таблица 1.4 - Вещественные типы

В предыдущих версиях Delphi 1...3 тип Real занимал 6 байт и имел диапазон значений от 2,9*10-39 до 1,7*1038. В версиях 4 и 5 этот тип эквивалентен типу Double. Если требуется (в целях совместимости) использовать 6-байтных Real, нужно указать директиву компилятора {SREALCOMPATIBILITY ON}.

Как видно из табл. 1.4, вещественное число в Object Pascal занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК.

Здесь s - знаковый разряд числа; е - экспоненциальная часть; содержит двоичный порядок; m - мантисса числа.

Мантисса m имеет длину от 23 (для single) до 63 (для Extended) двоичных разрядов, что и обеспечивает точность 7...8 для single и 19...20 для Extended десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).

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

Особое положение в Object Pascal занимают типы comp и Currency, которые трактуются как вещественные числа с дробными частями фиксированной длины: в comp дробная часть имеет длину 0 разрядов, т. е. просто отсутствует, в currency длина дробной части -4 десятичных разряда. Фактически оба типа определяют большое целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении они занимают 8 смежных байт). В то же время в выражениях comp и currency полностью совместимы с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т. д. Наиболее подходящей областью применения этих типов являются бухгалтерские расчеты.

Тип данных определяет множество допустимых значений и множество допустимых операций.

Простые типы.

Простые типы делятся на ПОРЯДКОВЫЕ и ВЕЩЕСТВЕННЫЕ.

1. ПОРЯДКОВЫЕ ТИПЫ , в свою очередь, бывают:

а) целые

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

Название типа

Длина (в байтах)

Диапазон значений

32 768...+32 767

2 147 483 648...+2 147 483 647

б) логический

Название этого типа BOOLEAN. Значениями логического типа может быть одна из логических констант: TRUE (истина) или FALSE (ложь).

в) символьный

Название этого типа CHAR - занимает 1 байт. Значением символьного типа является множество всех символов ПК. Каждому символу присваивается целое число в диапозоне 0…255. Это число служит кодом внутреннего представления символа.

2. ВЕЩЕСТВЕННЫЕ ТИПЫ .

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

Длина числового типа данных, байт

Название числового типа данных

Количество значащих цифр числового типа данных

Диапазон десятичного порядка числового типа данных

2*1063 +1..+2*1063 -1

СТРЕКТУРИРОВАННЫЕ ТИПЫ

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

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

Существует несколько методов структурирования. По способу организации и типу компонентов в сложных типах данных выделяют следующие разновидности: регулярный тип (массивы); комбинированный тип (записи); файловый тип (файлы); множественный тип (множества); строковый тип (строки); в языке Турбо Паскаль версии 6.0 и старше введен объектный тип (объекты).

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

1. Массивы

Массивы в Турбо Паскале во многом схожи с аналогичными типами данных в других языках программирования. Отличительная особенность массивов заключается в том, что все их компоненты суть данные одного типа (возможно структурированного). Эти компоненты можно легко упорядочить и обеспечить доступ к любому из них простым указанием порядкового номера.

Описание массива задаётся следующим образом:

<имя типа> = array [<сп.инд.типов>] of <тип>

Здесь <имя типа> - правильный идентификатор;

Array, of – зарезервированные слова (массив, из);

<сп.инд.типов> - список из одного или нескольких индексных типов, разделённых запятыми; квадратные скобки, обрамляющие список, - требование синтаксиса;

<тип> - любой тип Турбо Паскаля.

В качестве индексных типов в Турбо Паскале можно использовать любые порядковые типы, кроме LongInt и типов-диапазонов с базовым типом LongInt.

Глубина вложенности структурированных типов вообще, а следовательно, и массивов – произвольная, поэтому количество элементов в списке индексов типов (размерность массива) не ограничено, однако суммарная длина внутреннего представления любого массива не может быть больше 65520 байт.

2. Записи

Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.

Структура объявления типа записи такова:

< имя типа > = RECORD < сп . полей > END

Здесь <имя типа> - правильный идентификатор;

RECORD, END – зарезервированные слова (запись, конец);

<сп.полей> - список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

3. Множества

Множества – это набор однотипных логических связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Турбо Паскалем. количество элементов, входящих в множество, может меняться в пределах от 0до 256 (множество, не содержащее элементов, называется пустым).именно непостоянством количества своих элементов множества отличаются от массивов и записей.

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

Описание типа множества имеет вид:

< имя типа > = SET OF < баз . тип >

Здесь <имя типа> - правильный индификатор;

SET, OF – зарезервированные слова (множество, из);

<баз.тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме WORD, INTEGER и LONGINT.

Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделяемых друг от друга запятыми; список обрамляется квадратными скобками. Спецификациями элементов могут быть константы или выражения базового типа, а также – тип-диапазон того же базового типа.

4. Файлы

Под файлом понимается либо именованная область внешней памяти ПК, либо логическое устройство – потенциальный источник или приёмник информации.

Любой файл имеет три характерные особенности

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

    он содержит компоненты одного типа. Типом компонентов может быть любой тип Турбо Паскаля, кроме файлов. Иными словами, нельзя создать «файл файлов».

    длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только ёмкостью устройств внешней памяти.

Файловый тип или переменную файлового типа можно задать одним из трёх способов:

< имя >= FILE OF < тип >;

< имя >=TEXT;

<имя> = FILE;

Здесь <имя> - имя файлового типа (правильный индификатор);

FILE, OF – зарезервированные слова (файл, из);

TEXT – имя стандартного типа текстовых файлов;

<тип> - любой тип Турбо Паскаля, кроме файлов.

В зависимости от способа объявления можно выделить три вида файлов:

· типизированные файлы (задаются предложением FILE OF…);

· текстовые файлы (определяются типом TEXT);

· нетипизированные файлы (определяются типом FILE).

О преобразовании числовых типов данных Паскаля

В Паскале почти невозможны неявные (автоматические) преобразования числовых типов данных. Исключение сделано только для типа integer, который разрешается использовать в выражениях типа real. Например, если переменные описаны следующим образом:

Var X: integer; Y: real;

то оператор

будет синтаксически правильным, хотя справа от знака присваивания стоит целочисленное выражение, а слева – вещественная переменная, компилятор сделает преобразование числовых типов данных автоматически. Обратное же преобразование автоматически типа real в тип integer в Паскале невозможно. Вспомним, какое количество байт выделяется под переменные типа integer и real: под целочисленный тип данных integer выделяется 2 байта памяти, а под real – 6 байта. Для преобразования real в integer имеются две встроенные функции: round(x) округляет вещественное x до ближайшего целого, trunc(x) усекает вещественное число путем отбрасывания дробной части.

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

Массивы представляют собой формальное объединение нескольких однотипных объектов (чисел, символов, строк и т.п.), рассматриваемое как единое целое. Все компоненты массива – это данные одного типа.

Общий вид определения массива:

Type A = array [тип индекса массива] of [тип компонент массива]

Например, М1=array of real;

Строки – это массив символов, но количество символов в строке может меняться. Строка трактуется как цепочка символов произвольной длины. Максимальное количество символов не более 255. Каждый символ в строке имеет свой индекс (номер).

Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты записи (поля) могут быть различного типа. Записи позволяют объединять значения различных типов.

Month: (Jan, Feb, Mar, Apr, May, Jun, July, Aug, Sept, Oct, Nov, Dec);

Year: 2000..2050;

Множества – это наборы однотипных, логически связанных друг с другом объектов. Количество элементов, входящих в множество может меняться от 0 до 256. Именно непостоянством своих элементов множества отличаются от массивов и записей.

Digits = Set of 1..5;

Файл – именованная область внешней памяти. Файл содержит компоненты одного типа, кроме файлов (т.е. нельзя создать «файл файлов»). Длина файла не оговаривается и ограничивается только ёмкостью устройств внешней памяти.

F: File of Integer;

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

      1. Указатель (ссылочный тип)

Cодержит адрес байта памяти, в котором находится значение данных определённого типа. Этот тип называют также ссылочным. Для описания используется символ ^ и идентификатор типа. Например, P=^integer;

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

    1. Константы

Константой называют величину, значение которой не меняется в процессе выполнения программы.

    Числовые константы служат для записи чисел. Различают следующие их виды:

Целые числа: записываются со знаком + или -, или без знака, по обычным арифметическим правилам: -10 +5 5

Вещественные числа могут записываться в одной из двух форм:

обычная запись : 2.5 -3.14 2. - обратите внимание, что целая часть отделяется от дробной символом точки;

экспоненциальная форма: в этой записи вещественное число представляется в виде m*10 p , где m – мантисса или основание числа, 0.1≤|m|≤1, p – порядок числа, это целочисленная константа. Действительно, любое вещественное число можно представить в экспоненциальной форме:

153.5 -0.1535*10 3

99.005 0.99005*10 2

Во всех IBM-совместимых компьютерах вещественные числа хранятся как совокупность мантиссы и порядка, что позволяет упростить операции над ними, используя специальную арифметику, отдельно обрабатывающую мантиссу и порядок. Для программной записи числа в экспоненциальной форме вместо "умножить на 10 в степени" используется обозначение E или e (латинская):

153.5 -0.1535*10 3 -0.1535E3 или -1.535E02

99.005 0.99005*10 2 0.99005E+2 или 9.9005e+01

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

Поскольку размер памяти, отводимой под мантиссу и порядок, ограничен, то вещественные числа всегда представляются в памяти компьютера с некоторой погрешностью . Например, простейшая вещественная дробь 2/3 дает в десятичном представлении 0,666666... и, независимо от размера памяти, выделяемой для хранения числа, невозможно хранить все его знаки в дробной части. Одной из типичных проблем программирования является учет возможных погрешностей при работе с вещественными числами.

Шестнадцатеричные числа состоит из шестнадцатеричных цифр, которым предшествует знак $. Диапазон шестнадцатеричных чисел – от $00000000 до $FFFFFFFF.

Кроме числовых констант существуют и другие их виды:

    Логические константы.

Служат для проверки истинности или ложности некоторых условий в программе и могут принимать только одно из двух значений : служебное слово true обозначает истину, а false – ложь;

    Символьные константы.

Могут принимать значение любого печатаемого символа и записываются как символ, заключенный в апострофы ("одинарные кавычки"):

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

К символьным также относятся константы вида #X, где X – числовое значение от 0 до 255 включительно, представляющее собой десятичный ASCII -код символа. Таблицы ASCII-кодов, используемых операционными системами DOS и Windows, приведены в Приложении 1. Например, значение #65 будет соответствовать коду символа "A" латинской.

    Строковые константы.

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

"Введите значение X:"

Если в строковой константе необходимо записать сам символ апострофа, это делается так же, как для символьных констант.

Константы в Турбо Паскале могут быть именованными. Неименованные константы используются, например, при выводе текста сообщений в предыдущем примере. Именованные константы описываются в разделе описаний программы оператором следующего вида:

const Имя1=Значение1;

Имя2=Значение2;

ИмяN=ЗначениеN;

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

const e=2.7182818285;

lang="Turbo Pascal 7.1";

Здесь описана числовая константа e со значением основания натурального логарифма и строковая константа с именем lang, содержащая строку "Turbo Pascal 7.1".

Каждое даваемое программистом имя должно быть уникальным в пределах одной программы. Если мы включим этот раздел в свою программу, мы уже не сможем создать в ней других объектов с именами e и lang.

Глава 6. СТРУКТУРИРОВАННЫЕ
ТИПЫ ДАННЫХ Структурированные типы данных определяют наборы однотипных или разнотипных компонент. Типы компонент образуются из других типов (простых, структурированных, указателей и т. д.) данных. В языке Паскаль существуют следующие структурированные типы: - тип-массив; - тип-запись; - тип-множество; - тип-файл. В Turbo Pascal имеется еще два структурированных типа: - тип-строка string и - тип-строка PChar, являющиеся разновидностями массива. В дальнейшем объекты структурированных типов для краткости будут называться теми же именами, что и их типы, без указания слова "тип": массив, запись, множество, файл, строка. В стандарте языка существуют упакованные (packed) и неупакованные структурированные типы. В Turbo Pascal слово packed, характеризующее упакованный тип, не оказывает никакого влияния; в случае, когда это возможно, упаковка данных осуществляется автоматически. 6.1. Массив Тип-массив представляет собой фиксированное количество упорядоченных однотипных компонент, снабженных индексами. Он может быть одномерным и многомерным. Чтобы задать тип-массив, используется зарезервированное слово array, после которого следует указать тип индекса (индексов) компонент (в квадратных скобках) и далее после слова of - тип самих компонент: type <имя типа> = array[<тип индекса(индексов)>] of <тип компонент>; Пример. type Arr = array of Real; {тип-массив из 3 вещественных чисел} Matrix = array of Integer; {тип - двумерный массив целых чисел, состоящий из 3 строк и 2 столбцов} Введя тип-массив, можно затем задать переменные или типизированные константы этого типа. Размерность массива может быть любой, компоненты массива могут быть любого, в том числе и структурированного, типа, индекс (индексы) может быть любого порядкового типа, кроме типа Longint. При задании значений константе-массиву компоненты указываются в круглых скобках и разделяются запятыми, причем, если массив многомерный, внешние круглые скобки соответствуют левому индексу, вложенные в них круглые скобки - следующему индексу и т. д. Так, для введенных выше типов можно задать, например, следующие переменные и константы: var Ml, М2: Arr; Matr: Matrix; const M3: Arr =(1, 2, 3); Mat: Matrix = ((1, 2), (3, 4), (5, 6)); Последняя константа соответствует следующей структуре: 1 2 3 4 5 6 Примечание. Тип-массив можно вводить непосредственно и при определении соответствующих переменных или типизированных констант. Например: var Ml, M2: array of Real; Matr: array of Integer; Здесь определены те же массивы, что и в предыдущем примере. При таком объявлении массивов следует помнить, что их типы не будут идентичными никаким другим типам, даже если они имеют одинаковую структуру. Поэтому передавать их как параметры в подпрограмму нельзя (см. п. 10.3), нельзя также присваивать им значения других массивов (и наоборот), даже если их структуры совпадают. Доступ к компонентам массива осуществляется указанием имени массива, за которым в квадратных скобках помещается значение индекса (индексов) компоненты. В общем случае каждый индекс компоненты может быть задан выражением соответствующего типа, например: M1, Matrix, M2 и т. д. Одному массиву можно присвоить значение другого массива, но только идентичного типа. Так, если заданы следующие массивы: var А, В: array of Integer; С: array of Integer; то допустим следующий оператор: A:= В; С другой стороны, оператор С:= А; недопустим, т. к. массивы А и С - не идентичных типов. Имеются некоторые отличия в работе с одномерными массивами символов (не путать с величинами типа string - см. п. 6.2). Так, типизированным константам этого вида можно присвоить значение как обычным строковым константам, указав строку символов в апострофах, например const A: array of Char="ааааа"; В: array of Char="bbb"; Для таких массивов, как и для строк, можно использовать операции сравнения (даже если они не идентичных типов и даже если имеют различный размер) и конкатенации (объединения) - см. п. 6.2. Их можно использовать в операторах вывода Write и WriteLn. Например, для введенных выше массивов можно написать if A > В then WriteLn(A) else WriteLn(B); 6.2. Строка типа string В Turbo Pascal тип-строка (стандартный тип string) - последовательность символов произвольной длины (до 255 символов). Строку можно рассматривать как массив символов, однако в связи с широким использованием строк и некоторыми особенностями по сравнению со стандартными массивами они выделены в отдельный тип данных. У типа-строки в квадратных скобках может быть указан его размер (от 1 до 255). Если размер строки не указан, он считается равным 255, например: var Str: string; MaxStr: string; {строка в 255 символов} const January: string = "Январь"; Для строк применимы операции конкатенации (+) и сравнения. Операция конкатенации добавляет к первой строке вторую. Пример. Объединение двух строк. Str, Strl, Str2:string; begin Strl:= "Turbo "; Str2:= "Pascal"; Str:= Strl + Str2; {в переменной Str - "Turbo Pascal"} end. Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII-кодами соответствующих символов. Считается, что отсутствующие символы в более короткой строке имеют код меньше кода любого действительного символа. Например, "XS" больше, чем "X". Пример. Проверить, является ли введенная совокупность символов именем месяца на русском языке. program EXAMPLE11; const Instance: array of string!10]= ("ЯНВАРЬ", "ФЕВРАЛЬ", "МАРТ", "АПРЕЛЬ", "МАЙ", "ИЮНЬ", "ИЮЛЬ", "АВГУСТ", "СЕНТЯБРЬ", "ОКТЯБРЬ", "НОЯБРЬ", "ДЕКАБРЬ"); Month: Boolean = False; var Str: string; i: Integer; begin Writeln("Введите заглавные символы: "); ReadLn(Str); for i:= 1 to 12 do if Str = Instance[i] then Month:=True; if Month then WriteLn("Введено имя месяца") else WriteLn("Введено не имя месяца") end. Фактически строка N символов представляет собой массив из N+1 символа: string[N] = аrrау of Char. Нулевой символ предназначен для указания используемого количества символов строки и может изменяться от символа с кодом 0 до символа с кодом N. С ним можно работать как и с остальными символами строки (записывать и читать его значение и т. д.), но не забывая о его основном предназначении. 6.3. ASCIIZ-строка В версии 7.0 для совместимости с другими языками программирования и средой Windows введен еще один вид строк - строки, оканчивающиеся нулевым байтом - символом с кодом 0 (т. н. ASCIIZ-строки). В отличие от строк типа string у этих строк не накладывается ограничение на их размер (фактически размер может быть до 65535 байтов). Этим строкам дан стандартный тип PChar. Фактически этот тип является указателем на символ (об указателях см. п. 7): PChar = ^Char; Однако применение расширенного синтаксиса (ключ {Х+} - см. п. 17.7.1) позволяет использовать такую переменную как строку, эквивалентную масиву типа pChar = array of Char, где К - количество символов в строке, не считая завершающего символа с кодом 0. В отличие от типа string символ с индексом 0 здесь является первым символом строки, а последний символ с индексом К - завершающим символом с кодом 0. При работе с ASCIIZ-строками целесообразно задавать расширенный синтаксис; в этом случае не возникают трудности при использовании различных стандартных подпрограмм, работающих со строками. Пример. Использование строк типа PChar при расширенном синтаксисе. program EXAMPLE12; {$Х+} {не обязательно так как используется по умолчанию} type Т = array of Char; {массив для строки из 7 символов} var Str: PChar; const А: Т = "привет!"#0; begin Str:= "ПРИВЕТ!"; WriteLn(Str); {вывод строки: ПРИВЕТ!} Str:= @А; {допустимо также: Str:=A} WriteLn(Str); {вывод строки: привет!} WriteLn(Str);{вывод символа "р"} ReadLn end. Если используется ключ {$Х-}, переменная типа PChar в этом случае рассматривается как указатель на один единственный символ. В этом случае ни один из операторов предыдущего примера, за исключением операторов Str:=@A; и ReadLn, недопустимы, а оператор WriteLn(Str^), выполненный после оператора Str:=@A;, выдаст один символ "п". Для работы с ASCIIZ-строками в версии 7.0 используются специальные стандартные модули Strings (см. п. 16.2) и WinDos (см. п. 16.6). 6.4. Запись Тип-запись включает ряд компонент, называемых полями, которые могут быть разных типов. При задании типа-записи после зарезервированного слова record следует перечислить все поля типа-записи с указанием через двоеточие их типов и завершить задание типа словом end. Поля отделяются друг от друга точкой с запятой. Количество полей записи может быть любым. Пример. type Complex = record {Тип комплексных чисел} Re: Real; Im: Real end; Data = record {Тип - дата рождения} Year: Integer; Month: 1..12; Day: 1..31 end; Person = record {Тип - сведения о сотруднике} Name: string; Sex: (Male, Female); Age: Integer; Married: Boolean end; Примечание. Если несколько полей типа-записи имеют один и тот же тип, то их имена можно перечислить через запятую и затем указать этот общий тип. Так, рассмотренный в примере тип комплексных чисел можно ввести и другим образом: type Complex = record Re, Im: Real end; После введения типа-записи можно затем задать переменные или типизированные константы этого типа - записи. При задании значений константе ее поля записываются в круглых скобках через точку с запятой. Для задания значения каждого поля сначала указывается имя поля, а затем через двоеточие - его значение. Так, для введенных выше типов можно задать, например, следующие переменные и константы: var X, У, Z: Complex; Dat: Data; const Birthday: Data = (Year: 1971; Month: 12; Day: 9); Ivanov: Person = (Name: "Иванов"; Sex: Male; Age: 40; Married: True); Примечание. Тип-запись можно вводить и непосредственно при определении переменных или типизированных констант. Например, фрагмент var X, Y, Z: record Re, Im: Real end; определяет те же комплексные переменные, что и в предыдущем примере. Доступ к полям записи осуществляется указанием имени переменной (константы) и имени поля, записываемого через точку, например: Ivanov.Age, X.Re, Dat.Day и т. д. Пример. Использование полей записей. X.Re:= 1.5; X.Im:=1.7; Y.Re:= -X.Re; Y.Im:= -X.Im; Ivanov.Married:= False; Для того чтобы не выписывать каждый раз имя записи при обращении к ее полям, можно использовать оператор над записями WITH. Его структура выглядит следующим образом: with <имя записи> do <оператор>; В этом случае внутри оператора можно указывать только поле записи. Например, фрагмент: with X do begin Re:= 1.5; Im:= 1.7; Y.Re:= -Re; Y.Im:= -Im end; with Ivanov do Married:= False; эквивалентен фрагменту из предыдущего примера. Тип-запись может иметь вариантную часть, изменяющуюся при разных реализациях, например, в типе-записи параметров геометрических фигур для квадрата задается сторона, для треугольника - две стороны и угол между ними, для окружности - радиус и т. д. Вариантная часть может быть только одна и должна располагаться в конце записи. Пример. Использование вариантной части. type Figure = (Square, Triangle, Circle); Param = record X, Y: Real; {координаты точки привязки} case Fig: Figure of {параметры фигур} Square: (Side: Real); Triangle: (Sidel, Side2, Angle: Real); Circle: (Radius: Real) end; var MySquare, MyCircle: Param; Вариантная часть начинается словом case, за которым следует переменная выбора варианта (в примере Fig) с указанием типа. Далее указываются константы значения которых может принимать переменная выбора варианта (в примере Square, Triangle, Circle). За каждой константой через двоеточие в круглых скобках записываются поля данного варианта записи с указанием их типов. Круглые скобки необходимы, даже если для данного варианта вариантная часть отсутствует. Следует отметить, что вариантная часть не завершается своей операторной скобкой end, как у обычной конструкции CASE, т. к. далее идет завершающая операторная скобка end всего типа. В стандарте языка Паскаль перед тем, как использовать один из вариантов записи, переменной выбора варианта необходимо присвоить соответствующее значение: Fig:= Square; MySquare.Side:=5.0; Fig:= Circle; MyCircle.Radius:=7.5; В Turbo Pascal эту операцию делать необязательно, хотя, если переменная выбора задана, ее затем можно в программе посмотреть, чтобы определить, какой задан вариант. Более того, задание значения переменной выбора ни на что не оказывает влияния, и следующий фрагмент эквивалентен рассмотренному выше: Fig:= Circle; MySquare.Side:= 5.0; Fig:= Square; MyCircle.Radius:-7.5; В тип-записи допустимо не вводить переменную выбора вариантов, а перечислить лишь разные варианты, например: Transf = record case Integer of 1: (_Word: Word); 2: (_TwoSymb: array of Char) end; 6.5. Множество В языке Паскаль типом-множеством называется множество-степень исходного множества объектов порядкового типа, т. е. множество всевозможных сочетаний объектов исходного множества. Число элементов исходного множества в Turbo Pascal не может быть больше 256, а порядковые номера элементов (т. е. значение функции Ord) должны находиться в пределах от 0 до 255. Для задания типа-множества следует использовать зарезервированные слова set и of, а затем указать элементы этого множества, как правило, в виде перечисления или диапазона, например: type Alfa = set of "A".."Z"; Count = set of (Plus, Minus, Mult, Divid); Ten = set of 0..9; Number = set of "0".."9" ; Введя тип-множество, можно задать переменные или типизированные константы этого типа-множества. При задании значений константе-множеству ее элементы перечисляются через запятую (допустимо указывать диапазоны) и помещаются в квадратные скобки. Например, для введенных выше типов можно задать такие переменные и типизированные константы: var CharVal: Alfa; Operation: Count; const Index: Ten = ; Digit: Number = ["0".."9"]; Примечание. Так же как и для других структурированных типов, тип-множество можно ввести непосредственно при задании переменных или типизированных констант: var CharVal: set of "A".."Z"; Operation: set of (Plus, Minus, Mult, Divid); const Index: set of 0..9 = ; Digit: set of "0".."9"=["0".."9"]; Множеству можно в программе присвоить то или иное значение. Обычно значение задается с помощью конструктора множества. Конструктор задает множество элементов с помощью перечисления в квадратных скобках выражений, значения которых дают элементы этого множества. Допустимо использовать диапазоны элементов. Пример. Следующие структуры являются конструкторами множеств: В каждое множество включается и т. н. пустое множество , не содержащее никаких элементов. Конструктор множества можно использовать и непосредственно в операциях над множествами. Для множеств определены следующие операции: + - объединение множеств; - - разность множеств; * - пересечение множеств; = - проверка эквивалентности двух множеств; <> - проверка неэквивалентности двух множеств; <= - проверка, является ли левое множество подмножеством правого множества; >= - проверка, является ли правое множество подмножеством левого множества; in - проверка, входит ли элемент, указанный слева, в множество, указанное справа. Результатом операции объединения, разности или пересечения является соответствующее множество, остальные операции дают результат логического типа. Пример. Ввести строку символов, состоящую из латинских букв, цифр и пробелов. Осуществить проверку правильности введенных символов. program EXAMPLE13; var Str: string; L: Byte; Tru: Boolean; begin WriteLn("Введите строку"); ReadLn(Str); L:= Length(str); {число введенных символов} Tru:= L > 0; {true, если не пустая строка} while Tru and (L > 0) do {проверка с конца строки} begin Tru:=Str[L] in ["0".."9", "A".,"Z", "a".."z", " "]; {проверка допустимости символа} Dec(L) {предыдущий символ} end; if Tru then WriteLn("Правильная строка") else WriteLn("Неправильная строка") end. 6.6. Файл Тип-файл представляет собой последовательность компонент одного типа, расположенных на внешнем устройстве (в стандарте языка за основу взято расположение данных на магнитных лентах). Компоненты могут быть любого типа, за исключением типа-файла (или содержащего компоненты типа-файла) и типа-объекта. Число компонент в файле не объявляется. Для задания типа-файла следует использовать зарезервированные слова file и of, после чего указать тип компонент файла. Пример. type Number = file of Integer; {тип-файл целых чисел} Symb = file of "A".."Z"; {тип-файл прописных латинских букв} Стандартный тип Text определяет тип-файл, содержащий символы, объединенные в строки. Следует иметь в виду, что тип Text в Turbo Pascal не эквивалентен типу file of Char. Введя файловый тип, можно определить переменные файлового типа: var Fl, F2: Number; F3: Text; FF4: Symb; В Turbo Pascal можно использовать файл без типа, при определении которого не указывается тип компонент. В этом случае работа с файлом осуществляется на физическом уровне в соответствии с внутренним форматом его данных. При этом реальные компоненты файла могут иметь и различный тип. Пример. type UnTyp = file; Тип-файл можно определять и непосредственно при объявлении файловых переменных: var Fl, F2: file of Integer; Файловые переменные имеют специфическое применение. Над ними нельзя выполнять никаких операций (присваивать значение, сравнивать и т. д.). Их можно использовать лишь для выполнения операций с файлами (чтения, записи, удаления файла и т. д.). Работа с файлами будет рассмотрена в п. 11. Кроме того, через файловую переменную можно получить информацию о конкретном файле (тип, параметры, имя файла и т. д.)

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

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

Определение 1

Линейной называется конструкция алгоритма, реализованная в виде последовательности действий (шагов), причем каждое действие (шаг) выполняется только 1 раз, после каждого действия (шага) выполняется увеличение действия (шага) на 1 до тех пор, пока значение не станет больше конечного параметра алгоритма.

С помощью линейных алгоритмов представляют линейные процессы. Алгоритмы этого типа используют при описании обобщенного решения задач в виде последовательностей модулей.

Определение 2

Разветвляющейся (ветвящейся) называют алгоритмическую конструкцию, обеспечивающую выбор между 2 вариантами решений в зависимости от значений входных данных.

Ветвления бывают двух типов: неполное (если-то ) и полное (если-то-иначе ). С помощью полного ветвления можно организовать 2 ветви в алгоритме (то или иначе ), каждая из которых приведет к общей точке их слияния, алгоритм будет выполняться независимо от того, по какому пути пошло решение. При наличии неполного ветвления предполагаются некоторые действия алгоритма лишь на одной ветви (то ), поскольку вторая отсутствует, для одного из результатов проверки действия производить нет необходимости, управление сразу перейдет к точке слияния. Различают 4 базовые варианта структуры ветвления:

  1. Неполное ветвление типа «если – то », при котором все действия будут выполняться истинности условия.
  2. Полное ветвление типа «если – то – иначе» , при котором будут выполняться 2 действия в зависимости от истинности условия.
  3. Ветвление с выбором типа «то» , при котором действие 1 будет выполняться при условии 1, действие 2 при условии 2 и т.д.
  4. Ветвление с выбором типа «иначе» , при котором при условии 1 будет выполняться действие 1, при условии 2 действие 2 и т.д., а иначе будут выполняться все другие действия.

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

Определение 3

Циклической (или циклом) называется конструкция алгоритма, в которой некоторая группа идущих подряд действий (шагов) выполняется несколько раз в зависимости от условия задачи и входных данных.

Определение 4

Такую группу повторяющихся действий на каждом шагу цикла называют телом цикла .

В любой циклической конструкции содержатся элементы ветвящейся конструкции алгоритма.

Различают 3 типа циклических алгоритмов:

  • цикл с параметром (арифметический цикл);
  • цикл с предусловием;
  • цикл с постусловием (последние два называют итерационными).

Арифметический цикл

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

Цикл с предусловием

В данном цикле количество шагов заранее не определяется, оно зависит от входных данных. В этой циклической структуре сначала происходит проверка значения условного выражения (условия), стоящего перед выполнением очередного шага цикла. При истинном значении условного выражения будет исполняться тело цикла. После чего снова будет выполняться проверка условия. Эти действия будут повторяться до тех пор, пока значение условного выражения не станет ложным, тогда цикл завершится.

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

Цикл с постусловием

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

В реальных задачах, как правило, присутствует любое количество циклов.

Ниже приведены блок-схемы циклических алгоритмов.

Типы данных: простые и структурированные

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

Определение 5

Переменная представляет собой именованный объект (ячейку памяти), изменяющий свое значение.

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

Типом переменной задается:

  • используемый способ записи информации в ячейки памяти;
  • необходимый объем памяти для ее хранения.

Для каждого типа объем памяти определяется так, чтобы в него можно было поместить любое значение из допустимо¬го диапазона значений для данного типа.

Определение 6

Переменные, которые присутствуют в программе на протяжении всего периода ее работы, называются статическими .

Определение 7

Переменные, которые создаются и уничтожаются на разных этапах выполнения про¬граммы, называются динамическими .Определение 10

Массивом называют упорядоченную совокупность однотипных величин, которые имеют общее имя, порядковые номера у элементов (индексы).

Элементы массива хранятся в памяти компьютера по соседству в отличие от одиночных элементов. Массивы различают по количеству индексов элементов.

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

Определение 11

Количество элементов массива называется размерностью .

У одномерного массива его размерность записывают рядом с именем в круглых скобках.

Элементы одномерного массива вводятся поэлемен¬тно, в порядке, необходимом для решения конкретной задачи. При необходимости ввода всего массива элементы вводятся в порядке возрастания индексов.

Читайте также: