Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Философия программирования на C++ Условия: часть первая, ознакомительная


Здравствуйте, уважаемые подписчики.

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

Итак, начнем с исходника и будем его постепенно разбирать.

#include "iostream"
using namespace std;
int main() {
    int a = 10;
    if(a > 10)    //Если a > 10
        cout << "a > 10" << endl;
    else    //в противном случае (т.е. если a <= 10) ...
        cout << "a <= 10" << endl;
    int b = 0;
    if(a == b)    //Если a равен b ...
        cout << "a == b" << endl;
    if(a*b != 0)    //Если a умноженное на b не равно нулю ...
        cout << "a*b != 0" << endl;
    else if(a != 0)    //в противном случае (если a*b == 0) если а не равно нулю ...
        cout << "b == 0, a != 0" << endl;
    else if(b != 0)    //в противном случае (если a*b == 0 и а равно нулю) если b не равно нулю ...
        cout << "a == 0, b != 0" << endl;
    int c = -1;
    if( c >= 0 && b == 0 || a == 0 ){    //! Желательно расставлять все скобки. Подробнее в следующем выпуске (в данном случае пример плохого стиля программирования)
        cout << "c >= 0 && b == 0 || a == 0" << endl;
        c = 0;
        a = 20;
        b = 10;
    }
    if(b == 10)
        cout << "b == 10" << endl;
}


Немного слов теории. Условия в программе (ветвления) необходимы тогда, когда нужно выполнить что-либо в зависимости от определенного условия. Например, необходимо разделить число a на число b. Очевидно, если число b равно нулю, то деление невозможно. Поэтому необходимо проводить проверку на то, чтобы b не было равно нулю. Если b не равно нулю, то вывести результат деления, в противном случае вывести "деление на 0 не определено".
Поэтому знание команд, управляющих выполнением программы просто абсолютно необходимо для чтения и написания программ на С++.
Все условные команды позволяют выбрать дальнейших ход программы в зависимости от выполнения логического условия. Результатом логического выражения является логическая величина true или false. Тут же, как примечание, отмечу, что для изучения языка С++ очень желательно знать основы английского языка, так будет гораздо удобнее читать и понимать программы. При дальнейшем изложении мы будем исходить из того, что вы достаточно знаете английский язык.
Как пример логического выражения, можно посмотреть 5-ю строчку приведенного выше примера. Выражение a > 10 при помощи условного оператора > проверяет, больше ли значение переменной a чем 10. Соответственно если это так (а больше 10), то результатом будет true (верно), в противном случае false. Существуют и другие условные команды, некоторые из них приведены выше (все они интуитивно понятны, а если нет - пишите примеры на понимание и запускайте!).
Возможно комбинирование условий с помощью логических операций - &&(И), ||(ИЛИ), !(НЕ). Все они работают аналогично операциям булевой алгебры. Так что советуем повторить основы булевой алгебры, это поможет при составлении условий.
Команда if-else существует в двух вариантах - с секцией else и без нее. Вот как выглядят эти команды:

if(выражение)
    команда

И второй вариант:

if(выражение)
    команда
else
    команда

Результат "выражение" должен быть true или false. Под командой понимается либо оператор, заканчивающийся символом точки с запятой ';', либо составная команда (группа простых одиночных команд в фигурных скобках). Примеры всего написаны выше. Например, первая команда if-else проверяет, является ли значение а больше 10. Очевидно, что это не так, поэтому логическое выражение возвращает false, соответственно дальше выполняется команда, следующая за else (будет выведено "a <= 10"). Следующий оператор применяется без else. В этом случае если выражение будет false, то программа просто продолжит выполнение минуя команду if. В общем поэкспериментируйте со значениями переменных и смотрите что получится :). Там же есть пример с фигурными скобками. Все должно быть понятно, это на самом деле не сложно.

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

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

Пример решения квадратного уравнения (на самом деле неверный).


#include <iostream>
#include <cmath> //подключаем функции математики
using namespace std;
int main() {
    int a = 1;
    int b = -12;
    int c = 27;
    float D = 0, x1 = 0, x2 = 0;//float, так как решение или дискриминант могут быть дробными
    if (a == 0) {//решаем ур-е b*x+c =0
        x1 = x2 = -c/b;
        cout << "1 solve. x = "<< x1<< endl;
    }
    else    if( (a == 0) && (b == 0) && (c == 0) )
            cout << "Too many solves" << endl;
        else{
            if (b == 0)//ур-е a*x^2+c= 0;
                if (c < 0){
                    x1 = sqrt(c);//sqrt - квадратный корень
                    x2 = -sqrt(c);
                }
                else
                    cout << "No solve";
            else {//обычное квадратное уравнение
                D = b * b - 4*a*c;
                if (D < 0)
                    cout << "No solves";
                else    if(D == 0){
                        x1 = x2 = -b/(2 * a);
                        cout << "1 solve. x = " << x1 << endl;
                    }
                    else{
                        x1 = (-b + sqrt(D)) / (2 * a);
                         x2 = (-b - sqrt(D)) / (2 * a);
                        cout << "2 solves. x1 = " << x1 << ", x2 = "<< x2 <<endl;
                    }
            }
        }
}


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


В избранное