Главная » Статьи » Програмування » C [ Добавить статью ]

RUS Уроки по программированию на языке С (Лесенка if - else if)

Лесенка 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:
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.


Категория: C | Добавил: DEN-SHP (05.11.2012)
Просмотров: 785 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]