Оператор множественного выбора switch

Итак мы рассмотрели оператор с одиночным выбором if и оператор с двойным выбором if else, но в С++ еще имеется оператор множественного выбора switch, который мы сейчас детально рассмотрим.

// форма записи оператора множественного выбора switch
switch (/*переменная или выражение*/)
 {
 case /*константное выражение1/*: 
 {
 /*группа операторов*/;
 break;
 }
 case /*константное выражение2*/: 
 {
 /*группа операторов*/;
 break;
 }
 //.    .    .
 default:
                {
                 /*группа операторов*/;
                }
 }

На начальном этапе анализируется выражение или переменная. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break или закрывающая фигурная скобочка. Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default. После чего выполняется оператор или группа операторов данной ветви. Сейчас рассмотрим задачу с использованием оператора выбора switch.

Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа введенных с клавиатуры. Разработать пользовательский интерфейс.
// switch.cpp: определяет точку входа для консольного приложения.

 #include "stdafx.h"
 #include <iostream>
 using namespace std;

 int main(int argc, char* argv[])
 {
  int count; // переменная для выбора в switch
  double a,b; // переменные для хранения операндов
  cout << "Vvedite pervoe chislo: ";
  cin >> a;
  cout << "Vvedite vtoroe chislo: ";
  cin >> b;
  cout << "Vibirite deistvie: 1-clojenie; 2-vichitanie; 3-ymnojenie; 4-delenie: ";
  cin >> count;
  switch (count) // начало оператора switch
  {
 	 case 1: // если count = 1
 	 {
  	 cout << a << " + " << b << " = " << a + b << endl; // выполнить сложение
  	 break;
  	 }
  	 case 2: // если count = 2
  	 {
  	 cout << a << " - " << b << " = " << a - b << endl; // выполнить вычитание
  	 break;
  	 }
  	 case 3: // если count = 3 
  	 {
  	 cout << a << " * " << b << " = " << a * b << endl; // выполнить умножение
  	 break;
  	 }
  	 case 4: // если count = 4
  	 {
  	 cout << a << " / " << b << " = " << a / b << endl; // выполнить деление
  	 break;
 	 }
 	 default: // если count равно любому другому значению
 	 cout << "Nepravilni vvod" << endl;
 	 }
 system("pause");
 return 0;
}

В 9-й строке мы объявили переменную count целочисленного типа. Именно значение данной переменной программа будет сравнивать со значением константного выражения. В строке 10 объявлены две переменные вещественного типа данных, для хранения введённых чисел. Почему вещественного, объясню позже. С 17 по 41 строки записан условный оператор множественного выбора switch. На начальном этапе анализируется переменная count. Анализируется таким образом:
если переменная count равна единице, значит, выполняется блок операторов с 20-й по 23-ю строки;
если переменная count равна двойке, значит, выполняется блок операторов  с  25-й по 28-ю строки;
если переменная count равна тройке, значит, выполняется блок операторов  с  30-й по 33-ю строки;
если переменная count равна четырем, значит, выполняется блок операторов с 35-й по 38-ю строки;

Если же значение переменной count не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default. То есть будет выполнена следующая строка

cout << "Nepravilni vvod" << endl;

Оператор switch может содержать, а может и не содержать зарезервированное слово default. Если значение переменной не совпадет ни с одним константным выражением и не будет default, то программное управление в этом случае просто перешло бы к первому оператору после switch. В строках 19, 24, 29, 34 записаны константные выражения, с которыми программа сравнивает значение переменной count.
В строках 22, 27, 32, 37, записан оператор break. Возникает вопрос: «Зачем он нужен?» Допустим, пользователь ввел 2, то есть переменная count инициализировалась двойкой. Начинает работать условный оператор множественного выбора switch. То есть выполняется поиск двойки в константных выражениях. Сначала проверяется строка 19, мы видим, что в строке 19 константное выражение равно единице, а нам нужна двойка. Проверяем дальше. А дальше по порядку строка 24. Мы видим, что в строке 24 константное выражение равно двойке, то, что нужно!!! Переменная count равна константному выражению, выполняется блок операторов с 25 по 28 строки. И вот в 27-й строке записан оператор break, который заставляет программу перейти к первому оператору после оператора switch. В данном случае управление передается строке 42. А нужен этот переход только для того, чтобы не выполнялись заведомо ненужные действия. Если убрать оператор break, то программа будет дальше сравнивать значение переменной с константными выражениями, пока они все не закончатся и потом все равно передаст управление строке 42. Результат работы программы показан ниже (см. Рисунок 1).

Оператор множественного выбора switch C++

Рисунок 1 — Оператор множественного выбора в С++

Вернемся к строке 10, там объявляются две переменные типа double. Наверное, возникает вопрос, «Почему вещественного типа, а не целочисленного?». Отвечаю: «Потому, что одно из действий, которые может выполнять программа является деление, а при делении результат имеет вещественный тип данных. Компилятор С++ при делении чисел обращает внимание на их типы данных. Если мы просто делим числа на калькуляторе, например 4/5=0.8 Компилятор С++ нам выдаст результат при таком делении 0. Так как оба числа являются целочисленными, значит, результат тоже будет целочисленный, то есть целая часть от обычного деления, а в нашем случае целая часть при таком делении – это 0, соответственно часть информации теряется, или как еще говорят, отсекается (восемь десятых, в нашем случае, отсекается). А если делимое и делитель поменять местами, на калькуляторе получим: 5/4=1.25; компилятор С++ покажет несколько иной результат, а именно 5/4=1 (0.25 отсекается). Такое явление в С++ называется неявным приведением типа.» Вещественный тип данных используется для более точного представления чисел, чем целочисленный (то есть отображает дробную часть).

В С++ существуют два вещественных типа данных:

1) double – вещественный тип данных двойной точности, а значит занимает вдвое больше памяти, чем тип float
2) float – вещественный тип данных одинарной точности

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. mpavelFax

    Официальная работа через интернет

  2. n196184611

    n196184611

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

  3. n196184611

    n196184611

    Tan4ik выше спросил почему switch без break выполняет все условия, следующие за совпавшим.
    Мне тоже кажется что это просто косяк языка С++, ну как так может быть.. против логики, он тогда должен проверять все условия, раз break нет, но не должен их выполнять, т.к. совпадения нет. Автор статьи на этот вопрос тоже не смог дать ответ, просто написал что надо везде ставить break — железное правило. Наверное это… правда очень похоже на косяк в операторе ) поэтому и более понятного ответа ни у кого нет, кроме того что правило очень железное.

  4. Aydana

    Помогите пожалуйста что не так? Почему у меня выходит только «север»

    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <conio.h>
    #include <stdio.h>

    using namespace std;

    main()
    {
    int n1,n2;

    printf(«\n vvedite n1 i n2:\n»);
    scanf(«%d \n,%d»,&n1,&n2);

    if ((n1=-1)&&(n2=1)) printf(«\n sever \n»);
    else
    if ((n1=-1)&&(n2=-1)) printf(«\n Iug \n»);
    else
    if ((n1=-1)&&(n2=2)) printf(«\n vostok \n»);
    else
    if ((n1=1)&&(n2=-1)) printf(«\n sever \n»);
    else
    if ((n1=1)&&(n2=1)) printf(«\n iug \n»);
    else
    if ((n1=1)&&(n2=2)) printf(«\n zapad \n»);
    else
    if ((n1=2)&&(n2=1)) printf(«\n zapad \n»);
    else
    if ((n1=2)&&(n2=-1)) printf(«\n vostok \n»);
    else
    if ((n1=2)&&(n2=2)) printf(«\n sever \n»);
    system(«PAUSE»);
    return EXIT_SUCCESS;
    }

    • FuriLime

      наверно потому, что Вы в if присваиваете, а не приравниваете. И зачем в разделе с++ писать на си, используя if вместо switch

  5. Aydana

    Помогите пожалуйста что не так? Почему у меня выходит только «север»

    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <conio.h>
    #include <stdio.h>

    using namespace std;

    main()
    {
    int n1,n2;
    setlocale(LC_ALL, «Russian»);
    printf(«\n vvedite n1 i n2:\n»);
    scanf(«%d \n,%d»,&n1,&n2);

    if ((n1=-1)&&(n2=1)) printf(«\n ñåâåð \n»);
    else
    if ((n1=-1)&&(n2=-1)) printf(«\n Þã \n»);
    else
    if ((n1=-1)&&(n2=2)) printf(«\n âîñòîê \n»);
    else
    if ((n1=1)&&(n2=-1)) printf(«\n ñåâåð \n»);
    else
    if ((n1=1)&&(n2=1)) printf(«\n þã \n»);
    else
    if ((n1=1)&&(n2=2)) printf(«\n çàïàä \n»);
    else
    if ((n1=2)&&(n2=1)) printf(«\n çàïàä \n»);
    else
    if ((n1=2)&&(n2=-1)) printf(«\n âîñòîê \n»);
    else
    if ((n1=2)&&(n2=2)) printf(«\n ñåâåð \n»);
    system(«PAUSE»);
    return EXIT_SUCCESS;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.