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

Основным средством для организации мультиветвления служит оператор-переключатель, формат которого имеет вид:

switch(выражение)

{

case константа1: операторы_1;

case константа2: операторы_2;

default: операторы;

}

В этом операторе используются три служебных слова:

switch, case, default. Первое из них идентифицирует собственно оператор-переключатель. Служебное слово case с последующей константой является в некотором смысле меткой. Константы могут быть целыми или символьными и все должны быть различными (чтобы метки были различимы). Служебное слово default также обозначает отдельную метку. При выполнении оператора вычисляется выражение, записанное после switch, и его значение последовательно сравнивается с константами, которые помещены вслед за case. При первом же совпадении выполняются операторы, помеченные данной меткой. Если выполненные операторы не предусматривают какого-либо перехода (т.е, среди них нет ни goto, return, exit, break) , то далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель.

Операторы вслед за default выполняются, если значение выражения в скобках после switch не совпало ни с одной константой после case. Метка default может в переключателе отсутствовать. В этом случае при несовпадении значения выражения с константами переключатель не выполняет никаких действий. Операторы, помеченные меткой default не обязательно находятся в конце (после других вариантов переключателя).

На рис. 2.5.1 приведены схемы переключателя
(рис- 2.5.1, а) и оператора альтернативного выбора или селектора (рис- 2.5.1 , б), отсутствующего в языке Си.

 

Рис.2.5.1 Переключатель (а) и альтернативный выбор (б):

а - если выражение равно МК, то выполняются опсраторыSk,Sk+1,...

б - если выражение равно LK, то выполняются только операторы Sk.

Для реализации оператора альтернативного выбора в конце каждой последовательности операторов переключателя должен присутствовать оператор break.

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

Пример.

#include <stdio.h>

void main( )

{

int i;

while(l)

{

printf("\n Bвeдитe деcятичнyю цифpy: ");

scanf("%d",&i);

printf("\t\t");

switch( i )

{

case 1: printf("%d -oдин \n",i);

break;

case 2: printf("%d - двa \n",i);

break;

case 3: printf("%d - тpи \n",i);

break;

case 4: printf("%d - чeтыpe \n",i);

break;

case 5: printf("%d - пять \n",i);

break;

case 6: printf("%d - шеcть \n",i);

break;

case 7: printf("%d - ceмь \n",i);

break;

case 8: printf("%d - вoceмь \n",i);

break;

case 9: printf("%d - дeвять \n",i);

break;

case 0: printf("%d - нyль \n",i);

break;

default: printf("%d - этo нe цифpa! \n",i);

return;

} /* Koнeц пepeключaтeля */

}

}

Задача. Написать программу заполнения квадратной матрицы целыми числами натурального ряда по спирали.

Решение.

Прежде всего, сформулируем обобщенный словесный алгоритм решения поставленной задачи:

Пока не обработана матрица A

- выбрать вектор

- записать очередные члены натурального ряда в вектор.

Уточним понятия вектора в данной задаче – вектор это элементы строки или столбца матрицы. Каждый вектор будет характеризоваться направлением. Допустим, что мы начинаем заполнять матрицу, с левого верхнего угла по часовой стрелке, i – индекс строки, j – индекс столбца. В этом случае варианты возможных направлений следующие:

1. строка i – const, j++ →

2. столбец i++, j-const ↓

3. строка i – const, j-- ←

4. столбец i--, j-const ↑.

При рассуждениях, как надо заполнять очередную строку или столбец, нужно учесть, что диапазон индексов свободных ячеек матрицы будет уменьшаться. Например, при заполнении первой строки, останутся свободными ячейки с индексами строки от второй строки до последней. Допустим, что размер матрицы A[NxN]. В С нумерация индексов начинается с нуля. Тогда второй строкой будет строка с индексом 1, а последней – с индексом N-1. Очевидно, что движение по спирали будет изменять как начальные значения диапазона индексов векторов, так и конечные. Следовательно, необходимы переменные контроля границ допустимых значений индексов строк и столбцов:

i_0 – начальный индекс строки

j_0 – начальный индекс столбца

i_N – конечный индекс строки

j_N – конечный индекс столбца.

Для выбора направления введем переменную v, для счета ячеек матрицы – переменную count.

Уточним словесный алгоритм для обработки строки направления 1.

i=i_0; j=j_0;

Пока не обработана строка A[i,j++]=++count;

i_0++; v=2.

Остальные вектора направлений 2, 3 и 4 заполняются по аналогии.

Программа:

#define N 7

#include <iostream>

using namespace std;

//typedef unsigned int UINT;

int _tmain(int argc, _TCHAR* argv[])

{

int C=N*N,i_0=0,j_0=0,i_N=N-1,j_N=N-1,v=1,count=0;

//С- число элементов матрицы

int i,j;//Текущие индексы

int A[N][N];

do

{

switch(v)

{

case 1:

i=i_0;j=j_0;

do{A[i][j++]=++count;}while(j<=j_N);

i_0++;

v=2;

break;

case 2:

i=i_0;j=j_N;

do{A[i++][j]=++count;}while(i<=i_N);

j_N--;

v=3;

break;

case 3:

i=i_N; j=j_N;

do{A[i][j--]=++count;}while(j>=j_0);

i_N--;

v=4;

break;

case 4:

i=i_N;j=j_0;

do{A[i--][j]=++count;}while(i>=i_0);

j_0++;

v=1;

break;

 

}

 

}

while(count<C);

 

for(i=0;i<N;i++)

{

for(j=0;j<N;j++)

cout<<A[j][i]<<"\t";

cout<<endl;

}

return 0;

}