16830

Сложные типы данных

Лекция

Информатика, кибернетика и программирование

Лекция 3 2.4. Сложные типы данных Сложные типы данных характеризуются типами их компонентов и методом их объединения. К сложным структурированным составным типам данных агрегатам относят массивы записи множества и файлы. Массивы Массив это nмерная совоку...

Русский

2013-06-26

218 KB

8 чел.

Лекция 3

2.4. Сложные типы данных

Сложные типы данных характеризуются типами их компонентов и методом их объединения. К сложным (структурированным, составным) типам данных (агрегатам) относят массивы, записи, множества и файлы.

Массивы

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

  1.  вектор с элементами ai для i = 1n; на языке Паскаль это одномерный массив;
  2.  матрица с элементами a i, j ; на языке Паскаль - это двумерный массив;
  3.  пространство Ai,j,k...; на языке Паскаль - это n-мерный массив, где n -
    количество его измерений (индексов).

Массивы часто используют для:

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

Объявление массивов определяет атрибуты, характерные только для массивов, размерность и размер:

  1.  размерность (количество измерений)  массива определяет количество ин
    дексов при обращении к элементу массива;
  2.  размер массива - это количество его элементов с учетом всех его измере
    ний.

Размерность массива на языке Паскаль не ограничена. Однако общий объем ОП массива должен быть не более 65520 байт.

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

Массивы можно определить в разделах TYPE или VAR.

Форма объявления массива:

ТYРЕ  Т   =  ARRAY    [   T1   ]   OF  T2   ;

где     Т - имя типа массива;

Т1 - тип индексов в виде списка типов, по одному для каждого измерения; обычно тип индексов диапазонный; Т2 - базовый тип: тип элементов массива.

Примеры объявления массивов данных различных типов:

TYPE ТА = ARRAY [1 .. 10] OF INTEGER; { Тип массива А }

    MN = SET OF 2 ..100; { Тип множества }

VAR А : ТА; { Массивы данных: А - целого типа }

В : ARRAY [1 .. 20] OF REAL; { В - вещественного }

С : ARRAY [1..10,1..20] OF REAL;{С - двумерный, веществ.}

D : ARRAY [-10 .. 10] OF BOOLEAN; { D - логического }

E : ARRAY [0 .. 30] OF CHAR; { E - символьного }

F : ARRAY [1 .. 15] OF STRING[30]; {F- строковых данных}

G :  ARRAY [1 .. 20] OF MN; { G - множеств }

Тип массива А и множества MN в примере определен в разделе TYPE. Остальных массивов - в разделе VAR.

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

  1.  какие переменные могут быть с индексами;
  2.  сколько должно быть индексов при обращении к элементу массива;

какие допустимы значения индексов в соответствии с определенными для
них границами;

какой объем ОП нужен массиву.

Объем ОП, необходимой для размещения массива, определяется из объема ОП, требующегося для размещения одного элемента, и из размера массива, т. е. общего количества его элементов. Например, для 20 элементов типа REAL надо 20 * 6 = 120 байт ОП.

Так как тип элементов массива может быть любой, компонентами массива могут быть структурированные данные: массивы, записи, множества или файлы. Например:

TYPE В = ARRAY [ 1 .. 20 ] OF REAL ; VAR  A : ARRAY [ 1 .. 30 ] OF В ;

To же объявление можно выполнить по-другому:

VAR A : ARRAY [ 1 .. 30 ] OF ARRAY [ 1 .. 20 ] OF REAL ;

VAR A : ARRAY [ 1 .. 30, 1 .. 20 ] OF REAL ;

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

TYPE MES = (YAN,FEB,MAR,APR,MAI,IUN,IUL,AUG,SEN,OKT,NOV,

           DEC);

      X = ARRAY [ MES ] OF BYTE;

VAR А, В : X ;

      С : BYTE ;

BEGIN   В [YAN] := 31 ;       A [FEB] := 28;

                             С := A [FEB] ; ...

END.

В примере тип индексов массивов А и В определен как перечисляемый тип MES.

В ОП элементы массива располагаются так, что при переходе от элемента к элементу наиболее быстро меняется самый правый индекс массива. Таким образом, матрица располагается в ОП по строкам. Например:

VAR A : ARRAY [1..4] OF REAL;

В : ARRAY [1..2, 1..3] OF REAL;

В ОП элементы этих массивов располагаются в последовательности:

   A1 A2 A3 A4 B1,1 B1,2 B1,3 B2,1 B2,2 B2,3 

Обращение к элементу массива формируется в виде имени массива и списка индексов в квадратных скобках. Например:

A[i] - для обращения к ai элементу одномерного массива;

B[i, j] - для обращения к bi,j элементу двумерного массива;

c[i,j,k] - для обращения к Ci,j,k элементу трехмерного массива.

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

Примеры индексов в виде выражения: A[I  + J],  B[I], [J DIV 2].

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

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

TYPE  Т  = ARRAY [ 1 .. 10 ] OF REAL ;

VAR А, В : Т ; ...

A := В ; { - копирование элементов массива }

Ввод-вывод элементов массивов можно производить только поэлементно, т. е. с помощью циклов. Например:

FOR  I  :=  1  ТО 10  DO   READ (A[I]);

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

CONST  М = 10;  N = 20 ;

  TYPE Т = ARRAY [1 .. М,1 .. N]  OF REAL ;

  VAR   А,  В  : Т ;

            I  : INTEGER;

...

FOR  I := 1  ТО  М  DO   ...

FOR  J : = 1  TO  N  DO   ...

Записи

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

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

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

Фиксированная запись - это структура постоянного строения, состоящая из фиксированного количества элементов (компонентов, полей). Элементы записи в ней могут быть любых типов, в том числе скаляры, множества, файлы, другие записи. Описатель типа записи RECORD. Объявление записи заканчивается словом END и может быть в разделах TYPE или VAR. Форма объявления записи:

TYPE   Т =  RECORD  список-полей  END ;

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

Например:

TYPE TAB = RECORD { - объявление записи в разделе TYPE }

А,В : REAL;  { А и В - поля одинакового типа }

END;

VAR С : TAB;

       D : RECORD{ - объявление записи в разделе VAR }

Е, F : INTEGER; END;

Пример таблицы с данными различного типа:

СВЕДЕНИЯ О СТУДЕНТАХ

Номер зачетки                             Фамилия и инициалы 

Размер стипендии 

93100                                             Иванов И. И.                    2000.55           

93101                                             Петров П. П.                    2500.40 

Данные таблицы могут быть объявлены в виде:

TYPE  STR = RECORD { STR - имя типа записи }

NZ : 93100. .93500;

FIO : STRING[20];

RS : REAL;
END;

VAR STUD : STR; { STUD - переменная типа STR }

MST : ARRAY [1..20] OF STR; { MST - массив данных типа STR }

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

STUD.NZ,    STUD.FIO,   MST[I].FIO,   MST[I].RS.

Для вложенных полей (подструктур) уточнений имени может быть несколько. Например: А.В.С.

Пример копирования записи с помощью одного оператора присваивания: STUD := MST[I]; MST[I] := MST[J]; MST[J] := STUD;

Пример таблицы с элементом (полем) записи в виде массива:

СВЕДЕНИЯ О РЕЗУЛЬТАТАХ ЭКЗАМЕНОВ

Ф. И. 0. 

Номер зачетки 

Оценка экзамена по дисциплине 

Математика 

Физика 

Программир. 

История 

Иванов И. И. 

93100 

5 

4 

3 

4 

Петров П. П. 

93101 

3 

5 

4 

3 

Данные таблицы могут быть объявлены в виде:

TYPE  ST = RECORD      { Определение типа записи }

NZ : 93100..93500;

FIO : STRING[20];

ОС : ARRAY [1..4] OF BYTE; { - поле - массив из четырех оценок }

END;

VAR EKZ : ARRAY [1..25] OF ST;    { - массив записей типа ST }

Примеры обращения к элементам массива записей EKZ:

EKZ[I] .FIO - к фамилии I-строки таблицы;

EKZ[I] .OC[J] - к J-оценке I-строки таблицы.

Пример записи с полем перечисляемого типа:

TYPE  DATE = RECORD { - тип записи для определения даты }

DEN : 1 .. 31 ; { - поле интервального типа )

MES : (YAN,FEB,MAR,APR,MAY,IUN,    {-поле перечисляемого }

     IUL, AUG, SEN, OKT, NOV, DEC ) { типа };
GOD : 1900 .. 2000 ;

END ;

VAR X : DATE ; { - переменная типа DATE }

Y : ARRAY [ 1 .. 12] OF DATE ; {- массив типа DATE }

Обращение к полям записи:

X.DEN := 25; X.MES := APR; X.GOD := 1991; Y[I].GOD := 1993;

Пример копирования записи: X  := Y[I]  ;

Пример - таблица с элементом KRCH в виде массива значений:

Табельный номер 

Ф. И. О. сотрудника 

Должность 

Оклад 

Количество рабочих часов за 

Фам. 

Имя 

Отч. 

янв. 

февр. 

дек. 

Данные таблицы можно объявить в виде:

TYPE  FIO = RECORD { - тип записи для определения Ф.И.О. }

FAM : STRING[25];  { - фамилия } NAME : STRING[15];  { - имя }

ОТСН : STRING[20];  { - отчество }

END;

MES = (YAN,FEB,MAR,APR,MAI,IUN,IUL,AUG,SEN,OKT,NOV, DEC) ;

SOTR = RECORD       { - тип записи со сведениями о сотруднике: }

TN : WORD;         { - табельный номер }

SFIO : FIO; { - Ф.И.О. сотрудника - элемент записи

типа SOTR в виде записи типа FIO }

DOL : STRING[20];   { - должность }

OKL : REAL;         { - оклад }

  KRCH : ARRAY [ MES ] OF REAL;

END;

VAR VEDOM : ARRAY[1..100] OF SOTR; { - массив данных типа SOTR }

где     KRCH - количество рабочих часов по месяцам в виде 12 элементов массива данных типа REAL с индексами в виде данных типа MES.

Пример пересылки данных типа SOTR: VEDOM[I]   := VEDOM[J] ;   . Примеры обращения к элементам массива записей VEDOM:

VEDOM[I] .SFIO.FAM - к фамилии из I - строки ведомости;

VEDOM[I] .KRCH[MAI] - к количеству рабочих часов за май (5-й элемент массива KRCH) I - строки ведомости.

WITH - оператор присоединения

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

Форма оператора WITH:

WITH     список-имен-записей     DO     S   ;

где     S - один оператор, простой или составной (блок).

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

WITH  Y[I]  DO  IF  DEN  >  15  THEN WRITE (' Вторая половина месяца');

Это эквивалентно записи: IF Y[I].DEN > 15 THEN WRITE (' Вторая половина месяца');.

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

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

Форма 1 переменной (вариантной) части записи:

TYPE  SEL = тип ;  ...  описание фиксированной части записи CASE  SEL  OF

          Метка-1 : ( список-полей );

          Метка-2 : ( список-полей ); ... END ;

Форма 2 переменной (вариантной) части записи:

TYPE  SEL = тип ;  ...  описание фиксированной части записи CASE  PR : SEL  OF

              Метка-1 : ( список-полей ) ;

              Метка-2 : ( список-полей ) ; ...

END ;

где     SEL - имя типа ключа PR и меток для выбора варианта;

PR - имя переменной - селектора (ключа) выбора варианта; оно должно получить значение до использования вариантной части записи;

элемент списка-полей - это список-идентификаторов-полей : тип.

Ограничения:

  1.  в описании записи может быть только одна вариантная часть;
  2.  все идентификаторы в списках полей одной записи должны быть различны;
    однако, на разных уровнях вложенности полей одной записи и в разных
    записях имена могут повторяться;
  3.  вариантная часть записи должна быть последним ее элементом.

Тип SEL должен определять перечисляемый тип переменной. Для выбора одного из вариантных полей значениями этого типа должны быть метки, стоящие перед списками вариантных полей. Переменной (pr) этого типа в программе можно присваивать значения ее типа (sel) и таким образом выбирать один из вариантов полей вариантной записи.

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

Листинг 3. Первая форма вариантной записи.

TYPE VID = (KNIG,GAZ,GUR); {VID - имя типа селектора}

        IZDANIE = RECORD {Тип  вариантной записи  }

              AVTOR,NAIM : STRING;

           CASE VID OF

              KNIG :(GODIZD:1900..2000;IZDAT:STRING);
              GAZ  :( NM:1..365;REDAKTOR:STRING);

              GUR  :(NOM:1..12;GOD:1900..2000);

              END;

    VAR  V:VID; {- переменная  типа  VID}

         К:ARRAY[1..50] OF IZDANIE;{- массив  записей} BEGIN

    WITH К[5] DO {Присоединение к 5-й записи массива К}

    BEGIN        {Заполнение   5-й  записи массива  К:}

            AVTOR :='Н.Вирт';

            NAIM  :='Язык Паскаль';

         V := KNIG; {- установлено значение варианта}

                  GODIZD :=1982;

                  IZDAT  :='Мир';

    END;

END.

В примере листинга 3 приведено заполнение 5-го элемента массива записей. В обоих примерах использованы обозначения:

VID - имя типа ключа;

V - имя переменной - ключа для выбора варианта записи;

V может принимать значения KNIG, GAZ или GUR.

Листинг 4. Вторая форма вариантной записи.

TYPE  VID = ( KNIG, GAZ, GUR ) ; IZDANIE  =  RECORD

AVTOR, NAIM : STRING ;

CASE V : VID OF {V - в составе записи IZDAHIE} KNIG : ( GODIZD : 1900 .. 2000 ;

  IZDAT  : STRING );

GAZ  : (NM : 1 .. 365 ;

 REDAKTOR : STRING ) ; GUR  : ( NOM    : 1 .. 12 ;

GOD    : 1900 .. 2000 ) ;

                 END ;

VAR E : IZDANIE ; { - переменная типа IZDANIE }

BEGIN { Заполнение переменной Е: }

          E.AVTOR := 'H. Вирт' ;

          E.NAIM  := 'Язык Паскаль' ;

          E.V     := GUR ;  { - значение варианта }

          E.NOM   := 10 ;

          E.GOD   := 1972 ;

END.

Множества

Множество в математике - это произвольный набор объектов любой природы, понимаемый как единое целое. На языке Паскаль множество - это ограниченная совокупность различных элементов базового типа множества. Количество элементов, входящих в множество, может быть в пределах от 0 до 255. Данные переменной типа множества могут быть в виде множества-переменной и множества-константы (конструктора).

Описатель переменной типа множества - SET. Объявление переменной типа множества определяет базовый тип, т. е. состав элементов, из значений которых создаются конкретные значения множественного типа, и мощность множества (максимальное количество его элементов). В качестве базового типа может быть любой ординальный (порядковый) тип данных, кроме типов WORD, INTEGER и LONGINT. В том числе в качестве базового типа может быть тип BYTE, SHORTINT, логический (BOOLEAN), символьный (CHAR), перечисляемый и диапазонный тип (для целых 0 .. 255).

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

Тип переменной-множества может быть определен в разделе TYPE или VAR. Форма определения множественного типа:

TYPE имя-типа-множества = SET OF базовый-тип ;

Примеры объявления данных переменной типа множества:

TYPE MN = SET OF 2..100; { Диапазонный  тип }

   VRGODA = (VESNA,LETO,OSEN,ZIMA);{Перечисляемый   тип }

VAR    А,В : MN   ; { Переменные  типа:   MN   }

        С : SET OF '0'..'9'; {диапазон символьных данных}

      SIM : SET OF 'A'..'Z'; { " " }

    SEZON : SET OF VRGODA;{перечисляемого  типа }

      SEZ : SET OF VESNA..OSEN;{диапазон перечисл. типа}

    INTEG : SET OF 0..255;{диапазон  целого  типа}

где     MN, VRGODA - имена типов: множества и перечисляемого типа; А, В, С, SIM, SEZON, SEZ, INTEG - имена переменных типа SET.

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

[],    [   VESNA,    OSEN   ],    ['А',    'С'..'К',    D   +   Е,    F   ]

где     VESNA, OSEN, 'А', 'С', 'К' - константы базового типа;

'С' .. 'К' - диапазон значений базового типа;

D  + E- выражение;

F - имя переменной типа, совместимого с базовым типом множества;

[ ] - пустое множество.

Множество регистрирует наличие или отсутствие элемента, порядок перечисления элементов несуществен. При этом следующие множества равны (эквивалентны): [ 'А', 'Е', 'I' ] и [ 'Е' , 'I', 'А' ].

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

Типизированными константами называются константы, значения которых устанавливаются при описании их типа и определении их значения. Значения типизированных констант определяются в разделе констант (CONST). Форма определения одной типизированной константы:

Идентификатор   :   тип     =  значение   ;

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

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

Типизированные константы простых типов

Примеры инициирования типизированных констант простых типов:

TYPE   CVET = ( KR, GEL, ZEL ) ;

CONST  PCV CVET = KR ;

X REAL = 0.1 ;

MAX INTEGER = 9999 ;

В CHAR = 'A' ;

NAME STRING = 'H.ВИРТ' ;

С STRING [3] = 'ДА' ;

D STRING [3] = 'НЕТ' ;

E STRING [7] = 'ПЕТЯ' ;

Ограничения при использовании простых типизированных констант состоят в том, что нельзя:

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

Типизированные константы-массивы

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

Например, определение типизированных констант DIDG и DID эквивалентно:

CONST

DIDG : ARRAY [0..9] OF CHAR = ('0','1','2','3','4','5',

                               '6','7','8','9');

DID   :  ARRAY [0 .. 9]  OF  CHAR  =  '0123456789'

В примере значения элементов массива DID определены строкой. Примеры двух эквивалентных определений строковых массивов:

TYPE  TSHAP = ARRAY [ 1 .. 4 ]  OF STRING [30] ; CONST   SHAP  : TSHAP = (

   '   Результаты расчета    ' ,

   '+-------------------------+

   '|  Ф.И.О.  |  Зарплата   |',

   '+------------------------ +');

или:

CONST SHAP : ARRAY [ 1 .. 4 ]  OF STRING [30] = (

   ' Результаты расчета       ',
   '+------------------------+',

   '| Ф.И.О.    |  Зарплата  |',

   '+-------------------------+' );

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

TYPE А = ARRAY [ 1 . . 2, 1 . . 4 ] OF BYTE ;

CONST M : A = ((0, 1, 2, 3),  (4, 5, б, 7)) ;

             1-я строка,            2-я строка матрицы М.

Типизированные константы-записи

Форма определения константы-записи:

Идентификатор : тип = (список-значений-полей) ;

Элемент списка-значений-полей представляет собой

имя-поля   :   константа-значения-поля   ;

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

TYPE MES = (YAN,FEB,MAR,APR,MAY,IUN,IUL,AUG,SEN,OKT,NOV,

          DEC );

      DATE = RECORD

                  D = 1 .. 31 ;

                  M = MES ;

                  G = 1900 .. 1999 ;

             END ;

CONST  DAT : DATE = ( D : 18; M : MAY; G : 1913 ) ;

Типизированные константы-множества

Значение типизированной константы-множества задается в виде конструктора. Например:

TYPE  DEN = SET  OF  1 .. 31 ;

BUK = SET  OF 'A' .. 'Z' ;

   ERROR = SET  OF  1 .. 24 ;

CONST  RABDNI:DEN =[1..5,8..12,15..19,22..26] ;

 GLASN : BUK = ['A', 'E', 'I', '0', 'U'] ;

ERR : ERROR =   [] ;

GLAS : SET OF CHAR = ['A','E','И','0','У','Э','Я'];

5. Обработка данных

Оператор присваивания

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

Форма оператора присваивания:

А   :=  В   ;

где     А - имя переменной, левая часть оператора присваивания;

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

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

Правила выполнения оператора присваивания:

  1.  вычисляется выражение правой части оператора присваивания;

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

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

Примеры операторов присваивания и арифметических выражений:

 - традиционное представление;

На Паскале: z := (Х +Y) / (C-0.5) + (X-Y) / (X * А) ;

Традиционно: Ai=Bi+1+Ci,j на Паскале:

A[ I] := B[I+1 ] + C[ I, J] ;

В алгебре нет аналогов следующих операторов:

I:=I + 1;X:=X + DX;

С их помощью переменные I и X получают приращение равное соответственно 1 и DX.

Классификация и правила вычисления выражений

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

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

  1.  одноместные: +х,  -Y,  NOT  Z;
  2.  двухместные; например: X +  Y,  А  *   В,  С  <  D, E OR F.

Операции могут быть следующих типов, в последовательности приоритета от высшего к низшему:

  1.  одноместные операции: +, -, NOT;

мультипликативные операции (типа умножения): *, /, DIV, MOD, AND, SHL,
SHR;

  1.  аддитивные операции (типа сложения): +, -, OR, XOR;
  2.  операции отношения: =, <>, <=, <, >=, >, IN.

Если нет скобок, операции одного ранга (типа) выполняются в последовательности их написания слева направо, а операции различных рангов - в последовательности их приоритета.

Последовательность вычисления выражений:

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

а) значения функций;

б) одноместные операции;

в) двухместные операции в порядке их приоритета.

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

  1.  пропускать знак * - умножения;
  2.  при переносе их на следующую строку повторять один и тот же знак ариф
    метической операции в конце предыдущей и в начале следующей строки.

При написании выражений допускается:

  1.  не писать + в одноместной операции, т. е. можно писать А   :=   X; вместо
    А   :=   +Х;    ;

делать пробелы между операндами, знаками операций и скобками;

  1.  перенос  (продолжение)  выражения  на  следующую  строку,   не  разрывая
    идентификаторов, ключевых слов и чисел;

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

Арифметические выражения

Арифметические выражения - это аналог алгебраических выражений математики. Арифметические выражения используются:

  1.  в операторах присваивания;
  2.  в качестве фактических параметров процедур и функций;
  3.  в операторах заголовков цикла;
  4.  в списках данных операторов вывода.

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

Таблица 4. Арифметические операции, типы их операндов и результатов

Операция 

Действие 

Тип операнда 

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

+ 

Сложение 

1. Любой целый. 2. Любой целый и любой вещественный. 

Наименьший целый Вещественный 

- 

Вычитание 

Тот же 

Тот же 

* 

Умножение 

" 

/ 

Деление 

" 

DIV 

Целочисленное деление 

Любой целый 

Наименьший целый 

MOD 

Остаток целочисленного деления 

Результат операций +, -, * будет целого типа, если оба операнда целого типа; в остальных случаях, если хотя бы один операнд вещественный, результат - вещественный. Деление на нуль дает ошибку.

Пример оператора присваивания с арифметическим выражением, написанным традиционно: X = 2,5 + Z - SIN (Y - 1);

На Паскале это запишется в виде: X   :=  2.5  +  z   -  SIN   (Y  -   1);

Частный случай арифметического выражения - это константа, переменная или функция; например, 2.5, Z, SIN(Y- 1):

X   :=  2.5;   X   :=   Z;   X   :=  SIN(Y  -   1);

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

LnCD = DLnC; R = CD = EXP(D*Ln(C));

Пример текста в традиционной форме:

Y = AB + 102-CD-(M + N):L;

Выражение для приведенного примера на языке Паскаль может быть представлено в виде:

Y   := А  *  В  +  1Е2  *  EXP(D  *  Ln  (С)) -  (М  + N)  / L  ;

К арифметическим данным применимы встроенные процедуры и функции, примеры которых приведены в табл. 5. В ней inc и dec - процедуры, остальные - функции.

Таблица 5.  Примеры процедур и функций для арифметических типов данных

Вызов 

Возвращаемый результат 

abs (у) 

Модуль аргумента; тип результата совпадает с типом целым или вещественным аргумента и может быть 

arctan (x) 

Арктангенс (угол в радианах) 

sin (x) 

Синус (угол в радианах) 

cos (x) 

Косинус (угол в радианах) 

exp (x) 

Экспонента - ех 

frac (x) 

Дробная часть числа 

int (x) 

Целая часть числа                                                                                        

ln(x) 

Логарифм натуральный 

sqr (y) 

Квадрат аргумента; тип результата совпадает целым или вещественным с типом аргумента и может быть 

sqrt (x) 

Корень квадратный аргумента 

Pi 

Значение pi с точностью до 20 знака 

round (x) 

Округляет х до ближайшего целого значения, 

имеющего длинный целый тип 

trunc (x) 

Формирует целую часть числа х в виде значения, имеющего длинный целый тип 

frac (x) 

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

inc (z [,n]) 

z, увеличенное на 1 или на п, если п есть 

dec (z [,n]) 

z, уменьшенное на 1 или на п, если п есть 

где     х - арифметическое выражение вещественного типа;

у - арифметическое выражение целого или вещественного типа;

z - переменная ординального типа. Например:

VAR  R : REAL;   I : INTEGER; ...

R := ABS(-2.3);   { R = 2.3 } I := ABS(-150);   { I = 150 }

В одном арифметическом выражении могут быть целые различных типов. Над целыми допустимы операции: +, -, *, div mod и /. Div - это операция целочисленного деления; результат - целая часть частного. Mod формирует остаток от целочисленного деления; результат - целое. Результат деления целых значений с помощью операции / является вещественным. Например:

С   :=  A  div  В;   D   :=  A mod  В;   Е   :=  А  /   В;

При использовании процедур и функций с целочисленными параметрами применяется правило:

longint допускает использование integer и shortint;

word допускает использование byte.

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

Для работы с целым типом данных можно использовать встроенные функции CHR и ODD. Функция CHR(b) возвращает символ, код которого равен Ь. Функция ODD (1) возвращает значение TRUE, если аргумент нечетное число, и значение FALSE, если - четное. Например:

CHR(65)   =   'A';     CHR(66)   =   'В';        CHR(53)   = '5';

ODD(65)   =  TRUE;   ODD(66)    =   FALSE;

Примеры операторов присваивания с арифметическим выражением:

Традиционно: ;

на Паскале это запишется следующим образом:

Z   :=   (А  +  В) /  (С  + 1  -  SIN(X)) /   (3.2  - X  *  Y /  D)  + 2.5ЕЗ;

Традиционно: ;

на Паскале: X   :=A*(B--1)/C/D/(K + Y);.

Традиционно: ;

на Паскале: X   :=   (А*А +  В*В*В  --  COS(Y))   /   SQR   (А +  В);.

Традиционно: Z = arctg (eAx  А/Х);

На Паскале: Z   :=  ARCTAN   (ЕХР   (А  *   X)   *   SQRT   (А   /   X));.

В версию Паскаля 7.0 добавлены 2 функции для определения граничных значений ординальных типов и переменных: Low и High. Фактическим параметром функций может быть имя переменной или имя типа.

Примеры их использования приведены в листингах 5, 6, 7.

Листинг 5. Вывод граничных значений ординального типа.

Program Diapason;

Begin

Writeln ('byte:', Low(byte) : 12,'..',High(byte),

 #10#13, 'char:', Low(char) : 12,'..',High(char),
 #10#13,'shortint:',Low(shortint):12,'..',High(shortint),

 #10#13, 'word:', Low(word) : 12, '..', High(word),

 #10#13, 'integer:', Low(integer) : 12,'..',High(integer),

 #10#13, 'longint:1, Low(longint): 12,'..', High(longint),

 #10#13, 'boolean:',Low(boolean):12,'..',High(boolean));

end.

Листинг 6. Вывод граничных значений индексов массивов.

Program TestHighLow;

Type    A1 = array[1..10] of byte;

       A2 = array[0..2] of longint;

       A3 = array[-20..20] of real;

       A4 = array[1..5,1..10]   of byte;

Begin         Writeln   ( {   Будет  выведено:   }

       #10#13,   Low(A1),    '    ',  High(A1), {1   10}

       #10#13,   Low(A2),    '    ',  High(A2), {0 2}

       #10#13,   Low(A3),    '    ',  High(A3), {-20 20}

       #10#13,   Low(A4),    '    ',  High(A4)); {15}

End

Листинг 7. Вывод граничного значения длины строки.

Program StringLowHigh;

Type  TS  =  string;

Var       S   :   string[10];

Begin                         {   Будет  выведено:    }

  Writeln (Low(TS),' ',High(TS)); { 0 256 }
S := '';Writeln ( Low(S),' ',  High(S));   {   0   10   }

S := 'abc'; Writeln (Low(S),' ',High(S));  {   0   10   }

End.

Выражения сравнения

Выражение отношения (сравнения) - это 2 операнда, связанных операцией сравнения. Операндами отношений могут быть выражения, результат которых - значения любого простого типа, строка или множество. Типы обоих операндов должны быть совместимыми. Тип результата сравнения - логический, т. е. значение TRUE и FALSE. В табл.6 приведены операции отношения языка Паскаль.

Выражения сравнения можно использовать:

  1.  в условных операторах;
  2.  в операторах присваивания;
  3.  в качестве фактических параметров процедур и функций;
  4.  в списках данных операторов вывода.


Таблица 6. Операции отношения

Операция 

Действие 

Операнды 

= 

Равно 

Любой простой тип, строка или множество 

<>

Не равно 

< 

Меньше 

<= 

Меньше или равно 

> 

Больше 

>= 

Больше или равно 

IN 

Принадлежность к множеству 

Левый операнд - выражение любого ординального типа, совместимого с типом базовых элементов правого операнда; правый операнд - величина типа множества: константа или переменная с базовыми элементами того же типа, что и левый операнд 

Примеры:

VAR A, D : BOOLEAN;      I : INTEGER;

В, С : REAL;...

A := В > С ; D := I IN [ 1, 3, 5 . . 12 ] ;

IF  В > С THEN ...        WRITELN ( В > С ) ;

Логические выражения

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

Логические операции в порядке приоритета от высшего к низшему:

NOT   (HE) -отрицание;

AND   (И) - логическое умножение;

OR  (ИЛИ) - логическое сложение;

XOR (исключающее ИЛИ)   - сложение по модулю 2.

Логические операции применимы к операндам логического и целого типа. Логические операции над логическими данными дают результат, приведенный в табл. 7. Операция NOT - одноместная, выполняется над одним, в таблице -над первым операндом. Операндами логических операций могут быть: логические переменные, логические константы, функции, результат которых - логическое значение, и результаты операций отношения. Тип результата логического выражения над логическими операндами логический, т. е. значение TRUE или FALSE.

Таблица 7.  Результат логических операций

Операнд-1 

Операнд-2 

Результат операций 

NOT 

AND 

OR 

XOR 

F 

F 

Т 

F 

F 

F 

F 

Т 

Т 

F 

Т 

Т 

Т 

F 

F 

F 

Т 

Т 

Т 

Т 

F 

Т 

Т 

F 

где      F   =   FALSE; T   = TRUE.

Если операнды - целые числа, то результат логической операции тоже целое число. Биты результата формируются из битов операндов поразрядно по тем же правилам, что и в табл. 7. Только операндами и результатом вместо TRUE является 1, а вместо FALSE - 0.

Пример: Выполнение операции AND:

INTEGER:   I,    J,   К; 101=I

. . .   I := 5; J:= 3; К := I AND J; 01l = J

В результате K =  1; 001=K

К логическим в Паскале относят и 2 сдвиговые операции:

i SHL  j  --  SHiftLeft - сдвиг содержимого i на j разрядов влево; освободившиеся правые разряды заполняются нулями;

i  SHR  j  --  SHif tRight - сдвиг содержимого i на j разрядов вправо; освободившиеся левые разряды заполняются нулями,

где     i и j — выражения, результат которых - целого типа.

Пример:                                                    Выполнение сдвига

I : = 3;  J := 1;  К : =  I SHL J;  {К =  6 }         К   =   011    на 1   =   110

. . .                    К :=  К SHR  J; {К = 3  }         К   =   110    на 1   =   011

Для работы с логическим типом данных можно использовать встроенные функции: ORD, SUCC и PRED. Например:

ORD (FALSE) = 0;     ORD (TRUE) = 1; SUCC(FALSE) = TRUE ; PRED(TRUE) = FALSE ;

Выражения над символами

К типу CHAR применимы операции отношения, конкатенации и встроенные функции ORD, PRED и SUCC. Функция CHR(I) формирует значение символа, код которого равен I, где I - выражение над целыми, значение результата которого может быть от 0 до 255. Например:

CHR(65)   =   'A';     CHR(55)   =   '7';     CHR(186)   =   '|'; CHR(26)    =   EOF;         CHR(ORD(C))    =   С   ;

Конкатенация (+) производит сцепление символьных операндов; результат конкатенации - строка с длиной, равной сумме длин операндов. Например:

'А'  +  'В' =  'АВ';

Строковые выражения

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

Операции отношения выполняются над строковыми данными посимвольно. Если одна сравниваемая строка длиннее другой, то недостающие символы короткой строки дополняются пробелами. Например:

VAR R : BOOLEAN; SI, S2 : STRING[10];

... SI :='AB'; S2 := 'ABC'; R := S2 > SI; ... IF SI < S2 THEN ...

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

Например:

VAR  ST : STRING ;   ST1 : STRING[5]; S : CHAR ;            ...

ST := ''; { ST - пустая строка }

ST := 'A' + 'BC' ; { ST = 'ABC' }

ST :=  ST + 'D'; ; { ST = 'ABCD' }

S :='E'; {S='E'    }

ST :=  ST + S ; { ST = 'ABCDE' }

ST1 : = 'FGH'; { ST1 = 'FGH'}

ST := CONCAT ( ST, ST1 );     { ST = 'ABCDEFGH' }

Переменной типа string[n] можно присвоить значение строковой константы длиною не больше n. Но если присваиваемое значение имеет длину больше n (объявленной длины), то лишние правые символы отбрасываются.

Например:

VAR A: STRING[5] ;       { объявлена строка на 5 символов }

А:='ПЕТЯ'; L := LENGTH(STRING); {L = 4, длина строки }

А := 'АЛЕКСАНДР' ;

После второго оператора присваивания в качестве значения переменной А будет храниться только значение 'АЛЕКС'.

К строкам применим ряд встроенных процедур и функций, примеры которых приведены в табл. 8.

Таблица 8.  Примеры встроенных процедур и функций для строковых типов данных

Вызов 

Tun результата 

Назначение 

LENGTH (ST) 

Integer 

Функция; возвращает длину строки ST 

CONCAT (S1[,S2,...,SN]) 

String 

Функция; возвращает строку, представляющую собой сцепление строк параметров: SI, S2, ..., SN 

COPY (ST, N, K) 

Функция; копирует из строки ST К символов начиная с символа с номером N 

DELETE (ST, N, K) 

Процедура; удаляет из строки ST К символов начиная с символа с номером N 

INSERT (SUBST, ST, N) 

Процедура; вставляет подстроку SUBST в строку ST начиная с символа с номером N 

POS (SUBST, ST) 

Integer 

Функция; производит поиск подстроки SUBST в строке ST и возвращает номер позиции, с которой она начинается в ST; если подстрока не найдена, возвращается 0 

VAL (ST, X, CODE) 

Integer или REAL 

Процедура; преобразует строку символов ST во внутреннее представление целого или вещественного числа X; если преобразование успешно, CODE=0; или CODE равен номеру позиции в ST, где обнаружен ошибочный символ 

STR (X [:W [:D]], ST) 

String 

Процедура; преобразует число X типа REAL или INTEGER в строку символов ST так, как это делает WRITELN 

Выражения над множествами

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

А   :=  В   ;

где     А - переменная типа множества; В - выражение множественного типа.

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

Примеры операторов присваивания значений переменным-множествам:

SEZON  := []; ... SEZON := [VESNA,ZIMA];

   DNI:=[14,19]; ...

    А :=[18,45]; ...   А := А + В - [ 25, 31 ] ;

В выражениях типа множества допустимы операции: + - объединения (сложения) множеств, - - разности (вычитания) множеств, * - пересечения (умножения) множеств.

Объединением двух множеств (A + B) является множество, состоящее из элементов, входящих хотя бы в одно из множеств. Разностью двух множеств (А - B) является множество, состоящее из элементов множества А, не входящих в множество В. Пересечением двух множеств (A * B) является множество, состоящее из элементов, одновременно входящих в множество А и в множество В.

Примеры операторов присваивания и выражений над множествами:

VAR А,В,С:SET OF BYTE;    ...

  А:=[1..5]; В:=[3,4,7];
  С:=А+В; {С=[1..5,7]}

  С:=А-В; {С=[1,2,5] }

  С:=А*В; {С=[3,4] }

Над значениями множественного типа допустимы операции отношения и принадлежности:

= - проверка эквивалентности множеств;

<> - проверка неэквивалентности множеств;

<= - проверка вхождения;

>= - проверка включения;

IN - проверка принадлежности.

Например:

А <= В - А входит в В ?

В  >= А -  В  включает (содержит) А ?

Выбор одной из двух последних операций зависит от смысла проверки. Функции этих операций идентичны.

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

Примеры операций отношения над множествами даны в листинге 2.8. В результате выполнения всех примеров листинга 8 значение R = TRUE.

Листинг 8. Выражения надмножествами.

VAR  М:SET OF CHAR;

R :  BOOLEAN ;
...  { Сравнение конструкторов: }

R = ['A','E'] = ['E','A'];

R = ['A','E'] <> ['I','0'] ;

R = ['A','C'] <= ['A','B','C','D'];

R =[] <= ['A'];

M  = [] + ['A']; { M = ['A']; }

{ Сравнение конструктора и переменной: }

R = [ ' А' . . ' О' ] >= М ;

М  = М + [ ' Е' , ' I' ] ; {М=['А', ' Е' , 'Ч']; }

М  = М - [ ' I' ] ; { М = [ ' А' , ' Е' ] ; }

Для работы со множествами можно использовать операцию отношения типа "принадлежности". Форма операции:

A  IN   В

где    А - выражение любого ординального типа (в том числе константа или переменная), результат которого совместим с базовым типом множества В;

В - выражение над множеством, в частном случае константа или переменная типа множества.

Операция IN определяет принадлежность (вхождение) А к В. Она используется для определения наличия конкретного значения А в В значении типа SET. Если А входит в В, то результат этого отношения равен TRUE, а если не входит, то - FALSE. Например:

IF   I   IN   [   1   ..   4   ]   THEN   ...

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

Для добавления или исключения элемента из множества используются операции: + (объединения) и - (вычитания). На машинном уровне это вызывает достаточно громоздкий машинный код. Для устранения этого недостатка в 7-й версии введены 2 стандартные процедуры с заголовками:

procedure Include ( var S : set of T; Elem : Т ); procedure Exclude ( var S : set of T; Elem : Т );

где     Т - базовый тип множества. Вызовы этих процедур компилируются всего в одну машинную команду. Например:

var S : set of byte;

begin . . . { Без процедур: }

S := S + [123]; S := S - [45] ; ...

     { С помощью процедур: }

       Include ( S, 123 );

       Exclude ( S, 45 );

Смешанные выражения

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

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

А := (В <  -С  + 25) AND (X > Е)    ;

    3 12   5     4   <— последовательность выполнения операций.

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

Пример. Дан интервал А - В и значение X. Если X находится внутри интервала А - В, булевой переменной С присвоить значение TRUE, а если X находится вне или на границе заданного интервала, переменной С присвоить значение FALSE. Эта задача может быть решена с помощью одного оператора присваивания:

VAR А,В,X :REAL;

       С :BOOLEAN;

       С :=(X>А) AND (X<В);


 

А также другие работы, которые могут Вас заинтересовать

35896. Особенности дизайна и декора, аспекты их исторического развития 107 KB
  Особенности дизайна в 20е годы в СССР. Графический дизайн реклама мебель.Основные особенности дизайна 30х годов в СССР. Дизайн в период сталинизма.
35898. Производство алкогольной продукции 49.44 KB
  Дальнейшая перегонка дрожжей с водяным паромдает возможность получить энантовый эфир и дрожжевое масло. Фильтрат кубового остатка барды дрожжей может служить сырьем для получения с помощью ионообменных смол аминокислот в чистом виде. Более полно можно извлечь виннокислые соединения из осадков винных дрожжей методом высокого давления путем автоклавирования барды. Барабанные сушилки применяют для сушки винных дрожжей; для сушки виннокислой извести они менее пригодны так как часть материала в виде пыли уносится потоком горячего воздуха...
35899. Реляционная модель. Свойства и основные особенности реляционной модели Информационный принцип наполнения БД. Замкнутость реляционных систем, проявление замкнутости в синтаксе языка SQL 45 KB
  Техническая статья Реляционная модель данных для больших разделяемых банков данных доктора Е. 12 правил Кодда Реляционная СУБД должна быть способна полностью управлять базой данных через ее реляционные возможности. Онлайновый реляционный каталог описание БД и ее содержания должны быть представлены на логическом уровне как таблицы к которым можно применять запросы используя язык базы данных. Он должен поддерживать описание структуры данных и манипулирование ими правила целостности авторизацию и транзакции.