К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя, страница 8
Описание файла
PDF-файл из архива "К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
4Л.1. Услоииый оператор Условнотй оператор выполняет некоторый оператор только в том случае, если истинно некоторое условие (логическое выражение). Если условие ложно, то либо не выполняется никакой оператор, либо выполняется оператор, идущий следом за словом е!зе. Условный оператор строится по такой схеме: П ~- ~аыпаженне Р и с. 4.!3. Синтаксическая диаграмма для Усяоеного оператора Выражение между словами !! и 1)теп должно относиться к типу Воо!еап. Обратите внимание, что первый вид оператора можно 54 Руководство для пользователя рассматривать как сокращенную запись второго с пустым оператором в качестве альтернативного.
Осторожно: перед словом е!зе нет никакой точки с запятой! Поэтому текст: !! Р Ьйеп Ьен!и В!; 52; 53 еп(1; е1зе 54 неверен. Еще более бессмысленным текстом будет такой: '!( Р !Ьеп; Ьеп!и В1; 52; ВЗ епб. В этом случае условный оператор управляет пустым оператором, стоящим между словом Ьйеп и точкой с запятой. Это означает, что составной оператор, идущий за условным оператором, будет выполняться всегда.
Синтаксическая двусмысленность, порождаемая конструкцией: !( выражение ! (Ьеп !! выражение 2 !Ьеп оператор ! е!зе оператор 2 разрешается путем ее интерпретации как эквивалентной конструкции: .!! выражение ! (Ьеп Ьеп!и !! выражение 2 (Ьеп оператор ! е!зе оператор 2 епс! ' Читатель должен всегда помнить, что легкомысленное написанние условного оператора может обходиться очень дорого. Предположим, у нас есть и взаил(оисключаюп(их условий С!, ..., С„, прлчем каждому соответствует отличное от других действие э!. Пусть Р(С!) — вероятность истинности С! и пусть Р(С!) ) = Р(С1) для ! ( !. В этом случае наиболее эффективная последовательность написания условий такова: 1! С1 (Ееп Б! е1зе ь! С2 епеп 52 е!зе е1зе !! С(п-1) !Ьеп Э(п-1) е!зе Сп Наступление некоторого условия и выполнение соответствующего действия заканчивает условный оператор, а оставшиеся проверки пропускаются.
Если Гоцп(( — переменная логического типа, то другим абсурдным и часто употребляемым использованием условного оператора будет: !! Кеу = у'а!иеВоцдЬ((Ьеп Гопп(1: = 1гцее!ье Гозп(1: = !а!зе: Хотя значительно проще было бы написать такой оператор: Гоцп():= Кеу = Ча!пеЯопдЬ( ргоКгав Агао(сТойовзп(Оиьрис); ( Программа 4.0 — Печать таблицы степеней 2 в "арабском" и "римском" представлении.
) Яев ( остаток йивЬег: 1пСеКег; Ьей!и йивЬег:= 1; гереаС Иг!Се(ОиСриС, йивЬег, ' '); Кев := йивЬег; ыЬ!!е Кев = 1000 бо Ьеа(п Иг(Се(ОиьриС, 'М'); Кев ;= Яев — 1000 епб; !Т Кев >= 900 Сйеп Ьей!и Иг1Се(ОиСриС, 'Ой'); Кев := Кев — 900 епб е1ье 11 Яев >= 500 Сйеп ЬеК(п Иг(се(ОисриС, '0'); Кев := Кев — 500 епб е1ье !Т Кев >= 400 Слеп Ьеа!и Иг!Се(0иьриС, 'СО'); Кев := Кев — 400 епб; ыЬ!1е Кев >= 100 бо Ьей(п ИгтСе(ОисриС, 'О'); Кев := Кев — 100 епб; СТ Кев >= 90 Сйеп Ьейсп Иг!Се(ОиСриС, 'ХС'); Кев := Кев — 90 епб е1ье !Т Кев >= 50 СЬеп Ьей!и Игтье(ОиориС„ '1'); Кев := Яев — 50 епб е!ье !Т Кев >= 40 СЬеп ЬеК!и Иг1Се(ОисриС, 'ХС'); Кев := Кев — 40 епб; ып11е Кев >= 10 бо Ьеа!п Иг!Се(ОиСри», 'Х'); Яев := Кев — 10 епб; !Т Кев = 9 Сйеп ЬеК(п Иг!Се(ОиьриС, '1Х'); Яев := Кев — 9 епб е1ье П Яев >= 5 Слеп ЬеКТп Иг(Се(ОиСриС, ''т' ); Яев := Кев — 5 епб е1ье !Т Яев = 4 СЬеп Ьей!и Иг(ье(ОиориС, '1Ч'); Кев := Кев — 4 епб; ыЬ!1е Кев = 1 бо 56 Руководство для пользователя Ьеа|п Нг(Ье(Онгрпс, ' 1'); Веа := Веа — 1; епд; Иг!Се1п(Оперой); ИиаЬег := МиаЬег " 2 нпе(1 МиаЬег > 5000 епд Дает в качестве результата: 1 1 2 11 4 1Ч, В Ч111 16 ХЧ1 я 32 )(ХХ11 Б4 ЬХ1Ч 126 СХХЧ111 25Б ССЬУ1 512 ОХ11 1024 МХХ1Ч 2646 ММХьу111 4096 ИИМИХСЧ1 Еще раз напоминаем, что каждая «ветвь» условного оператора содержит только по одному оператору.
Поэтому, если необходимо выполнять более чем одно действие, следует пользоваться составным оператором. 4.6.2. Оператор варианта Этот оператор состоит из выражения (селектора) И-списка операторов, с каждым из которых сопоставлено одно или несколько постоянных значений, относящихся к типу селектора. Тип селектора должен быть ординальным. Каждое из постоянных значений должно быть сопоставлено самое большее с одним оператором. Оператор варианта выбирает для выполнения оператор, сопоставленный с текущим значением селектора. Если такая константа не была нигде написана, то зто ошибка. По окончании выполнения выбранного оператора управление передается в конец всего оператора варианта.
Оператор варианта строится по такой схеме: Р и с. 4.14. Синтаксическая яиагракна Лля Оператора варианта 4. Концепция делсгвия 57 сазе со о1 '1', 'о', 'О', 'о', '0': хоме!:= чоие1 + 1; ропе .= ропс + 1 епз Замечание. Константы выбора ИЕ являются метками (см. равд. 3.2 и 4.7) и на них нельзя ссылаться в операторе перехода. Их упорядоченность произвольная. Хотя эффективность оператора варианта зависит от реализации, тем не менее в качестве общего правила следует порекомендовать следующее: им нужно пользоваться в случае взаимоисключающих операторов с приблизительно равными вероятностями выбора. 4.6.
ОПЕРАТОР ПРИСОЕДИНЕНИЯ Оператор присоединения употребляется при работе с переменными, относящимися к записному типу (одному из составных типов). О нем речь пойдет в равд. 7.3. 4.7. ОПЕРАТОР ПЕРЕХОДА Оператор перехода — простой оператор, указывающий, что дальнейшая работа должна продолжаться в другой части текста программы, а именно с того места, где находится метка. целое аеэ энвкв еесв Р и с.
4.15. Синтаксическая диаграмма дпя Оператора переходи Примеры саее г о1 О' х.= 1: х 7 х:= 3: х 4: х епе (Предполагается чаг 1: 1п(еяег; с)1: Сваг;) О; 5(П(Х); со5(х), ехр(х); 1п(х) 38 Руководство для пользователя Каждая метка: а) должна появляться в описании метки перед ее использованием в блоке; б) должна стоять перед одним и только одним оператором, входящим в раздел операторов блока; в) в качестве области действия имеет область, «накрывающую» весь текст блока, за исключением каких-либо вложенных блоков, переописывающих данную метку. Для метки н оператора перехода, указывающего на нее, должнб выполняться по крайней мере одно из следующих трех условий: 1» Метка стоит перед оператором, содержащим оператор перехода.
2. Метка стоит перед одним из операторов некоторой последовательности операторов (внутри составного оператора или оператора цикла) и один из операторов этой последовательности содержит оператор перехода. 3. Метка стоит перед оператором из последовательности операторов, представляющих собою раздел операторов блока, содерс .жащего описание процедуры или функции, в которой находится оператор перехода. Примеры (фрагмент программы): 1аЬе1 1; ( блок А ) ргесезпге В; ( блок В ) 1аЬе1 3, 5; Ьеа(п ВеЬо 3; 3: Иг(ее1п('Не11о'); 5: 1( Р Спел ЬеВ1п 5; Весе 5 епе; ( нп(1е Р Пе 3 ) Восо 1; (зто приводит к досрочному окончанию В1 Иг(ее1п ( ойооПЬуе ' ) епд; ( Ь)псх В ) Ьеб)п В; 1: ЫгЕСе1п(' Едзаег') ( квота 3" в блоке А запрещено) епд ( блок А ) Переход внутрь сложного оператора извне ето запрещается.
Следовательно, приведенные примеры неверны. еь Концепция дейстопя 5р Примеры неправильных конструкции: а) Сот 1 := 1 Со 10 до Ье01п 31; 3: 32 епе; Восо 3 б) 11 В Спел ВоСо 3; 11 В1 СЬеп 3: Б в) ргоседиге Р: ргосейнге 0; Ье01п ...
3: 3 вос1; Ьеагп ... Восо 3 епд . Операторы перехода следует оставлять для необычных, исключительных ситуаций, когда приходится нарушать естественную структуру алгоритма. Хорошим правилом будет стремление избегать переходов при организации регулярных итераций и условного выполнения операторов, поскольку такие переходы разрушают связь между структурои вычисления и текстуальной (статической) структурой программы.
Более того, потеря соответствия между текстуальной структурой и структурой вычисления (статической и динамической) приводит к потере ясности программы и затрудняет задачу верификации. Часто появление в программе на Паскале оператора перехода свидетельствует о том, что программист еше не научился «думать» на Паскале Сво все другие языки оператор перехода входит как необходимая компонента)*. * Заметим, что в Паскале оператор перехода оставлен. Во втором издании книги в атом месте стоило менее категоричное утверждение. — Празаеч. пер.
ПЕРЕЧИСЛЯЕМЫЕ И ДИАПАЗОННЫЕ ТИПЫ )нты уже познакомились с именами простых предопределенных типов: Воо!еап, Сваг, 1п(енег и Кев!. С помощью таких имен мы можем ссылаться на существующие типы, которые они представляют. Теперь покажем, как с помощью двух механизмов можно порождать совершенно новые ординальные типы: перечисляемые и диапазонные типы. Перечисляемые типы никак не связаны с каким- либо другим типом, это совершенно новые типы; в то время как диапазонные типы . — просто подмножества значений некоторого другого, уже существующего типа (ординального). гз.!.