Составление алгоритма решения. Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см

Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см. разд. 2.6). С учетом этого схемы алгоритмов представлены на рис. 4.11 а, 4.11 б. Схема алгоритма по третьему варианту реализована рис. 4.12.

Наличие в алгоритмах ряда параллельно расположенных блоков (4-8 рис. 4.11 а, 4-6 рис. 4.11 б, 5-7 рис. 4.12) требует преобразования их в условно-линейные (рис. 4.13).

Программирование задачи

Алгоритм организации ветвления типа «выбор» со значительным числом ветвей в зависимости от значения проверяемого целочисленного операнда (выражения) реализуется в Си/Си++ специальной конструкцией из двух операторов – переключателя (switch) и разрыва (break).

Структура конструкции:

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

{

case n1:

оператор 1;

[break;]

. . .

case ni:

оператор i;

[break;]

Составление алгоритма решения. Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см - student2.ru

Составление алгоритма решения. Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см - student2.ru

Рис. 4.11. Схемы алгоритмов задачи 4.4 с множественным ветвлением

Составление алгоритма решения. Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см - student2.ru

Рис. 4.12. Схема алгоритма задачи 4.4 с последовательным ветвлением на два

Составление алгоритма решения. Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см - student2.ru

Рис. 4.13. Варианты условно линейных схем алгоритмов

. . .

case nN:

оператор N;

[break;]

[default:

оператор N+1;]

}

где switch –ключевое слово, название основного оператора (переключатель);

выражение – любое с целочисленным результатом;

( ) – ограничители выражения;

case –ключевое слово (вариант);

n1 ni nN – целая константа (метка), обозначающая требуемый вариант (начиная с нуля);

: – признак метки;

оператор i; –один из простых операторов, соответствующих каждому варианту выбора;

default –ключевое слово (по умолчанию);

{ } – ограничители тела оператора switch;

[ ] – признак необязательности содержимого;

break – вспомогательный оператор (разорвать, выйти).

Оператор работает следующим образом:

· вычисляется значение выражения переключения. Результат – целая (символьная) константа;

· результат последовательно сравнивается с каждой из меток ni в диапазоне от n1 до nN;

· если совпадение с одной из меток ni произошло, выполняется соответствующий оператор (i) и оператор break, если он имеется, передает управление оператору программы, расположенному под закрывающей фигурной скобкой. (При отсутствии оператора break после оператора i сохраняется естественный порядок выполнения ниже записанных операторов, начиная с (i+1));

· если метки ni, аналогичной результату вычисления выражения не обнаружено и элемент по умолчанию (default: оператор N+1;) присутствует, управление передается оператору N+1, а затем оператору, расположенному под закрывающей фигурной скобкой.

При отсутствии элемента по умолчанию управление напрямую передается оператору под фигурной скобкой.

Так, фрагменты программ

int i; . . . switch( i ) { case 1: x=1; break; case 2: y=7; break; case 6: z=15; break; default: t=0; } s=3; int i; . . . switch( i ) { case 1: x=1; break; case 2: y=7; break; case 6: z=15; break; } s=3;  

предписывают вычисление х, если i = 1, вычисление у, если i = 2, вычисление z при i = 6, а затем передачу управления на вычисление переменной s. Если же i Составление алгоритма решения. Алгоритмизация по первому и второму вариантам математической формулировки требует использования специфической структуры «множественный выбор» (см - student2.ru 1, 2, 6, то в левом фрагменте будут вычислены t и s, а в правом фрагменте – только s.

Правила составления и использования

Метки ni задаются пользователем произвольно (желательно по нарастанию) и не могут повторяться.

В одном операторе switch может быть не более 257 вариантов выбора.

Отсутствие операторов break позволяет получить чистую структуру оператора switch. В этом варианте после выбора нужной ветви будут последовательно выполнены все ниже расположенные варианты, включая default, если он имеется.

Элемент по умолчанию может быть не последним в теле оператора switch. При этом, если оператор break в его ветви отсутствует, то будут последовательно выполнены все ниже расположенные варианты.

Использование чистого оператора switch при отсутствии некоторых операторов ветвей позволяет выполнять передачу управления на одну ветвь по нескольким разным меткам, записанным выше.

Метками оператора goto помечать ключевые слова case и default запрещается – они сами выполняют функцию меток.

Так, фрагмент программы

int a, b;

. . .

switch ( a – b )

{

case 0:

case 1:

case 2:

x=96.;

default:

y=3;

case 5:

z=12;

}

d=6.;

предписывает в случае, если (а - b) равно нулю, единице или двойке вычисление х, а затем y, z, d. Если (a - b) равно 5 – вычисляется z и d. Если (а - b) не равно 0, 1, 2, 5 – вычисляется y, z и d.

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

С учетом изложенного, запрограммируем решение задачи.

Идентификация переменных представлена в табл. 4.9.

Таблица 4.9

Обозначение в алгоритме Баз k Балл Ст N
Обозначение в программе baz kbaz ball St n

С учётом таблицы идентификации на основании схем алгоритма запишем программы решения задачи.

Программа по левой условно-линейной схеме «множественное ветвление»

Особенность левой условно-линейной схемы – сохранение естественного порядка расчета при выполнении отдельных условий и нарушение этого порядка, когда условия не выполняются. Программирование такого варианта требует использования полной структуры «множественный выбор».

/* Множественное ветвление. switch */

#include<stdio.h>

#include<stdlib.h>

main( )

{

float baz, kbaz, st;

int ball, n;

scanf("%f %f %d", &baz, &kbaz, &ball);

switch(ball)

{

case 0:

st = 0;

n = 0;

break;

case 2:

st = 0;

n = 2;

break;

case 3:

st = 0;

n = 3;

break;

case 4:

st = baz;

n = 4;

break;

case 5:

st = baz + kbaz*baz;

n = 5;

break;

default:

printf("Error");

}

printf("\n baz=%.2f kbaz=%.2f ball=%d ",baz, kbaz, ball);

printf("\n st=%.2f n=%d", st, n);

}

Пять строк численных значений вводимых переменных позволяют проверить все возможные вычислительные ветви (= 0, = 2, = 3, = 4, = 5).
300. 0.25 0

300. 0.25 2

300. 0.25 3

300. 0.25 4

300. 0.25 5

Результаты решения представлены в приложении 4.7 (а, б, в, г, д).

Внимание! Сообщение «Error» в строке выводимых данных свидетельствует о вводе в качестве балла любого непредусмотренного задачей значения.

Программа по центральной условно-линейной схеме «множественное ветвление»

Особенность центральной условно-линейной схемы – сохранение естественного порядка расчета при последовательном выполнении отдельных условий и нарушение этого порядка, когда условия не выполняются.

Программирование такого варианта требует использования полной структуры «множественный выбор».

Внимание! Попытка присвоить значение номера ветви 023 переменной n (n = 023) расценивается ЭВМ как работа с восьмеричным числом (238), поэтому при программировании номер ветви изменен на 320 (n = 320).

/* Множественное ветвление. switch */

#include<stdio.h>

#include<stdlib.h>

main( )

{

float baz, kbaz, st ;

int ball, n;

scanf("%f %f %d", &baz, &kbaz, &ball);

switch(ball)

{

case 0:

case 2:

case 3:

st = 0;

n = 320;

break;

case 4:

st = baz;

n = 4;

break;

case 5:

st = baz + kbaz*baz;

n = 5;

break;

default:

printf("Error");

}

printf("\n baz=%.2f kbaz=%.2f ball=%d ",baz, kbaz, ball);

printf("\n st=%.2f n=%d", st, n);

}

300. 0.25 0

300. 0.25 2

300. 0.25 3

300. 0.25 4

300. 0.25 5

Пять строк численных значений вводимых переменных позволяют проверить все возможные вычислительные ветви (= 0, = 2, = 3, = 4, = 5).

Результаты представлены в приложении 4.8 (а, б, в, г, д).

Внимание! Сообщение «Error» в строке выводимых данных свидетельствует о вводе в качестве балла любого непредусмотренного задачей значения.

Программа по правой условно-линейной схеме «последовательное ветвление на два»

Правая условно-линейная схема по стилю аналогична левой – сохраняет естественный порядок расчета при выполнении каждого условия и нарушает его, когда условия не выполняются. Программирование такого варианта реализуется с помощью полного if.

/* Сложное ветвление. Полный if */

#include<stdio.h>

#include<stdlib.h>

main( )

{

float baz, kbaz, st ;

int ball, n;

scanf("%f %f %d", &baz, &kbaz, &ball);

if(ball < 4)

{

st = 0;

n=320;

}

else

if(ball ¹ 5)

{

st = baz;

n = 4;

}

else

{

st = baz + kbaz*baz;

n = 5;

}

printf("\n baz=%.2f kbaz=%.2f ball=%d ",baz, kbaz, ball);

printf("\n st=%.2f n=%d", st, n);

}

300. 0.25 0

300. 0.25 2

300. 0.25 3

300. 0.25 4

300. 0.25 5

Пять строк численных значений вводимых переменных позволяют проверить все возможные вычислительные ветви.

Результаты представлены в приложении 4.9 (а, б, в, г, д).

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

Заключение

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

Условие – зависимость, формирующая узел ветвления.

Варианты условий – простые, составные, сложные в соответствии с количеством используемых (заданных) логических и арифметических операций.

Узел ветвления – точка преобразования исходной (входной) ветви в несколько формируемых (выходных).

Варианты узлов – простой (две выходные ветви), сложный (три и более выходных ветвей).

Ветвь – каждый из возможных вариантов решения.

Пути реализации ветвящихся процессов – универсальный (последовательным делением на два), частный случай (одноузловое множественное условие).

В универсальном варианте ветвлений число конечных ветвей на единицу больше количества проверяемых условий.

Программные средства – операторы передачи управления (условный и безусловный), структура «множественный выбор».

Использование ветвящихся процессов в чистом виде достаточно редко. Эффективность программирования – наименьшая из всех типовых вычислительных процессов (ветвей много, но в каждом конкретном вычислении требуется только одна).

Значительные перспективы использования в смешанных вычислительных процессах в комплексе с циклами – поиск экстремумов, сортировка и т. п.

Вопросы для контроля

Какой вычислительный процесс называется ветвящимся?

Что такое ветвь?

Для чего выполняются условно-линейные схемы алгоритмов?

Для чего нужны операторы передачи управления?

Какова структура оператора безусловной передачи управления?

Какие операторы условной передачи управления используются в Си/Си++?

Каковы структуры неполного и полного оператора условной передачи управления?

Как записываются операции отношения?

Какие логические операции используются в Си/Си++?

Что такое сложные условия?

Что такое главное и вспомогательные условия?

Как выполняется последовательное ветвление?

Для чего выполняются условно-линейные схемы алгоритмов?

Почему разные условные операторы требуют различных условно-линейных схем?

Когда используются сложные ветвления?

Какова структура оператора switch?

Когда и для чего применяется оператор break?

Наши рекомендации