itmo.ru aco.ifmo.ru c-visionlab.ru
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


1.6. Селективные конструкции

1.6.1 Селективные конструкции. Пример определения оценки в зависимости от количества баллов (пример 6)

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

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

switch ( переменная )
{
    case константа 1: 
    {
        блок операторов 1;
        break;
    }
    case константа 2: 
    {
        блок операторов 2;
        break;
    }
    default: 
    {
        блок операторов 3;
    }
} 

Рассмотрим пример определения оценки в зависимости от количества баллов

/////////////////////////////////////////////////////////////////////////////
// Программирование на языке высокого уровня. Основы языка С++
// Пример 6. Пример определения оценки в зависимости от количества баллов
// 
// http://aco.ifmo.ru/el_books/programming
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение строковой библиотеки
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
 
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    // количество баллов
    int studentGrade;
    // оценка (строка символов)
    string studentMark; 

    // ввод баллов 
    cout<<"Please, input your grade: ";
    cin>>studentGrade;

    // определение оценки
    if ( studentGrade >= 90 ) // 90 и более баллов - оценка 5А
        studentMark="5А"; 
    else if ( studentGrade >= 83 ) // 83-89 - оценка 4В
        studentMark="4А"; 
    else if ( studentGrade >= 74 ) // 74-83 - оценка 4С
        studentMark="4С"; 
    else if ( studentGrade >= 67 ) // 67-74 - оценка 3D 
        studentMark="3D";
    else if ( studentGrade >= 60 ) // 60-67 - оценка 3D 
        studentMark="3E";
    else // менее 60 - не сдано
        studentMark="FX";

    // вывод оценки на экран
    // для вывода строки необходимо преобразовать ее в набор символов при помощи функции c_str()
    cout<<"Your mark is "<<studentMark.c_str()<<endl; 
}
/////////////////////////////////////////////////////////////////////////////

В этом примере условие проверяется последовательно – вначале больше ли studentGrade чем 90, если нет – проверяется следующее условие. Если ни одно из условий не выполнено, выполняется блок else.

Если пропустить последний блок else – возможна ситуация когда ни одно из условий не выполнится.

1.6.2 Оператор Switch. Пример меню с выбором действия (пример 7)

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

/////////////////////////////////////////////////////////////////////////////
// Программирование на языке высокого уровня. Основы языка С++
// Пример 7. Пример работы оператора switch - меню с выбором действия
// 
// http://aco.ifmo.ru/el_books/programming
// Университет ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
 
/////////////////////////////////////////////////////////////////////////////
// функция main начинает исполнение программы 
void main()
{
    // описание переменных
    double a,b; // два вещественных числа для вычислений
    int menu_number; // номер выбранного пункта меню

    // ввод данных 
    cout<<"Enter two numbers: "; // запросить ввод 
    cin>>a>>b; // прочитать два введенных числа 

    // вывод меню
    cout<<endl<<endl<<"Enter number of menu item: ";
    cout<<"1. a+b"<<endl;
    cout<<"2. a-b"<<endl;
    cout<<"3. a*b"<<endl;
    cout<<"4. a/b"<<endl;
    // ввод номера пункта меню
    cin>>menu_number;

    // оператор выбора по номеру пункта меню
    switch(menu_number)
    {
        // если menu_number==1 
        case 1:
            {
                cout<<"a+b="<<a+b<<endl;
                // выход из оператора switch
                break; 
            }
        // если menu_number==2
        case 2:
            {
                cout<<"a-b="<<a-b<<endl;
                // выход из оператора switch                
                break;
            }
        // если menu_number==2
        case 3:
            {
                cout<<"a*b="<<a*b<<endl;
                // выход из оператора switch                
                break;
            }
        // если menu_number==2
        case 4:
            {
                cout<<"a/b="<<a/b<<endl;
                // выход из оператора switch   
                break;
            }
        // если ни один из предыдущих case не сработал
        default :
            {
                cout<<"Wrong menu item"<<endl;
                // оператор break не нужен, т.к. switch закончился
            }
    }
}
/////////////////////////////////////////////////////////////////////////////

Когда поток управления достигает оператора switch, программа оценивает следующее за switch управляющее выражение (в данном случае menu _ number). Оператор switch сравнивает значение управляющего выражения с каждой из меток case. Оператор break заставляет программу перейти к первому оператору после оператора switch.

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

Те же самые действия можно было бы описать и при помощи операторов if – else if – else:

switch(menu_number)
{
    case 1:
        {
            cout<<"a+b="<<a+b<<endl;
            break; 
        }
    case 2:
        {
            cout<<"a-b="<<a-b<<endl;           
            break;
        }
    case 3:
        {
            cout<<"a*b="<<a*b<<endl;
            break;
        }
    case 4:
        {
            cout<<"a/b="<<a/b<<endl;
            break;
        }
    default :
        {
            cout<<"Wrong menu item"<<endl;
        }
}
if(menu_number==1) 
{
   cout<<"a+b="<<a+b<<endl;
}
else if(menu_number==2) 
{
   cout<<"a-b="<<a-b<<endl; 
}
else if(menu_number==3) 
{
   cout<<"a*b="<<a*b<<endl;
}
else if(menu_number==4) 
{
   cout<<"a/b="<<a/b<<endl;
}
else 
{
   cout<<"Wrong menu item"<<endl;
}

Без операторов break всякий раз, когда в операторе switch обнаруживается соответствие, будут исполняться операторы и всех последующих меток case, пока не встретится оператор break или не будет достигнут конец switch.

switch(menu_number)
{
    case 1:
        {
            cout<<"a+b="<<a+b<<endl;
        }
    case 2:
        {
            cout<<"a-b="<<a-b<<endl;           
            break;
        }
    case 3:
        {
            cout<<"a*b="<<a*b<<endl;
            break;
        }
    case 4:
        {
            cout<<"a/b="<<a/b<<endl;
            break;
        }
    default :
        {
            cout<<"Wrong menu item"<<endl;
        }
    }
if(menu_number==1) 
{
   cout<<"a+b="<<a+b<<endl;
}
if(menu_number==1 || menu_number==2) 
{
   cout<<"a-b="<<a-b<<endl; 
}
else if(menu_number==3) 
{
   cout<<"a*b="<<a*b<<endl;
}
else if(menu_number==4) 
{
   cout<<"a/b="<<a/b<<endl;
}
else 
{
   cout<<"Wrong menu item"<<endl;
}