Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория ответы.doc
Скачиваний:
39
Добавлен:
24.12.2018
Размер:
1.61 Mб
Скачать
  1. Алгоритмы линейного типа. Операторы ввода-вывода. Генератор случайных чисел.

  1. Алгоритмы с ветвлением. Условные выражения. Инструкция if (полная и неполная форма). Вложенные if-инструкции. Конструкция if-else-if.

В этой главе вы узнаете, как управлять ходом выполнения С++-программы. Существует три категории управляющих инструкций: инструкции выбора (if, switch), итерационные инструкции (состоящие из for-, while- и do-while-циклов) и инструкции перехода (break, continue, return и goto).

За исключением return, все остальные перечисленные выше инструкции описаны в этой главе.

Инструкция if

Инструкция if позволяет сделать выбор между двумя выполняемыми ветвями программы.

Инструкция if была представлена в главе 2, но здесь мы рассмотрим ее более детально. Полный формат ее записи таков.

if(выражение) инструкция; else инструкция;

Здесь под элементом инструкция понимается одна инструкция языка C++. Часть else необязательна. Вместо элемента инструкция может быть использован блок инструкций. В этом случае формат записи i f-инструкции принимает такой вид.

i f (выражение) {

последовательность инструкций }

else {

последовательность инструкций }

Если элемент выражение, который представляет собой условное выражение, при вычислении даст значение ИСТИНА, будет выполнена if-инструкция; в противном случае — else-инструкция (если таковая существует). Обе инструкции никогда не выполняются. Условное выражение, управляющее выполнением if-инструкции, может иметь любой тип, действительный для С++-выражений, но главное, чтобы результат его вычисления можно было интерпретировать как значение ИСТИНА или ЛОЖЬ.

Использование if-инструкции рассмотрим на примере программы, которая представляет собой версию игры "Угадай магическое число". Программа генерирует случайное число и предлагает вам его угадать. Если вы угадываете число, программа выводит на экран сообщение одобрения ** Правильно **. В этой программе представлена еще одна библиотечная функция rand (), которая возвращает случайным образом выбранное целое число. Для использования этой функции необходимо включить в программу заголовок <cstdlib>.

// Программа "Угадай магическое число".

#include <iostream.h>

#include <stdlib.h>

int. main (){

int magic; // магическое число

int guess; // вариант пользователя

magic = rand(); // Получаем случайное число.

cout << "Введите свой вариант магического числа: "; cin >> guess;

if (guess == magic) cout << "** Правильно **"; return 0; }

В этой программе для проверки того, совпадает ли с "магическим числом" вариант, предложенный пользователем, используется оператор отношения "==". При совпадении чисел на экран выводится сообщение ** Правильно **.

Попробуем усовершенствовать нашу программу и в ее новую версию включим else-зетвь для вывода сообщения о том, что предположение пользователя оказалось неверным.

//Программа "Угадай магическое число": 1-е усовершенствование.

#include <iostream.h>

#include <stdlib.h>

int main (){

int magic; // магическое число

int guess; // вариант пользователя

magic = rand(); // Получаем случайное число.

cout << "Введите свой вариант магического числа: "; cin >> guess;

if (guess == magic) cout << "** Правильно **";

else cout << "...Очень жаль, но вы ошиблись.";

return 0; }

Условное выражение

Иногда новичков в C++ сбивает с толку тот факт, что для управления if-инструкцией можно использовать любое действительное С++-выражение. Другими словами, тип выражения необязательно ограничивать операторами отношений и логическими операторами или операндами типа bool. Главное, чтобы результат вычисления условного выражения можно было интерпретировать как значение ИСТИНА или ЛОЖЬ. Как вы помните из предыдущей главы, нуль автоматически преобразуется в false, а все ненулевые значения — в true. Это означает, что любое выражение, которое дает в результате нулевое или ненулевое значение, можно использовать для управления if-инструкцией. Например, следующая программа считывает с клавиатуры два целых числа и отображает частное от деления первого на второе. Чтобы не допустить деления на нуль, в программе используется if -инструкция.

// Деление первого числа на второе.

#include <iostream.h>

int main() {

int a, b;

cout << "Введите два числа: "; cin >> a >> b;

if(b) cout « a/b « '\n';

else cout << "На нуль делить нельзя.\n";

return 0; }

Обратите внимание на то, что значение переменной b (делимое) сравнивается с нулем с помощью инструкции if (b), а не инструкции if (b != 0). Дело в том, что, если значение b равно нулю, условное выражение, управляющее инструкцией if, оценивается как ЛОЖЬ, что приводит к выполнению else-ветви. В противном случае (если b содержит ненулевое значение) условие оценивается как ИСТИНА, и деление благополучно выполняется. Нет никакой необходимости использовать следующую if-инструкцию, которая к тому же не свидетельствует о хорошем стиле программирования на C++. if(b != 0) cout « a/b « '\n';

Эта форма if-инструкции считается устаревшей и потенциально неэффективной.

Вложенные if-инструкции

Вложенные i f-инструкции образуются в том случае, если в качестве элемента инструкция (см. полный формат записи) используется другая if-инструкция. Вложенные if-инструкции очень популярны в программировании. Главное здесь — помнить, что else-инструкция всегда относится к ближайшей if-инструкции, которая находится внутри того же программного блока, но еще не связана ни с какой другой else-инструкцией. Вот пример.

if(i) (

if(j) statement1;

if(k) statement2; // Эта if-инструкция

else statement3; // связана с этой else-инструкцией.

}

else statement4}; // Эта else-инструкция связана с if (i) .

Как утверждается в комментариях, последняя else-инструкция не связана с инструкцией if (j ), поскольку они не находятся в одном блоке (несмотря на то, что эта if-инструкция — ближайшая, которая не имеет при себе "else-пары"). Внутренняя else-инструкция связана с инструкцией if (к), поскольку она— ближайшая и находится внутри того же блока.

Вложенная i f-инструкция — это инструкция, которая используется в качестве элемента инструкция любой другой if- или else-инструкции.

Язык C++ позволяет 256 уровней вложения, но на практике редко приходится вкладывать if-инструкции на "такую глубину".

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

//Программа "Угадай магическое число": 2-е усовершенствование.

#include <iostream.h>

#include <stdlib.h>

Int main(){

int magic; // магическое число

int guess; // вариант пользователя

magic = rand(); // Получаем случайное число.

cout << "Введите свой вариант магического числа: " ; cin » guess;

if (guess == magic) {

cout << "** Правильно **\n";

cout << magic << " и есть то самое магическое число. \n";

else {

cout « "...Очень жаль, но вы ошиблись.";

if(guess > magic) cout <<" Ваш вариант превышает магическое число.\n";

else cout << " Ваш вариант меньше магического числа.\n";

return 0; }

Конструкция if -else-if

Очень распространенной в программировании конструкцией, в основе которой лежит сложенная if-инструкция, является "лестница" if-else-if. Ее можно представить в следующем виде.

if(условие)

инструкция; else if(условие)

инструкция; else if(условие)

инструкция ;

else

инструкция;

Здесь под элементом условие понимается условное выражение. Условные выражения вычисляются сверху вниз. Как только в какой-нибудь ветви обнаружится истинный результат, будет выполнена инструкция, связанная с этой ветвью, а вся остальная "лестница" опускается. Если окажется, что ни одно из условий не является истинным, будет выполнена последняя else-инструкция (можно считать, что она выполняет роль условия, которое действует по умолчанию). Если последняя else-инструкция не задана, а все остальные оказались ложными, то вообще никакое действие не будет выполнено.

"Лестница" if-else-if— это последовательность вложенных if-else-инструкций.

Работа if -else-if-''лестницы" демонстрируется в следующей программе.

// Демонстрация использования "лестницы" if-else-if.

#include <iostream.h>

int main() {

int x;

for(x=0; x<6; x++) {

if (x==l) cout << "x равен единице.\n";

else if(x==2) cout « "x равен двум.\n";

else if(x==3) cout << "x равен трем.\n";

else if(x==4) cout << "x равен четырем.\n";

else cout << "x не попадает в диапазон от 1 до 4.\n"; }

return 0; }

Результаты выполнения этой программы таковы.

х не попадает в диапазон от 1 до 4.

х равен единице.

х равен двум.

х равен трем.

х равен четырем.

х не попадает в диапазон от 1 до 4.

Как видите, последняя else-инструкция выполняется только в том случае, если все предыдущие if-условия дали ложный результат.