double arrow

Оптимизация кода

Вариант решения № 3.

Вариант решения № 2.

Вариант решения № 1.

Лесенка if - else if

Из прошлого раздела урока вы узнали о существовании условных операторов. Теперь неплохо было бы получить информацию об особенностях их работы.

Предположим нам необходимо написать программу для учета денежной скидки, в зависимости от суммы. Например, если покупатель приобрел товара на сумму больше 100 грн., он получает скидку 5%. Больше 500грн. - 10%, и, наконец больше 1000 грн. - 25%. приложение должно выдать сумму, которую должен уплатить покупатель, если последний получил скидку. Теперь необходимо найти оптимальный вариант ррешения задачи.

# include <iostream> using namespace std; void main(){ // обявляется переменная,для хранения первоначальной суммы int summa;   // запрос на ввод суммы с клавиатуры cout<<"Enter item of summa:\n"; cin>>summa;   if(summa>100){ // если сумма больше 100 грн., скидка 5% cout<<"You have 5% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*5<<"\n"; } if(summa>500){ // если сумма больше 500 грн., скидка 10% cout<<"You have 10% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*10<<"\n"; } if(summa>1000){ // если сумма больше 1000 грн., скидка 25% cout<<"You have 25% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*25<<"\n"; } else{ // в противном случае, скидки нет cout<<"You have not discount!!!\n"; cout<<"You must pay - "<<summa<<"\n"; }   }

Данный пример, на первый взгляд у начинающего программиста не вызывает нареканий, однако, давайте рассмотрим ситуацию, в которой программа отработает весьма некорректно. Сумма, введенная с клавиатуры, равна 5000. Эта цифра привышает 1000, следовательно, мы должны получить 25% скидку. Однако, произойдет совсем другое.

1. Каждый оператор if является самостоятельным и независит от других if, следовательно, вне зависимости от того, какое из if выполнится, проверка условия все равно будет осуществляться для всех операторов.

2. Сначала, осуществится проверка условия if(summa>100). 5000, естественно больше 100, условие истинно и выполняется тело if. На экране мы получаем :

You have 5% discount!!! You must pay - 4750

3. Однако, на этом программа не остановится - далее будет проанализированно условие if(summa>500). 5000 больше 500, условие снова истинно и выполняется тело if. На экране мы получаем :

You have 10% discount!!! You must pay - 4500

4. Ну и, наконец программа проверит условие if(summa>1000), которое тоже окажется истинным, так как 5000 больше 1000. И, действие связанное с if, выполняется и теперь. На экран выводится:

You have 25% discount!!! You must pay - 3750

Таким образом, вместо одной информационной надписи, мы получаем три. Такое решение задачи является нерентабельным. Попробуем оптимизировать его:

# include <iostream> using namespace std; void main(){ // обявляется переменная,для хранения первоначальной суммы int summa;   // запрос на ввод суммы с клавиатуры cout<<"Enter item of summa:\n"; cin>>summa;   // если сумма в диапазоне от 100 грн. до 500 грн., скидка 5% if(summa>100&&summa<=500){ cout<<"You have 5% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*5<<"\n"; } // если сумма в диапазоне от 500 грн. до 1000 грн., скидка 5% if(summa>500&&summa<=1000){ cout<<"You have 10% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*10<<"\n"; } if(summa>1000){ // если сумма больше 1000 грн., скидка 25% cout<<"You have 25% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*25<<"\n"; } else{ // в противном случае, скидки нет cout<<"You have not discount!!!\n"; cout<<"You must pay - "<<summa<<"\n"; }   }

Для начала, снова представим, что пользователь ввел сумму размером 5000 грн.

1. Сначала, осуществится проверка условия if(summa>100&&summa<=500). 5000 не входит в заданный диапазон, условие ложно и тело if выполнятся не будет.

2. Далее будет проанализированно условие if(summa>500&&summa<=1000). 5000 не входит и в этот диапазон, условие снова ложно и тело if выполнятся не будет.

3. И, наконец программа проверит условие if(summa>1000), которое окажется истинным, так как 5000 больше 1000. И, действие связанное с if, выполнится. На экран выводится:

You have 25% discount!!! You must pay - 3750

Казалось бы на этом можно остановиться, но давайте-ка проверим еще один вариант. Например, пользователь вводит значение 600. И, на экране появляются следующие данные:

Enter item of summa: You have 10% discount!!! You must pay - 540 You have not discount!!! You must pay - 600 Press any key to continue

Такой поворот событий объясняется легко:

1. Сначала, осуществится проверка условия if(summa>100&&summa<=500). 5000 не входит в заданный диапазон, условие ложно и тело if выполнятся не будет.

2. Далее будет проанализированно условие if(summa>500&&summa<=1000). 5000 входит в этот диапазон, условие истинно и тело if выполнится, на экран выведется сообщение о 10% скидке.

3. И, наконец программа проверит условие if(summa>1000), которое окажется ложным. Действие связанное с if выполняться не будет, но у данного самостоятельного оператора if, есть собственный else, который отработает в нашем случае. На экран выводится сообщение об отсутствии скидки.

Вывод: во-первых, мы выяснили, что оператор else относится только к последнему if. Во-вторых, пришли к тому, что и данная реализация программы нас не устраивает. Рассмотрим еще один пример решения:

# include <iostream> using namespace std; void main(){ // обявляется переменная,для хранения первоначальной суммы int summa;   // запрос на ввод суммы с клавиатуры cout<<"Enter item of summa:\n"; cin>>summa;   if(summa>1000){ // если сумма больше 1000 грн., скидка 25% cout<<"You have 25% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*25<<"\n"; } else{ // если сумма не больше 1000 грн. продолжаем анализ if(summa>500){ // если сумма больше 500 грн., скидка 10% cout<<"You have 10% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*10<<"\n"; } else{ // если сумма не больше 500 грн. продолжаем анализ if(summa>100){ // если сумма больше 100 грн., скидка 5% cout<<"You have 5% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*5<<"\n"; } else{ // если сумма не больше 100 грн. скидки нет cout<<"You have not discount!!!\n"; cout<<"You must pay - "<<summa<<"\n"; } } }   }

Внимательно проанализировав данный пример, вы заметите, что каждый следующий if, может выполниться только, в том случае, если не выполнился его "предшественник", так как находится внутри конструкции else последнего. Таким образом, мы наконец-то нашли оптимальный код реализации. Структрура, которую мы только что создали называется "Лесенка if else if", так как условия в ней располагаются в виде лестницы. Теперь, мы с вами знаем, какая это полезная конструкция. Остался последний штрих:

В предыдущем разделе урока прозвучало правило: Если к блоку if или else относится только одна команда, то фигурные скобки можно не указывать. Дело в том, конструкция if else считается одной цельной командной структурой. Следовательно, если внутри некоторых else нет ничего кроме вложенной конструкции, фигурные скобки таких else можно опустить:

# include <iostream> using namespace std; void main(){ // обявляется переменная,для хранения первоначальной суммы int summa;   // запрос на ввод суммы с клавиатуры cout<<"Enter item of summa:\n"; cin>>summa;   if(summa>1000){ // если сумма больше 1000 грн., скидка 25% cout<<"You have 25% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*25<<"\n"; }   // если сумма не больше 1000 грн. продолжаем анализ else if(summa>500){ // если сумма больше 500 грн., скидка 10% cout<<"You have 10% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*10<<"\n"; }   // если сумма не больше 500 грн. продолжаем анализ else if(summa>100){ // если сумма больше 100 грн., скидка 5% cout<<"You have 5% discount!!!\n"; cout<<"You must pay - "<<summa-summa/100*5<<"\n"; } else{ // если сумма не больше 100 грн. скидки нет cout<<"You have not discount!!!\n"; cout<<"You must pay - "<<summa<<"\n"; }   }

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

Теперь можно переходить к следующим разделам урока, где мы с вами подробно рассмотрим еще несколько примеров использования if else.

Структура множественного выбора switch.

Мы уже знакомы с конструкцией, анализирующей условия - конструкцией if, а также с тернарным оператором. Еще один оператор выбора - оператор switch. Представьте, что необходимо написать программу, в которой используется меню, состоящее из пяти пунктов. Например, маленькое приложение для малышей, умеющее складывать, вычитать и т. п. Можно реализовать обработку выбора с помощью лесенки if else if, вот так:

# include <iostream> using namespace std; void main(){   // объявление переменных и ввод значения с клавиатуры float A,B,RES; cout<<"Enter first digit:\n"; cin>>A; cout<<"Enter second digit:\n"; cin>>B;   // реализация программного меню char key; cout<<"\nSelect operator:\n"; cout<<"\n + - if you want to see SUM.\n"; cout<<"\n - - if you want to see DIFFERENCE.\n"; cout<<"\n * - if you want to see PRODUCT.\n"; cout<<"\n / - if you want to see QUOTIENT.\n";   //ожидание выбора пользователя cin>>key;   if(key=='+') { // если пользователь выбрал сложение RES=A+B; cout<<"\nAnswer: "<<RES<<"\n"; } else if(key=='-'){ // если пользователь выбрал вычитание RES=A-B; cout<<"\nAnswer: "<<RES<<"\n"; } else if(key=='*'){ // если пользователь выбрал умножение RES=A*B; cout<<"\nAnswer: "<<RES<<"\n"; } else if(key=='/'){ // если пользователь выбрал деление if(B){ // если делитель не равен нулю RES=A/B; cout<<"\nAnswer: "<<RES<<"\n"; } else{ // если делитель равен нулю cout<<"\nError!!! Divide by null!!!!\n"; } } else{ // если введенный символ некорректен cout<<"\nError!!! This operator isn't correct\n"; } }

Вышеописанный пример вполне корректен, но несколько громоздко выглядит. Данный код можно значительно упростить. именно для этого используется switch. Он позволяет сравнить значение переменной с целом рядом значений и, встретив совпадение, выполнить определенное действие.


Сейчас читают про: