- Форум
- По малко от всичко
- Информационни технологии
- Уроци по С++
4.4.2. Оператор if/else
Операторът се използва за избор на една от две възможни алтернативи в зависимост от стойността на дадено условие.
Чрез него се реализира разклоняващ се изчислителен процес от вид, илюстриран на Фиг. 5.
не
да
Фиг. 5.
Ако указаното условие е в сила, се изпълняват се едни действия, а ако не – други действия. И в двата случая след това се изпълняват общи действия.
Условието се задава чрез някакъв булев израз, а действия 1 и действия 2 – чрез оператори. Фиг. 6 описва подробно синтаксиса и семантиката на този оператор.
Синтаксис
if (<условие>) <оператор1> else <оператор2>
където
- if (ако) и else (иначе) са запазени думи
- <оператор1> и <оператор2> са произволни оператори;
- <условие> е булев израз.
Семантика
Пресмята се стойността на булевия израз, представящ условието. Ако резултатът е true, изпълнява се <оператор1>. В противен случай се изпълнява <оператор2>, т.е.
false
true
if (<условие>) <оператор1> else <оператор2>
…
Фиг. 6.
Забележки:
1. Булевият израз, определящ <условие>, трябва да бъде напълно определен. Задължително се огражда в кръгли скобки.
2. Операторът след условието е точно един. Ако е необходимо няколко оператора да се изпълнят, трябва да се обединят в блок.
3. Операторът след else е точно един. Ако е необходимо няколко оператора да се изпълнят, трябва да се обединят в блок.
Задача 20. Променливата y зависи от променливата x. Зависимостта е следната:
Да се напише програма, която по дадено x намира съответната стойност на y.
Програма Zad20.cpp решава задачата.
Program Zad20.cpp
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
int main()
{ cout << "x= ";
double x;
cin >> x;
if (!cin)
{cout << "Error, bad input!!! \n";
return 1;
}
double y;
if (x >= 1) y = log10(x) + 1.82;
else y = x*x - 7*x + 8.82;
cout << setprecision(3) << setiosflags(ios :: fixed);
cout << setw(10) << x << setw(10) << y << "\n";
return 0;
}
След въвеждането на стойността на променливата x, програмата извършва проверка за валидност на въведената стойност. Изпълнението на оператора if/else води до пресмятане на стойността на булевия израз x >= 1. Ако тя е true, се изпълнява операторът за присвояване y = log10(x) + 1.82;. В противен случай се изпълнява операторът за присвояване y = x*x - 7*x + 8.82;, след което се извежда резултатът.
Вложени условни оператори
В условните оператори:
if (<условие>) <оператор>
if (<условие>) <оператор1> else <оператор2>
<оператор>, <оператор1> и <оператор2> са произволни оператори, в т. число могат да бъдат условни оператори. В този случай имаме вложени условни оператори.
При влагането е възможно да възникнат двусмислици. Ако в един условен оператор има повече запазени думи if отколкото else, възниква въпросът, за кой от операторите if се отнася съответното else. Например, нека разгледаме оператора
if (x >= 0) if ( x >= 5) x = 1/x; else x = -x;
Възможни са следните две различни тълкувания на този оператор:
а) if оператор, тялото на който е if/else оператор, т.е.
if (x >= 0)
if (x >= 5) x = 1/x; else x = -x;
При това тълкувание, ако преди изпълнението на if оператора x има стойност –5, след изпълнението му, стойността на x остава непроменена.
б) if/else оператор, с if оператор след <условие>, т.е.
if (x >= 0) if ( x >= 5) x = 1/x;
else x = -x;
При това тълкувание, ако преди изпълнението на if/else оператора x има стойност –5, след изпълнението му, стойността на x става 5.
Записът чрез съответни подравнявания, не влияе на компилатора. В езика C++ има правило, което определя начина по който се изпълняват вложени условни оператори.
Правило: Всяко else се съчетава в един условен оператор с най-близкото преди него несъчетано if. Текстът се гледа отляво надясно.
Според това правило, компилаторът на C++ ще приеме първото тълкувание за горните вложени условни оператори.
Препоръка: Условен оператор да се влага в друг условен оператор само след else. Ако се налага да се вложи след условието, вложеният условен оператор да се направи блок.
Задачи върху операторите if и if/else
Задача 21. Ако променливата a има стойност 8, определете каква стойност ще има променливата b след изпълнението на оператора
if (a > 4) b = 5; else
if (a < 4) b = -5; else
if (a ==b = 8; else b = 3;
Тъй като е в сила условието a > 4, променливата b ще получи стойността 5.
Задача 22. Стойността на y зависи от x. Зависимостта е следната:
Да се напише програма, която по дадено x, намира стойността на y.
Програма Zad22.cpp решава задачата.
Program Zad22.cpp
#include <iostream.h>
#include <iomanip.h>
int main()
{ cout << "x= ";
double x;
cin >> x;
if (!cin)
{ cout << "Error, Bad input\n";
return 1;
}
double y;
if (x <= 2) y = x; else
if (x <= 3) y = 2; else y = x-1;
cout << setprecision(3) << setiosflags(ios :: fixed);
cout << setw(10) << x << setw(10) << y << "\n";
return 0;
}
Забележка: В програма Zad22.cpp след първото else е в сила условието x > 2. Затова не е нужно то да се проверява.
Задача 23. Да се напише програма, която въвежда три реални числа a, b и c и извежда 0, ако не съществува триъгълник със страни a, b и c. Ако такъв триъгълник съществува, да извежда 3, 2 или 1 в зависимост от това какъв е триъгълникът - равностранен, равнобедрен или разностранен съответно.
Програма Zad23.cpp решава задачата.
Program Zad23.cpp
#include <iostream.h>
int main()
{ cout << "a= ";
double a;
cin >> a;
if (!cin)
{cout << "Error, bad input \n";
return 1;
}
cout << "b= ";
double b;
cin >> b;
if (!cin)
{cout << "Error, bad input \n";
return 1;
}
cout << "c= ";
double c;
cin >> c;
if (!cin)
{cout << "Error, bad input \n";
return 1;
}
bool x = a <= 0 || b <= 0 || c <= 0 ||
a+b <= c || a+c <= b || b+c <= a;
if (x) cout << 0 << "\n"; else
if (a == b && b == c) cout << 3 << "\n"; else
if (a == b || a == c || b == c) cout << 2 << "\n"; else
cout << 1 << "\n";
return 0;
}
Булевата променлива x е помощна. Тя има стойност true, ако a, b и c не са страни на триъгълник. Получена е след прилагане отрицание на условието a, b и c да са страни на триъгълник, т.е. на условието
a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a
като са използвани законите на де Морган.
Закони на де Морган:
!!A е еквивалентно на A
!(А || B) е еквивалентно на !A && !B
!(A && B) е еквивалентно на !A || !B
Задача 24. Да се напише програма, която на цялата променлива k присвоява номера на квадранта, в който се намира точка с координати (x, y). Точката не лежи на координатните оси, т.е. x.y ≠ 0.
Програмата Zad24.cpp решава задачата.
Program Zad24.cpp
#include <iostream.h>
int main()
{ cout << "x=";
double x;
cin >> x;
if (!cin)
{cout << "Error, Bad input! \n";
return 1;
}
cout << "y=";
double y;
cin >> y;
if (!cin)
{cout << "Error, Bad input! \n";
return 1;
}
if (x*y == 0)
{cout << "The input is incorrect! \n";
return 1;
}
int k;
if (x*y>0) {if (x>0) k = 1; else k= 3;}
else
if (x>0) k = 4; else k = 2;
cout << "The point is in: " << k << "\n";
return 0;
}
Аз съм МОМЧЕ R.I.P. липсваш ми боже колко ми липсваш защо трябваше да става така мамкаму