Программирование ветвлений
Для программирования ветвящихся алгоритмов в языке Си имеется несколько различных средств:операция условия “?:”, условный оператор if и оператор выбора switch.
Условный оператор. Формат условного оператора следующий:
if(<выражение>) <оператор1;> [else <оператор2;>]
Его можно использовать в полной и неполной формах. Выражение – это некоторое условие, содержащее операции отношения и логические операции. Если выражение истинно, выполняется оператор1, если ложно – оператор2.
Необходимо обратить внимание на следующие особенности синтаксиса условного оператора:
- выражение записывается в круглых скобках;
- точка с запятой после оператора 1 ставится обязательно.
Вот пример использования полной формы условного оператора для нахождения большего значения из двух переменных a и b:
if(a>b) max=a; else max=b;
Та же самая задача может быть решена с использованием неполного ветвления следующим образом:
max=a; if(b>a) max=b;
Решение этой задачи с помощью операции «условие» было рассмотрено раньше.
Рассмотрим примеры программирования вложенных ветвящихся структур. Требуется вычислить функцию sign(x) – знак x, которая определена следующим образом:
Пример 1.
Алгоритм с полными вложенными ветвлениями. | Алгоритм с неполным ветвлением |
if(x<=0) if(x==0) y=0; else y=–1; else y=1; | y=1; if(x<=0) if(x==0) y=0; else y=–1; |
Пример 2. Упорядочить по возрастанию значения в двух переменных a, b.
if(a>b){c=a; a=b; b=c;}
cout<<”a=”<<a<<”b=”<<b;
В данном примере использован составной оператор: последовательность операторов, заключенная в фигурные скобки. Обратите внимание на то, что перед закрывающей фигурной скобкой точку с запятой надо ставить обязательно, а после скобки точка с запятой не ставится.
В следующем примере вернемся к задаче вычисления площади треугольника по длинам трех сторон. Добавим в программу проверку условия правильности исходных данных: a, b, c – положительные величины, а также сумма длин каждой пары сторон треугольника должна быть больше длины третьей стороны.
Пример 3.
// Площадь треугольника
#include <iostream.h>
#include<math.h>
void main()
{float a,b,c,p,s;
cout<<²\na=²; cin>>a;
cout<<²\nb=²; cin>>b;
cout<<²\nc=²; cin>>c;
if(a>0 && b>0 && c>0 && a+b>c && a+c>b && b+c>a)
{ p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
cout<<²\nПлощадь треугольника=²<<s;
}
else cout(²\n Неверные исходные данные.²);
}
Оператор выбора (переключатель).Формат оператора выбора:
switch (целочисленное_выражение)
{ case константа1: список_операторов;
case константа2: список_операторов;
. . . . . . . . . . . . . . . . . . .
[default: список_операторов;]
}
Выполнение оператора происходит в следующем порядке:
1) вычисляется выражение;
2) полученное значение последовательно сравнивается с константами, помещенными после служебного слова case;
3) как только значение выражения совпало с константой после служебного слова case, то на эту последовательность операторов передается управление. А дальше выполняются все остальные операторы, расположенные ниже;
4) если ни с одной из констант совпадения не произошло, то выполнятся операторы после слова default., если эта ветвь записана в операторе, или управление передается на оператор, следующий за оператором switch.
Для того чтобы обойти выполнение операторов на последующих ветвях, нужно принять специальные меры, используя для этого оператор break.
Рассмотрим фрагмент программы, который переводит числовую оценку знаний ученика в ее словесный эквивалент, согласно вузовской системе: 5 – отлично, 4 – хорошо, 3 - удовлетворительно, 2 – неудовлетворительно.
Пример 5.
#include <iostream.h>
void main()
{int ball;
cout<<²\nВведите оценку: ²; cin>>ball;
switch (ball)
{ case 2: cout<<”\tЭто неудовлетворительно!\n”; break;
case 3: cout<<”\tЭто удовлетворительно!\n”; break;
case4: cout<<”\t Это хорошо!\n”; break;
case 5: cout<<”\tЭто отлично!\n”; break;
default: cout<<”\tНет такой оценки!\n”;
}
}
Вот два варианта результатов выполнения этой программы:
Введите оценку: 3 Это удовлетворительно!
Введите оценку: 7 Нет такой оценки!
Если на всех ветвях убрать оператор break, то возможен такой результат работы этой программы:
Введите оценку: 3 Это удовлетворительно!
Это хорошо!
Это отлично!
Нет такой оценки!
Возможны задачи, в которых такой порядок выполнения ветвей оператора выбора может оказаться полезным. В следующем фрагменте программы происходит возведение вещественного числа хв целую степень n в диапазоне от 1 до 5.
y=1.0;
switch(n)
{ case 5: y=y*x;
case 4: y=y*x;
case 3: y=y*x;
case 2: y=y*x;
case 1: y=y*x; cout<<”y=”<<y; break;
default: cout<<”Степень больше 5”;
}
Упражнения
1. Составьте программу решения квадратного уравнения: ax2+bx+c=0, учитывающую все возможные варианты исходных данных.
В каждом случае должно выводиться соответствующее решение или сообщение.
2.Составьте программу, которая выводит на экран меню:
1.Первое
2.Второе
3.Третье
и, в зависимости от выбранного пункта, выдает одну из надписей: «Получите суп.», «Получите картошку», «Получите компот», «Оставайтесь голодным». Напишите два варианта программы: с использованием условного оператора if и с использованием переключателя.