Мегаобучалка Главная | О нас | Обратная связь


Условные операторы и логические выражения



2019-11-13 775 Обсуждений (0)
Условные операторы и логические выражения 0.00 из 5.00 0 оценок




Обучение детей программированию противоречит современной теории обучения. Разве интересно составлять планы, овладевать дисциплиной в организации мышления, уделять внимание деталям и учиться быть самокритичным?

Алан Перлис

Встречаются ситуации, когда программе нужно выбрать, какую операцию ей выполнить, в зависимости от определенного условия. Например, при вводе данных о возрасте человека для совершеннолетних необходимо запросить данные паспорта, а для несовершеннолетних свидетельства о рождении и т.д. В языке C++ предусмотрено несколько условных операторов для таких ситуаций.

Оператор ветвления if

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

Например, фраза «Если на улице идет дождь, то надо взять зонт» в русском языке может служить иллюстрацией конструкции с условием. Логическое выражение «на улице идет дождь» принимает одно из двух возможных значений ИСТИНА либо ЛОЖЬ. В случае истинности этого условия выполняется действие «взять зонт». Это пример условия с одной ветвью.

Рис. 6. Условие с одной ветвью (блок-схема)

Можно привести пример условия с двумя ветвями «Если лифт работает, то подняться на лифте, иначе идти пешком». Действие «подняться на лифте» выполняется в случае истинности условия «лифт работает», а действие «идти пешком» в случае его ложности.

 

Рис. 7. Условие с двумя ветвями (блок-схема)

Рассмотрим, как реализуются эти формы с помощью условного оператора if в языке C++.

if(условие) {операторы;}

Например, «если a > 3, то b увеличить на 1, а c уменьшить на 5» будет реализовано:

if (a > 3) {

     b++;

     c -= 5;

}

Если после условия применяется всего один оператор, фигурные (операторные) скобки ставить не обязательно.

Пример:

if (a > b) x = 1;

Полная форма условного оператора if с двумя ветвями включает дополнительную конструкцию else.

if (условие) {операторы_1;} else {операторы_2;};

Например, если требуется при отрицательном значении a увеличить b в 2 раза, c добавить 1 и уменьшить в 3 раза, а при неотрицательном вывести сообщение “test”:

if (a<0) {

     b *= 2;

     ++c /= 3;

} else {cout << "test";};

Условие соответствует типу логическому bool, принимающему значения true либо false. Для проверки простых условий используются операторы сравнения:

> больше
< меньше
>= больше либо равно
<= меньше либо равно
== равно
!= не равно

ВАЖНО: Наиболее часто встречающейся ошибкой в операциях сравнения является использование оператора присваивания = (один знак равно) вместо оператора проверки равенства == (два знака равно).

В языке С++ при использовании логического типа bool,  true имеет значение 1 при преобразовании к целому типу, а false – значение 0. И наоборот, целые можно неявно преобразовать в логические значения: при этом ненулевые целые преобразуются в true, а ноль – в false. В любом месте, где требуется логическое значение, может стоять целочисленное выражение.

Задача №12. Маршрутки

К остановке одновременно подъехало три маршрутки, в которые загрузились a, b и c пассажиров. Водители решили перераспределить пассажиров поровну. Определите, смогут ли они это сделать, и, если да, то какое минимальное количество людей нужно пересадить.

Входные данные

Три целых неотрицательных числа a, b, c ≤ 109 через пробел.

Выходные данные

Одно число – минимальное количество пересаженных пассажиров, если рассадка поровну возможна или строка NO в противном случае.

Пример

Ввод Вывод
15  5  2 NO
15  5  1 8

Решение

#include <iostream>

using namespace std;

int main() {

int a, b, c, s, p = 0;      // p – сколько нужно пересадить

cin >> a >> b >> c;

if ((a + b + c) % 3 == 0){       // рассадка возможна?

   s = (a + b +c) / 3;          // сколько должно быть

   if (a > s) p += a - s; // пересадить

   if (b > s) p += b - s; // всех

   if (c > s) p += c - s;  // "лишних"

   cout << p;

} else cout << "NO";

}

Задача №13. Коробки

На столе лежат коробка размера A1 × B1 × C1 и коробка размера A2 × B2 × C2. Выясните можно ли одну из этих коробок положить в другую, если разрешены повороты коробок вокруг любого ребра на угол 90 градусов.

Входные данные

Первая строка входного файла содержит три целых числа A1, B1 и C1. Вторая строка входного файла содержит три целых числа A2, B2 и C2. Все числа положительны и не превосходят 1000.

Выходные данные

Если коробки одинаковы, выведите "Boxes are equal". Если первая коробка может быть положена во вторую, выведите "The first box is smaller than the second one". Если вторая коробка может быть положена в первую, выведите "The first box is larger than the second done". Иначе, выведите "Boxes are incomparable".

Примеры

INPUT.TXT OUTPUT.TXT
1 1  2  3 3  2  1 Boxes are equal
2 2  2  3 3  2  1 The first box is larger than the second one
3 2  2  3 3  2  3 The first box is smaller than the second one
4 3  4  5 2  4  6 Boxes are incomparable

Решение

Определим вспомогательные величины x1, x2, x3 – разности между длинами меньших, средних и больших коробок соответственно:

#include <fstream>

usingnamespace std;

main() {

ifstream cin("input.txt");

ofstream cout("output.txt");

int a1, b1, c1, a2, b2, c2;

cin >> a1 >> b1 >> c1 >> a2 >> b2 >> c2;

int x1 = min(min(a1,b1),c1) - min(min(a2,b2),c2);

int x3 = max(max(a1,b1),c1) - max(max(a2,b2),c2);

int x2 = a1 + b1 + c1 - a2 - b2 - c2 - x1 - x3;

if (!x1 && !x2 && !x3) cout << "Boxes are equal";

else if (x1<=0 && x2<=0 && x3<=0)

     cout << "The first box is smaller than the second one";

    else if (x1>=0 && x2>=0 && x3>=0)

     cout << "The first box is larger than the second one";

         else cout << "Boxes are incomparable";

}

Задача №14. Школьная алгебра (acmp.ru)

(Время: 1 сек. Память: 16 Мб)

Трёхчлен a + bx + сy от двух переменных x и y однозначно определяется коэффициентами a, b и c. Написать программу, которая по заданным a, b и c выводит соответствующий трёхчлен, записанный с использованием алгебраических соглашений:

· коэффициент при члене, содержащем переменную, опускается, если его модуль равен единице;

· член, коэффициент при котором равен нулю, опускается (кроме случая, когда все коэффициенты равны нулю, тогда трехчлен состоит из одной цифры 0);

· знак "+" опускается, если он предшествует отрицательному коэффициенту;

· знак "+" опускается, если он стоит в начале выражения (так называемый унарный плюс);

· знак умножения между коэффициентом и переменной опускается.

При этом запрещено менять местами члены.

Входные данные

Через пробел записаны целые коэффициенты a, b и с, каждое из которых не превосходит 30000 по абсолютной величине.

Выходные данные

Трехчлен, записанный с использованием алгебраических соглашений.

Примеры

Ввод Вывод
1 0  2  -1 2x-y
2 3  0  -2 3-2y

Решение

#include <iostream>

using namespace std;

int main() {

int a, b, c;

cin >> a >> b >> c;

if (!a && !b && !c) {

   cout << '0';

   return 0;

}

if (a) cout << a;

 

if (b) {

   if(a && b > 0) cout << '+';

   if(b * b != 1) cout << b;

   else

       if (b == -1) cout << '-';

   cout << 'x';

}

if (c) {

   if((a || b) && c > 0) cout << '+';

   if(c * c != 1) cout << c;

   else

       if(c == -1) cout << '-';

    cout << 'y';

}

}

Задача №15. Сломанные часы

Имеются часы с 12-часовым круглым циферблатом и двумя стрелками – часовой и минутной. Все деления на циферблате стерлись, кроме начального (на 12 часов). Владимир измерил и записал углы, на которые отклонены стрелки от начального деления. Помогите ему определить, сколько времени часы показывают, либо они сломаны.

Часы считаются сломанными, если они показывают невозможное время (часовая и минутная стрелка не синхронизированы) (рис. 8)

Рис. 8. Иллюстрация к задаче "Сломанные часы"

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

Входные данные

В единственной строке файла clock.in записаны два неотрицательных целых числа X и Y через пробел – углы в градусах поворота часовой и минутной стрелок соответственно.

0 ≤  X,Y < 360

Выходные данные

В файл clock.out выведите время в формате “hh:mm” (без кавычек), либо символ “*” если часы сломаны.

Пример

clock.in clock.out
60  0 2:0
105  55 *
217  84 7:14

Решение

Для установления точного времени достаточно знать положение лишь одной стрелки - часовой. Минутная нужна лишь для установления факта, сломаны ли часы (показывают невозможное время). После этого решение задачи становится совершенно тривиальным.

#include <fstream>

usingnamespacestd;

int main() {

ifstream cin("clock.in");

ofstream cout("clock.out");

unsigned int x, y, hh, mm;

cin >> x >> y;

hh = x / 30;     // 1 час соответствует 30 град. часовой стрелки

mm = x % 30 * 2; // 2 минуты = 1 градус часовой стрелки

if (mm * 6 == y)            // минутная стрелка за 1 мин.

  cout << hh << ':' << mm;      // проходит 6 градусов

else cout << '*';                    

}

Если градусы задаются только целыми числами, как в условии данной задачи, то не удастся проверить время с нечётным числом минут, например 4:15. Любое положение минутной стрелки, соответствующее нечетному числу минут и целое число градусов на часовой будет означать, что часы сломаны.

Задача №16. Принц и дракон

(Время: 1 сек. Память: 16 Мб)

Условие и разбор задачи взяты с сайта acmp.ru.

Волшебник Мерлин продает волшебные мечи принцам, желающим убить дракона. Основная характеристика меча – число драконьих голов, которые он срубает за удар. Основная характеристика дракона – число голов, которые он может отрастить за сеанс регенерации. Бои принцев с драконами всегда протекают одинаково – принц атакует, и прячется за щитом; дракон атакует огненным дыханием и регенерирует; так продолжается до тех пор, пока после очередного удара у дракона не кончатся головы. Ясно, впрочем, что не каждым мечом можно победить каждого дракона. Заказ, поступающий Мерлину, всегда содержит число голов дракона и скорость его регенерации. Подсчитайте по известной атакующей силе меча, сможет ли принц убить такого дракона таким мечом и, если да, сколько ударов потребуется.

Входные данные

N – число голов, которые меч срубает одним ударом. Далее идет число M – число голов дракона. За ним идет K – число голов, которые дракон регенерирует за раз (1 ≤ N, M, K ≤ 105). Все числа разделены пробелом.

Выходные данные

В выходной файл OUTPUT.TXT выведите число ударов, которые необходимо нанести принцу, чтобы убить дракона, если это возможно. Если таким мечом убить дракона нельзя, то следует вывести «NO».

Примеры

Ввод Вывод
1 3  6  2 4
2 4  4  5 1
3 5  10  6 NO

Решение

Если N >= M то головы дракона будут срублены за 1 удар, иначе если N ≤ K, то принцу не удастся срубить головы дракона за любое количество ударов, ну а в противном случае (если не выполняются вышеописанные 2 условия) принц срубит все головы дракона ровно за

        (M – N – 1) div (N – K) + 2 удара.

#include <iostream>

int main() {

int n, m, k;

std::cin >> n >> m >> k;

if(n >= m) std::cout << 1;

else if(k - n >= 0) std::cout << "NO";

     else std::cout << (m - k - 1)/(n - k)+1;

}

5.2 Тернарная условная операция ?:

Условный оператор (? :) является тернарным оператором (т.е. имеет три операнда). Тернарную операцию можно определить так:

логическое выражение ? выражение 1 : выражение 2

Алгоритм работы операции следующий:

Если логическое выражение истинно, то возвращается значение выражения 1, в противном случае — значение выражения 2.

Ближайшим аналогом тернарного условного оператора языка C++ является логическая функция ЕСЛИ табличного процессора.

Рис. 9. Функция ЕСЛИ (IF) Microsoft Office Excel.

Пример

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

int x = 5, y = 10;

int z = (x > y ? x : y); // z = 10

Допускается использование вложенного тернарного оператора

Пример

Составить алгоритм находящий значение y:

Ниже показан код программы, решающей данную задачу с использованием тернарной операции “?:”

#include <iostream>

int main() {

float x, y;

std::cin >> x; // вводим значение x

y = (x<=0 ? -x*x*x : (0<x && x<12 ? x*x : 12 * x));

std::cout << "y = " << y << "\n";

return 0;

}

Тернарный условный оператор удобно использовать не только непосредственно в коде программы, но и в макросах. Опишем макрос SGN(X) возвращающий значение математической функции знака (signum).

#define SGN(X) (((X < 0) ? -1: ((X>0)? 1: 0)))

Обратите внимание, при использовании тернарного условного оператора в макросе нужно учитывать специфику выражения. Например, для макроса ABS, возвращающего абсолютную величину числа (модуль).

#define ABS(X) (((X) < 0)? -(X) : X)

В данном примере: если X<0 то -Х иначе Х

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

Например, при подстановке a+b c отрицательной величиной без скобок в –X будет преобразовано в  –a+b вместо –(a+b).

Задача №17. ГТС

Городская телефонная сеть (ГТС) устанавливает для своих абонентов следующие правила:

Имеется лимит времени L, в пределах которого одна минута стоит Aрублей. Каждая минута разговоров сверх лимита обходится пользователю в Bрублей. Сколько должен заплатить абонент, проговоривший Tминут?

Входные данные

В одной строке через пробел четыре целых неотрицательных числа L, A, B, T≤109.

Выходные данные

Одно число – сумма, которую должен оплатить абонент.

Пример

Ввод Вывод
100 2 5 35 70
100 2 5 135 375

Решение

Очевидно, расчет выполняется по одной из двух формул

#include <iostream>

int main(){

int L, a, b, T;

std::cin >> L >> a >> b >> T;

std::cout << (T <= L ? T*a : L*a + (T-L)*b);

}

Задача №18. Холодильник

Чтобы поднять на N-й этаж M-этажного дома новый холодильник, Витя вызвал бригаду грузчиков. Оплата работы грузчиков производится так: за подъем холодильника на один этаж требуется заплатить 200 рублей, за спуск на один этаж — 100 рублей. За подъем и спуск на лифте плата не взимается. Несмотря на то, что в Витином доме есть лифт, ему,возможно, все же придется заплатить грузчикам, поскольку лифт останавливается только на каждом K-м этаже, начиная с первого (то есть на этажах с номерами 1, K+1, 2K+1, 3K+1, …). Требуется вычислить, какой минимальной суммы денег достаточно, чтобы грузчики доставили холодильник с первого этажа на N-й.

Входные данные

В единственной строке через пробел записаны три числа N, M, K ≤ 109.

Выходные данные

Единственное число S– необходимая минимальная сумма для доставки холодильника.

Решение

Разобьем дом на отдельные секции по K этажей каждая. Для заданной квартиры в секции холодильник можно поднять за сумму S1 с этажа R1 или спустить за сумму S2 с этажа R2.

Рис. 10. Иллюстрация к задаче "Холодильник".

Выбрать S = min(S1; S2). Для верхней группы S = S1

#include <iostream>

using namespace std;

int main(){

int n, m, k;

cin >> n >> m >> k;

int r1 = (n-1)/k * k + 1;//ближний этаж снизу, куда приходит лифт

int r2 = r1 + k; //ближний этаж сверху, куда приходит лифт

int s1 = (n-r1) * 200;  //сумма за подъем

int s2 = (r2-n) * 100;  //сумма за спуск

cout << (r2>m ? s1 : min(s1,s2));

}



2019-11-13 775 Обсуждений (0)
Условные операторы и логические выражения 0.00 из 5.00 0 оценок









Обсуждение в статье: Условные операторы и логические выражения

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (775)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)