Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
32
Добавлен:
12.03.2016
Размер:
3.29 Mб
Скачать
      1. Перечислимые типы

В 1.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

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

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

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

VAROtpravlenie, Pribitie :Byte;

BEGIN

Otpravlenie:=22;

Pribitie:=Otpravlenie+10;

WriteLn(Pribitie)

END.

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

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

VAROtpravlenie, Pribitie : 0..24;

BEGIN

Otpravlenie:=22;

Pribitie:=Otpravlenie+10;

WriteLn(Pribitie)

END.

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

Паскаль будет обнаруживать выход за диапазон только в том случае, когда вы установите флажок (крестик) в OptionsCompiler…Compiler OptionsRuntime Errors в положение Range Checking (см. часть IV – «Обзор популярных команд меню»).

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

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

Spring :march..may;

Autumn :september..november;

tsifra :0..9;

Zaglavnie:’А’..’Я’

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]