Существует три типа управляющих инструкций:
- операторы ветвления (или условного перехода);
- операторы выбора;
- операторы цикла.
Пример:
Cравнить два числа.
Оператор else не всегда обязателен: если он отсутствует, C++ считает, что он существует, но является пустым.
Пример:
Пример задачи с решением: написать программу, которая проверяет, находится ли введенное пользователем значение в диапазоне чисел от -2 до 1 включительно. Использовать вещественный тип данных. Использовать оператор && либо вложенное условие. Не использовать "магических чисел". На выводе использовать 3 переменные.
Результаты работы должны быть следующими:
Первый способ решения:
Второй способ решения:
Тернарный оператор
Пример:
Если num1 > num, тогда в num2 записать значение из num1, иначе в num2 записать значение из num.
Примеры решения задач
1. Написать программу, которая решает следующую задачу.
После выигрыша в денежной лотерее необходимо оплатить налог: если сумма выигрыша меньше 100 р., то нужно выплатить налог в сумме 10 р.; если выигрыш от 100 до 200 р., то нужно выплатить налог 15 р.; если выигрыш больше 200 р., то налог составит 25 р. Пользователь вводит сумму выигрыша, а программа должна вывести сумму, которую необходимо выплатить в качестве налога.
Выигрыш | Налог |
---|---|
< 100 | 10 |
от 100 до 200 | 15 |
> 200 | 25 |
Блок-схема алгоритма решения задачи:
В этой программе нужно определить, в каком из трех диапазонов находится введенное пользователем число: от 0 до 99, или от 100 до 200, или больше 200.
Решение:
Условная конструкция всегда должна начинаться с оператора if – "если".
Сначала проверяем (в 14-15 строках): "если выигрыш < 100, в nalog записать значение 10". Далее (в 16-17 строках) пишется "иначе если выигрыш <= 200, то в nalog записать 15".
Если пользователь введет в win значение 55, то win<100 вернет true, в nalog запишется 10, а строки 16-19 вообще не будут выполняться, потому что они начинаются с оператора else.
Если же пользователь ведет в win значение 150, то win<100 вернет false, а следовательно строка 15 не выполнится и далее будет проверяться условие из строки 16: win<=200 вернет true, и в nalog запишется значение 15.
В этой задаче условие поставлено таким образом, что если пользователь введет число ровно 100 или ровно 200, то он должен заплатить сумму налога, предусмотренного средним диапазоном чисел – 15 р. Т.е. всегда нужно внимательно определять, к какому диапазону относится каждая граница диапазона.
В конце условной конструкции написано просто else (иначе). Это значит, что при всех других значениях win будет в nalog записано число 25.
Но можно и продолжить последнюю часть конструкции, дописав в конце условие win>200.
На результате работы программы это не отразится, а просто будет проверяться условие в 18 строке, если все предыдущие проверки вернули false.
Если бы в этой задаче максимально возможный выигрыш составлял 250, то можно было бы получить неполное ветвление. Т.е. если пользователь введет, например, число 251, то программа просто ничего не выведет для этого случая:
При решении подобных задач (где можно выделить диапазоны) не обязательно начинать проверку с меньшего диапазона. Можно начать с большего.
Оба фрагмента приводят к одному и тому же результату.
Сравните:
Но настоятельно не рекомендуется начинать с проверки среднего диапазона (т.е. когда выигрыш от 100 до 200), так как это потребует использовать дополнительные проверки в условиях, что затруднит чтение программы.
2. Программа должна спросить пользователя, идет ли на улице дождь. Если пользователь ответит "yes", то программа должна вывести "Возьмите зонт!". Если пользователь напишет не "yes", а любое другое сообщение, то программа ничего не отвечает.Т.е. в этой задаче необходимо реализовать конструкцию неполного ветвления:
Если пользователь введет "yes", то 14 строка вернет true, и тогда выполнится 15 строка, а потом выполнится следующая – 17 строка.
Если пользователь введет любой другой ответ, то 14 строка вернет false, и 15 строка НЕ выполнится, а сразу будет передано управление дальше – на 17 строку.
Добавим условия в задачу №2:
Программа должна спросить пользователя, идет ли на улице дождь. Если пользователь ответит "yes", то программа должна вывести "Возьмите зонт!". Если пользователь напишет не "yes", а любое другое сообщение, то программа ничего не отвечает.
Ещё программа должна спросить, светит ли солнце. Если "yes", то программа должна вывести "Наденьте солнцезащитные очки!"
И ещё программа должна спросить, дует ли ветер. Если "yes", то программа должна вывести "Наденьте шарф!" Если другой ответ, то должна вывести "Возьмите веер!".
Результаты работы программы могут выглядеть так:
Все эти три условия независимы друг от друга: например, может идти дождь и дуть ветер, но при этом солнце может не светить; или может светить солнце и дуть ветер, но дождь может не идти.
Таким образом, в одной этой программе будут три разные независимые друг от друга условные конструкции, при этом каждая из первых двух будет являться неполным ветвлением, потому что программой не будет предусмотрено никаких действий на тот случай, если пользователь введёт не "yes".
Блок-схема алгоритма решения этой задачи:
Решение:
3. Часто встречаются ситуации, что нужно выполнить какое-то действие в том случае, когда выполняются одновременно несколько условий или хотя бы одно из имеющихся условий. Например, нужно написать программу, которая хвалит пользователя только в том случае, если он верно ответил на оба вопроса. Примеры результата работы программы:
Решение:
Составное условие в строке 18 вернет true только в том случае, если и левая, и правая его части вернут true.
Можно немного изменить эту программу так, чтобы она хвалила пользователя, если он ответил правильно хотя бы на один вопрос:
В этом случае нужно всего лишь заменить логическое И (&&) на логическое ИЛИ (||):
Составное условие в строке 18 вернет true в том случае, если хотя бы левая, или хотя бы правая, или обе его части вернут true.
Еще одна подобная задача.
Пользователю предлагается решить три примера:
- 5*6
- 7*8
- 8*9
Если он правильно решит все три примера, то программа должна вывести сообщение об этом. Если хотя бы в одном примере допустит ошибку, то программа должна просто завершить свою работу.
Есть как минимум два равнозначных решения этой задачи.
Первое решение:
Второе решение:
4. Многие программы должны выполнить сразу несколько действий в том случае, если условие возвращает true (или false). Например, нужно получить от пользователя ввод значений цены (в рублях) и скидки (в процентах), вывести размер скидки в рублях и итоговую цену. Если пользователь введет некорректные данные, то программа не должна ничего считать.
Примеры результата работы программы:
Для решения этой задачи нужно использовать фигурные скобки {}, чтобы выполнялись все 4 действия, если if() вернёт true:
Если забыть поставить скобки, то строка 19 выполнится только если if() вернет true, а вот строки 20-23 выполнятся в любом случае, что противоречит условию задачи.
Эту же задачу можно решить с использованием вложенных условий. При этом порядок выполнения инструкций останется в точности таким же:
Написать программы для решения следующих задач (по вариантам):
1. Даны два действительных числа.
Вывести первое число, если оно больше второго, и оба числа, если это не так.
2. Даны два действительных числа.
Заменить первое число нулем, если оно меньше или равно второму, и оставить числа без изменения в противном случае.
3. Даны три действительных числа.
Вывести на экран те из них, которые принадлежат интервалу [1..5].
4. Даны действительные числа a, b, c.
Удвоить числа, если a ≥ b ≥ c, и заменить их абсолютными значениями, если это не так.
5. Даны два действительных числа x, y.
Меньшее из этих двух чисел заменить их полусуммой, а большее – их удвоенным произведением.
6. Из трех монет одинакового достоинства одна фальшивая (более легкая).
Найти эту монету с помощью одного взвешивания на чашечных весах без гирь.
7. Даны три действительных числа.
Возвести в квадрат те из них, значения которых не отрицательны.
8. Работники предприятия получат надбавки в зависимости от стажа работы:
- если стаж 20 и более лет, то надбавка будет составлять 200 р., если стаж более 10 лет, то надбавка – 100 р.,
- если стаж 10 лет или меньше, то надбавка 50 р.
Программа должна получить от пользователя количество лет стажа и вывести надбавку.
Примеры результата работы программы:
9. Написать программу, которая получает от пользователя 3 числа и выводит наименьшее из них.
Использовать алгоритм присваивания переменной min первого из введенных значений.
Правильный алгоритм поиска максимального и минимального:
10. Написать программу, которая выводит три введенных пользователем числа в порядке возрастания (цикл не использовать).
Результаты работы программы должны быть следующими:
11. Пользователь вводит число.
Программа должна определить и вывести в каждом случае, делится ли это число без остатка:
- на 2
- на 3
- на 5
Результаты работы программы должны быть следующими:
12. Пользователь вводит три натуральных (целых положительных) числа.
Найти сумму тех чисел, которые делятся на 5 без остатка. Если таких чисел нет, то вывести сообщение об ошибке.
Результаты работы программы должны быть следующими:
13. Написать программу, которая выводит максимальную цифру введенного пользователем трехзначного числа.
Результаты работы программы должны быть следующими:
14. Написать программу для поиска корней квадратного уравнения, которая должна работать следующим образом:
15. Пользователь вводит трехзначное число.
Программа должна определить, есть ли в этом числе одинаковые цифры, а также вывести количество одинаковых цифр.
Инструкция выбора эффективна, если есть необходимость выбора при ограниченном количестве возможных вариантов. Инструкция выбора похожа на усложненную инструкцию if, которая вместо проверки одного условия анализирует множество разных возможностей.
switch (выражение)
{
case a:
// Переход сюда, если выражение == a;
break;
case b:
// Переход сюда, если выражение == b;
break;
default:
// Если ни одно условие не выполнено, то переход сюда
}
- значением выражения должно быть целое число (int, long или char);
- a, b и т.д. должны быть константами, указанными после служебного слова case. Если константа соответствует значению выражения, то программа передает управление этой ветви. Если ни один вариант не подходит, то выполняется условие default.
Пример (фрагмент программы):
cout << “Введите 5, 10 или 15: ”;
cin >> choice;
switch (choice)
{
case 5:
// Обработка случая “5”;
break;
case 10:
// Обработка случая “10”;
break;
case 15:
// Обработка случая “15”;
break;
default:
cout << “Вы ввели не 5, не 10 и не 15\n”;
}
Для выхода из инструкции switch необходимо использовать команды break, иначе управление будет переходить от одного случая к следующему, даже если совпадение значений уже было найдено.
Пример с решением.
Написать программу, которая принимает только числа 0 и 1:
1. Написать программу с использованием конструкции выбора, которая принимает символ и выводит соответствующий результат:
Циклы предоставляют возможность итеративного выполнения блока кода.
Цикл с предусловием while
while (условие)
{
// Код, повторно выполняемый до тех пор,
// пока очередная проверка условия не даст false.
// Если при первом обращении к циклу
// условие ложно, тело цикла не выполнится ни разу.
}
Пример:
Бесконечный цикл while
Цикл с постусловием do while
do
{
// Условие не проверяется до тех пор,
// пока не будет достигнут конец цикла.
// Цикл с постусловием всегда выполнится хотя бы раз.
// Цикл выполняется до тех пор, пока условие истинно.
}
while (условие)
Пример:
(тело цикла выполнится 11 раз):
Бесконечный цикл do while
Цикл с предусловием for
Сначала единожды инициализируется i. Затем проверяется условие. Если оно истинно, то выполняется тело цикла. Затем выполняется третий параметр. Затем снова проверяется условие. И так далее.
Пример:
Бесконечный цикл for
Пример:
Каждый из трех параметров цикла for является необязательным.
Во всех циклах счетчик цикла i можно увеличивать/уменьшать на любое число. Его можно даже умножать, делить, выводить из-под корня, получать остаток от деления и т.д.:
В соответствии с областями видимости, во всех циклах переменная i должна быть объявлена до того, как она будет использована.
Специальные операторы управления циклом
В C++ определены 2 специальные команды – break и continue.
В случаях, если условие работы цикла нарушается не в начале или в конце, а в середине цикла, можно использовать команду break, чтобы выйти из цикла.
Встретив команду continue, программа немедленно возвращается к началу цикла (т.е. к третьему параметру – к i++):
Вложенные команды управления
Вложенный цикл – это цикл, размещённый внутри другого цикла. На первом проходе внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. Как внешний, так и внутренний цикл может быть прерван командой break.
Программа, демонстрирующая работу вложенного цикла:
1. Написать программу с использованием цикла с предусловием while (), которая 5 раз выведет на экран ваше ФИО.
Пример:
2. Написать программу с использованием бесконечного цикла с предусловием while (), которая предлагает пользователю ввести имя.
Образец:
3. Написать программу с использованием цикла for(;;) и оператора break, которая каждый раз (бесконечный цикл) запрашивает у пользователя делимое и делитель и получает частное. Выход из цикла, если пользователь вводит нулевое значение делителя.
4. Написать программу с использованием цикла for и операторов break и continue, которая дает пользователю 5 попыток ввода пароля. В качестве правильного пароля использовать 12345.
5. Написать программу с использованием вложенного цикла, которая выводит на экран расписание занятий по дням недели. Пользователь ничего не вводит.
6. Написать программу с использованием вложенного цикла, которая выводит на экран таблицу умножения. Пользователь ничего не вводит.
7. Написать программу MyDeposit таким образом, чтобы у пользователя была возможность получить общие суммы по каждому году. Использовать цикл for.
8. Дополнить программу MyDeposit таким образом, чтобы выход из цикла осуществлялся, когда начальное значение вклада начинает превышать конечное значение в 10 раз. Использовать оператор break.
Например, здесь сумма вклада = 100. Значит последняя выплата не может быть больше 1000.
9. Преобразовать программу MyDeposit таким образом, чтобы проверка пользовательского ввода осуществлялась с помощью бесконечного цикла. Выход из цикла, если пользователь ввел корректные данные, с помощью оператора break. Удалить фрагмент кода, в котором ограничивается увеличение итоговой суммы более чем в 10 раз от изначального вклада.
Переменные, в которых хранятся значения вклада и процентной ставки (в процентах) должны быть объявлены вне циклов (в соответствии с правилами области видимости).