Тема 2. Разветвляющиеся вычислительные процессы
Теоретический материал
Базовые конструкции структурного программирования
Программу для решения задач любой сложности можно составить, используя только три базовые конструкции - линейную, разветвления и циклы. В теории программирования это математически строго доказано. Особенность этих конструкций состоит в том, что они имеют один вход и один выход, поэтому эти конструкции могут вкладываться друг в друга произвольным образом.
линейная цикл разветвление
Рис.2.1 Базовые конструкции структурного программирования
Операторы управления вычислительным процессом
true
О
п
структурного
программирования (то есть использование
всего того, о чем говорилось в
теоретическом материале).
Программа
должна быть написана на языке C++,
который мы используем в рамках
структурной парадигмы.
Контрольные
расчеты должны быть выполнены до
запуска программы (на калькуляторе,
в системе Maxima,в
системе MathCAD
или любым другим способом); контрольные
расчеты предполагают набор некоторых
проверочных исходных данных и получение
соответствующих этим наборам
результатов. При тех же исходных данных
результаты работы программы должны
совпасть с контрольными расчетами.
Ввод/вывод
исходных данных и результатов в
работах с линейными, разветвляющимися
и циклическими программами должен
производиться в стиле С; в работах с
массивами – в стиле С++.
Обработка
данных в соответствии с заданием; Отладка
программы, то есть процесс исправления
true
Простой оператор- это оператор, не содержащий другие операторы. Последним символом в каждом операторе является символ точка с запятой.
Есть понятие – пустой оператор. Пустой оператор состоит из единственного символа – точка с запятой.
Составной оператор или БЛОК - это любая совокупность простых операторов, заключенных в фигурные скобки.
Управляющие операторы, реализующие разветвляющиеся алгоритмы
Для выполнения ветвления применяются операторы if и switch, а также операция условия ?:.
Условный оператор if.
Рис.2.2. Структурная схема условного оператора
Оператор if используется для разветвления, то есть для выбора возможного продолжения вычислительного процесса.
(1) if (выражение) оператор;
(2) if (выражение) оператор 1;
else оператор 2;
Алгоритм работы
Вычисляется выражение. (Результат вычисления может иметь арифметический тип или тип указателя.)
Если результат вычисления отличен от нуля (true), то выполняется <оператор> или <оператор1>.
Если результат равен нулю (false), то выполняется
< оператор 2>.
Для случая (1) <оператор > пропускается, и управление передается на следующий после if оператор.
Операторы <оператор1> и <оператор2> сами могут быть операторами if, образуя вложенный if. Компилятор интерпретирует вложенные if,сопоставляя каждое из ключевых слов else с последним встретившимся словом if, не имеющим своего else. Соответствие ищется в пределах блока, в котором находится данный if. Внутренние и внешние блоки при этом не рассматриваются. Если соответствие для if не найдено, компилятор полагает, что if не имеет ветви else.
Пример
Ввести с клавиатуры два целых числа и найти максимальное.
#include<stdio.h>
int main() {
int x,y,max;
printf("enter x=");
scanf("%d",&x);
printf("enter y=");
scanf("%d",&y);
if(x>y)
max=x;
else
max=y;
printf("x=%d y=%d max=%d\n",x,y,max);
return 0;
}
Протокол работы
enter x=5
enter y=8
x=5 y=8 max=8
enter x=8
enter y=5
x=8 y=5 max=8
Работа оператора if начинается с проверки условия в круглых скобках
(if x > y). Если вы ввели x=8, а y=5, то условие оказалось выполненным и, следовательно будет выполнен оператор, стоящий в веточке if, а именно, max=x, то есть 8. В противном случае сработает веточка else и будет выполнен оператор max=y.
Точка с запятой является заключительным символом любого оператора (а не разделителем), поэтому точка с запятой ставится и после max=x; и после max=y; .
Операция условия ?:
Кроме рассмотренного оператора if есть операция условия ? :.
условное_ выражение ? TRUE_оператор : FALSE_оператор;
При выполнении операции условия сначала вычисляется значение условного_ выражения. Если результат истина(true) , то результатом всей операции является результат выражения TRUE_оператор, если – ложь(false) , результат выражения FALSE_оператор.
Рассмотренная выше программа могла бы использовать вместо оператора if эту операцию условия, и тогда программа нахождения максимального числа выглядела бы так:
#include<stdio.h>
int main() {
int x,y,max;
printf("enter x=");
scanf("%d",&x);
printf("enter y=");
scanf("%d",&y);
max=(x>y)? x:y;
printf("x=%d y=%d max=%d\n",x,y,max);
return 0;
}
протокол работы
enter x=8
entery=5
x=8 y=5 max=8
Если (x>y) ,то max=x, иначе max=y.
Результаты получили точно такие же, как и при использовании оператора if , но запись получилась проще и нагляднее.
Рассмотрим еще один фрагмент:
int x=1,y=1;
if(x==1)
if(y==1)
printf(“x равно 1 и y равно 1”);
else
printf(“x не равно 1”);
Строка “x не равно 1” будет выводиться тогда, когда значение x на самом деле равно 1. Ошибка связана с тем, что компилятор сопоставляет if с ближайшим else.
Для исправления ошибки надо ввести {}:
int x=1, y=1;
if(x==1)
{if(y==1)
printf(“x равно 1 и y равно 1”);
}
else
printf(“x не равно 1”);
Операторы switch и break
Оператор switch используется для выбора одного варианта из многих.
(вместо нечеткого if-else).
switch(выражение-cелектор)
{
case constant_1: < оператор1>;[break;]
case constant_2: <оператор2>; [break;]
. . . . . . . . . . . . .
. . . . . . . . . . . . . .
case constant_N: <операторN>;[break;]
default: <оператор N+1;>
}
Сначала вычисляется значение выражения - селектора, которое сравнивается со значением констант (или константных выражений). Тип значения выражения-селектора –целый: char, int.
Выполняются только те операторы, которые помечены меткой-constant,совпадающей с селектором. Break дает возможность осуществить выход из оператора switch. Если break будет отсутствовать, то будут выполнены все операторы, следующие после метки, совпавшей с селектором, включая default.Ветка default может отсутствовать. Если ни одна из меток-констант не совпадает с селектором, то выполнится оператор, следующий за default.
Пример программы, реализующей мини-калькулятор, способный производить сложение, вычитание, умножение и деление.
#include<iostream.h>
int main() {
float a,b,f,res;
char op;
cout<<"\n enter a="; cin>>a;
cout<<"\n enter op="; cin>>op;
cout<<"\n enter b="; cin>>b;
f=1;
switch(op) {
case'+': res=a+b; break;
case'-': res=a-b; break;
case'*': res=a*b; break;
case'/': res=a/b; break;
default: cout<<"try again\n"; f=0;
}
if(f) cout<<"\nresult="<<res<<endl;
return 0;
}
Протокол работы
enter a=6.6
enter op=/
enter b=2.0
result=3.3
Оператор switch более нагляден, и его применяют, если в программе более 2-3 разветвлений. Выражение, по которому осуществляется переход на ту или иную ветвь op, является целочисленным.
Пример разветвляющейся программы.
Решить на компьютере задачу вычисления значений функции y=f(x),где
y=
Рабочий набор x=13
Текст программы
#include<stdio.h>
#include<math.h>
int main() {
float x,y,z;
printf("\n x=");
scanf("%f",&x);
if(x>3)
y=27+pow((x-3),3);
else
if (x>1)
y=pow(x,3);
else
if(x>0)
y=x;
else
y=sin(x)*sin(x)/2;
printf("\n y=%f при x=%f",y,x);
return 0 ;
}
Выполнить вариант при x=13 Контрольные расчеты провести для всех ветвей алгоритма. В зависимости от введенного значения x, будет работать та или иная веточка алгоритма. Правильность работы программы должна быть проверена для каждой веточки алгоритма
Контр расчет:
x=5.0 y=35.000000 (x>3)
x=2.0 y=8.000000 (x>1)
x=0.8 y=0.000000 (x>0)
x=-3.1415 y=0.000000 (x<0)
x=13 y=1027.000000
(при заданном рабочем значении x=13)
Примечание.
При проверке условий нельзя использовать двухсторонние неравенства, то есть x<y<z.Синтаксически ошибки нет, и компилятор не выдаст сообщения. Но что же произойдет при вычислениях? Операции одного приоритета выполняются слева – направо, поэтому сначала выполнится x<y и сформируется результат в виде true или false. Далее произойдет сравнение true<z или false <z.Значения true и false преобразуются соответственно в 1 и 0 того же типа, что и z. Полученный результат вряд ли отвечает нашим ожиданиям.
операторы, следующие после метки, совпавшей с селектором, включая default.Ветка default может отсутствовать. Если ни одна из меток-констант не совпадает с селектором, то выполнится оператор, следующий за default.
Варианты заданий к работе 2
Необходимо написать программу для решения задачи вычисления некоторой функции y=f(x) , заданной различными формулами на различных участках ее определения. Используйте различные формы условных операторов в соответствии с теоретическим материалом, описанным выше
Таблица 2.1
Номер варианта |
Функция y = f(x) |
Рабочий набор данных
|
| ||||||
X |
| ||||||||
1 |
|
7,4 |
| ||||||
2 |
4,3 |
| |||||||
3 |
10,9 | ||||||||
4 |
-10 | ||||||||
5 |
9,2 | ||||||||
6 |
25 | ||||||||
7 |
-19,8 | ||||||||
8 |
3,1415 |
9 |
0 | ||
10 |
100 | ||
11 |
-15,5 | ||
12 |
7,6 | ||
13 |
40 | ||
14 |
12 |
15 |
1,5 | |
16 |
3 | |
17 |
2 | |
18 |
3,1415 | |
19 |
23 | |
20 |
2 | |
21 |
5,7 | |
22 |
20,5 | |
23 |
-2,5 | |
24 |
-3 | |
25 |
2,4 | |
26 |
11,5 | |
27 |
3,4 | |
28 |
6,9 |
29 |
4,5 | |
30 |
13 |
Общие требования к выполнению лабораторных работ и оформлению отчетов приведены в работе 1.