Здавалка
Главная | Обратная связь

Лесенка if - else if



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

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

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

# 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

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

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

# 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:600You have 10% discount!!!You must pay - 540You have not discount!!!You must pay - 600Press 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. Во-вторых, пришли к тому, что и данная реализация программы нас не устраивает. Рассмотрим еще один пример решения:

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

# 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.

Предыдущая Оглавление Следующая  
Предыдущая Оглавление Следующая
           






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.