Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика.doc
Скачиваний:
89
Добавлен:
15.03.2015
Размер:
2.58 Mб
Скачать

Тема 2. Разветвляющиеся вычислительные процессы

Теоретический материал

Базовые конструкции структурного программирования

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

линейная цикл разветвление

Рис.2.1 Базовые конструкции структурного программирования

Операторы управления вычислительным процессом

true

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

О

п

  • структурного программирования (то есть использование всего того, о чем говорилось в теоретическом материале).

  1. Программа должна быть написана на языке C++, который мы используем в рамках структурной парадигмы.

  2. Контрольные расчеты должны быть выполнены до запуска программы (на калькуляторе, в системе Maxima,в системе MathCAD или любым другим способом); контрольные расчеты предполагают набор некоторых проверочных исходных данных и получение соответствующих этим наборам результатов. При тех же исходных данных результаты работы программы должны совпасть с контрольными расчетами.

  3. Ввод/вывод исходных данных и результатов в работах с линейными, разветвляющимися и циклическими программами должен производиться в стиле С; в работах с массивами – в стиле С++.

  4. Обработка данных в соответствии с заданием;

Отладка программы, то есть процесс исправления 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.

Соседние файлы в предмете Информатика