Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.
Допустим, мы хотим по данному числу x определить его абсолютную величину (модуль). Для этого необходимо нарушить линейную логику программы. Программа должна напечатать значение переменной x, если x>0 или же величину -x в противном случае. Линейная структура программы нарушается: в зависимости от справедливости условия x>0 должна быть выведена одна или другая величина. Соответствующий фрагмент программы на C++ имеет вид:
double x;
cin>>x;
if (x>0)
{
cout< }
else
{
cout<<-x;
}
return 0;
В этой программе используется условная инструкция if (если). После слова if в обязательных круглых скобках указывается проверяемое условие (x>0). После этого в фигурных скобках идет блок (последовательность) инструкций, который будет выполнен, если условие истинно, в нашем примере это вывод на экран величины x. Затем идет слово else (иначе) и после него блок инструкций, который будет выполнен, если проверяемое условие неверно.
Итак, условная инструкция в C++ имеет следующий синтаксис:
if (Условие)
{
Блок инструкций 1
}
else
{
Блок инструкций 2
}
Блок инструкций 1 будет выполнен, если Условие истинно. Если Условие ложно, будет выполнен Блок инструкций 2.
В условной инструкции может отсутствовать слово else и последующий блок. Такая инструкция называется неполным ветвлением. Например, если дано число x и мы хотим заменить его на абсолютную величину x, то это можно сделать следующим образом:
if (x<0)
{
x=-x;
}
В этом примере переменной x будет присвоено значение -x, но только в том случае, когда x<0.
Вложенные условные инструкции
Внутри условных инструкций можно использовать любые инструкции языка C++, в том числе и условную инструкцию. Получаем вложенное ветвление – после одной развилки в ходе исполнения программы появляется другая развилка. Покажем это на примере программы, которая по данным ненулевым числам x и y определяет, в какой из четвертей координатной плоскости находится точка (x,y):
double x,y;
cin>>x>>y;
if (x>0)
{
if (y>0) // x>0, y>0
{
cout<<"Первая четверть"< }
else // x>0, y<0
{
cout<<"Четвертая четверть"< }
}
else
{
if (y>0) // x<0, y>0
{
cout<<"Вторая четверть"< }
else // x<0, y<0
{
cout<<"Третья четверть"< }
}
В этом примере мы использовали комментарии – текст, который компилятор игнорирует. Комментариями в C++ является последовательность символов // и весь текст после этого символа до конца строки. Обратите также внимание на отступы в начале строк, используемые для облегчения понимания текста.
Операторы сравнения
В качестве проверяемого условия должно использоваться выражение логического типа bool. Переменные логического типа принимают два значения: true (истина) и false (ложь). Также любое целочисленное выражение можно трактовать, как логическое выражение, при этом нулевое целое число означает ложь, а ненулевое — истину. Таким образом, если вместо условия написать false или 0, то оно будет всегда ложно, если же указать true, 1 или любое ненулевое число, то условие будет истинно.
Как правило, в качестве проверяемого условия используется результат вычисления одного из следующих операторов сравнения:
<
Меньше — возвращает true, если первый операнд меньше второго.
>
Больше — возвращает true, если первый операнд больше второго.
<=
Меньше или равно.
>=
Больше или равно.
==
Равенство. Возвращает true, если два операнда равны.
!=
Неравенство. Возвращает true, если два операнда неравны.
Например, условие x*x<2 означает "значение x*x меньше 2", а условие 2*x!=y означает "удвоенное значение переменной x не равно значению переменной y".
Будьте аккуратны: оператор == (два знака равенства) — это проверка на равенство двух выражений, а оператор = (один знак равенства) — это присваивание одной переменной значения выражения и использование его в условии оператора ветвления в большинстве случаев является ошибкой.
Иногда нужно проверить одновременно не одно, а несколько условий. Например, проверить, является ли данное число четным , можно при помощи условия n%2==0 (остаток от деления n на 2 равен 0), а если необходимо проверить, что два данных целых числа n и m являются четными, необходимо проверить справедливость обоих условий: n%2==0 и m%2==0, для чего их необходимо объединить при помощи оператора && (логическое И): n%2==0 && m%2==0.
В C++ существуют стандартные логические операторы: логическое И, логическое ИЛИ, логическое отрицание.
Логическое И является бинарным оператором (то есть оператором с двумя операндами: левым и правым) и имеет вид && (два знака амперсанда). Оператор && возвращает true тогда и только тогда, когда оба его операнда имеют значение true.
Логическое ИЛИ является бинарным оператором и возвращает true тогда и только тогда, когда хотя бы один операнд равен true. Оператор "логическое ИЛИ" имеет вид || (два знака вертикальной черты).
Логическое НЕ (отрицание) является унарным (то есть с одним операндом) оператором и имеет вид ! (восклицательный знак), за которым следует единственный операнд. Логическое НЕ возвращает true, если операнд равен false и наоборот.
Пример:
x && !y
Данное выражение означает "x И отрицание y" и равно true тогда и только тогда, когда x равно true, а y равно false.
Упражнения -
(A) Даны два целых числа. Напечатайте наибольшее из них.
-
(B) Даны два целых числа. Программа должна вывести число 1, если первое число больше второго, число 2, если второе больше первого, или число 0, если они равны.
-
(C) Даны три числа. Напечатайте наибольшее из них (программа должна вывести ровно одно целое число). Какое наименьшее число операторов сравнения (>, <, >=, <=) необходимо для решения этой задачи?
-
(D) Даны три действительных положительных числа a, b, c. Определите, существует ли треугольник с такими сторонами. Если треугольник существует, выведите строку YES, иначе выведите строку NO.
-
(E) Даны три целых числа. Определите, сколько среди них совпадающих. Программа должна вывести одно из чисел: 3 (если все совпадают), 2 (если два совпадает) или 0 (если все числа различны).
-
(F) Поле шахматной доски определяется парой чисел (a, b), каждое от 1 до 8, первое число задает номер столбца, второе – номер строки. Заданы две клетки. Определите, может ли шахматная ладья попасть с первой клетки на вторую за один ход. Входные данные: 4 целых числа от 1 до 8 каждое, первые два задают начальную клетку, вторые два задают конечную клетку. Начальные и конечные клетки не совпадают. Программа должна вывести YES, если из первой клетки ходом ладьи можно попасть во вторую или NO в противном случае.
-
(G) Решите ту же задачу для короля.
-
(H) Решите ту же задачу для слона.
-
(I) По заданному числу n от 1 до 365 определите, на какое число какого месяца приходится день невисокосного года с номером n. Программа получает на вход целое число n и должна вывести два числа: число месяца (от 1 до 31) и номер месяца (от 1 до 12), на которое приходится данный день.
-
(J) Даны действительные числа a, b, c. Найдите все решения квадратного уравнения ax2+bx+c=0. Для вычисления квадратного корня используется функция sqrt, для использования которой необходимо в начале программы подключить заголовочный файл cmath. Формат входных данных: три действительных числа. Формат выходных данных: два действительных числа, если уравнение имеет два корня, одно действительное число – при наличии одного корня. При отсутствии действительных корней программа не выводит ничего.
-
(K) Определите тип треугольника (остроугольный, тупоугольный, прямоугольный) с данными сторонами. Входные данные: три натуральных числа – стороны треугольника. Выходные данные: одно из слов rectangular для прямоугольного треугольника, acute для остроугольного треугольника, obtuse для тупоугольного треугольника или impossible, если входные числа не образуют треугольника.
-
(L) По данному числу n<100 закончите фразу "На лугу пасется..." одним из возможных продолжений: "n коров", "n корова", "n коровы", правильно склоняя слово "корова". Программа должна вывести введенное число n и одно из слов (на латинице): korov, korova или korovy, например, 1 korova, 2 korovy, 5 korov. Между числом и пробелом должен стоять ровно один пробел.
-
(M) Билет на одну поездку в метро стоит 15 рублей, билет на 10 поездок стоит 125 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна. Входные данные: количество поездок n. Выходные данные – три целых числа, равные необходимому количеству билетов на 1, на 10, на 60 поездок. Например, при вводе 129 программа должна вывести 0 1 2 (2 билета на 60 поездок и 1 билет на 10 поездок).
-
(N) Решите предыдущую задачу при наличии следующих билетов: 1 поездка - 15 рублей, 5 поездок - 70 рублей, 10 поездок - 125 рублей, 20 поездок - 230 рублей, 60 поездок - 440 рублей. Если для какого-то данного n существует несколько способов приобретения билетов одинаковой стоимости, необходимо вывести ту комбинацию билетов, которая дает большее число поездок.
#include
using namespace std;
double x,y;
int main()
{
setlocale(LC_ALL, "rus");
cin>>x>>y;
if (x>y) {
std::cout<<"1";
}
else {std::cout<<"2";
}
if (x==y) {std::cout<<"0"<
Достарыңызбен бөлісу: |