Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Курс Лекций ОАиП.doc
Скачиваний:
65
Добавлен:
21.03.2016
Размер:
5.89 Mб
Скачать

3.2.3 Примеры программирования разветвляющихся алгоритмов

Задача 1. Даны два вещественных числа x и y – координаты точки (x,y) на плоскости и область D, заданная графически (рис. 3.2). Вычислить значение z, заданное формулой

Рис. 3.2 D - заштрихованная область

Решение. Из рис. 3.2 видно, что область D является объединением двух областей – квадрата со стороной, равной 1, и части круга с радиусом, равным 1. Следовательно, условие (x,y D состоит в том, что точка с координатами (x,y) принадлежит квадрату или сегмента круга. Условие принадлежности точки квадрату, изображенному на рис. 1.2, можно записать в виде логического выражения

x>=-1 && x<=0 && y<=1 && y>=0, (2)

а условие принадлежности точки сегменту – в виде логического выражения

x>=0 && x<=1 && y>=-1 && y<=0 && x*x+y*y<=1 (3)

Объединив выражения (2) и (3) знаком логической операции || (ИЛИ), получим логическое выражение, соответствующее условию (x,y D, которое затем используем в операторе if- else.

Графическая схема алгоритма решения задачи изображена на рис. 3.3. Алгоритм содержит ветвление, на каждой ветви которого имеется лишь по одной команде. Программируется такое ветвление с помощью оператора if- else.

Рис. 3.3 Решение задачи 1.

/* Текст программы */

#include <stdio.h>

#include <math.h>

main()

{ float x,y,z;

puts("Введите координаты точки (x,y)");

scanf("%f %f",&x,&y);

if ( x>= -1 && x<=0 && y<=1 && y>=0

|| x>=0 && x<=1 && y>=-1 && y<=0 && x*x+y*y<=1 )

z=1+x*y;

else z=5;

printf(" Для точки (%.2f,%.2f) z=%.4f", x, y, z);

fflush(stdin); getchar();

return(0);

}

Задача 2. Вычислить значение функции

Решение. Необходимо задать значение x и проанализировать, по какой из трех формул, необходимо вычислить y . При этом придется задать один или два вопроса. Например, для x=6, зададим вопрос x>5 и x¹10? Ответ будет "Да", следовательно, вычислять y надо по первой формуле. Пусть x=3,14159. На вопрос x>5 и x¹10? ответ будет "Нет", т.е. вычислять y надо по второй или третьей формуле. Для выяснения, по какой конкретно, необходимо задать еще один вопрос, например, ? В этом случае ответ будет "Да". Следовательно,y должно вычисляться по второй формуле. Рассуждая аналогично, придем к выводу, что для x=-5 необходимо задать два вопроса x>5 и x¹10? и ? На каждый из вопросов будет получен ответ "Нет", следовательно,y надо вычислять по третьей формуле. Таким образом, приходим к разветвляющемуся алгоритму, изображенному на рис. 3.4. В алгоритме предусмотрен вывод исходных данных, формулы и номера формулы, по которой производится вычисление y. +

Сведем в таблицу соответствия (табл. 3.5) обозначения переменных в задаче и в программе.

Таблица 3.5

Таблица соответствия

Обозначения в задаче

Имена в алгоритме и программе

Тип данных

Комментарий

x

x

вещественный

исходное данное – аргумент функции

y

y

-//-

результат – значение функции

n

целочисленный

номер формулы

z

строка

вид формулы

Рис.3.4 Алгоритм решения задачи 2

В программе блокам 3-5, 7-9, 10-12 графической схемы соответствуют составные операторы оператор 1, оператор 2, оператор 3, соответственно.

/* Программа задачи 1.2 */

#include <stdio.h>

#include <math.h>

main()

{

float x,y;

int n;

char *z;

puts("Введите x");

scanf("%f",&x);

if(x>5 && x!=10)

{ y=x*x;

n=1;

z="y=x*x";

}

else

if(x>=0 && x<=5)

{

y=sin(x);

n=2;

z="y=sinx";

}

else

{

y=2*x;

n=3;

z="y=2x";

}

printf("При x=%.2f y=%.4f (формула %d:%s)\n",x,y,n,z);

fflush(stdin);

getchar();

return(0);

}

Для проверки правильности разработанного алгоритма и программы достаточно подготовить семь тестов. Сделаем это с помощью рис. 3.5. На рис. 3.5 на числовой оси отмечены промежутки значений x с указанием формул для вычисления y для каждого промежутка и каждой граничной точки. В таблице 3.6 приведены тесты.

Рис. 3.5 Промежутки значений x

Таблица 3.6