Увод в програмирането  alpha
Оператор за избор на вариант switch. Оператори break, continue и goto.

Оператор switch

switch - избира се една от няколко взаимноизключващи се възможности, алтернативи:

        switch ( израз_селектор )
        {
                case израз1:
                        оператори
                        [break;]
                
                case израз2:
                        оператори
                        [break;]
                ............
                [ default:
                        оператори
                        [break;]]               
        }

израз_селектор е условие за избот. Стойността му е от цял тип ( частност тип char )

израз1, израз2, .... са константни изрази от цял тип ( в частност тип char ) като етикет към първия/следващи оператори.

switch, case, default са ключови думи.

Начин на работа на switch:

switch се изпълнява по следния начин:

  1. Първо се пресмята стойността на израза селектор.
  2. Стойността на израза селектор се сравнява със стойността на констрантните изрази1, изрази2, ....
  3. Ако стойността на израза селектор съвпада със стойността на някой от константните изрази, то се изпълнява групата от оператори, преписана към съответния израз
  4. С изпълнение на break управлението се предава на оператори, записани след затварящата фигурна скоба на switch
  5. Ако няма съвпадение с нито един от константните изрази, изпълнява се групата от оператори след default

При състяване на switch трябва да се спазват следните изисквания:

  1. не може да има константни изрази с еднаква стойност
  2. последователността на подредба на константните изрази може да е напълно произволна
  3. в какъв ред се пресмятат от компилатора стойностите на изразите зависи от компилатора
  4. няколко етикета ( изрази ) могат да бъдат свързани с една и съща група оператори:
            case израз1:
            case израз2:
            ............
            case изразК:
                    оператори
  5. операторите break не са задължителни

Ако не се използва break, след изпълнението на избрания вариант веднага се преминава към изпълнението на непосредсвено следващия вариант и т.н. Ако няма нито един break , изпълнението на switch приключва със '}' .

Default не е задължителен. Ако такъв вариант не е предвиден и няма съвпадение на стойност на израза селектор с някой израз, то switch-a е равносилен на празен оператор. Т.е. switch не прави нищо.

Операторите между {} образуват по същество блок. Ето защо в блока може да има дефиниране на променливи.

Изход от switch може да се осъществи освен с оператор switch и с операторите goto, return и exit.

switch може да бъде влаган в себе си.

Операторът switch може да се счита за еквивалентен на следната вложена конструкция:

        if ( израз_селектор == израз1 )
        {
                оператори;
        }
        else if ( изрази_селектор == израз2 )
        {
                оператори;
        }
        // Последния блок може и да не се ползва:
        else 
        {
                оператори;
        } 

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

Предимството на вложената конструкция ifelse е, че определя точно реда, по който се оценяват израз1, израз2 и т.н. Това позволява най-често срешания случай да се постави на първо място и с това да се избегне проверките на осталинте изрази като по този начин се повиши ефективността на програмния код. Очевидно if lese е по-обща от switch.

Задача: Да се състави програма, която пресмята периметъра на окръжност, квадрат или равностранен триъгълник:

Решение:

        #include <iostream.h>
        #include <stdio.h>
        #include <stdlib.h>
        
        void main()
        {
                char sys;
                float r, x;
                cout<<"Въведете кода на фигурата: ";
                sys = getchar();
                cout<<endl<<"Въведете r= ";
                cin>>r;
                cout<<endl;
                switch(sys)
                {
                        case 'c':
                                x = 2 * 3.14 * r;
                                break;
                        
                        case 's':
                                x = 4 * r;
                                break;
                        
                        case 't':
                                x = 3 * r;
                                break;
                        default:
                                cout<<"Въведен е неправилен код на фигура!"<<endl;
                                exit(1);
                }
                cout<<"Периметърът е "<< x << endl;
        }
Note
exit() -> завършва изпълненито на програмата:
exit(1) -> програмата не е изпълнена успешно; сигналът се предава на Операционната Система
exit(0) -> програмата е изпълнена успешно; сигналът се предава на Операционната система.

break

Командата break се използва в тялото на цикли.

Общ вид:

        break;

break може да бъде използван на произволно място в тялото на цикъла, което е допустимо, за който и да е друг оператор.

Изпълнението на break предизвиква излизанеото от цикъла и предаването на управлението на операторите, записани непосредствено след цикъла. След излизането от цъкъла с оператор break стойностите на променливите от цикъла не се изменят като се запазват такива, каквито са били преди изпълнението на break.

Задача: Да се състави програма за търсене на първо срещане на даден символ в текст

Решение:

        #include<iostream>
        #include<stdio.h> 
        
        using namespace std;
        
        int main ()
        {
                int i, j, R;
                char symbol;
                cout<<"Въведете символа: "
                symbol = getchar() ; // чете символа
                getchar(); // "доизчиства" буфера
                cout<<"Въведете текста: \n";
                i=1;
                j=0;
                while ( ( R = getchar() ) != '\n' )
                {
                        if ( R == symbol )
                        {
                                j = 1;
                                break;
                        }
                        else 
                                i++;
                }
                
                if ( j == 1 )
                        cout<<"Символът "<<symbol<<" е на " << i <<"-та позиция в текста."<<endl;
                else
                        cout<<"Символът "<<symbol<<" не е открит в текста."<<endl;
                
                return 0;
        }

Continue

Оператор continue се използва за завършване на итерация на цикъл. Той може да бъде записан на произволно място в тялото на цикъла, разрешено за оператор.

Оператор continue завършва изпълнението на текущата итерация в цикъла. Изпълнението на цикъла продължава по стандартния начин, определен от дефиницията на цикъла.

Задача:

Да се напише програма, която намира индексите на елементите на масив, който съдържат четни числа.

Решение:

        #include<iostream.h>
        void main()
        {
                int i, a[10];
                
                for( i = 0; i < 10 ; i++ )
                {
                        cout<<"Въведете a["<<i<<"] = ";
                        cin>>a[i];
                }
                
                cout<<"\n Индекси на четните числа в масива са: \n"
                
                for( i = 0; i<10; i++)
                {
                        if( a[i] % 2 != 0 ) 
                                continue;
                        cout<<i<<"  ";
                }
        }

Оператор Goto

Операторът осъществява безусловен преход.

общ вид:

        етикет: оператор;
        ................
        goto етикет;

Препоръчително е goto да не се използва. В повечето съвременни езици е отхвърлен и не се ползва.

goto предава управлението на програмата в тялото на една ( и съща ) функция.

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

Обичайно приложение:

Goto се ползва във множество вложени цикли като goto от най-вътрешния предава управлението извън най-външния цикъл.