Ada (798525), страница 7
Текст из файла (страница 7)
Следует заметить, что в левой части может распологаться имя только однойпеременной. В правой части записывается выражение (expression) результат вычислениякоторого становится новым значением переменной result. Выражение expression, расположенноев правой части, может быть одиночной переменной или константой, может содержатьпеременные, константы, знаки операций и вызовы функций.
Тип переменной определяемой какresult должен быть совместим по присваиванию с типом результата вычисления выраженияexpression.Выполнение присваивания разделяется на несколько действий. Сначала производитсявычисление имени переменной result и результата выражения expression (порядок следованияэтих действий не регламентирован стандартом языка). После этого, в случае успеха, дляпеременных скалярных типов проверяется принадлежность значения результата вычислениявыражения expression подтипу переменной. Если проверка успешна, то значение результатавычисления выражения expression становится новым значением содержимого переменной result.При этом старое значение содержимого result - теряется. Иначе, в случае какой-либо неудачи,возбуждается исключение ошибки ограничения или, проще говоря, - ошибка, а значениепеременной result остается без изменений.Приведем несколько примеров инструкций присваивания:A := B + CX := YСледует заметить, что в Аде, в результате выполнения присваивания производится изменениетолько содержимого result (значение содержимого переменной указанной в левой части).Необходимо также подчеркнуть, что операция присваивания в Аде, в отличие от языков C/C++,не возвращает значение и не обладает побочными эффектами.
Кроме того, напомним, чтооперация присваивания, в Аде, не допускает совмещение, переименование и использованиепсевдонимов, а также она запрещена для лимитированных типов.3.3 БлокиБлок содержит последовательность инструкций, перед которой может располагаться разделописаний (все описания локальны для блока и не доступны вне блока). За последовательностьюинструкций могут следовать обработчики исключений (обработка исключений в Адерассматривается позже). В общем случае инструкция блока Ады имеет вид:declare-- локальные описанияbegin-- последовательность инструкцийexeption-- обработчики исключенийend;Блок может иметь имя. Для этого перед инструкцией блока записывается идентификатор, закоторым ставится двоеточие.
При именовании блока, имя блока должно указываться после endзавершающего блок:Some_Block:declareX : Integer;beginX := 222 * 333;Put(X);end Some_Block;3.4 Условные инструкции ifДля организации условного выполнения последовательностей алгоритмических действий (тоесть, построения разветвляющихся алгоритмов), в Аде могут использоваться условныеинструкции if.Каждая инструкция if заканчивается конструкцией "end if".if <логическое_выражение> then-- последовательность инструкцийend if;if <логическое_выражение> then-- последовательность инструкций 1else-- другая последовательность инструкций 2end if;В первом примере, приведенном выше, последовательность инструкций, описывающаяалгоритмические действия, будет выполнена только в случае когда результат вычислениялогического выражения будет иметь значение True.
Во втором примере, в случае когдарезультатвычислениялогическоговыраженияTrueбудетвыполняться"последовательность инструкций 1", в противном случае - "последовательностьинструкций 2".Для сокращения инструкций вида "else if ... ", и в целях улучшения читабельности,введена конструкция elsif, которая может быть использована столько раз, сколько это будетнеобходимо.if <логическое_выражение> then-- последовательность инструкций 1elsif <логическое_выражение> then-- последовательность инструкций 2elsif <логическое_выражение> then-- последовательность инструкций 3else-- последовательность инструкцийend if;В этой форме инструкции if, заключительная конструкция else - опциональна.Необходимо также заметить, что результат вычисления логического выражения всегда должениметь предопределенный тип Standard.Boolean.3.5 Инструкция выбора сaseЕще одним средством позволяющим строить разветвляющиеся алгоритмы является инструкциявыбора сase.Инструкция выбора сase должна предусматривать определенное действие для каждоговозможного значения переменной селектора (переключателя).
В случаях, когда невозможноперечислить все значения переменной селектора, нужно использовать метку others.Каждое значение выбора может быть представлено как одиночное значение (например, 5), какдиапазон значений (например, 1..20), или как комбинация, состоящая из одиночных значенийи/или диапазонов значений, разделенных символом '|'.Каждое значение выбора должно быть статическим значением, то есть оно должно бытьопределено компилятором во время компиляции программы.caseвыражениеiswhen значение_выбора => действияwhen значение_выбора => действия...when others => действияend case;Важные примечания:••"выражение", в инструкции case, должно быть дискретного типаметка others обязательна в инструкции сase тогда, когда инструкции when неперечисляют всех возможных значений селектора.case Letter iswhen 'a'..'z'| 'A'..'Z' => Put ("letter");when '0'..'9'when ''' | '"' | '`'when '&'when othersend case;=> Put ("digit! Value is"); Put (letter);=> Put ("quote mark");=> Put ("ampersand");=> Put ("something else");В некоторых случаях, в качестве действий, указываемых для метки others, можетиспользоваться пустая инструкция null:...when others => null; -- ничего не делать.
. .3.6 Организация циклических вычисленийПри решении реальных задач часто возникает необходимость в организации циклическихвычислений. Все конструкции организации циклических вычислений в Аде имеют форму "loop... end loop" с некоторыми вариациями. Для выхода из цикла может быть использованаинструкция exit.3.6.1 Простые циклы (loop)Примером простейшего цикла может служить бесконечный цикл. Обычно он используетсясовместно с инструкцией exit, рассматриваемой позже.loop-- инструкции тела циклаend loop;3.6.2 Цикл whileВо многих случаях, прежде чем выполнять действия которые описываются инструкциями телацикла, необходимо проверить какое-либо условие.
Для таких случаев Ада предусматриваетконструкцию цикла while.Цикл while идентичен циклу while в языке Паскаль. Проверка условия выполнения циклапроизводится до входа в блок инструкций составляющих тело цикла. При этом, если результатвычисления логического выражения будет True, то будет выполнен блок инструкций телацикла.
В противном случае, тело цикла - не выполняется.while логическое_выражение loop-- инструкции тела циклаend loop;Необходимо заметить, что результат вычисления логического выражения должен иметьпредопределенный тип Standard.Boolean3.6.3 Цикл forЕще одним распространенным случаем является ситуация когда необходимо выполнитьнекоторые действия заданное количество раз, то есть организовать счетный цикл. Для этого Адапредусматривает конструкцию цикла for.Конструкция цикла for Ады аналогична конструкции цикла for, представленной в языкеПаскаль.Существует несколько правил использования цикла for:•••тип переменной-счетчика цикла for определяется типом указываемого диапазоназначений счетчика, и должен быть дискретного типа, вещественные значения недопустимысчетчик не может быть модифицирован в теле цикла, другими словами - счетчикдоступен только по чтениюобласть действия переменной-счетчика распространяется только на тело циклаПримечательно также, что тело цикла не будет выполняться если при указании диапазоназначений переменной-счетчика величина значения "нижней границы" будет больше чемвеличина значения "верхней границы".for счетчик in диапазон_значений_счетчика loop-- инструкции тела циклаend loop;forCount in 1..20 loopPut (Count);end loop;Возможен перебор значений диапазона в обратном порядке:for счетчик in reverse диапазон_значений_счетчика loop-- инструкции тела циклаend loop;for Count in reverse 1..20 loopPut (Count);end loop;Любой дискретный тип может использоваться для указания диапазона значений переменнойсчетчика.declaresubtype List is Integer range 1..10;beginfor Count in List loopPut (Count);end loop;end;Здесь, тип List был использован для указания диапазона значений переменной-счетчикаCount.
Подобным образом также можно использовать любой перечислимый тип.3.6.4 Инструкции exit и exit whenИнструкции exit и exit when могут быть использованы для преждевременного выхода изцикла. При этом, выполнение программы будет продолжено в точке непосредственноследующей за циклом. Два варианта, показанных ниже, имеют одинаковый эффект:loop-- инструкции тела циклаif логическое_выражение thenexit;end if;end loop;loop-- инструкции тела циклаexit when логическое_выражение;end loop;3.6.5 Именованые циклыИнструкции преждевременного выхода из цикла exit и exit when, обычно, осуществляютвыход из того цикла, который непосредственно содержит данную инструкцию. Однако, мыможем именовать циклы и модифицировать инструкцию выхода из цикла так, чтобыосуществлять выход сразу из всех вложенных циклов.
Во всех случаях, следующая выполняемаяинструкция будет следовать сразу за циклом из которого был осуществлен выход.outer_loop:loop-- инструкцииloop-- инструкцииexit outer_loop when логическое_выражение;end loop;end loop outer_loop;Примечательно, что в случае именованого цикла end loop также необходимо именоватьметкой.3.7 Инструкция перехода gotoИнструкция перехода goto предусмотрена для использования в языке Ада, в исключительныхситуациях, и имеет следующий вид:goto Label;<<Label>>Использование инструкции goto очень ограничено и четко осмысленно. Вы не можетевыполнить переход внутрь условной инструкции if, внутрь цикла (loop), или, как в языкеПаскаль, за пределы подпрограммы.Вообще, при таком богатстве алгоритмических средств Ады, использование goto едва-лиможно считать оправданным.4.