Файл: Использование управляющих конструкций в С++.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 03.04.2023

Просмотров: 856

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Листинг 2

В строках 22 — 29 определен try-блок. В нем располагается код, который потенциально может вызвать ошибку в работе программы, а именно ошибку в случае деления на 0. Задаем условие if — если num2 равно 0, то генерировать целое число 123, к примеру. В этом случае try-блок сразу прекращает выполнение дальнейших команд, а число 123 попадает в catch. В нашем примере выводится сообщение об ошибке. При этом программа продолжает работать и выполнять команды, размещенные ниже. Если же число num2 не будет равно нулю, то в try-блоке выполнится команда cout << num1 / num2 << endl;, а catch не сработает.

Запускаем программу и в первом шаге цикла вводим значение переменной num2 равное 0, а во втором — любое другое число (см. Рисунок 1)

Рисунок 1

Программа завершила работу.

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

Чтобы было лучше понятно, как именно значение, которое генерирует throw передается в catch, заменим участок кода строк 22 — 33 на следующий код:

try  

{    

  if (num2 == 0)  

  {  

    throw "Ошибка - на 0 делить нельзя!!!!";  

    //генерировать символьную строку  

  }  

  cout << num1 / num2 << endl;     

}  

catch(char *str)//сюда передастся строка  

{  

  cout << str << endl;  

}  

При попытке деления на 0 throw генерирует не число, а символьную строку. И блоку catch в скобках мы показываем, что он будет принимать указатель на строку и ниже — выводить эту строку на экран.

Исключение так же может генерироваться в определенной программистом функции. Например, у нас определена функция деления двух целых чисел и в ней мы сразу проверим деление на 0.

int division(int n1, int n2)  

{  

    if(n2==0)  

    {  

        throw 99;  

    }  

    return n1/n2;  

}  

Вызывается эта функция в try-блоке.

try  

{    

  cout<<division(5, 0);  

  cout<<endl;  

}  

catch(int i)  

{  

  cout<<"Ошибка №"<<i<<" Деление на ноль."<<endl;  

}  

Деление на ноль не состоится и catch поймает число 99.

Что важно знать об исключениях:

  • try-блок — так называемый блок повторных попыток. В нем надо располагать код, который может привести к ошибке и аварийному закрытию программы; [24]
  • throw генерирует исключение. То, что остановит работу try-блока и приведет к выполнению кода catch-блока. Тип исключения должен соответствовать типу принимаемого аргумента catch-блока; [25]
  • catch-блок — улавливающий блок, поймает то, что определил throw, и выполнит свой код. Этот блок должен располагаться непосредственно под try-блоком. Никакой код не должен их разделять. [26]
  • если в try-блоке исключение не генерировалось, catch-блок не сработает. Программа его обойдет.

Глава 2. Ветвления

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

К примеру, мы вводим с клавиатуры целое число. Если это число больше десяти, то программа должна выполнить одно действие, иначе — другое.

Для реализации данных конструкций используются следующие операторы:

  • if
  • else
  • else if
  • switch

Отдельно стоит упомянуть так называемый тернарный оператор. Используется он обычно в тех случаях, если условие и код, который надо выполнить, в результате проверки условия, очень простые. К примеру, спросить у пользователя хочет он продолжить работать в программе или же хочет выйти из неё. Он имеет следующий синтаксис:

условие ? команда 1 : команда 2

Оператор if

Операторы выбора позволяют принять программе решение, основываясь на истинности или ложности условия. [28] Если условие истинно (т. е. равно true), оператор в теле if выполняется, после чего выполняется следующий по порядку оператор. [29] Если условие ложно (т. е. равно false), оператор в теле if не выполняется (игнорируется или пропускается) и сразу же выполняется следующий по порядку оператор. Проверяемое условие может быть любым логическим выражением. [30] Логические выражения могут быть образованы операциями равенства и отношения (см. Таблица 1).

Оператор

Условие

Описание

==

a == b

a равно b

!=

a != b

a не равно b

>

a > b

a больше b

<

a < b

a меньше b

>=

a >= b

a больше или равно b

<=

a <= b

a меньше или равно b

Таблица 1. Логические выражения

Нельзя путать операцию = (операция присваивания) и операцию == (операция равенства) так как это приводит к логическим ошибкам, т. е. программа даже скомпилируется без ошибок, но работать будет не правильно.

Условный оператор или оператор выбора if записывается в двух формах, рассмотрим первую.

if(/*проверяемое условие*/)  


{  

   /*тело оператора выбора 1*/;  

}  

Фигурные скобки тела условного оператора можно опускать, если при истинности условия необходимо выполнить один оператор. Пример:

if(/*проверяемое условие*/)  

   /* оператор*/;  

Рассмотрим простейший пример использования оператора if (см. Листинг 3).

Условие задачи: даны два числа, необходимо их сравнить.

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.    
  5. int main()  
  6. {  
  7.   int a, b;  
  8.   cout<<"Введите первое число: ";  
  9.   cin>>a;  
  10.   cout<<" Введите второе число: ";  
  11.   cin>>b;  
  12.   if(a>b)  
  13.   {  
  14.     cout<<a<<">"<<b<<endl;  
  15.   }  
  16.   if(a<b)  
  17.   {  
  18.     cout<<a<<"<"<<b<<endl;  
  19.   }  
  20.   if(a==b)  
  21.     cout<<a<<"="<<b<<endl;  
  22.   system("pause");  
  23.   return 0;  
  24. }  

Листинг 3

В строке 7 объявляются две переменные. После того как мы ввели два числа, программа начинает их сравнивание. Так как неизвестно, какие числа введет пользователь, необходимо предусмотреть все возможные случаи.

  • 1-й случай: первое введенное число больше второго. (12-15 строки).
    Читается так: «Если ;а больше b, то делать соответствующий вывод на экран».
  • 2-й случай: первое введенное число меньше второго. (16-19 строки).
    Читается так: «Если, а меньше b, то делать соответствующий вывод на экран».
  • 3-й случай: первое введенное число равняется второму. (20-21 строки).
    Читается так: «Если, а равно b, то делать соответствующий вывод на экран».

Первые два оператора if написаны вместе с фигурными скобками, хотя можно было обойтись и без них, ведь при истинном условии у нас выполняется только оператор вывода. А в третьем операторе if скобки опущены, тем самым показано, что программа будет работать правильно и без них. Ниже показан пример работы программы, описанной выше (см. Рисунок 2).

Рисунок 2

Оператор if else

Оператор if else — это форма записи оператора выбора if. Оператор if else позволяет определить программисту действие, когда условие истинно и альтернативное действие, когда условие ложно. [31]

Синтаксис записи оператора выбора if else следующий:

if(/*проверяемое условие*/)  

{  

   /*тело оператора выбора 1*/;  

}  

else  

{  

  /*тело оператора выбора 2*/;  


}  

Читается так: «Если проверяемое условие истинно, то выполняется тело оператора выбора 1, иначе (то есть проверяемое условие ложно) выполняется тело оператора выбора 2.» [32]

Рассмотрим задачу с предыдущего раздела, с использованием if else (см. Листинг 4). Условие задачи следующее: «Даны два числа, необходимо их сравнить».

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. int main(int argc, char* argv[])  
  6. {  
  7. int a, b;  
  8. cout<<"Введите первое число: ";  
  9. cin>>a;  
  10. cout<<"Введите второе число: ";  
  11. cin>>b;  
  12. if(a>=b)  
  13. {  
  14. cout<<a<<">="<<b<<endl;  
  15. }  
  16. else  
  17. {  
  18. cout<<a<<"<="<<b<<endl;  
  19. }  
  20. system("pause");  
  21. return 0;  
  22. }  

Листинг 4

В данном коде нас интересуют строки 12-19. Эти строки читаются так: если a (первое число) больше либо равно b (второе число), то выполнить оператор вывода в строке 14, иначе выполнить оператор вывода в строке 18.

В данном операторе if мы используем операции соотношений >= и <=. Условие перехода не совсем правильно, так как условие будет ложно только в том случае, если первое число будет меньше второго, во всех остальных случаях условие истинно.

Вывод программы следующий (см. Рисунок 3):

Рисунок 3

Оператор switch

Итак мы рассмотрели оператор с одиночным выбором if и оператор с двойным выбором if else, но в С++ еще имеется оператор множественного выбора switch, который мы сейчас детально рассмотрим.

switch(переменная или выражение)  

{  

  case значение_1:  

    код;  

    break;  

  case значение_2:  

    код;  

    break;  

  ...  

  default:  

    код;  

}  

На начальном этапе анализируется выражение или переменная. После этого осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. [33] Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break (оператор break будет рассмотрен более подробно в 3 главе данной работы, посвященной циклам). Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default. После чего выполняется оператор или группа операторов данной ветви. [34]


Рассмотрим задачу с использованием оператора выбора switch (см. Листинг 5).

Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа, введенных с клавиатуры. Разработать пользовательский интерфейс.

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. int main(int argc, char* argv[])  
  6. {  
  7.   int count;  
  8.   double a,b;  
  9.   cout<<"Введите первое число: ";  
  10.   cin>>a;  
  11.   cout<<"Введите второе число: ";  
  12.   cin>>b;  
  13.   cout<<"Выбирите действие:\r\n”  
  14.        +”\t1-сложение\r\n”  
  15.        +”\t2-вычитание\r\n”  
  16.        +”\t3-умножение\r\n”  
  17.        +”\t4-деление\r\n"  
  18.        +”:”;  
  19.   cin>>count;  
  20.   switch(count)  
  21.   {  
  22.     case 1:  
  23.       cout<<a<<"+"<<b<<"="<<a+b<<endl;  
  24.       break;  
  25.     case 2:  
  26.       cout<<a<<"-"<<b<<"="<<a-b<<endl;  
  27.       break;  
  28.     case 3:     {  
  29.       cout<<a<<"*"<<b<<"="<<a*b<<endl;  
  30.       break;  
  31.     case 4:  
  32.       cout<<a<<"/"<<b<<"="<<a/b<<endl;  
  33.       break;  
  34.     default:  
  35.       cout<<"Ошибка ввода"<<endl;  
  36.   }  
  37.   system("pause");  
  38.   return 0;  
  39. }  

Листинг 5

В 7 строке мы объявили переменную count целочисленного типа. Именно значение данной переменной программа будет сравнивать со значением константного выражения. В строке 8 объявлены две переменные вещественного типа данных для хранения введённых чисел. С 20 по 36 строки записан условный оператор множественного выбора switch. На начальном этапе анализируется переменная count.

Анализ проводится следующим образом:

  • если переменная count равна единице, то выполняется оператор в 23 строке;
  • если переменная count равна двойке, то выполняется оператор в 26 строке;
  • если переменная count равна тройке, то выполняется оператор в 29 строке;
  • если переменная count равна четырем, то выполняется блок оператор в 32 строке;
  • если же значение переменной count не совпадает ни с одним константным выражением, то передается управление ветви программы, содержащей зарезервированное слово default. То есть будет выполнена следующая строка 35.

Оператор switch может содержать, а может и не содержать зарезервированное слово default. [35] Если значение переменной не совпадет ни с одним константным выражением и не будет default, то программное управление в этом случае просто перешло бы к первому оператору после switch. [36] В строках 22, 25, 28, 31 записаны константные выражения, с которыми программа сравнивает значение переменной count.
В строках 24, 27, 30, 33, записан оператор break, который необходим для следуюих целей. Допустим, пользователь ввел 2, то есть переменная count инициализировалась двойкой. Начинает работать условный оператор множественного выбора switch. То есть выполняется поиск двойки в константных выражениях. Сначала проверяется строка 22, мы видим, что в строке 22 константное выражение равно единице, а нам нужна двойка. Проверяем дальше. А дальше по порядку строка 25. Мы видим, что в строке 25 константное выражение равно двойке, то, что нужно. Переменная count равна константному выражению, выполняется оператор в 26 строке. И вот в 27-й строке записан оператор break, который заставляет программу перейти к первому оператору после оператора switch. В данном случае управление передается строке 37. А нужен этот переход только для того, чтобы не выполнялись заведомо ненужные действия. Если убрать оператор break, то программа будет дальше сравнивать значение переменной с константными выражениями, пока они все не закончатся и потом все равно передаст управление строке 37 (см. Рисунок 4).