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

20.1. Перечисляемый тип

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

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

Type

Имя=(Значение1, Значение2,…,ЗначениеN);

Порядковый номер первой из перечисленных констант равен 0, следующей – 1 и т.д. Максимальное количество констант равно 256.

Пример. Type

Week_Days=(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);

Side=(North, East, South, West);

Объявленные типы могут использоваться для описания переменных в разделе Var.

Пример Var

Days,Week_End : Week_Days;

Curs: Side;

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

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

Pred(аргумент) – дает элемент, предшествующий аргументу; результат определен для всех элементов списка, кроме первого;

Succ(аргумент) – дает элемент, сдедующий за аргументом; результат определен для всех элементов списка, кроме последнего.

Пример Pred(Tuesday) = Monday,

Succ(Tuesday) = Wednesday.

Рассмотрим пример программы, использующей перечисляемый тип.

Задача. Составить алгоритм и программу, определяющую новый курс корабля по предшествующему курсу и команде. Для простоты будем считать, что курс соответствует сторонам света:

Север, Восток, Юг, Запад.

Команда вводится с клавиатуры и может принимать следующие значения:

Вперед, Вправо, Назад, Влево, Стоп.

Последняя команда приводит к окончанию работы программы.

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

Алгоритм

1. Задать начальное значение курса.

2. Повторять

Ввести команду, определить новый курс и

Вывести его на экран

Пока не будет дана команда “Стоп”.

3. Закончить.

Уточним алгоритм

1. Старый_курс = Север.

2. Повторять

2.1. Ввести Команду.

2.2. Если Команда = “Вперед”, то

Новый_курс= Старый_курс

Иначе

Если Команда = “Вправо”, то

Если Старый_курс = “Запад”, то

Новый_курс=”Север”

Иначе

Новый_курс= Следующий(Старый_курс)

Иначе

Если Команда = “Назад”, то

Выбрать Старый_курс из

Север, Восток: Новый_курс = Следующий(Следующий (Старый_курс));

Юг, Запад: Новый_курс = Предшествующий(Предшествующий (Старый_курс))

Иначе

Если Команда = “Влево”, то

Если Старый_курс = “Север”, то

Новый_курс=” Запад ”

Иначе

Новый_курс= Предшествующий(Старый_курс)

Иначе

Если Команда не = “Стоп”, то

Вывести “неправильная команда”.

2.3. Выбрать Новый_курс из

Север : Вывести “ Север”

Восток : Вывести “Восток”

Юг : Вывести “ Юг ”

Запад : Вывести “ Запад "”

2.4. Старый_курс = Новый_курс.

Пока не будет Команда = “Стоп”.

3. Закончить.

Программа для этого алгоритма приведена ниже.

Program Ship;

Type

Side=( North, East, South, West);

Var

St_Curs,N_Curs : Side; { Старый и новый курс }

Com : String; { Команда }

Begin

St_Curs:= North;

WriteLn(’Идем на Север...’);

{ Определение нового курса }

Repeat

Write(’Введите команду: ’);

Readln(Com);

If Com = ’вперед’ then

N_Curs:= St_Curs

Else

If Com = ’вправо’ then

Begin

{ Движение вправо }

If St_Curs = West then

N_Curs := North

Else

N_Curs := Succ(St_Curs)

End

Else

If Com = ’назад’ then

Case St_Curs of

North,East : N_Curs := Succ(Succ (St_Curs));

South,West : N_Curs := Pred(Pred(St_Curs));

End

Else

If Com = ’влево’ then

If St_Curs = North then

N_Curs := West

Else

N_Curs := Pred(St_Curs)

Else

If Com <> ’стоп’ then

Writeln(’Неправильная команда’:30);

Write(’ Новый курс: ’);

Case N_Curs of

North : Writeln(’Север’);

East : Writeln(’Восток’);

South : Writeln(’Юг’);

West : Writeln(’Запад’);

End;

St_Curs := N_Curs;

Until Com = ’стоп’;

Writeln(’Приехали! Нажмите Enter’);

Readln;

End.

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