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

RUS Уроки по программированию на языке С (Конструкция логического выбора if)


Конструкция логического выбора if

Сейчас мы с вами познакомимся с оператором, который позволяет превратить обычную линейную программу в программу «мыслящую». Данный оператор позволяет проверить какое-то утверждение (выражение) на истинность и в зависимости от полученного результата произвести то или иное действие. Для начала рассмотрим общий синтаксис данного оператора:

if (утверждение или выражение)
{
 действие 1;
}
else 
{
 действие 2;
}

Основные принципы работы оператора if.

1. В качестве утверждения или выражения может выступать какая-либо конструкция, содержащая логические операторы или же арифметическое выражение.

• if(X>Y) – обычное утверждение, будет истинным, если X действительно больше Y

int X=10,Y=5;
if(X>Y){ // истина
 cout<<"Test!!!";// на экране Test
}

• if(A>B&&A<C) – комбинированное утверждение, состоящее из двух частей, будет истинно, если обе части будут верными

int A=10,B=5,C=12;
if(A>B&&A<C){ // истина
 cout<<"A between B and C";// на экране Test
}

• if(A-B) – арифметическое выражение, будет истинным, если А не равно B, т. к. в противном случае (если они равны) их разность даст нуль, а нуль это ложь

int A=10,B=15;
if(A-B){ // -5 это истина
 cout<<"A != В";// на экране A != В
}

• if(++A) - арифметическое выражение, будет истинным, если А не равно -1, т. к. если А равно -1 увеличение на 1 даст нуль, а нуль это ложь

int A=0;
if(A++){ // 1 это истина
 cout<<"Best test!!";// на экране Best test!!
}

• if(A++) - арифметическое выражение, будет истинным, если А не равно 0, т. к. в данном случае используется постфиксная форма инкремента, сначала произойдет проверка условия и будет обнаружен нуль, а потом увеличение на единицу.

int A=0;
if(A++){ // 0 это ложь
 cout<<"Best test!!";// эту фразу мы не увидим, т. к. if не выполнится
}

• if(A==Z) - обычное утверждение, будет истинным, если A равно Z

• if(A=Z) – операция присваивания, выражение будет истинным, если Z не равно нулю

Примечание: Типичная ошибка. Очень часто вместо операции проверки на равенство ==, по невнимательности указывается операция присваивания =, и смысл выражения может радикально измениться. Такая банальная опечатка может привести к некорректной работе всей программы. Рассмотрим два казалось бы идентичных примера.
Правильный пример.
# include <iostream>
using namespace std;
void main(){
 
 int A,B; //объявляем две переменные

 //просим пользователя ввести в них данные
 cout<<"Enter first digit:\n";
 cin>>A;
 cout<<"Enter second digit:\n";
 cin>>B;

 if(B==0){ // если B содержит ноль
 cout<<"You can’t divide by zero!!!";// сообщаем об ошибке
 }
 else{ // в противном случае
 cout<<"Result A/B="<<A<<"/"<<B<<"="<<A/B;// выдаем результат деления А на B
 }
 cout<<"\n The end. \n"; // конец
}
Пример с ошибкой.
# include <iostream>
using namespace std;
void main(){
 
 int A,B; //объявляем две переменные

 //просим пользователя ввести в них данные
 cout<<"Enter first digit:\n";
 cin>>A;
 cout<<"Enter second digit:\n";
 cin>>B;

 // Приравниваем B к нулю и проверяем условие, оно автоматически ложно
 if(B=0){ // эта часть не выполнится никогда, т. к. условие всегда ложно
 cout<<"You can’t divide by zero!!!";// сообщаем об ошибке
 }
 else{// всегда выполняется эта часть, в которой A делится на новоиспеченный нуль 

// В этой строке произойдет ошибка на этапе выполнения, т. к. компьютер попытается разделить число на нуль
 cout<<"Result A/B="<<A<<"/"<<B<<"="<<A/B;
 }
 cout<<"\n The end. \n"; // Эту фразу мы не увидим никогда.
}

2. Как вы уже успели заметить, если содержимое круглых скобок будет являться истиной, то выполнится действие 1, заключенное в фигурные скобки конструкции if, при этом действие 2 блока else будет проигнорировано.

3. Если же содержимое круглых скобок ложно, выполнится действие 2, заключенное в фигурные скобки конструкции else, при этом действие 1 будет проигнорировано.

4. Конструкция else является необязательной. Это означает, что если нет необходимости делать что-либо при ложности утверждения, данную конструкцию можно не указывать. Например, программу, использующую защиту против деления на нуль, можно записать таким образом:

# include <iostream>
using namespace std;
void main(){
 int A,B; //объявляем две переменные

 //просим пользователя ввести в них данные
 cout<<"Enter first digit:\n";
 cin>>A;
 cout<<"Enter second digit:\n";
 cin>>B;

 if(B!=0){ // если В не равно нулю
 cout<<"Result A/B="<<A<<"/"<<B<<"="<<A/B; // производим вычисления
 }
 // в противном случае не делаем ничего
 cout<<"\nThe end.\n";
}

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

# include <iostream>
using namespace std;
void main(){
 int A,B; //объявляем две переменные

 //просим пользователя ввести в них данные
 cout<<"Enter first digit:\n";
 cin>>A;
 cout<<"Enter second digit:\n";
 cin>>B;

 if(B!=0) // если В не равно нулю
 cout<<"Result A/B="<<A<<"/"<<B<<"="<<A/B; // производим вычисления

 // в противном случае не делаем ничего
 cout<<"\nThe end.\n";
}

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

Примечание: Будьте внимательны: оператор if и оператор else неразрывны!!! Попытка вписать между ними строку кода, приведет к ошибке на этапе компилляции.
Фрагмент кода с ошибкой.
 ....
 if(B==0){ // если B содержит ноль
 cout<<"You can’t divide by zero!!!";// сообщаем об ошибке
 }
  cout<<"Hello";// Ошибка!!!! Разрыв конструкции if - else!!!
 else{ // в противном случае
 cout<<"Result = "<<A/B;// выдаем результат деления А на B
 }
 ....

Тернарный оператор.

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

Для начала рассмотрим его синтаксис:

УТВЕРЖДЕНИЕ ИЛИ ВЫРАЖЕНИЕ?ДЕЙСТВИЕ1:ДЕЙСТВИЕ2;

Принцип действия прост - если УТВЕРЖДЕНИЕ ИЛИ ВЫРАЖЕНИЕ - истина, выполняется ДЕЙСТВИЕ1, если - ложь, выполняется ДЕЙСТВИЕ2.

Давайте рассмотрим деиствие данного оператора на примере:

# include <iostream>
using namespace std;
void main(){
 int A,B; //объявляем две переменные

 //просим пользователя ввести в них данные
 cout<<"Enter first digit:\n";
 cin>>A;
 cout<<"Enter second digit:\n";
 cin>>B;

 /* В данном случае, если В не будет равно нулю, выполниться та команда, которая
 стоит после знака вопроса и на экране покажется результат деления. В
 противном случае выполниться команда стоящая после знака
 двоеточие и на экране будет сообщение об ошибке деления на нуль.*/
 (B!=0)?cout<<"Result A/B="<<A<<"/"<<B<<"="<<A/B:cout<<"You can’t divide by zero!!!";

 //конец программы
 cout<<"\n The end. \n";
}

Не правда ли, код стал еще оптимальнее!? Для закрепления полученной информации приведем еще один, более сложный, пример. Программа, будет определять, какое из двух чисел, введенных пользователем является большим, а какое меньшим.

# include <iostream>
using namespace std;
void main(){
 int A,B; //объявляем две переменные

 //просим пользователя ввести в них данные
 cout<<"Enter first digit:\n";
 cin>>A;
 cout<<"Enter second digit:\n";
 cin>>B;

 /*Если, (b>a), то на место оператора ?: подставится b,
 в противном случае на место оператора подставится a,
 таким образом, то число, которое больше запишется
 в переменную max.*/
 int max=(b>a)?b:a;

 /*Если, (b<a), то на место оператора ?: подставится b,
 в противном случае на место оператора подставится a,
 таким образом, то число, которое больше запишется
 в переменную min.*/
 int min=(b<a)?b:a;

 // Вывод результата на экран.
 cout<<"\n Maximum is \n"<<max;
 cout<<"\n Minimum is \n"<<min<<"\n";
}

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


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