Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты информатика.rtf
Скачиваний:
39
Добавлен:
02.05.2015
Размер:
6.9 Mб
Скачать

Условный оператор

Условный оператор реализует выполнение определённых команд при условии, что некоторое логическое выражение (условие) принимает значение «истина» true. В большинстве языков программирования условный оператор начинается с ключевого слова if.

Встречаются следующие формы условного оператора:

Условный оператор с одной ветвью

if условие then команды end

При выполнении такого оператора вычисляется условие, и если оно истинно, то выполняются команды до ключевого слова end, в противном случае выполнение программы продолжается со следующей за условным оператором команды. В языках низкого уровня (ассемблерах) это — единственная доступная форма условного оператора. В некоторых языках для условного оператора с одной ветвью используется специальное ключевое слово (обычно это when).

Условный оператор с двумя ветвями

if условие then команды1 else команды2 end

Здесь при истинности условия выполняются команды1 при ложности — команды2. При необходимости проверить последовательно несколько условий возможно каскадирование условных операторов:

if условие1

then команды1

else if условие2 then команды2

else if условие3 then команды3

...

else if условиеN-1 then командыN-1

else командыN end;

В этом случае условия будут проверяться последовательно, и как только встретится истинное, будет выполнен соответствующий набор команд и исполнение перейдёт к команде, следующей за условным оператором. Если ни одно из условий не окажется истинным, выполняются командыN из ветви else.

Условный оператор с несколькими условиями

Вышеприведённая схема каскада условных операторов используется достаточно часто, поэтому ряд языков программирования содержит специальную конструкцию для неё, позволяющую записать множественное ветвление несколько компактнее и менее подверженную ошибкам написания:

if условие1 then команды1

elsif условие2 then команды2

elsif условие3 then команды3

...

else командыN end;

порядок выполнения этого оператора в точности соответствует вышеприведённому каскаду простых операторов if-then-else, а отличие чисто формальное: вместо вложенных нескольких условных операторов эта конструкция является единым целым и содержит дополнительное ключевое слово elsif, требующее после себя очередное условие.

[править]C, C++ и их потомки

C и C++ (а вслед за ними и JavaC#PHP и множество других языков) имеют условный оператор, структурно аналогичный Паскалю. Отличие состоит в том, что условие должно быть записано в круглых скобках, а вместо ключевых слов begin и end используются фигурные скобки {} :

if (<условие>)

{

<операторы>

}

else

{

<операторы>

}

7.организация циклов. Использование оператора фор.

Условные операторы (операторы выбора) и оператор безусловного перехода GOTO позволяют в зависимости от необходимости выполнять один блок операторов, обходя при этом другой. Однако часто при написании программ нужно решить задачу другого плана — многократно выполнять один и тот же блок операторов. Программная конструкция, позволяющая организовать многократное выполнение блока операторов, называется циклом.

Цикл можно организовать при помощи условного оператора и оператора GOTO. Для этого, например, в процедуре можно объявить целочисленную переменную, которая будет служить счетчиком. Перед входом в группу операторов, подлежащих многократному выполнению (такая группа операторов называется телом цикла), счетчику присваивается значение 0. Затем следуют операторы тела цикла, среди которых необходимо обязательно разместить оператор, увеличивающий значение счетчика на 1. Завершает всю конструкцию условный оператор, в котором проверяется значение счетчика. Если оно еще не превышает заранее заданного предельного значения, то при помощи оператора GOTO осуществляется переход к первому оператору тела цикла. Операторы тела цикла выполнятся еще раз, и так будет продолжаться до тех пор, пока значение счетчика не превысит заданный предел.

Оператор цикла FOR ... NEXT повторяет группу операторов указанное количество раз. Ниже приведен его полный синтаксис.

FOR счетчик = начало ТО конец [STEP шаг]    [операторы][EXIT FOR][операторы]NEXT [счетчик]

где:

счетчик — обязательный элемент; переменная числового типа, используемая в качестве счетчика цикла; переменная не может быть типа Boolean и не может быть элементом массива.

начало и конец — обязательные элементы; выражения, задающие начальное и конечное значение счетчика цикла.

шаг — необязательный элемент; если он используется, то указывается после ключевого слова STEP; этот элемент задает величину приращения счетчика, то есть при каждом прохождении цикла счетчик будет увеличиваться на шаг, пока не достигает значения 1 конец; приращение шаг может быть как положительным, так«и отрицательным; значение 0 задает бесконечный цикл (в этом случае нужно предусмотреть свой собственный вариант выхода из цикла); если шаг не указан, то приращение считается равным 1.

операторы — блок операторов, составляющих тело цикла; ни один из операторов тела цикла не должен менять значение счетчика цикла (это может привести к непредсказуемым последствиям);

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

Конструкция NEXT служит для завершения оператора цикла. После ключевого слова NEXT можно указать переменную цикла счетчик, ту же самую, что и в заголовке цикла (после ключевого слова FOR). Это делать не обязательно, но настоятельно рекомендуется. Иначе вы обязательно запутаетесь, особенно при использовании вложенных циклов.

Ниже приведено несколько примеров использования оператора цикла FOR ... NEXT.

  1. В приведенном в этом примере цикле вычисляются значения 11 точек параболы, соответствующие значениям абсциссы от -5 до 5. При помощи функции MsgBox эта информация выдается на экран. Обратите внимание на то, как при помощи операции конкатенации в одну строку собирается текстовая информация и значения числовых переменных.

  2. В этом примере вычисляется произведение нечетных чисел из первой десятки (нечетный факториал). Шаг приращения задан явно и равен 2.

  3. В этом примере проиллюстрирован вариант наиболее частого использования вложенных циклов — инициализация массивов. Во вложенном цикле (по переменной J) происходит инициализация элементов массива для конкретного значения I для всех значений J. Затем во внешнем цикле переменная I увеличивается на 1, и для всех значений J при новом значении I инициализируются элементы массива. Так задаются начальные значения для всех без исключения элементов массива А.

Оператор цикла FOR EACH ... NEXT выполняет блок операторов, составляющих тело цикла, для всех элементов массива или набора (коллекции). Синтаксис этого оператора следующий:

FOR EACH элемент IN группа[операторы][EXIT FOR][операторы]NEXT [элемент]

где:элемент — переменная, используемая для итерации по элементам массива или коллекции (набора). Для итерации по элементам набора, элемент может быть переменной типа Variant или объектной переменной соответствующего типа, а для итерации по элементам массива — только переменной типаVariant.группа — имя массива или коллекции (набора).

Остальные элементы оператора аналогичны соответствующим элементам оператора FOR ... NEXT который описывался выше. Ниже приводится пример, иллюстрирующий наиболее часто встречающийся способ использования оператора FOR EACH ... NEXT.

В этом примере оператор цикла FOR EACH NEXT используется для итерации по элементам набора открытых в данный момент форм. Переменная циклаMyForm объявлена как переменная объектного типа FORM. Коллекция всех открытых форм называется FORMS. Таким образом, в приведенном выше примере в операторе цикла проверяется свойство Caption всех открытых в данный момент форм. Если среди открытых форм есть форма, имеющая подпись (CaptionФорма2, то на экран выдается соответствующее сообщение и цикл прерывается.

Наиболее гибким и удобным в семействе операторов цикла является оператор DO ... LOOP. Существует два варианта синтаксиса этого оператора.

DO [{WHILE | UNTIL} условие]      'Первый вариант[операторы][EXIT DO][операторы]LOOP

DO        'Второй вариант[операторы][EXIT DO][операторы]LOOP [{WHILE | UNTIL} условие]

Элемент условие может быть любым выражением числового или строкового типа, но обычно это выражение логического типа. Для первого варианта оператора DO ... LOOP условие вычисляется до первого выполнения операторов тела цикла. Если выражение условие сразу имеет значение False (Ложь) (и при этом указано ключевое слово WHILE), то операторы тела цикла не выполняются ни разу, а управление передается на следующий оператор. Если выражение условие принимает значение True (Истина), то тело цикла будет выполняться до тех пор, пока условие не станет равно False (Ложь). Для экстренного выхода из цикла служит конструкция EXIT DO.

Второй вариант оператора DO ... LOOP отличается от первого только тем, что выражение условие проверяется после выполнения операторов тела цикла. Таким образом, при использовании второго варианта оператора DO ... LOOP, операторы цикла выполняются как минимум один раз.

Ключевые слова WHILE и UNTIL, используемые в этом операторе, являются взаимоисключающими. То есть вы можете указать либо WHILE, либо UNTIL. Если указано ключевое слово WHILE, то операторы тела цикла будут выполняться до тех пор, пока значением выражения условие является True (Истина). В случае использования ключевого слова UNTIL операторы тела цикла выполняются до тех пор, пока значением выражения условие не станет True(Истина).

Далее приводится несколько примеров использования обоих вариантов оператора DO ... LOOP.

  1. В этом примере оператор цикла DO ... LOOP используется для подсчета произведения нечетных чисел из первой десятки (как и в примере с оператором FOR ...NEXT). Обратите внимание на тот факт, что теперь вам самим нужно заботиться об инициализации переменной цикла (X) и об ее правильном приращении в теле цикла.

  2. В этом примере вычисляется сумма чисел от -10 до 0. Поскольку в операторе используется ключевое слово UNTIL, то тело цикла будет выполняться до тех пор, пока числовая переменная X не станет положительной (либо равной 0). Если переменной X задать положительное значение до цикла, то операторы тела цикла не выполнятся ни разу.

  3. В этом примере, как и в предыдущем, вычисляется сумма чисел от -10 до 0. Однако здесь цикл организован подругому. Переменной цикла является переменная Check типа Boolean. Перед входом в цикл этой переменной присваивается значение True (Истина). Операторы тела цикла выполняются как минимум один раз, так как условное выражение, управляющее циклом, расположено в конструкции LOOP. Поскольку в этой конструкции использовано ключевое слово UNTIL, то цикл будет выполняться до тех пор, пока переменная Check не получит значение False (Ложь). Если об этом не позаботиться, то мы получим бесконечный цикл, который подвесит все наше приложение. В этом примере выход из цикла осуществляется при достижении переменной X значения 0.

В заключение обзора операторов цикла следует упомянуть об операторе WHILE ... WEND. Он имеет следующий синтаксис:

WHILE условие[операторы]WEND

Как видите, этот оператор достаточно прост. Перед очередным выполнением операторов тела цикла проверяется значение условия. Если условиеистинно, то выполняется тело цикла, иначе управление передается оператору, следующему за оператором WHILE ... WEND. В целом операторWHILE ... WEND не рекомендуется использовать. Он считается устаревшим и оставлен только для совместимости с ранними версиями Basic. Все возможности, предоставляемые этим оператором, с лихвой перекрываются возможностями более гибкого и удобного оператора DO... LOOP.

Вопросы 8-9 смотри 7.

10. Код: (C)

     char ZNAC;     int x,y,z;      if (ZNAC == '-') x = y - z;      else  if (ZNAC == '+') x = y + z;            else if (ZNAC == '*') x = y * z;                  else if (ZNAC == '/') x = y / z;                        else ...

Получилась такая себе лесенка из вложенных в друг друга операторов if.

рассмотрим другую, родственную управляющую структуру: структуру множественного выбора. Оператор структуры множественного выбора  называется switch. Такая структура тоже в конечном итоге структура ветвления, но если if это разделение пути надвое (да - мы идем в одну сторону, нет - в другую), то switch это разветвление на большее число вариантов, нежели 2.Естественно, необходимость проверять условия никуда не девается, но выглядит это синтаксически иначе, чем для оператора if. Давайте пример, который мы повторили выше перепишем, используя оператор switch.

Код: (C)

switch (ZNAC){case -:        x=y-z;        break;case +:        x=y+z;        break;case *:        x=y*z;        break;case /:        x=y/z;        break;default:        cout<<А куркулятор у меня только арифметический! Чего это вы тут такое левое нажимаете?;        break;}

-сразу после оператора switch идет в круглых скобках имя переменной, которая проверяется на соответствие определенному значению (в этих скобках может стоять и выражение). Так называемое управляющее выражение. Т.е. условие, которое для оператора if записывается в скобках (например, ZNAC=-) как бы делится на 2 части: первая остается в скобках после оператора switch, вторая (значение) выносится ниже и устанавливается после ключевого слова case. Знак сравнения (не любой, а только конкретно - знак равенства) подразумевается сам по себе, так как он один и других зесь просто быть не может.

Внимание! В Си в структуре множественного выбора можно использовать (т.е. подразумевать, как мы выяснили выше) ТОЛЬКО оператор сравнения ==. Никакие другие операторы сравнения использоваться не могут! Вернемся к этому немного позже.

С первой строчкой разобрались. Дальше - case. Расшифровывается так: в случае, если указанные после switch в скобках переменная или выражение принимают такое значение, как указанные case, то начинают выполняться операторы, следующие после этого же case, если нет - мы переходим к другому случаю, к другому case. Если среди всех описанных нами случаев нет ни одного, соответствующего текущему значению проверяемой переменной или выражениия, переходим к служебному слову default. В этом случае начинают выполняться операторы, находящиеся после него. Собственно, этого служебного слова в данной конструкции может и не быть - оно не обязательно, но считается правильным все же описывать ситуации, которые вы не предвидели в case. Кроме того, default не обязательно должен располагаться в самом конце рассматриваемой структуры, но рекомендуется все-таки располагать его именно там - как-то логически более на месте. Но если вам все-таки очень захотелось втемышить его куда-нибудь посередине, не забудьте после операторов, описывающих действия по умолчанию поставить break. Зачем - смотрите следующий абзац.

Теперь рассмотрим оператор break. Когда выполняется этот оператор, следущие за ним строки не выполняются, программа выходит из блока структуры и начинает выполняться оператор, следующий сразу после данного блока. Простым языком говоря: если представлять блок структуры, как контейнер (что собственно так и есть), как только встретили break, из контейнера выбрались и пошли дальше по коду.

Оператор break здесь необходим после операторов действия для каждого случая, кроме самого последнего (обычно это действия по умолчанию), т.к. в последнем случае программа по любому выходит из структуры switch. Но если вы и в этом случае поставите оператор break, ошибкой это являться не будет.

Я обещала вернуться к единственности оператора сравнения для структуры множественного выбора. В этом языке данная структура может применяться ТОЛЬКО для проверки на совпадение с константным целым выражением, т.е. это может быть любая комбинация символов и целых чисел, лишь бы они были постоянными. Следует отметить, что использование целого константного выражения является существенным недостатком, присущим рассмотренному оператору. ПОЭТОМУ: не пытайтесь лепить вswitch проверку переменной или вызов функции, даже если она однозначно целая или символьная. Еще раз посторюсь: число, указанное для каждого конкретного случая НЕ МОЖЕТ ИЗМЕНЯТЬСЯ! Константы в вариантах case должны быть различными. Почему, надеюсь - ясно?

После ключевого слова switch может стоять и выражение в круглых скобках, может быть там любое выражение, допустимое в языке СИ, значение которого должно быть целым. Отметим, что можно использовать явное приведение к целому типу, однако необходимо помнить о тех ограничениях и рекомендациях, о которых говорилось в предыдущих уроках.

Символы должны заключаться в одиночные кавычки. Например: 'F'.

Если есть несколько случаев, для которых должны выполняться одни и те же действия, после case перечисляются все константы, а после идут общие для этих случаев операторы, описывающие действие. Выглядит так, например:

Код: (C)

сase D:case d:                //блок операторов

Еще некоторые детали данной структуры: список операторов может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки. Однако наличие фигурных скобок - не ошибка.

В операторе switch можно использовать свои локальные переменные, объявления которых находятся перед первым ключевым словом case, однако в объявлениях не должна использоваться инициализация.

Схема выполнения оператора switch следующая:

  • - вычисляется выражение в круглых скобках;

  • - вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case;

  • - если одно из константных выражений совпадает со значением выражения, то управление передается на оператор, помеченный соответствующим ключевым словомcase;

  • - если ни одно из константных выражений не равно выражению, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.

В теле оператора switch можно использовать вложенные операторы switch, (или другие вложенные структуры) при этом в ключевых словах case можно использовать одинаковые константные выражения.

Пример:

Код: (C)

     switch (a)      {        case 1: b=c; break;        case 2:            switch (d)            {                case 0:  f=s;  break;                case 1:  f=9;  break;                case 2:  f-=9; break;            }         case 3: b-=c; break;         :      }

11.

12.