Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 27.


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

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

ТИПЫ ВЕЛИЧИН В ЯЗЫКЕ ПАСКАЛЬ. ОПЕРАТОР ВАРИАНТА

1. Понятие типов величин и их классификация в языке Паскаль.

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

-       конечное множество всех возможных значений величины;

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

-       формат представления значения величины в памяти;

-       объём памяти, необходимый для хранения значения величины.

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

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

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

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

Если идентификатор типа стандартный, то и тип называется стандартным. Свойства стандартных типов известны, и поэтому они не нуждаются в каких бы то ни было описаниях в тексте программы. Программист имеет возможность создавать также и новые нестандартные типы, идентификаторы для которых он вибирает сам. Эти идентификаторы должны быть описаны в разделе типов Type.

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

Классификационные признаки типа

Идентификатор типа

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

Порядковые

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

Без знака

Byte

Word

Со знаком

ShortInt

Integer

LongInt

Логический

Boolean

Символьный

Char

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

Показательная форма представления

Single

Real

Double

Extended

Целочисленная форма представления

Comp

2. Стандартные порядковые типы.

Основной отличительный признак порядковых типов состоит в том, что каждому значению порядкового типа сопоставляется его порядковый номер. Общее количество значений данного порядкового типа равно 28∙k, где k – объём значения типа, выраженный в байтах.

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

Характеристики порядковых типов представлены в нижеследующей таблице:

Идентификатор

Наименование

Объём значения

Количество значений

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

Byte

короткий целый без знака

1

256

0..255

Word

целый без знака

2

65536

0..65535

ShortInt

короткий целый со знаком

1

256

–128..127

Integer

целый со знаком

2

65536

–32768..32767

LongInt

длинный целый со знаком

4

4294967296

–231..(231–1)

Boolean

логический

1

2

False, True

Char

символьный

1

256

#0..#255

Стандартные функции и процедуры обработки порядковых типов представлены в нижеследующем перечне. Обозначения: T – идентификатор порядкового типа, X – выражение типа T, x – идентификатор переменной или типизированной константы типа T.

1). SizeOf (T): Word, SizeOf (x: T): Word – определение объёма значения типа.

2). Ord (X): LongInt – порядковый номер значения аргумента.

3). Pred (X): T  – предыдущее значение этого же типа.

4). Succ (X): T – следующее значение этого же типа.

5). High (T): T, High (x: T): T – наибольшее возможное значение типа T.

6). Low (T): T, Low (x: T): T – наименьшее возможное значение типа T.

7). Inc (x, n: LongInt) – увеличение значения x; выражение n указывает, на сколько увеличивается порядковый номер значения x; эквивалентно x := x + n для целочисленного x.

8). Inc (x) – увеличение x; эквивалентно x := Succ(x) или x := x + 1 для целочисленного x.

9). Dec(x, n: LongInt), Dec (x) – уменьшение значения x.

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

В более подробном виде вышеизложенный материал можно найти по ссылке http://a-morgun.narod.ru/a08-01/a0008-0001-0001-0006.html.

3. Оператор варианта.

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

Но в отличие от команды выбора АЯ, оператор варианта Паскаля предоставляет значительно меньше возможностей. Дело в том, что выбор варианта определяется не логическим выражением, а связывается только с одним значением и только порядкового типа.

Оператор варианта имеет две формы записи: полную и сокращённую.

Оператор варианта в полной форме

Оператор варианта в сокращённой форме

      Case <селектор> Of
            <вариант_1>: <оператор_1>;
            <вариант_2>: < оператор_2>;
            ...........................................
            <вариант_
N>: < оператор_N>
           
Else <оператор>
     
End;

      Case <селектор> Of
            <вариант_1>: <оператор_1>;
            <вариант_2>: <оператор_2>;
            ...........................................
            <вариант_
N>: <оператор_N>
     
End;

Свойства и особенности записи оператора варианта следующие:

-       слова Case (случай), Of (из), Else, End – зарезервированные;

-       <селектор> – выражение порядкового типа;

-       <вариант_*> – перечень констант и/или интервалов значений порядкового типа, соответствующих типу <селектора>;

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

-       <операторы_*>, указанные после <вариантов_*>, называются основными, <оператор>, указанный после Else, называется альтернативным;

-       зарезервированное слово End обозначает конец оператора варианта.

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

-       Вычисляется значение <селектора>, которое затем по порядку сравнивается со значениями <вариантов_*>.

-       Для выполнения выбирается тот из основных <операторов_*>, для которого значение <селектора> совпало со значением <варианта_*>.

-       Если значение <селектора> не совпало ни с одним <вариантом_*>, то для выполнения выбирается альтернативная <серия> (для оператора в полной форме) или не выбирается ни одна из них (для оператора в сокращённой форме).

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

Значения целочисленных <вариантов_*> могут находиться в пределах значений типа Integer, то есть в пределах от –32768 до 32767. Из этого же промежутка может быть выбран и интервал значений, например, 5..9 (две рядом стоящие точки называются горизонтальным двоеточием). В качестве значений <вариантов_*> символьного типа могут быть указаны любые буквы, цифры, знаки препинания или их интервалы, например, ’a’, ’x’, ’k’..’n’. В качестве значений <вариантов_*> логического типа могут быть использованы только константы True и False.  

Например, для селектора S, представляющего собой целочисленную переменную, возможен оператор варианта следующего вида:

Case S Of
   1:          
WriteLn('Значение варианта — целая константа');
   2,7:        
WriteLn('Значение варианта 
— перечень целых констант');
   12..18:     
WriteLn('Значение варианта 
— интервал целых констант');
   9,20,31..40:
WriteLn
('Перечень констант и интервалов')
  
Else         WriteLn
('Значение варианта отсутствует')
End;

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

В заключение приведём программу реализации задачи V.2.3 “Сравнение”, использующей оператор варианта при выводе результатов решения на экран.

{$B+,D+,E+,I+,L+,N+,Q+,R+,X-}
Program V_02_03;
   Function Comparison ( X,Y: Real ): Byte;
   Begin
      If X > Y Then Comparison := 1
         Else If Y > X Then Comparison := 2
            Else Comparison := 3
   End;
   Var X,Y: Real;
Begin
   Write('Сколько лет Иванову? '); ReadLn(X);
   Write('Сколько лет Петрову? '); ReadLn(Y);
   Case Comparison(X,Y) Of
     
1: WriteLn('Иванов старше Петрова');

      2: WriteLn('Петров старше Иванова');
      3: WriteLn('Возрасты обоих равны')
   End
End.

Уважаемые подписчики! На следующем занятии мы с вами продолжим рассмотрение задач на множественные ветвления.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.


В избранное