§6 Инструкция if. Полное и неполное ветвление. Вложенные инструкции if

Условная инструкция if

Из прошлого занятия вам, должно быть, стало понятным, что без логики в программе невозможно решать сложные задачи, в которых требуется выполнять инструкции в зависимости от поставленного условия. Из жизненного опыта нам известно, что даже элементарные бытовые действия мы выполняем после определенных размышлений. Просыпаясь мы задаемся вопросом: “Не пора ли мне вставать? Который час? О… нет и шести! Можно еще поспать”. Выходя из дома мы выбираем маршрут: “Я иду в школу пешком, если не опаздываю”. “Я опаздываю! Поеду-ка я лучше на автобусе, так быстрее!”. И тому подобное.
Это для нас совершенно естественно – решать как действовать дальше. Мы либо принимаем решение утвердительно, либо отвергаем его. (Однако, для нас, в отличие от алгоритмов, не всегда очевидны последствия принимаемых решений. Поэтому мы, принимая решения, вручаем нашу судьбу в “руки Господни”, либо полагаемся на “русское авось”).

1234x600
В языке C++ существуют специальные инструкции управления, которые прерывают линейное выполнение алгоритма и направляют дальнейшее его выполнение по тому пути, который выбран в результате решения поставленного условия.
Условная инструкция if является инструкцией управления, которая позволяет реализовать алгоритмическую структуру ветвление. Синтаксис этой инструкции:

if (Выражение) 
    Инструкция1; 
else
    Инструкция2;

Ветвление полное и неполноеЕсли выражение в условии принимает значение true или отличное от нуля, то выполняется инструкция Инструкция1. Если условие принимает значение false или равно 0, то выполняется инструкция Инструкция2. Выражение в условии может быть логическим выражением или любым выражением скалярного типа. Инструкция if имеет две формы для полного и неполного ветвления. В неполном ветвлении ветвь “на иначе” отсутствует:

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

Это означает, что если условие ложно, то будут выполняться инструкции следующие за условной инструкцией.
Программа 6.1 Неполное ветвление. Определить является ли число N кратным числу K.

#include <iostream>
using namespace std;

int main() {
    int N, K;
    cout << "N = "; cin >> N;
    cout << "K = "; cin >> K;
    if (N % K == 0) cout << N << " кратно " << K << endl;
    return 0;
}

Блок-схема к программе 6.1
n_кратно_k
Неполные ветвления используются так же часто в программах, как и полные.
Программа 6.2 Каскад неполных веталений. На вход программе подаются 4 числа определить количество положительных чисел в исходном наборе. Если таких чисел нет, то сообщить об этом.

#include <iostream>
using namespace std;

int main() {
    int a, b, c, d, i = 0;
    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;
    cout << "c = "; cin >> c;
    cout << "d = "; cin >> d;
    if (a > 0) ++i;
    if (b > 0) ++i;
    if (c > 0) ++i;
    if (d > 0) ++i;
    if (!i) cout << "Количество положительных чисел равно " << i << endl;
    if (i == 0) cout << "Положительных чисел - нет!" << endl; 
    return 0;
}

Принято, для хорошей читаемости программного кода, инструкции, находящиеся в ветвях условной инструкции (т. е. блок, см. ниже), выделять отступом. Размер отступа определяет разработчик (устанавливается в настройках редактора программного кода), но традиционно он принимается равным 4 пробелам или однократной табуляции:
Программа 6.3 Полное ветвление. Введены два числа. Определить порядковый номер большего из них.

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;
    if (a > b) 
        cout << 1 << endl;
    else
        cout << 2 << endl;
    return 0;
}

Блок-схема к программе 6.3
if2

Составная инструкция (блок)

В том случае, если в ветвях if более одной инструкции, то данный набор инструкций называется составной инструкцией или блоком, который должен заключаться в фигурные скобки:

if (Выражение) {
    Блок1; 
} else {
    Блок2;
}

Пример задачи. Даны два действительных числа a и b. Возвести в третью степень большее из них и в четвертую степень меньшее. Вывести новые значения a и b.
Программа 6.4

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    double a, b;
    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;
    if (a > b) {
        a = pow(a, 3);
        b = pow(b, 4);
    } else {
        a = pow(a, 4);
        b = pow(b, 3);
    }
    cout << "a = " << a << "\n"
         << "b = " << b << endl;
    return 0;
}

Обратите внимание, что блок не завершается точкой с запятой.

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

Одна инструкция if может быть вложена в другую инструкцию if. C++ поддерживает очень большую глубину вложенности, но на практике редко возникают случаи, когда глубина вложенности превосходит 3 или 4. С увеличением числа вложенных друг в друга if код перестает быть читаемым и понятным. Также возрастает вероятность ошибки и найти ее будет проблематично.
Пример задачи. Дана точка A с координатами x и y. Определить какой координатной четверти принадлежит A.
Программа 6.5

#include <iostream>
using namespace std;

int main() {
    double x, y;
    cout << "x = "; cin >> x;
    cout << "y = "; cin >> y;
    cout << "Точка находится ";
    if (x > 0)
        if (y > 0)
            cout << "в I четверти.";
        else
            cout << "в IV четверти.";
    else
        if (y > 0)
            cout << "во II четверти.";
        else
            cout << "в III четверти.";
    cout << endl;
    return 0;
}

Заметим, что данную программу можно сделать более понятной, если использовать сложные логические выражения:
Программа 6.5а

#include <iostream>
using namespace std;

int main() {
    double x, y;
    cout << "x = "; cin >> x;
    cout << "y = "; cin >> y;
    cout << "Точка находится ";
    if (x > 0 && y > 0)
        cout << "в I четверти.";
    else if (x > 0 && y < 0)
        cout << "в IV четверти.";
    else if (x < 0 && y > 0)
        cout << "во II четверти.";
    else
        cout << "в III четверти.";
    cout << endl;
    return 0;
}

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


Print Friendly, PDF & Email

Comments are closed.