Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / Laba_varik15_7.2

.docx
Скачиваний:
12
Добавлен:
10.06.2023
Размер:
131.71 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования «Московский технический университет связи и информатики»

__________________________________________________________________

Кафедра «Информатика»

Лабораторная работа №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

Соседние файлы в папке лабы