Опубликован: 10.12.2015 | Доступ: свободный | Студентов: 610 / 92 | Длительность: 07:10:00
Лекция 3:

Операторы выбора

< Лекция 2 || Лекция 3 || Лекция 4 >

К операторам выбора, называемым операторами управления потоком выполнения программы, относят: условный оператор (ifelse) и переключатель (switch). Каждый из них служит для выбора пути выполнения программы.

Синтаксис условного оператора следующий:

if (выражение) оператор_1; else оператор_2;

Здесь нужно пояснить следующее. Выражения, используемые при сравнении двух величин в С++ отличаются от таковых, в других алгоритмических языках.

Описание Выражение
a больше, чем b a>b
a меньше, чем b a<b
a равно b a==b
a не равно b a!=b
a больше или равно b a>=b
a меньше или равно b a<=b

Так при проверке равенства двух величин нужно использовать ==, а не =, т.к. в противном случае получится оператор присваивания.

При истинности выражения, выполняется оператор_1, в противном случае - выполняется оператор_2. Рассмотрим пример.

x=3;
if (x>0) a=15; else a=12;

Как вы, наверное уже догадались, переменная a принимает значение 15.

Операторы могут быть составными (могут объединяться в блоки).

double y=2;

if (y>3) {cout<<"\nHow old are you?";
		 cout<<"\nI am 33"<<endl;}

	else {cout<<"\nWhat are you doing?";
	 	cout<<"\nI am computing"<<endl;};

Результатом работы этого фрагмента будет выведенная на экран фраза

What are you doing?
I am computing

Допустима сокращенная форма условного оператора, когда отсутствует else и оператор_2. В этом случае при ложности выражения ничего не происходит.

double z=5;
if (z<3) cout<<"\nHi!";

Данный фрагмент ничего не выполнит.

Нужно сказать, что в свою очередь, оператор_1 и оператор_2 могут быть условными, что позволяет организовать цепочку проверок. В следующем примере показаны некоторые способы использования условных операторов.

//==========================================================
// Name        : choice.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

//Здесь рассматриваются операторы выбора
//В этой программе объясняется использование условных
//операторов

int main() {
	int x=5;
	int y=10;
	cout<<"\nThis program explains 'if' statement using"<<endl;
	cout<<"\nx= "<<x<<", "<<"y= "<<y<<endl;

	if (x>y) {cout<<"\n"<<x<<" > "<<y<<" ";}
	else {cout<<"\n"<<y<<" > "<<x<<" "<<endl;}

	double a=3.3;
	double b=2.48;
	double c=4.65;
	double d;

	//Использование логической бинарной операции
	//&& - конъюнкции (И)
	if (a>b && c>b) {d=7;}
	else d=3;
	//Если а>b и c>b, то d=7, иначе, d=3
	cout<<"\na= "<<a<<", "<<"b= "<<b<<", "<<"c= "<<c<<endl;
	cout<<"\nBecause "<<a<<" > "<<b<<" && "<<c<<" > "<<b<<" So d = "<<d<<endl;

	double f=1;
	double g=3;
	double h=5;
	double k;

	if (f>g || h>g) {k=15;}
	else k=100;

	//Использование логической бинарной операции
	//|| - дизъюнкции (ИЛИ)
	//Если f>g или h>g, то k=15, иначе, k=100
	cout<<"\nf= "<<f<<", "<<"g= "<<g<<", "<<"h= "<<h<<endl;
	cout<<"\nBecause "<<f<<" > "<<g<<" || "<<h<<" > "<<g<<" So k = "<<k<<endl;

	//При выполнении многочисленных последовательных сравнений
	//используется оператор if-else-if

	int st=55;
	double z;
	//Введем фрагмент таблицы Стьюдента для 95% вероятности
	if      (st>120)  z=1.96;//st больше 120
	else if (st==120) z=1.98;//st равно 120
	else if (st>=100) z=1.982;//st больше или равно 120
	else if (st>=90)  z=1.986;
	else if (st>=80)  z=1.989;
	else if (st>=70)  z=1.994;
	else if (st>=60)  z=2;
	else if (st>=55)  z=2.004;
	else if (st>=50)  z=2.008;
	else if (st>=45)  z=2.014;
	else if (st>=40)  z=2.021;
	else cout<<"\nThats all right!"<<endl;//Действие по умолчанию

	cout<<"\nt-test ("<<st<<") = "<<z<<endl;
	return 0;
}

Результат:

This program explains 'if' statment using
x=5, y=10
10>5
a = 3.3, b = 2.48, c = 4.65
Because 3.3>2.48 && 4.65>2.48 So d = 7
f = 1, g = 3, h = 5
Because 1>3 || 5>3 So k = 15
t-test (55) = 2.004

В следующем примере оператор if - else используется при расчете геометрической прогрессии.

//==========================================================
// Name        : geometrical_progression.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
#include<math.h>
//Здесь описываются математические функции (pow - возведение в степень)
//Эта программа рассчитывает сумму геометрической прогрессии
//S=A+A*Q+A*Q^2+A*Q^3+...+A*Q^N
using namespace std;

int main() {
	//Опишем переменные, используемые в программе
	double s; //Сумма геометрической прогрессии
	double a; //Первый член прогрессии
	double q; //Знаменатель прогрессии
	int n;    //Количество последних членов геометрической прогрессии
	cout<<"\nHi! Let's calculate sum of the geometrical progression!";
	cout<<"\nNow enter the first member's value ";
	cin>>a;
	cout<<"\nThen enter the base of geometrical progression ";
	cin>>q;
	cout<<"\nEnter the number of last members of geometrical progression ";
	cin>>n;
	//Используем условный оператор для выбора формулы рассчета суммы прогрессии
	//в зависимости от того больше единицы основание прогрессии или нет
	if (q<1) {s=a/(1-q);}
		else
				{
					s=0;
					for(int i=0;i<n;i++)
							{
								s+=pow(q,i);
							}
					s=a*(s+1);
				}
	cout<<"\nThe sum of geometrical progression is "<<s<<endl;

	return 0;
}

Результат:

Hi! Let's calculate sum of the geometrical progression!
Now enter the first member's value 3
Then enter the base of geometrical progression 2
Enter the number of last members of geometrical progression 6
The sum of geometrical progression is 192

Переключатель

Переключатель используется для организации множественного выбора. Синтаксис оператора switch следующий.

switch (переключающее выражение)
{case константное_выражение_1: операторы_1;
  case константное_выражение_2: операторы_2;
  ……………………………………………………
   case константное_выражение_n: операторы_n;
	default: операторы;
}

Управляющая конструкция switch передает управление тому из помеченных с помощью case операторов, для которого значение константного выражения совпадает со значением переключающего выражения. Значения константных выражений, помещаемых за служебными словами case, приводятся к типу переключающего выражения. В одном переключателе все константные выражения должны иметь различные значения, но быть одного типа. Любой из операторов, помещенных в фигурных скобках после конструкции switch (...), может быть помечен одной или несколькими метками вида

case константное_выражение:

Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default:. В каждом переключателе должно быть не больше одной метки default, однако эта метка может и отсутствовать. В случае отсутствия метки default при несовпадении переключающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов.

Сами по себе метки case константное выражение_i: и default: не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выход из переключателя, то в нем последовательно выполняются все операторы, начиная с той метки, на которую передано управление. Пример программы с переключателем:

 
//==========================================================
// Name        : switch.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	int n;
	cout<<"\nInput integer value between 1 and 7"<<endl;
	cin>>n;

	switch (n)
		{
	case 1: cout<<"\nToday is Monday";   break;
	case 2: cout<<"\nToday is Tuesday";  break;
	case 3: cout<<"\nToday is Wednesday";break;
	case 4: cout<<"\nToday is Thursday"; break;
	case 5: cout<<"\nToday is Friday";   break;
	case 6: cout<<"\nToday is Saturday"; break;
	case 7: cout<<"\nToday is Sunday";   break;
	default:cout<<"\nThis number is illegal!";

		}
	cout<<"\n"<<endl;
	return 0;
}

Результат:

Input integer value between 1 and 7
5
Today is Friday

Кроме сказанного о возможностях переключателя, приведенная программа иллюстрирует действие оператора break. С его помощью выполняется выход из переключателя.

Условная операция

В отличие от унарных и бинарных операций условная операция используется с тремя операндами. В изображении условной операции два размещенных не подряд символа '?', и ':' и три операнда-выражения:

выражение_1 ? выражение 2 : выражение 3

Первым вычисляется значение выражения_1. Если оно истинно, т.е. не равно нулю, то вычисляется значение выражения_2, которое становится результатом. Если при вычислении выражания_1 получится 0, то в качестве результата берется значение выражения_3. Пример:

х <0 ? p=4 : z=7;

Если выражение х<0 истинно, то переменная p принимает значение 4, в противном случае переменной z присваивается значение 7.

//==========================================================
// Name        : conditional_operation.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	double s, t, r;
	s=5.7;
	t=-0.237;
	s<t?r=6:r=10;
	cout<<"\ns= "<<s<<" t= "<<t;
	cout<<"\ns < t? r =6 : r =10 ";
	cout<<"\nSo r = "<<r<<endl;
	return 0;
}

Результат:

s=5.7  t=-0.237
s<t?r=6:r=10
So r = 10
< Лекция 2 || Лекция 3 || Лекция 4 >
Зося Ковалева
Зося Ковалева

Хочу получить удостоверение. Сколько стоит оплата?