лабы / Laba_varik15_7.2
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования «Московский технический университет связи и информатики»
__________________________________________________________________
Кафедра «Информатика»
Лабораторная работа №7 - Проект 2
«Разработка проекта, решающего задачу
вычисления сложного выражения с условием и выбора
наименьшего (наибольшего) из нескольких значений»
по теме
«Логические данные и выражения.
Операторы разветвления VС++. Программная реализация
базовых разветвляющиеся структур и
типовых алгоритмов»
Выполнил: студент. Вариант №15
Проверил:
Москва, 2021 г.
Общее задание.
1) Изучить вопросы представления логического типа данных и логических
выражения, формализации, алгоритмизации и программирования алгоритмов при решении задач, использующих разветвляющиеся структуры.
2) Разработка проекта.
2.1) Выберите вариант задания из таблиц 7.2 для создания проекта.
2.2) Выполните этап формализации задачи.
2.3) Разработайте:
• два функциональных алгоритма и соответствующие программные функции для решения поставленной задачи согласно индивидуальному заданию:
первые для вычисления значения выражения с условием, ис-
пользуя базовые алгоритмы и нахождением наибольшего и
наименьшего значений без использования вспомогательных
функций min и max;
вторые для вычисления значения выражения с условием, ис-
пользуя свои разработанные алгоритмы и соответствующие
функций, вычисляющие минимальное и максимальное из двух
задаваемых значений.
•использующая только сложное логические выражения;
программный код функции ввода исходных данных;
• программный код функции вывода результатов;
• алгоритм главной функции main и его программную реализацию,
в которых осуществляется вызов разработанных функций ввода
исходных данных, двух разработанных функции решения задачи и
функции вывода результатов, а также реализован выбор способа
решения задачи с помощью оператора switch.
2.4) Создайте консольный проект, содержащий три раздельно откомпилированных файла:
файл, содержащий функцию ввода исходных данных и функцию вывода результатов;
• файл с четырьмя разработанными функциями, соответствующие разработанным функциональным алгоритмами;
• файл с главной функцией, которая должна содержать только операторы вызова разработанных функций (ввода, две функции решения задачи разными способами и вывода), причем обмен данными между функциями должен осуществляется через параметры, без использования глобальных переменных.
2.5) Подготовьте тестовые исходные данные для контрольного решения задачи.
2.6) Выполните проект и получите результаты.
2.7) Докажите правильность полученных результатов на заранее
разработанных нескольких тестовых данных.
Вариант индивидуального задания – 15.
Формализация индивидуального задания.
asinx +bcosx, если x < 2
s = max {x^3, e^x, 10^3}, если x>3
min {sinx/x, max {a^x, x^3}, xln^2x} , в противном случае
Формализация и уточнение задачи.
Алгоритм решения данной задачи представляет собой комбинацию вычисления сложного выражения с условием и выбора наименьшего (наибольшего) из нескольких значений, используя все виды разветвлений. Можно решить эту задачу двумя способами:
•создать функциональный алгоритм и соответствующую программную функцию, используя вложенные разветвления с базовыми алгоритмами нахождения наибольшего и наименьшего значений без использования библиотечных функций max и min;
•создать функциональный алгоритм и соответствующую программную функцию, используя вложенные разветвления и разработанные свои алгоритмы и программные функции нахождения наибольшего и наименьшего из двух значений.
Будем считать, что исходные данные и результат вычислений имеют тип double. Для контроля правильности результата создадим переменную целого типа, этой переменной будем присваивать номер ветви разветвления, по которой выполнились вычисления.
4) Разработка двух функциональных алгоритмов и алгоритма главной функции main.
Разработаны два функциональных алгоритма Razv и Razm:
•функциональный алгоритм Razv – вычисления условного выражения
решения задачи, используя вложенные разветвления с базовыми алгорит-
мами нахождения наибольшего и наименьшего значений без использова-
ния библиотечных функций (рисунок 1);
Рисунок 1 - Схема алгоритма Razv, использующая базовые алгоритмы нахождения наибольшего и наименьшего значения.
• функциональный алгоритм Razm – вычисления условного выражения решения задачи, используя предопределенные алгоритмы вычисления максимума и минимума двух переменных – MaxMy и MinMy (рисунок 2);
Рисунок 2 - Схема алгоритма Razm,
использующая предопределенные алгоритмы maxMy и minMy.
• схема главной функции main представлена на рисунке 3.
Рисунок 3 - Схема алгоритма главной функции main.
5) Разработка программного кода проекта.
Разработан программный код проекта, состоящий из трех файлов исходного кода:
• файла с функциями CalcSN, которые решают задачу
вычисления условного выражения первым и вторым способами
• файла с функциями ввода исходных данных и вывода результатов;
• файла с главной функцией main.
#include <cmath>
#include <iostream>
using namespace std;
// Определение ф-ции с вложенными разветвлениями и без функций max и min
double Razv(double a, double b, double x, int& n)
{
double s; // Локальная переменная ФУНКЦИИ
if (x < 2)
{
s = a * sin(x) + b * cos(x);
n = 1;
}
else
if (x > 3)
{
s = x * x * x;
double s1 = exp(x);
double s2 = pow(10,3);
if (s < s1) s = s1;
if (s < s2) s = s2;
n = 2;
}
else
{
s = pow(x, 3);
double s1 = (sin(x) / x);
double s2 = x * pow(log(x), 2);
double s3 = pow(a, x);
if (s < s1) s = s1;
if (s < s2) s = s2;
if (s < s3) s = s3;
n = 3;
}
return s;
}
// Описания (прототипы) ф-ций maxMy и minMy
double max(double x, double y);
double min(double x, double y);
//Определение ф-ции с вложенными разветвлениями, использующей maxMy и minMy
double Razm(double a, double b, double x, int& n)
{
double s8 = exp(x);
if (x<2)
{
n = 1;
return a*sin(x)+b*cos(x);
}
else if (x > 3)
{
n = 2;
return max(pow(x,3),max(s8, pow(10, 3)));
}
else
{
n = 3;
return max((sin(x) / x), max(max(pow(a, x), pow(x, 3)), x * pow(log(x), 2)));
}
}
// Определение функций maxMy
double max(double x, double y)
{
double f;
if (x > y) f = x; else f = y;
return f;
}
// Определение функций minMy
double min(double x, double y)
{
double f;
if (x < y) f = x; else f = y;
return f;
}
Рисунок 4 - CalcSN.
#include <iostream>
using namespace std;
// Определение функции ввода
void GetXYZ(double& a, double& b, double& x)
{
setlocale(LC_ALL, "rus");
cout << " Введите a, b, x\n ";
cin >> a >> b >> x;
}
// Определение функции вывод.
void PutRN(double s, int n)
{
setlocale(LC_ALL, "rus");
cout << " Вычислено значение сложной функции s = " << s << endl;
cout << " Номер ветки разветвления n = " << n << endl;
}
Рисунок 5 - GetPut.
#include <iostream>
#include <cmath>
using namespace std;
void GetXYZ(double& a, double& b, double& x);
void PutRN(double, int);
double Razv(double a, double b, double x, int& n);
double Razm(double a, double b, double x, int& n);
int main()
{
double a, b, x, s;
int n; // Номер ветки
GetABX(a, b, x); // Вызов функции ввода исходных данных
int choice; // Вариант выбора решения
cout << " Каким способом решать задачу?\n";
cout << " 1 - с вложенными разветвлениями ";
cout << " без библиотечных функций max и min \n ";
cout << " 2 - со своими функциями min и max \n ";
cout << " Что выбираете 1 или 2 ?\n ";
cin >> choice;
switch (choice)
{
case 1:
s = Razv(a,b,x, n);
break;
case 2:
s = Razm(a,b,x, n);
break;
default:
cout << " Вы ввели что-то не то! ";
cout << endl;
system("PAUSE");
return 0;
}
PutSN(s, n); // Вызов функции вывода результатов
system("PAUSE");
return 0;
}
Рисунок 6 - main.
6) Результаты выполнения проекта.
Результаты выполнения функций Razv и Razm при заданных значениях исходных данных должны быть одинаковы. На рисунке 7 приведены результаты работы проекта для тестовых данных первой ветви.
Рисунок 7 - результат работы программы.
7) Доказательство правильности результата.
Для тестовых исходных данных, проверяющих все ветви разветвления, были получены следующие результаты выполнения проекта:
Исходные данные |
Результат |
№ ветви |
||
а = 1 |
b = 2 |
x = 1 |
s = 1.92208 |
n = 1 |
а = 3 |
b = 4 |
x = 4 |
s = 1000 |
n = 2 |
а = 5 |
b = 6 |
x = 2.5 |
s = 55.9017 |
n = 3 |