Цели:
ü освоить методику написания разветвляющихся вычислительных алгоритмов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.
Пример 1. Разработать алгоритм и составить по нему программу для вычисления значений функции y = f(x). Необходимо учитывать область определения функции:

Ход выполнения работы
1. Построить алгоритм. В задаче требуется вычислить функцию, вид которой зависит от значения аргумента. Поэтому разобьем числовую ось значениями, указанными в формуле на несколько промежутков, указав при этом, какой должен быть результат вычислений на каждом промежутке:
При разработке алгоритма будем рассматривать промежутки числовой оси слева направо. Обозначения в алгоритме: ФНЗ – функция не задана; ФНО – функция не определена.
Записывая основной алгоритм решения задачи, вместо вычислений каждой части функции для упрощения будем писать блок1, блок2 и блок3. Поставим в соответствие каждому блоку алгоритм вычисления конкретной функции с учетом её области определения. Последний этап разработки алгоритма решения исходной задачи – подстановка в основной алгоритм вместо блоков 1,2,3 соответствующих вычислительных алгоритмов.
|
|
|
Сделаем небольшое замечание относительно записи текста алгоритма. Рекомендуется записывать текст алгоритма «ступеньками», т.е. новый блок «если – иначе» нужно записывать с отступом относительно предыдущего блока «если – иначе» и т.д. Так же следует поступать и при записи текста программы, соответствующей алгоритму. Одной из причин этого является то, что структура алгоритма и программы хорошо просматривается, что может помочь при обнаружении синтаксических ошибок.
Основной алгоритм:
объявление переменных вещ: х, у
ввод х
если х<5
блок1
иначе
если x<7
«ФНЗ»
иначе
если x<12
блок2
иначе
если х<=15
«ФНЗ»
иначе
блок3
все_если
все_если
все_если
все_если
Рассмотрим вычисления в каждом из блоков 1, 2 и 3 отдельно.
Блок1. Требуется вычислить функцию
. При вычислении учитываем, что подкоренное выражение должно быть больше или равно нулю и при этом знаменатель не должен равняться нулю. Таким образом, получаем:
если cos(х)>0

печать у
иначе
«ФНО»
все_если
Блок2. Требуется вычислить функцию
. Здесь никаких ограничений на вычисления нет. Таким образом, получаем:

печать у
Блок3. Требуется вычислить функцию
. При вычислении учитываем, что подкоренное выражение должно быть больше или равно. Таким образом, получаем:
если 25-х>=0

печать у
иначе
«ФНО»
все_если
В основной алгоритм вместо блоков 1,2,3 подставим алгоритмы вычисления соответствующих частей функции. В итоге получаем алгоритм решения исходной задачи.
|
|
|
2. Написать программу, соответствующую алгоритму.
| Алгоритм | Программа |
объявление переменных вещ: х, у ввод х если х<5 если cos(х)>0 печать х,у иначе «ФНО» все_если иначе если x<7 «ФНЗ» иначе если x<12 печать х,у иначе если х<=15 «ФНЗ» иначе если 25-х>=0 печать х,у иначе «ФНО» все_если все_если все_если все_если все_если | # include "stdio.h" # include "math.h" int main () { float x,y; printf ("x="); // ввод значения переменной x scanf("%f",&x); // проверка условий if (x<5) if(cos(x)>0) { y=1/sqrt(cos(x)); printf ("x=%f,y=%f\n",x,y); } else printf("FNO\n"); else if(x<7) printf("FNZ\n"); else if (x<12) { y=pow(x,2); printf ("x=%f,y=%f\n",x,y); } else if (x<=15) printf("FNZ\n"); else if(25-x>=0) { y=sqrt(25-x); printf ("x=%f,y=%f\n",x,y); } else printf("FNO\n"); return 1; } |
3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Примечание. В качестве тестового примера можно ввести следующие значения: х=16 и х=30.
Пример 2. Разработать алгоритм и составить по нему программу для вычисления значений функции z = f(x,y) в зависимости от попадания точки с координатами (х,у) в область D (область D выделена серым цветом):
![]() |

Ход выполнения работы
1. В задаче требуется вычислить функцию, вид которой зависит от координат точки координатной плоскости. Если точка с координатами (х,у) попадает в область D, то вычисляется первая часть функции (в алгоритме – блок 1), в противном случае – вторая часть (блок 2). Процесс написания алгоритма разобьем на четыре этапа:
написание основного алгоритма решения задачи;
определение условия принадлежности точки области D. Так как одна и та же точка не может принадлежать двум непересекающимся областям одновременно, разобьем область D на две области: D1 (треугольник) и D2 (кольцо);
написание вспомогательных алгоритмов вычисления каждой части заданной функции;
написание полного алгоритма решения исходной задачи и соответствующей программы.
Обозначения в алгоритме: ФНО – функция не определена.
Рассмотрим отдельно этапы алгоритма.
1. Запишем основной алгоритм решения задачи:
объявление вещ: x, y, z
ввод х, у
если (
) или (
)
блок 1
иначе
блок 2
все_если
2. Математическое определение условий:
a)
. Найдем уравнение прямой, проходящей через точки с координатами (-3;0) и (0;2). Запишем уравнение прямой в общем виде
.

Таким образом, уравнение прямой
.
.
b)
. Определим уравнение окружности с центром в точке (2,0) радиуса R =2:
(внешняя окружность). Определим уравнение окружности с центром в точке (2,0) радиуса R =1:
(внутренняя окружность). Так как область D2 находится внутри кольца, включая его границы, то условием принадлежности точки (х,у) области D2 будут неравенства:
,
.
.
3. Вычислительные алгоритмы, соответствующие блокам 1,2:
| Блок 1 | Блок 2 |
| если х-у ≠ 0 z=1/(x-y) печать х, у,z иначе «ФНО» все_если | если ху > 0 z=ln(xy) печать х, у,z иначе «ФНО» все_если |
2. Написать программу, соответствующую алгоритму:
| Алгоритм | Программа |
| объявление переменных вещ: х, у, z ввод х, у если (((x>=-3 и x<=0) и (y>=0 и y<=2*x/3+2)) или ((x-2)*(x-2)+y*y<=4 и (x-2)*(x-2)+y*y>=1)) если х-у ≠ 0 z=1/(x-y) печать х, у,z иначе «ФНО» все_если иначе если ху > 0 z=ln(xy) печать х, у,z иначе «ФНО» все_если все_если | # include "stdio.h" # include "math.h" int main () { float x,y,z; printf ("x="); // ввод значения переменной x scanf("%f",&x); printf ("y="); // ввод значения переменной y scanf("%f",&y); if((x>=-3&&x<=0&&y>=0&& y<=2*x/3+2)||(pow(x-2,2)+y*y<=4 && pow(x-2,2)+y*y>=1)) if(x-y!=0) { z=1/(x-y); printf("x=%f,y=%f,z=%f\n",x,y,z); } else printf("FNO\n"); else if(x*y>0) { z=log(x*y); printf("x=%f,y=%f,z=%f \n",x,y,z); } else printf("FNO\n"); return 1; } |
3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Примечание. В качестве тестового примера можно ввести значения х=1, у=1 и х=3, у=5.
Пример 3. С клавиатуры вводится целое число от 0 до 99, обозначающее количество копеек. Написать программу, которая должна вывести правильно напечатанное окончание слова «копейка».
|
|
|
Ход выполнения работы
1. Напишем алгоритм решения задачи. Окончания слов будут зависеть от последней цифры чисел из диапазона от 0 до 9 и от 14 до 99. Исключением будут четыре числа: 11, 12, 13 и 14. В алгоритме и программе используем оператор выбора. Ключом для него будет остаток от деления введенного целого числа на 10 (так можно определить последнюю цифру двузначного целого числа).
2. Написать программу, соответствующую алгоритму:
| Алгоритм | Программа |
| объявление переменных цел: х ввод х если x>=11 и x<=14 печать «х копеек» иначе выбор х%10 случай 1: «х копейка» случай 2: «х копейки» случай 3: «х копейки» случай 4: «х копейки» случай 5: «х копеек» случай 6: «х копеек» случай 7: «х копеек» случай 8: «х копеек» случай 9: «х копеек» все_выбор все_если | # include "stdafx.h" # include "stdio.h" int main() { int x; printf ("x="); //ввод х scanf("%i",&x); if(x>=11 && x<=14) printf (“%i копеек\n”,x); else { switch (x%10) { case 1: printf (“%i копейка\n”,x); break; case 2: printf (“%i копейки\n”,x); break; case 3: printf (“%i копейки\n”,x); break; case 4: printf (“%i копейки\n”,x); break; case 5: printf (“%i копеек\n”,x); break; case 6: printf (“%i копеек\n”,x); break; case 7: printf (“%i копеек\n”,x); break; case 8: printf (“%i копеек\n”,x); break; case 9: printf (“%i копеек\n”,x); break; } } return 1; } |
3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.







