1 Операторы ветвления и логические операции. 3 Оператор if Когда в программе C++ необходимо принять решение о том, выполнять или нет определенное действие,

Презентация:



Advertisements
Похожие презентации
Тема: Управление потоком в PHP Изучить возможности языка PHP при решении задач, требующих использования условного оператора. Рассмотреть примеры управления.
Advertisements

Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Лекция 7. Структура языка С/С++. Операторы ветвления: условный оператор if. Полное ветвление. Неполное ветвление. Оператор множественного выбора switch.
Занятие 2. Конструкции принятия решений. Конструкции принятия решений позволяют приложениям проверять условия и выбирать направление действий. Другим.
Операторы языка с++. Операторы в языке C++ предназначены для описания действий. Любой оператор может быть помечен меткой. Операторы отделяются друг от.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
Министерство образования Республики Беларусь Белорусский государственный университет Управляющие структуры языков программирования.
©ρŧą Базовые конструкции языка.
b5_java_s4
Введение в C++ Урок 1-2.
Тест классы По программированию Pascal.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Операторы языка Си Лекция 5.
Microsoft® Small Basic Условия и циклы Предполагаемое время работы с этим уроком: 2 часа.
Операторы языка C#. Блок или составной оператор. Пустой оператор С помощью фигурных скобок несколько операторов языка, возможно перемежаемых объявлениями,
Алгоритмическая конструкция «ветвление» Презентацию разработал Мащенко П.С., учитель МБОУ СОШ 2 муниципального образования Щербиновский район станицы Старощербиновской.
Лекция 2. Фундаментальные типы данных и основные конструкции Красс Александр СПбГУ ИТМО, 2008.
Лекция 2 С => C++ => C# Большие и маленькие буквы различаются (main, Main, MAIN, mAin – разные имена) После каждого оператора ставится точка с запятой.
Транксрипт:

1 Операторы ветвления и логические операции

2

3 Оператор if Когда в программе C++ необходимо принять решение о том, выполнять или нет определенное действие, можно использовать оператор if. Этот оператор имеет две формы: if и if else. Оператор if указывает программе выполнить оператор или группу операторов, если проверочное условие истинно, и пропустить этот оператор или группу операторов, если условие ложно. if (проверяемое условие) оператор

4 Оператор if // if.cpp использование оператора if #include using namespace std; int main () { char ch; Int spaces = 0; Int total = 0; cin.get(ch); while (ch ! = '. ') // выход по достижении конца предложения { if (ch == ' ') // проверка, является ли ch пробелом spaces++; total++; // выполняется каждый раз cin.get(ch); } cout « spaces « " spaces, " « total; cout « " characters total in sentence\n "; return 0; } Результаты выполнения программы: The balloonist was an airhead with lofty goals. 6 spaces, 46 characters total in sentence

5 Оператор if else Этот оператор незаменим для создания взаимоисключающих последовательностей действий. Общая форма этого оператора выглядит следующим образом: if (проверяемое условие) оператор 1 else Оператор 2 Если проверяемое условие является истинным или ненулевым, программа выполняет оператор 1 и пропускает оператор 2. В противном случае, когда значение проверяемого условия является ложным или нулевым, программа пропускает оператор 1 и выполняет оператор 2.

6 Форматирование операторов if else Следует иметь в виду, что обе ветви оператора if else должны быть одиночными операторами, в случае же нескольких операторов следует использовать фигурные скобки, чтобы объединить их в блок. if (ch == 'Z') {// этот блок выполняется, если условие истинно zorro++; cout « "Another Zorro candidate\n"; } else {// этот блок выполняется, если условие ложно dull++; cout « "Not a Zorro candidate\n" ; }

7 Конструкция if else if else В компьютерных программах, как и в реальной жизни, возможен выбор более чем из двух возможных вариантов. Реализовать такую возможность можно путем расширения оператора if else. Как было показано ранее, за ключевым словом else должен следовать единый оператор, который может быть блоком. Поскольку if else сам является единым оператором, он может следовать за ключевым словом else: if (ch == 'А') a_grade++; // альтернатива # 1 else if (ch == 'В') // альтернатива # 2 b__grade + +; // под альтернатив а # 2 а else soso + +; // под альтернатива # 2b

8 Конструкция if else if else // ifelseif.cpp использование конструкции if else if else #include using namespace std; const int Fave = 27; int main() { int n; cout « "Enter a number in the range to find " ; cout « "my favorite number: " ; do { cin » n; if (n < Fave) cout « "Too low guess again: "; else if (n > Fave) cout « "Too high guess again: "; else cout « Fave « " is right!\ n"; } while (n != Fave) ; return 0; }

9 Конструкция if else if else Результаты выполнения программы: Enter a number in the range to find my favorite number: 50 Too high guess again: 25 Too low guess again: 37 Too high guess again: 31 Too high guess again: 28 Too high guess again: is right!

10 Логические выражения в языке C++ предусмотрены три логические операции, обеспечивающие объединение или изменение существующих выражений логическое ИЛИ ( | | ); логическое И ( && ); логическое НЕ ( ! ).

11 Операция логическое ИЛИ: || Эта операция объединяет два выражения в одно. Если любое или оба исходных выражения имеют значение true, или ненулевое, результирующее выражение имеет значение true. В противном случае выражение имеет значение false.

12 Операция логическое ИЛИ: || В соответствии с правилами C++ оператор | | является концом последовательности, т.е. любые изменения значения, указанные в левой части, происходят до вычисления правой части. Например, рассмотрим следующее выражение: i++ < 6 || i = = j Предположим, что первоначально i имеет значение 10. К моменту сравнения с j переменная i приобретает значение 11. Кроме того, C++ не станет утруждать себя вычислением выражения в правой части, если выражение в левой части истинно, поскольку для того, чтобы все логическое выражение было истинным, достаточно истинности одной части выражения

13 Операция логическое И: && Операция логическое И, записываемая как &&, также объединяет два выражения в одно. Результирующее выражение имеет значение true только в том случае, если оба исходных выражения имеют значения true. Поскольку операция && имеет более низкий приоритет, чем операторы сравнения, в этих выражениях скобки не используются. Подобно операции ||, операция && действует в качестве конца последовательности, и поэтому левая часть выражения вычисляется до вычисления правой части выражения. Если левая часть ложна, то ложно и все выражение; поэтому в таком случае C++ не утруждает себя вычислением правой части.

14 Операция логическое И: && В листинге 6.5 продемонстрировано использование операции && в обычной ситуации прерывания цикла while по двум различным причинам. В программе этого листинга цикл while считывает значения в массив. Одно проверочное условие (i < ArSize) прерывает цикл, когда массив полон. Второе проверочное условие (temp >= 0) предоставляет пользователю возможность досрочно выйти из цикла путем ввода отрицательного числа. Операция && позволяет объединить две проверки в единое условие. В программе используются также два оператора if, оператор if else и цикл for; поэтому она может служить иллюстрацией к нескольким темам этой и предыдущей главы.

15 Операция логическое И: && // and.cpp использование логического оператора И #include using namespace std; const int ArSize = 6; int main() { float naaq[ArSize] ; cout « "Enter the NAAQs (New Age Awareness Quotients) " « "of\n your neighbors. Program terminates " « "when you make\n" « ArSize « " entries " « "or enter a negative value. \n"; int i = 0; float temp; сin » temp ; while (I = 0) // два критерия выхода { naaq[i++] = temp; if (i < ArSize)// в массиве остается свободное место, cin » temp;// поэтому получаем следующее значение }

16 Операция логическое И: && if (i == 0) cout « "No data--bye\n" ; else { cout « "Enter your NAAQ: float you; cin » you; int count = 0; for (int j = 0; j < i; j++) if (naaq[j] > you) count++; cout « count; cout « " of your neighbors have greater awareness of\n" « "the New Age than you do.\n"; } return 0 ; }

17 Операция логическое И: && Enter the NAAQs (New Age Awareness Quotients) of your neighbors. Program terminates when you make 6 entries or enter a negative value б Enter your NAAQ: of your neighbors have greater awareness of the New Age than you do. Enter the NAAQs (New Age Awareness Quotients) of your neighbors. Program terminates when you make 6 entries or enter a negative value Enter your NAAQ: of your neighbors have greater awareness of the New Age than you do.

18 Операция логическое НЕ:! Операция ! реализует отрицание, или инвертирование следующего за ним выражения сравнения. Таким образом, если выражение имеет значение true или ненулевое, то !выражение имеет значение false. Как правило, отношение можно выразить в более понятном виде, не прибегая к этому оператору: if (! (х > 5)) // выражение if (x <= 5) понятней Однако операция ! может быть удобной при работе с функциями, которые возвращают значение true или false, либо значения, которые могут интерпретироваться таким образом. Например, strcmp(sl,s2) возвращает ненулевое значение (true), если две строки, s1 и s2, отличаются одна от другой, и нулевое значение, если они одинаковы. Следовательно, !strcmp(sl,s2) возвращает значение true, если две строки одинаковы.

19 Немного о логических операциях Как уже говорилось, операции логического И и логического ИЛИ в C++ имеют более низкий приоритет, чем операции сравнения. Это означает, что выражение типа х > 5 && х < 10 читается следующим образом: (х > 5) && (х < 10) С другой стороны, операция ! имеет более высокий приоритет, чем любые операции сравнения или арифметические операции. Следовательно, чтобы выполнить отрицание выражения, его нужно заключить в скобки: ! (х > 5) // выражение ложно, если х больше 5 !х > 5 // выражение истинно, если !х больше 5

20 Немного о логических операциях Операция логическое И имеет более высокий приоритет, чем операция логическое ИЛИ. Следовательно, выражение age > 30 && age 300 означает следующее: (age > 30 && age 300

21 Библиотека символьных функций cctype Язык C++ унаследовал от С весьма удобный пакет функций, связанных с обработкой символов, прототипы которых описаны в файле заголовков cctype (для более ранних версий языка - ctype.h). Эти функции упрощают выполнение таких задач, как определение вида символа (строчная или прописная буква, цифра или знак препинания) и т.п. Например, функция isalpha(ch) возвращает ненулевое значение, если ch буква, и нуль во всех остальных случаях. Аналогично функция ispunct(ch) возвращает значение true, если ch знак пунктуации, такой как запятая или точка.

22 Библиотека символьных функций cctype Эти функции использовать удобнее, чем операции И и ИЛИ. Например, ниже показано использование операций И и ИЛИ для проверки того, является ли символ ch алфавитным: if ((ch >= 'a' 44 ch = 'A' 44 ch <- 'Z')) Сравните это с вызовом функции isalpha(): if (isalpha(ch)) Функция isalpha() не только проще в использовании, но и является более общей. В частности форма записи аналогичного по назначению кода с использованием операций И и ИЛИ предполагает, что коды символов от А до Z образуют непрерывную последовательность, а коды никаких других символов не попадают в этот диапазон. Это допущение справедливо для ASCII-кода, но не в общем случае. Таблица 6.4. Символьные функции библиотеки cctype см. стр 255

23 Оператор ?: В языке C++ имеется оператор, который часто может использоваться вместо оператора if else. Этот оператор называется условным и записывается как ?:. Это единственный оператор C++, требующий использования трех операндов. Его общая форма выглядит следующим образом: выражение 1 ? выражение 2 : выражение 3 Если выражение 1 истинно, то значением всего условного выражения будет выражение 2. В противном случае значением всего выражения будет выражениеЗ. Ниже приводится несколько примеров, в которых демонстрируется работа этого оператора: 5 > 3 ? 10 : 12 // 5 > 3 истинно, поэтому значение выражения 10 3 == 9 ? 25 : 18 // 3 = = 9 ложно, поэтому значение выражения 18

24 Оператор switch Предположим, что нужно создать экранное меню, которое предлагает пользователю выбрать один из пяти пунктов, например. Cheap, Moderate, Expensive, Extravagant и Excessive. Можно, конечно, расширить последовательность if else if else для обработки пяти взаимоисключающих вариантов, но для этой цели больше подходит оператор языка C++ switch, который обеспечивает выбор из расширенного списка. Общая форма оператора switch выглядит следующим образом: switch {целочисленное выражение) { case метка 1 : оператор (ы) case метка 2 : оператор (ы) default : оператор (ы) }

25 Оператор switch Оператор switch в языке C++ действует как переключатель, который указывает компьютеру, какую строку программу нужно выполнять следующей. Встретив ключевое слово switch, программа переходит к строке, помеченной значением, соответствующим значению целочисленного выражения. Например, если целочисленное выражение имеет значение 4, программа переходит к строке с меткой case 4:. Чаще всего метками являются просто константы типа int или char, такие как 1 или q, либо перечислители. Если целочисленное выражение не соответствует ни одной из меток, программа переходит к строке, помеченной меткой default. Эта метка необязательна: если она опущена и совпадение с метками отсутствует, программа переходит к оператору, следующему за switch.

26 Оператор switch Оператор switch существенно отличается от аналогичных операторов таких языков, как Pascal. В языке C++ каждая метка case действует только как метка строки, а не как разграничитель между вариантами. Иначе говоря, после того, как программа переходит к определенной строке в операторе switch, она по порядку выполняет все операторы, следующие за этой строкой, если только явно не указано иное. Выполнение операции НЕ останавливается автоматически на следующем варианте. Чтобы прервать выполнение в конце некоторой группы операторов, необходимо использовать оператор break: тогда выполнение продолжится с оператора, следующего за switch.

27 Оператор switch // switch.cpp использование оператора switch #include using namespace std; void showmenu(); // прототипы фунхций void report () ; void comfort(); int main() { showmenu(); int choice; cin » choice; while (choice != 5) { switch(choice) { case 1 : cout « "\a\n"; break; case 2 : report () ; break; case 3 : cout « "The boss was in all day.\n"; break; case 4 : comfort(); break; default : cout « "That's not a choice.\n"; }

28 Оператор switch showmenu(); cin » choice; } cout « "Bye!\ n"; return 0; } void showmenu () { cout « "Please enter 1, 2, 3, 4, or 5:\n" "1) alarm 2) report\n" "3) alibi 4) corafort\n" "5) quit\n"; } void report() { cout « "It's been an excellent week for business.\n" "Sales are up 120%. Expenses are down 35%.\n"; }

29 Оператор switch void comfort ( ) { cout « "Your employees think you are the finest CEO\n" "in the industry. The board of directors think\n" "you are the finest CEO in the industry. \n" ; } Ниже приводится пример выполнения программы: Please enter 1, 2, 3, 4, or 5: 1) alarm2) report 3) alibi4) comfort 5) quit 4 Your employees think you are the finest CEO in the industry. The board of directors think you are the finest CEO in the industry. Please enter 1, 2, 3, 4, or 5: 1) alarm 2) report 3) alibi 4) comfort 5) quit

30 Оператор switch 2 It's been an excellent week for business. Sales are up 120%. Expenses are down 35%. Please enter 1, 2, 3, 4, or 5: 1) alarm 2) report 3) alibi 4) comfort 5) quit б That's not a choice. Please enter 1, 2, 3, 4, or 5: 1) alarm2) report 3) alibi4) comfort 5) quit 5 Bye!

31 Оператор switch Выполнение цикла while прерывается, когда пользователь вводит 5. Ввод чисел от 1 до 4 приводит к выбору соответствующего варианта из списка switch, а ввод 6 к переходу к операторам, определенным по умолчанию (с меткой default). Если требуется ограничить выполнение определенной частью операторов переключателя, в программе необходимо использовать оператор break. Чтобы убедиться в этом, можно удалить операторы break из листинга 6.10 и посмотреть, как программа будет выполняться после этого. В частности, выяснится, что ввод значения 2, приводит к выполнению программой всех операторов, связанных с метками 2, 3, 4 и default.

32 Операторы switch и if else И оператор switch, и оператор if else позволяют программе осуществить выбор из списка взаимоисключающих вариантов. Оператор if else более универсален. Например, он может обрабатывать диапазоны, как показано в следующем примере: if (age > 17 && age < 35) index = 0; else if (age >- 35 && age < 50) index = 1 ; else if (age >= 50 && age < 65) index = 2 ; else index = 3; Оператор switch не предназначен для обработки диапазонов. Каждая метка варианта оператора switch должна быть единичным значением. Кроме того, это значение должно быть целочисленным (включая тип char), поэтому оператор switch не будет выполнять проверку значений с плавающей точкой. Помимо этого, значение метки варианта должно быть константой. Если реализация вариантов требует использования диапазонов, осуществления проверки значений с плавающей точкой или сравнения двух переменных, следует использовать оператор if else.

33 Операторы break и continue Операторы break и continue позволяют программе пропускать фрагменты кода. Оператор break можно использовать в операторе switch и в любых циклах. Он вызывает переход к оператору, следующему за оператором switch или циклом. Оператор continue используется в циклах. Результат его действия следующий: программа пропускает остальную часть тела цикла и начинает новую итерацию цикла. Применение обоих операторов показано в листинге Пользователь вводит строку текста. Цикл отображает на экране каждый символ; если встречается точка, то используется оператор break для завершения цикла. Этот пример демонстрирует, как можно использовать оператор break для завершения цикла изнутри, если некоторое условие становится истинным. Затем программа подсчитывает количество пробелов, но не остальных символов. Оператор continue используется для пропуска связанной с подсчетом части цикла, когда символ не является пробелом.

34 Операторы break и continue // jump.cpp использование операторов continue и break #include using namespace std; const int ArSize = 80; int main() { char line[ArSize] ; int spaces = 0; cout « "Enter a line of text:\n"; cin.get(line, ArSize); for (int i = 0; line[i] != '\0'; i++) { cout « line[i]; // отображение символа if (line[i] == '.') // выход, если это точка break; if (line[i] != ' ') // пропуск остальной части цикла continue; spaces++; } cout « "\п « spaces « " spaces\n"; cout « "Done.\n"; return 0; }

35 Операторы break и continue Хотя оператор continue заставляет программу пропустить остальную часть тела цикла, он не препятствует выполнению выражения обновления цикла. В цикле for оператор continue вынуждает программу перейти непосредственно к выражению обновления, а затем к условию продолжения цикла. Однако в цикле while оператор continue заставляет программу перейти непосредственно к условию продолжения. Таким образом, любое выражение обновления в теле цикла while, следующее за continue, будет пропущено.

36 Операторы break и continue В приведенной программе использование оператора continue было необязательным. Вместо него можно было использовать следующий код: if (line[i] == ' ') spaces++; Однако оператор continue может делать программу более читабельной, если за ним следует несколько операторов. Таким образом, все эти операторы не придется делать частью оператора if.

37 Операторы break и continue В языке C++, как и в С, существует оператор goto. Оператор вида goto paris означает переход к точке программы, помеченной меткой paris:. Ниже приводится пример кода, в котором используется этот оператор: char ch ; cin » ch; if (ch == 'P') goto paris; cout <... … paris: cout « "You've just arrived at Paris. \n" ; Однако в большинстве случаев оператор goto применять не рекомендуется. Для управления ходом выполнения программы лучше использовать такие структурированные операторы управления, как if else, switch, continue и т.п.

38 Циклы считывания чисел Предположим, что требуется написать программу для считывания ряда чисел в массив. В данном случае пользователю необходимо предоставить возможность прервать ввод прежде, чем массив будет заполнен. В качестве одного из возможных способов решения этой задачи рассмотрим использование свойств метода cin: int n; cin » n; Что происходит, если, пользователь вместо числа вводит слово? В этом случае происходит четыре события: Значение п остается неизменным. Несоответствующие входные данные остаются в очереди ввода. В объекте cin устанавливается флаг ошибки. При вызове метода cin в случае преобразования в тип bool возвращается значение false.

39 Циклы считывания чисел Так как метод возвращает значение false, то для прерывания цикла считывания чисел можно использовать нечисловое значение. А поскольку нечисловой ввод влечет за собой установку флага ошибки, то прежде чем программа сможет продолжить считывание ввода, необходимо переустановить флаг. Для переустановки флага неверного ввода используется метод clear ().

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

41 Циклы считывания чисел // cinfish.cpp нечисловой ввод прерывает выполнение цикла #include using namespace std; const int Max = 5; int main() { // получение данных double fish[Max]; cout « "Please enter the weights of your fish.\n"; cout « "You may enter up to " « Max « " fish. \n" ; cout « "fish #1: "; int i = 0;

42 Циклы считывания чисел while (i < Max && cin » fish[i]) { if (++i < Max) cout « "fish #" « i+1 « ": "; } // вычисление среднего значения double total = 0.0; for (int j = 0; j < i; j++) total += fish[j]; // вывод результатов if (i == 0) cout « "No fish\n"; else cout « total / i « " = average weight of " « i « " fish\n"; cout « "Done.\n"; return 0; }

43 Циклы считывания чисел Выражение cin » fish[i] в действительности представляет собой вызов функции метода cin, а функция возвращает объект cin. Если значение cin является частью проверочного условия, оно преобразуется в тип bool. Преобразованное значение равно true, если ввод успешен, и false в противном случае. Значение выражения, равное false, завершает цикл. Результат выполнения программы выглядит следующим образом: Please enter the weights of your fish. You may enter up to 5 fish <q to terminated fish #1: 30 fish #2: 35 fish #3: 25. fish #4: 40 fish #5: g 32.5 = average weight of 4 fish

44 Циклы считывания чисел Обратите внимание на следующую строку: while (i < Max && cin » fish[i]) { Вспомним, что C++ не вычисляет правую часть логического выражения И, если левая часть ложна. В данном случае вычисление правой части это использование объекта cin для помещения результатов ввода в массив. Если i равно Мах, цикл прерывается без попытки помещения считываемого значения в ячейку памяти, следующую после области массива.

45 Резюме И сами программы, и процесс программирования становятся более интересными, если использовать операторы, которые предоставляют программе выбор из нескольких вариантов действий. В качестве средств управления выбором вариантов в C++ применяются операторы if, if else и switch. Оператор if языка C++ позволяет программе выполнять оператор или блок операторов условно, т.е. программа выполняет оператор или блок в случае удовлетворения определенного условия. Оператор if else позволяет программе выбирать для выполнения один из двух операторов или блоков операторов. Чтобы реализовать последовательность нескольких операций выбора, к оператору можно добавлять дополнительные операторы else if. Оператор switch C++ обеспечивает переход программы к определенному варианту из имеющихся в списке.

46 Резюме Язык C++ располагает также операторами, играющими вспомогательную роль в принятии решений. В главе 5 мы рассмотрели выражения сравнения, которые позволяют сравнить два значения. В операторах if и if else выражения сравнения обычно применяются для проверки некоторых условий. Используя логические операции C++ (&&, | | и !), можно объединять или изменять выражения сравнения, реализуя более сложные проверки. Условный оператор (?:) обеспечивает компактный способ выбора одного из двух условий. Библиотека символьных функций cctype обеспечивает удобный и эффективный набор инструментальных средств анализа результатов ввода символов. С помощью циклов и операторов принятия решений C++ программист может создавать интересные и эффективные программы с развитой логикой.