Ветвления в си
Ветвления и логические операторы
Ветвление служит для выбора определённого набора команд в зависимости от значения некоторого выражения.
Например, если человек набрал правильный пароль, то дверь открывается, иначе нет, если уровень игрока выше определённого значения, то
он получает новое оружие, если температура человека больше 38 градусов, у него кашель и насморк, то есть подозрение на грипп, если дискриминант
меньше нуля, то корни уравнения комплексные и т.п.
В си ветвления организуются с помощью конструкции
if (условие) { <Действия, если условие выполняется> } else { <Действия, если условие не выполняется> }
Например, запрашиваем у человека пароль, если он совпадает, то пишем приветствие, иначе ограничиваем вход.
#include<stdio.h> #include<conio.h> int main() { int pass; prinf("Enter password: "); scanf("%d", &pass); if (pass == 1234) { printf("Welcome"); } else { prinf("Access denied!"); } getch(); }В си используется несколько логических операторов
- > больше
- < меньше
- >= больше или равно
- <= меньше или равно
- == равно
- != не равно
- ! отрицание выражения
Особенностью Си является то, что в нём отсутствует специальный булев тип. Истиной в си является любой ненулевое значение, ложью 0. Операторы сравнения также возвращают в качестве ложи 0, в качестве истины любое ненулевое значение.
С помощью логических операторов можно создавать сложные, составные выражения, об этом поговорим позже.
Одной из самых распространённых ошибок при обучении си является использование оператора присваивания = вместо оператора сравнения ==. Как упоминалось в разговоре про оператор присваивания, он возвращает значение, поэтому это значение воспринимается как истина, или ложь.
Например
#include<conio.h> #include<stdio.h> int main() { if (1) { printf("TRUE"); } else { printf("FALSE"); } getch(); }
В этом примере будет выведено TRUE.
Вот пример, где ошибочно используется оператор присваивания вместо равно
#include<conio.h> #include<stdio.h> int main() { int i = 0; if (i = 1) { printf("i equals to 1"); } else { printf("i equals to 0"); } getch(); }
Здесь при проверке условия переменной i присваивается 1, и эта же единица возвращается как логическая истина, поэтому работать будет первая ветвь.
Оператор if может содержать всего одну ветвь, в этом случае вторая просто опускается, например
#include<conio.h> #include<stdio.h> int main() { float number; printf("Enter number"); scanf("%f", &number); if (number < 0.0f) { number = -number; } printf("%.6f", number); getch(); }
В этой программе пользователь вводит число, если оно отрицательное, то мы меняем его знак. В том случае, если ветвь оператора if содержит всего один оператор, то можно не использовать фигурные скобки. Прошлый пример можно переписать
#include<conio.h> #include<stdio.h> int main() { float number; printf("Enter number "); scanf("%f", &number); if (number < 0.0f) number = -number; printf("%.6f", number); getch(); }
Однако, это плохой стиль программирования. Пожалуйста, пишите фигурные скобки всегда. Это улучшает читаемость кода, за счёт чего вы будете делать меньше ошибок.
Ветвления могут идти друг за другом, например, можно проверять много условий. Напишем программу, которая по порядковому дню недели выводит его название.
#include<conio.h> #include<stdio.h> int main() { unsigned day; printf("Enter day "); scanf("%d", &day); if (day > 7) { day = day % 7; } if (day == 0) { printf("Sunday"); } else if (day == 1) { printf("Monday"); } else if (day == 2) { printf("Tuesday"); } else if (day == 3) { printf("Wednesday"); } else if (day == 4) { printf("Thursday"); } else if (day == 5) { printf("Friday"); } else if (day == 6) { printf("Saturday"); } getch(); }
Ветви оператора if могут содержать любые допустимые к использованию внутри функции конструкции. Например, объявление переменных, ветвления и т.д. Ветвления могут быть вложены друг в друга.
#include <stdio.h> #include <conio.h> int main() { unsigned month, year; printf("Enter month"); scanf("%d", &month); printf("Enter year"); scanf("%d", &year); if (month < 13) { if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { printf("31 days"); } else if (month == 2) { if (year % 4 == 0) { printf("29 days"); } else { printf("28 days"); } } else { printf("30 days"); } } else { printf("No such month"); } }
