Главная » Статьи » Програмування » C | [ Добавить статью ] |
|
# 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: 600 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. Во-вторых, пришли к тому, что и данная реализация программы нас не устраивает. Рассмотрим еще один пример решения:
Вариант решения № 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.
Всего комментариев: 0 | |