Условен оператор

1. Условен оператор

Нека решим следната:

Задача 1: Да се напише програма, която въвежда от клавиатурата реално число r. Програмата да изчислява и отпечатва периметъра на окръжност с радиус r.

#include <iostream>

int main()
{
	const double PI=3.14;
	double r,p;
	cout<<"r=";
	cin>>r;
	p=2*PI*r;
	cout<<"P="<<p<<endl;
	return 0;

}

Всеки алгоритъм трябва да е напълно коректен и да извежда верни резултати за различни входни данни. В предложеното решение не е отчетена една съществена подробност. Представете си, че за стойност на радиуса бъде въведено отрицателно число, което типът double допуска. Тогава получената обиколка също ще бъде отрицателно число. Подобни изчисления (отрицателни стойности за радиус и обиколка на окръжност) в геометрията са недопустими. За да е прецизно решена задачата, при подаването на входните данни е необходимо да се направи проверка за тяхната коректност, т.е. да се провери дали въведената стойност за радиус принадлежи на множеството от допустими стойности за r. Това може да се направи чрез разклонен алгоритъм.

Алгоритъм, чието изпълнение се разделя на различни последователности от действия, в зависимост от верността на дадено условие, се нарича разклонен алгоритъм.

Разклонените алгоритми се реализират чрез условен оператор. Съществуват две форми на условния оператор – кратка и пълна.

2. Кратка форма на условния оператор

(визуализация) – 471.fla – същата както за С++

Синтаксис:

if(<условие>) <оператор>;

където:

<условие> е логически израз (най-често израз за сравнение, чийто резултат е от логически тип – true или false). Задължително се огражда в скоби.

<оператор> е произволен допустим за езика C++ оператор. Ако операторите са повече от един, се използва конструкцията блок {…}.

Семантика:

  1. Изчислява се стойността на логическия израз (условието).
  2. Aко условието има стойност true, се изпълнява оператора, след което изпълнението на програмата продължава със следващия по ред oператор.
  3. Ако условието има стойност false, програмата продължава с оператора, зададен след if.
  4. Пълна форма на условния оператор

Синтаксис:

if (<условие>) <оператор1>;
else <оператор2>;

където:

<условие> е логически израз;

<оператор1> и <оператор2> са произволни допустими за езика С++ оператори. Ако се налага използването на повече от един оператор, се използва конструкцията блок {…}.

Семантика:

  1. Изчислява се стойността на логическия израз (условието).
  2. Aко то има стойност true, се изпълнява <оператор1>.
  3. Aко условието има стойност false, се изпълнява <оператор2>.

И в двата случая изпълнението продължава със следващия по ред оператор от програмата.

Следният код илюстрира пълното решение на поставената в началото на темата задача 1:

Примерен вход:          r=12.5                     Примерен изход: P=78.5

Примерен вход:          r=-3.1                     Примерен изход: Некоректни данни!

#include <iostream>

int main()
{
	const double PI=3.14;
	double r,p;
	cout<<"r=";
	cin>>r;
	if(r>0)
	{
		p=2*PI*r;
		cout<<"P="<<p<<endl;
	}
	else cout<<"Некоректни данни!";
	return 0;
}

Задача 2: Да се състави програма, която въвежда от клавиатурата две различни реални числа. Програмата да изведе по-голямото от тях.

Примерен вход: a=12.5                              Примерен изход: 12.5

b=3

Примерен вход:          a=-2                          Примерен изход: -1.25

b=-1.25

Решение:

#include<iostream>

int main()
{
	float a,b;
	cout<<"a=";
	cin>>a;
	cout<<"b=";
	cin>>b;
	if (a>b) cout<<a<<endl;
	else cout<<b<<endl;
	return 0;
}

Задача 3: Да се състави програма, която въвежда последователно от клавиатурата 3 реални числа и извежда най-голямото от тях.

Примерен вход:                                                          Примерен изход: 771

28

771

65

Примерен вход:                                                          Примерен изход: -3

-3

-25

-21

За да се реши задачата най-рационално, може да се приложи следният алгоритъм:

  • Декларира се помощна променлива max. След поредица от сравнения в нея ще се запази намереното най-голямо число.
  • Променливата max се инициализира с първото въведено число.
  • Въвежда се следващото число и се сравнява с max. Ако то е по-голямо от max, стойността му се присвоява в max.
  • Стъпка 3 се повтаря и за следващото въведено число.
  • Извежда се вече намереното в max най-голямо число.

Решение:

#include<iostream.h>

int main()
{
	double x,max;
	cin>>x;
	max=x;
	cin>>x;
	if(x>max) max=x;
	cin>>x;
	if(x>max) max=x;
	cout<<max<<endl;
	return 0;
}

Алгоритъмът може да се използва и за намиране на максималното от n въведени числа.

Задача 4: Да се състави програма, която въвежда от клавиатурата три реални числа x, у, и z и ги сортира във възходящ ред. Въвеждането на числата става на един ред, разделени с интервал. Сортираните числа се извеждат на изхода на един ред, разделени с интервал.

Примерен вход: 31 15 5                            Примерен изход: 5 15 31

Примерен вход: -4 -19 -10                    Примерен изход: -19 -10 -4

За решението на задачата се използват поредици от размени на стойностите на променливи.

Предлагаме две решения на задачата.

Решение 1:

#include<iostream.h>

int main()
{
	double x,y,z,a;
	cin>>x>>y>>z;
	if(x>y){a=x; x=y; y=a;}
	if(x>z){a=x; x=z; z=a;}
	if(y>z){a=y; y=z; z=a;}
	cout<<x<<" ";
	cout<<y<<" ";
	cout<<z<<endl;
	return 0;
}

Решение 2:

#include<iostream.h>
int main()
{
	double x,y,z,a;
	cin>>x>>y>>z;
	if(x>y){a=x; x=y;y=a;}
	if(y>z){a=y; y=z; z=a;}
	if(x>y){a=x; x=y;y=a;}
	cout<<x<<" „;
	cout<<y<<" „;
	cout<<z<<endl;
	return 0;
}

От значение е в каква последователност се сравняват двойките променливи.

3. Вложени условни оператори

Всеки един от операторите в частите след if и else са произволни изпълними оператори. Допуска се те да бъдат условни оператори. В този случай говорим за вложени условни оператори.

В общия случай влагането изглежда по следния начин:

if(<условие1>)
{
      if (<условие2>) <оператор1>;
      else <оператор2>;
}
else
{
     if (<условие3>) <оператор3>;
     else <оператор4>;
}

Всяка част else се свързва с най-близкия предхождащ я if оператор, с който образува пълна форма на условния оператор.

Задача 5: Да се състави програма за пресмятане на линейно уравнение ах+b=0. Коефициентите а и b се въвеждат от клавиатурата на един ред, разделени с интервал. На изхода се извежда стойността на х, или се извежда подходящо съобщение.

Примерен вход: 4 32                      Примерен изход: -8

Примерен вход: 0 0                        Примерен изход: Всяко x е решение

Примерен вход: 0 -2                      Примерен изход: Няма решение

Решение:

//Program_7.cpp

#include<iostream.h>

int main()
{
	double a,b,x;
	cin>>a>>b;
	if(a==0)
	if(b==0) cout<<"Всяко x е решение";
	else cout<<"Няма решение";
	else cout<<-b/a;
	return 0;
}

Задача 6: Да се състави програма, която определя в кой квадрант лежи точката A с координати (xa,ya). Да се извежда съобщение с номера на квадранта. Предполага се, че т. A не лежи на никоя от координатните оси.

Примерен вход: 1 5                      Примерен изход: квадрант I

Примерен вход: -2 -3.8             Примерен изход: квадрант III

Решение:

#include<iostream.h>

int main()
{
	double xa,ya;
	cin>>xa>>ya;
	if(xa>0)
	if(ya>0) cout<<"квадрант I";
	else cout<<"квадрант IV";
	else
	if(ya>0) cout<<"квадрант II";
	else cout<<"квадрант III";
	return 0;
}

Задача 7: Да се състави програма за намиране корените на уравнението ах2+bх+с=0, където коефициентите а, b и с се въвеждат от клавиатурата на един ред, разделени с интервал. На изхода се извежда подходящо съобщение за решението на уравнението.

Примерен вход: 1 2 1                   Примерен изход: х1=-1 х2=-1

Примерен вход: 0 8 -2                 Примерен изход: х=4

Примерен вход: 1 5 -6                 Примерен изход: х1=1 х2=-6

Примерен вход: 1 2 5                   Примерен изход: Няма реални корени

Решение:

#include<iostream.h>

#include<math.h>

int main()
{
	double a,b,c,x1,x2,d;
	cin>>a>>b>>c;
	if(a==0)
	{
		if(b==0)
		if(c==0) cout<<„Всяко x e решение";
		else cout<<„Няма решение";
		else cout<<„x="<<-c/b;
	}
	else
	{
		d=b*b-4*a*c;
		if(d>=0)
	{
	x1=(-b+sqrt(d))/(2*a);
	x2=(-b-sqrt(d))/(2*a);
	cout<<„x1="<<x1<<" „;
	cout<<„x2="<<x2<<endl;
	}
		else cout<<„Няма реални корени";
	}
	return 0;
}

Задача 8: Да се напише програма, която въвежда от клавиатурата две реални числа. Програмата да изведе по-голямото от тях. В случая, когато въведените числа са равни, да се изведе подходящо съобщение.

Примерен вход:          a=12.5                                 Примерен изход: 12.5

b=3

Примерен вход:          a=-2                          Примерен изход: -1.25

b=-1.25

Примерен вход:          a=1.25                                 Примерен изход: а=b=1.25

b=1.25