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

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

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

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

  • регулярный тип (массивы);
  • комбинированный тип (записи);
  • файловый тип (файлы);
  • множественный тип (множества);
  • строковый тип (строки);
  • объектный тип (объекты).

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

Литература

  1. Попов В.Б. Паскаль и Дельфи. Самоучитель - СПб.: Питер, 2004. - 544 с.: ил.

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

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

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

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) усекает вещественное число путем отбрасывания дробной части.

Глава 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. Кроме того, через файловую переменную можно получить информацию о конкретном файле (тип, параметры, имя файла и т. д.)

Простые типы данных

Типы данных

Общая характеристика реляционной модели данных

Основы реляционной модели данных были впервые изложены в статье Е.Кодда в 1970 г. Эта работа послужила стимулом для большого количества статей и книг, в которых реляционная модель получила дальнейшее развитие. Наиболее распространенная трактовка реляционной модели данных принадлежит К.Дейту . Согласно Дейту, реляционная модель состоит из трех частей:

  • Структурной части.
  • Целостной части.
  • Манипуляционной части.

Структурная часть описывает, какие объекты рассматриваются реляционной моделью. Постулируется, что единственной структурой данных, используемой в реляционной модели, являются нормализованные n-арные отношения.

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

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

В данной главе рассматривается структурная часть реляционной модели.

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

Важно! Реляционная модель требует, чтобы типы используемых данных были простыми .

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

  • Простые типы данных.
  • Структурированные типы данных.
  • Ссылочные типы данных.

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

  • Логический.
  • Строковый.
  • Численный.

Различные языки программирования могут расширять и уточнять этот список, добавляя такие типы как:

  • Целый.
  • Вещественный.
  • Дата.
  • Время.
  • Денежный.
  • Перечислимый.
  • Интервальный.
  • И т.д.…

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

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

  • Массивы
  • Записи (Структуры)

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

называемое множеством индексов. Отображение

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

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

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

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

Работая же с простыми типами данных, например с числовыми, мы манипулируем ими как неделимыми целыми объектами. Чтобы "увидеть", что числовой тип данных на самом деле сложен (является набором битов), нужно перейти на более низкий уровень абстракции. На уровне программного кода это будет выглядеть как ассемблерные вставки в код на языке высокого уровня или использование специальных побитных операций.

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

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

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

§ регулярный тип (массивы);

§ комбинированный тип (записи);

§ файловый тип (файлы);

§ множественный тип (множества);

§ строковый тип (строки);

§ в языке Турбо Паскаль версии 6.0 и старше введен объектный тип (объекты).


26)Оператор goto - это оператор безусловного перехода. Он применяется в том случае, когда после выполнения некоторого оператора нужно перейти не к следующему за ним оператору, а в какую-то другую часть программы, помеченную специальной меткой. Эта метка обязательно должна быть объявлена в разделе описания меток данной программы. Метка может быть как числовой, например: goto 12, так и содержать буквенные символы, например: goto raschets.

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

Пустой оператор не выполняет никаких действий и не содержит никаких символов. Обычно такой оператор используется для организации перехода к концу локального или глобального блока. Особенно в тех случаях, когда необходимо пропустить несколько операторов, но не выходить из блока. Для этого перед зарезевированным словом «end» ставится метка и за ней обязательно двоеточие. Например:

goto Metka; (Переход в конец блока)

Metka: (Пустой оператор помечен меткой)

ввод - Read(<список_ввода>) и ReadLn(<список_ввода>).

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

Список ввода - это последовательность имён переменных, разделённых запятыми. Например, при помощи команды

ReadLn(k, x, c, s); {k: Byte; x: Real; c: Char; s: String}

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

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

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

Вообще, вводить с клавиатуры можно только данные базовых типов (за исключением логического). Если же программе всё-таки необходимо получить с консоли значение для Boolean-величины, придётся действовать более хитро: вводить оговоренный символ, а уже на его основе присваивать логической переменной соответствующее значение. Например:

WriteLn("Согласны ли Вы с этим утверждением? y - да, n - нет");

ReadLn(c); {c: Char}

else WriteLn("Ошибка!");

until (c = "n") or (c = "y");

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

Вывод - Для того, чтобы вывести на экран какое-либо сообщение, используют процедуру Write(<список_вывода>) или WriteLn(<список_вывода>).

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

Формат - Если для вывода информации воспользоваться командой, приведённой в конце предыдущего пункта, то выводимые символы окажутся «слепленными». Чтобы этого не случилось, нужно либо позаботиться о пробелах между выводимыми переменными:

WriteLn(a, " ", b, " ", c);

либо задать для всех (или хотя бы для некоторых) переменных формат вывода:

WriteLn(a: 5, b, c: 20: 5);

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

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

Например, если a = 25, b = "x", а c = 10.5, то после выполнения команды WriteLn(a: 5, " ", b, c: 10: 5) на экране или в файле будет записано следующее (подчерки в данном случае служат лишь для визуализации пробелов):

25_x_ _10.50000

Особенно важен формат при выводе вещественных переменных. К примеру, если не указать формат, то число 10.5 будет выведено как 1.0500000000Е+0001. Такой формат называется записью с плавающей точкой.

Если же задать только общую длину вещественного числа, не указывая длину дробной части, то оно будет занимать на экране заданное количество символов (в случае надобности, спереди будет добавлено соответствующее количество пробелов), но при этом останется в формате плавающей точки. Минимальной длиной для вывода вещественных чисел является 10 (при формате _x.xE+yyyy). Первая позиция зарезервирована под знак «-».

27) A лгоритм линейной структуры (линейный алгоритм) – алгоритм, в котором блоки выполняются последовательно друг за другом. Такой порядок выполнения блоков называется естественным .

Пример. Вычислить

Решение : Схема алгоритма линейной структуры имеет вид (рис.1.)

28)Простой и составной операторы

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

Два последовательных оператора обязательно должны разделяться точкой с запятой “;”.

Примеры простых операторов:

a:= 10; b:= a*5; Write(a, b);

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

Составной оператор – это последовательность операторов, перед которой стоит слово BEGIN, а после – END. Слова BEGIN и END часто именую операторными скобками.

Пример составного оператора:

BEGIN
a:= 10;
b:+ a*5;
Write(a, b)
END ;

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

ВАЖНО: Составной оператор применяется в тех случаях, когда синтаксис языка Паскаль допускает использование только одного оператора, в то время как алгоритм требует задания некоторой последовательности действий. В Паскале все управляющие структуры (операторы) не различают простой и составной оператор: там где стоит простой оператор, можно поставить и составной.


30. цикл с постусловием: Циклы применяются, когда нужно выполнить одни и те же команды несколько раз.

Рассмотрим общий вид цикла с постусловием:

[тело цикла];

Until < логическое выражение>;

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

Стоит правильно понимать суть этого цикла: «Повторять команды, приведенные в теле цикла до тех пор, пока данное условие не будет выполнено (логическое выражение не будет истинным)».

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

Рассмотрим общий вид цикла с предусловием:

While <логическое выражение> do [оператор][;]

[тело цикла];

Главными плюсами данного цикла являются:

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

2. В данном цикле можно реализовать повторение команд до определенного условия – до логического выражения .

Стоит правильно понимать суть этого цикла: «Пока данное условие выполняется (или логическое выражение не ложь) повторяем команды, написанные в теле цикла, иначе завершаем цикл».

Через цикл с предусловием можно реализовать цикл с параметром, за одним «но» – на практике лучше использовать «for».


Похожая информация.


Поддержите проект — поделитесь ссылкой, спасибо!
Читайте также
Чем открыть файл fb2 на Андроид? Чем открыть файл fb2 на Андроид? Как найти песню не зная названия и исполнителя Как найти песню не зная названия и исполнителя Что делать, если шумит и трещит жёсткий диск Что делать, если шумит и трещит жёсткий диск