bool Resh3(float x,float y)




Лекция 12

 

Логический тип данных и логические выражения. Разветвляющиеся структуры и их программирование на VС++ (продолжение). Примеры выполнения лабораторных работ.

 

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

В лабораторной работе по теме «Программирование алгоритмов разветвляющейся структуры» решается задача, пример которой изображен на слайде 2: вычислить

 

 

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

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

Первый проект должен содержать три файла исходного кода: 1) файл с пользовательской функцией, которая решает задачу вычисления условной функции первым способом, 2) файл с пользовательскими функциями ввода исходных данных и вывода результатов и 3) файл с главной функцией main.

Для первого проекта требуется создать пользовательскую функцию, которая решает задачу, используявложенные разветвления с базовыми алгоритмами нахождения наибольшего и наименьшего значений без использования дополнительных пользовательских функций.Очевидно, что эта функция (с именем Razv) будет иметь три входных параметра x, y и z, которые включены в выражение, определяющее условную функцию r. Также функция Razv имеет два результата своей работы:первый является вычисляемым значением условной функции и присваивается переменной r, второй – переменная целого типа n, в которую записывается номер ветви разветвления, по которой вычислялось значение r. Первый результат – переменная r - возвращается в вызывающую функцию оператором return через возвращаемое значение, второй - переменная целого типа n – через выходной параметр по ссылке. Кроме того, для хранения промежуточных вычислений в функции Razv создаются вспомогательные локальные переменные r1 и r2. Схема алгоритма функции пользователя Razv, в которой используются вложенные разветвления с базовыми алгоритмами нахождения наибольшего и наименьшего значений, представлена на рисунке 1.

 

По этой схеме алгоритма составлен программный код, показанный на рис.2 и записанный в отдельный файл исходного кода именем Calc1.cpp:

 

 

Как уже говорилось, функция ввода исходных данных x, y и z (с именем GetXYZ) и функция вывода результатов (с именем PutRN) совершенно одинаковы для всех трех проектов. Их программный код, записанный в файл с именем GetPut.cpp, представлен ниже на рис.3

Главная функция первого проекта записана в файл с именем main1.cpp и содержит вызовы трех созданных пользовательских функций: ввода исходных данных, вычисления значения условной функции и вывода результатов (рис.4):

 

 

Для решения задачи требуется предварительно подготовить исходные тестовые данные, которые обеспечивают вычисление условной функции r по каждой из трех ветвей разветвления. После раздельной компиляции каждого файла и трехкратного выполнения проекта для каждого набора тестовых данных получены следующие результаты:

Т.к. y<x (1<2), то вычисления идут по первой ветви и находится

min(x2, sin y, cos z) = min(22, sin 1, cos 1) = min(4, 0.841471, 0.540302) = 0.540302 – верно

 

Т.к. x<=y<=z (1<=2<=3), то вычисления идут по второй ветви и вычисляется

max(ex+y, ln z2) = max(e3, ln 9) = max (20.0855, 2.197224) = 20.0855 - верно

 

Т.к. вычисления идут по третьей ветви, то r=x+y+z=1+3+2=6 - верно

Результаты тестирования совпадают с результатами ручного расчета.

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

· код функции min() с двумя формальными параметрами, который вычисляет минимальное из них посредством тернарной условной операции и возвращает его через возвращаемое значение;

· код функции max() с двумя формальными параметрами, который вычисляет максимальное из них посредством тернарной условной операции и возвращает его через возвращаемое значение;

· код функции CalcPN(), которая, так же, как и в первом проекте, имеет 4 формальных параметра (три входных и один выходной) и для решения задачи использует вызовы этих дополнительных пользовательских функций.

Программный код второго проекта представлен на рисунке 5.

Так как файл с функциями GetXYZ и PutRN идентичен файлу первого проекта, поэтому на рисунке 5 представлены тексты только двух файлов.

 

 

Рисунок 5 –Программный код второго проекта

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

 

Третий проект содержит 4 файла. В этот проект добавлены три уже существующих файла – файл GetPut.cpp с функциями ввода и вывода, файл Calc1.cpp с функцией решения задачи из первого проекта, и файл Calc2.cpp с функциями для решения задачи из второго проекта.

В этот проект также добавлен четвертый файл с программным кодом главной функции main(), который с помощью переключателя switch реализует выбор способа решения задачи. Программный код функции main() представлен на рисунке 6.

 

 

Рисунок 6 –Программный код главной функции третьего проекта.

Результаты выполнения всех трех проектов при заданных значениях исходных данных должны быть одинаковы. На рисунке ниже приведены результаты работы третьего проекта для тестовых данных первой ветви.

 

Пример выполнения лабораторной работы по теме «Решение содержательных задач, основанных на программировании алгоритмов разветвляющихся структур» (данная работа студентами не выполняется).

Пример задания: Заданы действительные числа x, y. Определить, принадлежит ли точка с координатами (x,y) геометрической фигуре: ромб с вершинами в точках (-1,0), (0,1), (1,0) и (0,-1).

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


Далее необходимо записать условия попадания точки в область в виде формул. Заданная область ограничена четырьмя прямыми, поэтому надо определить уравнения этих прямых.

Определены уравнения, описывающие фигуру – уравнения прямых AB, BC, CD, DA :

AB: x-y=-1; BC: x+y=1; CD: x-y=1; DA: x+y=-1.

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

 

Таким образом, для того, чтобы точка с координатами x, y принадлежала построенному ромбу, необходимо выполнение вышеперечисленных условий, из которых можно записать выражение условной логической функции:

fbool(x,y) = |x-y|≤1 && |x+y|≤1.

 

В лабораторной работе эту условную логическую функцию требуется реализовать двумя различными способами, разработав соответственно алгоритм и программный код для двух функций:

o первая функция использует стандартное разветвление и сложное логическое выражение;

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

Ниже показана схема алгоритма функции Resh1(), в которой для вычисления условной функциииспользуется стандартное разветвление и сложное логическое выражение (рисунок 7).

Рисунок 7 – Схема алгоритма функции, использующей стандартное разветвление и сложное логическое выражение.

На рисунке 8 показана схема алгоритма второй функции пользователя Resh2(), которая вычисляет условную функцию,реализуя вложенные разветвления только с помощью операций отношения, без использования логических операций и сложных логических выражений.

Рисунок 8 – Схема алгоритма функции, реализующей вложенные разветвления только с помощью операций отношения, без использования логических операций и сложных логических выражений.

 

По этим алгоритмам составлен программный код двух функций, который записан в отдельный файл.

 

Кроме того, в проекте надо создать еще два файла исходного кода с тремя функциями:

· файл, в который записывается программный код функции ввода исходных данных и программный код функции вывода результатов;

· файл с программным кодом главной функции main(), которая вызывает описанные выше функции для решения поставленной задачи.

 

Так же, как и в предыдущей лабораторной работе, требуетсяпредварительно подготовить исходные тестовые данные, т.е. координаты для разных точек, попадающих и непопадающих в заданную геометрическую фигуру. После раздельной компиляции каждого файла и выполнения проекта для двух наборов тестовых данных получены следующие результаты:

При тестовых данных результаты ручного расчета и вычисления на компьютере совпадают.

 

Дополнение. Приведем еще один пример вычисления условной функции попадания точки в заданную область:

bool Resh3(float x,float y)

{

return (fabs(x-y)<=1 && fabs(x+y)<=1);

}

Функция Resh3, не используя разветвлений, просто вычисляет значение логического выражения и возвращает true или false в вызывающую главную функцию.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-12-05 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: