Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

12.8. Перечислимые типы

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

VAR Month: (January, february, march, april, may, June, July, august, September, October, november, december)

Она означает, что переменная Month может принимать только одно из перечисленных в скобках значений. Например, можно записать Month = may. Переменная Month является переменной перечислимого типа, который является одним из видов порядковых типов.

Эти значения ни в коем случае не являются строками. Так, нельзя записать Month:= 'may'. Кроме того, их нельзя вывести, на печать, вообще они не могут быть введены в компьютер или выведены из него, например при помощи операторов Read и Write. Однако их удобно применять при программировании. Это удобство выяснится из следующего примера.

Задана. Известно, сколько дней в каждом месяце года.. Сколько дней летом?

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

CONST dni :array[1..12] of Byte=(31,28,31,30,31,30,31,31,30,31,30,31);

VAR s,i :Integer;

BEGIN

s:=0; {Сумматор летних дней}

for i:=6 to 8 do s:=s+dni[i]; {Летние месяцы - 6,7,8}

WriteLn(s)

END.

Недостаток приведенной программы - не самая лучшая наглядность, к тому же приходится самому на пальцах вычислять номера месяцев начала .и конца лета (6 и 8). Паскаль имеет средства повысить наглядность и удобство таких программ. Запишем нашу программу по-новому, с использованием перечислимого типа данных:

TYPE mes = (january, february, march, april, may, June, July, august, September, october, november, december);

CONST dni :array [january..december] of Byte=

(31,28,31,30,31,30,31,31,30,31,30,31);

VAR s :Integer;

i :mes;

BEGIN

s:=0;

for i:=june to august do s:=s+dni[i];

WriteLn(s)

END.

Пояснения. Основное достижение нашей программы в том, что в операторе for можно написать June to august вместо 6 to 8, а в определении массива dni можно написать array[january..december] вместо array[1..12]. Для этого пришлось определить специальный перечислимый тип mes, перечислив в скобках произвольные имена месяцев, а переменную цикла i задать типом mes, а не Integer.

Синтаксис перечислимого типа:

(имя, имя, имя, .... имя)

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

if i=february then dni[i]:=29

12.9. Ограниченный тип (диапазон)

Задана. Поезд отправляется в путь в 22 ч и находится в пути 10 ч. Во сколько он прибывает на место назначения?

Ошибочная программа:

VAR Otpravlenie, Pribitie :Byte;

BEGIN

Otpraylenie:=22;

Pribitie:=0tpravlenie+10;

WriteLn(Pribitie)

END.

Эта программа вместо ответа "8" напечатает ответ "32" и ошибки не заметит. Паскаль не знает, что имеют смысл только те значения переменной Pribitie, которые находятся в диапазоне от Одо 24. Это должен был знать программист, но он тоже не обратилна это внимания. Хотелось бы, чтобы Паскаль вместо выдачи неправильного ответа напоминал забывчивым программистам, что переменная вышла из имеющего смысл диапазона. Для этого программист должен иметь возможность этот диапазон указать. Такую возможность дает применение диапазонов (ограниченных типов).

Вот программа, обнаруживающая собственную ошибку:

VAR Otpravlenie, Pribitie :0..24;

BEGIN;

Otpravlenie:=22;

Pribitie:=0tpravlenie+10;

WriteLn(Pribitie)

END.

Конструкция VAR Otpravlenie, Pribitie : 0..24 означает, что переменные Otpravlenie и Pribitie имеют право принимать значения целых чисел в диапазоне от 0 до 24.

Паскаль будет обнаруживать выход за диапазон только в том случае, - когда вы установите флажок (крестик) в Options -> Compiler -> Compiler Options -> Runtime Errors в положение Range Checking (см. часть IV -"Обзор популярных команд меню").

Диапазон можно задавать для любого порядкового типа, например:

VAR Month :(january, february, march, april, may, june, july, august,september, october, november, december);

Spring :march..may;

Autumn :september..november;

tsifra :0..9;

Zaglavme:'A'..'Я'

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

Задание 108

Известны дата и время (месяц, день, час, минута) отплытия теплохода летом этого года из Москвы в Астрахань. Известно время в пути (в днях, часах и минутах). Оно не превышает 20 суток. Определить дату и время прибытия теплохода в Астрахань. Использовать диапазоны.

Вариант 1. Для простоты предположим, что путешествие начинается между 1 и 10 июня.

Вариант 2. Путешествие начинается в любой день лета. Определите еще и дни недели отправления и прибытия, если известно, какой день недели был 1 июня.