Читайте также:
|
|
Алгоритм организации ветвления типа «выбор» со значительным числом ветвей в зависимости от значения проверяемого целочисленного операнда (выражения) реализуется в Си/Си++ специальной конструкцией из двух операторов – переключателя (switch) и разрыва (break).
Структура конструкции:
switch(выражение)
{
case n1:
оператор 1;
[break;]
...
case ni:
оператор i;
[break;]
...
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 1, 2, 6, то в левом фрагменте будут вычислены t и s, а в правом фрагменте – только s.
Правила составления и использования
1. Метки ni задаются пользователем произвольно (желательно по нарастанию) и не могут повторяться.
2. В одном операторе switch может быть не более 257 вариантов выбора.
3. Отсутствие операторов break позволяет получить чистую структуру оператора switch. В этом варианте после выбора нужной ветви будут последовательно выполнены все ниже расположенные варианты, включая default, если он имеется.
4. Элемент по умолчанию может быть не последним в теле оператора switch. При этом, если оператор break в его ветви отсутствует, то будут последовательно выполнены все ниже расположенные варианты.
5. Использование чистого оператора switch при отсутствии некоторых операторов ветвей позволяет выполнять передачу управления на одну ветвь по нескольким разным меткам, записанным выше.
6. Метками оператора 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, но не соответствует стандартной структуре «выбор» и используется как специфический.
С учетом изложенного, запрограммируем решение задачи.
Идентификация переменных представлена в табл. 2.
Таблица 2
Обозначение в алгоритме | Баз | 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);
}
|
300. 0.25 2
300. 0.25 3
300. 0.25 4
300. 0.25 5
Программа по центральной условно-линейной схеме «множественное ветвление»
Особенность центральной условно-линейной схемы – сохранение естественного порядка расчета при последовательном выполнении отдельных условий и нарушение этого порядка, когда условия не выполняются.
Программирование такого варианта требует использования полной структуры «множественный выбор».
ü Внимание! Попытка присвоить значение номера ветви 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 (а, б, в, г, д).
Предлагаемые варианты реализации простых и сложных ветвящихся вычислительных процессов универсальны и могут использоваться при решении ветвящихся задач любых видов и типов.
Вопросы для контроля
1. Какой вычислительный процесс называется ветвящимся?
2. Что такое ветвь?
3. Для чего выполняются условно-линейные схемы алгоритмов?
4. Для чего нужны операторы передачи управления?
5. Какова структура оператора безусловной передачи управления?
6. Какие операторы условной передачи управления используются в Си/Си++?
7. Каковы структуры неполного и полного оператора условной передачи управления?
8. Как записываются операции отношения?
9. Какие логические операции используются в Си/Си++?
10. Что такое сложные условия?
11. Что такое главное и вспомогательные условия?
12. Как выполняется последовательное ветвление?
13. Для чего выполняются условно-линейные схемы алгоритмов?
14. Почему разные условные операторы требуют различных условно-линейных схем?
15. Когда используются сложные ветвления?
16. Какова структура оператора switch?
17. Когда и для чего применяется оператор break?
Дата добавления: 2015-07-15; просмотров: 61 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Выбор метода решения | | | Требования к отчету |