Добавил:
Если чем-то мне удалось вам помочь, то благодарность принимаю на эту карту: 2200 2460 1776 0607 Для защищенки 5 сем: https://t.me/+h5cc9QNQe19kODVi Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаба7_2

.docx
Скачиваний:
0
Добавлен:
10.10.2023
Размер:
311.84 Кб
Скачать

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

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

«Московский технический университет связи и информатики»

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

Лабораторная работа №7-2

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

по теме:

«Логические данные и выражения. Операторы разветвления VC++. Программная реализация базовых разветвляющиеся структур и типовых алгоритмов»

по дисциплине

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

Выполнил: студент гр. БИН2104 Зайцева О.С.

С/б №1БИН21092

Вариант 9

Проверил:

Москва, 2021 г.

Содержание

  1. Индивидуальное задание

  2. Формализация и уточнение задания

  3. Схема алгоритмов проекта

  4. Программный код проекта

  5. Результаты выполнения проектов

  6. Доказательство правильности работы программы для каждой ветви.

  1. Индивидуальное задание

Вариант 9

Требуется создать решение, состоящее из трёх проектов для вычисления условной функции z = f(a, b, x, y):

  1. Формализация и уточнение задания

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

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

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

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

  1. Разработка двух функциональных алгоритмов и алгоритма главной функции main.

Разработаны два функциональных алгоритмов razv и razm:

  • функциональный алгоритм razv – вычисления условного выражения решения задачи, используя вложенные разветвления с базовыми алгоритмами нахождения наибольшего и наименьшего значений без использования библиотечных функций (Рисунок 1);

Рисунок 1- Схема алгоритма razv, использующая базовые алгоритмы нахождения наибольшего и наименьшего значения

  • функциональный алгоритм razm – вычисления условного выражения решения задачи, используя предопределённые алгоритмы вычисления максимума и минимума двух переменных – maxMy и minMy (рисунок 2)

Рисунок 2- Схема алгоритма razm, использующая предопределенные алгоритмы maxMy и minMy

  • схема главной функции main представлена на схеме 3

Рисунок 3 – Схема алгоритма главной функции main

  1. Разработка программного кода проекта

Разработан программный код проекта, состоящий из трёх файлов исходного кода:

  • файла с функциями razv, razm, maxMy и minMy, которые решают задачу вычисления условного выражения первым и вторым способами;

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

  • файла с главной функцией main.

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

// Файл getput.cpp с функциями ввода и вывода

#include <iostream>

using namespace std;

//Определение функции ввода

void get_abxy(double& x, double& y, double& a, double& b)

{

setlocale(LC_ALL, "rus");

cout << "Введите значение x, y, a, b:\n";

cin >> x >> y >> a >> b;

}

//Определение функции вывода

void put_zn(double z, double n)

{

setlocale(LC_ALL, "rus");

cout << "Результат z:" << z << endl;

cout << "Номер ветки: " << n << endl;

}

// Файл calc.cpp с функциями razv, raz, minMy и maxMy

#include <cmath>

// Определение ф-ции с вложенными разветвлениями, без доп.функций

double razv(double x, double y, double a, double b, int& n)

{

double z; // Локальная переменная функции

if (x < y)

{

double z1 = a / (b + y), z2 = pow(sin(y), 2.0); //Локальная переменная блока

z = a + cos(x);

if (z1 < z) z = z1;

if (z2 < z) z = z2;

n = 1; //номер ветки

}

else

if (x < (y + 5))

{

double z1 = pow(a, 3.0), z2=log(pow(x, 2.0)+ pow(y, 2.0));

if (z1 > z2) z = z1; else z = z2;

n = 2;

}

else

{

z = a + pow(cos(x - y), 3.0);

n = 3;

}

return z;

}

// Описание (прототиипы) функций maxMy and minMy

double maxMy(double x, double y);

double minMy(double x, double y);

// Определениие функции с вложенными разветвлениями, использующей minMy и maxMy

double razm(double x, double y, double a, double b, int& n)

{

if (x < y)

{

n = 1;

return minMy((a - cos(x)), minMy(a / (b + y), pow(sin(y), 2.0)));

}

else

if (x < (y + 5))

{

n = 2;

return maxMy(pow(a, 3.0), log(x * x + y * y));

}

else

{

n = 3;

return a + pow(cos(x - y), 3.0);

}

}

// Определение ф-ции maxMy

double maxMy(double x, double y)

{

double f;

if (x > y) f = x; else f = y;

return f;

}

// Определение ф-ции minMy

double minMy(double x, double y)

{

double f;

if (x < y) f = x; else f = y;

return f;

}

#include <iostream>

using namespace std;

void get_abxy(double& x, double& y, double& a, double& b);

void put_zn(double z, double n);

double razv(double x, double y, double a, double b, int& n);

double razm(double x, double y, double a, double b, int& n);

int main()

{

double x, y, a, b, z;

int n; //номер ветки

get_abxy(x, y, a, b); //вызов функции ввода исходных данных

int choice; //вариант выбора решения

cout << "Каким способом решать задачу? \n";

cout << "1- с вложенным разветвлением \n";

cout << "без дополнительных функций max и min \n";

cout << "2- со своими функциями minMY и maxMy\n";

cout << "Что выбираете 1 или 2 ?\n";

cin >> choice;

switch (choice)

{

case 1:

z = razv(x, y, a, b, n);

break;

case 2:

z = razm(x, y, a, b, n);

break;

default:

cout << "Вы ввели что-то не то!";

cout << endl;

system("Pause");

return 0;

}

put_zn(z, n); //Вызов функции вывода результатов

system("Pause");

return 0;

}

  1. Результаты выполнения проекта

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

Результаты выполнения проекта для тестовых данных первой ветки

  1. Доказательство правильности результатов

Для тестовых исходных данных, проверяющих все ветви разветвления, были получены следующие результаты выполнения проекта:

Исходные данные

Результат

№ ветки

x= 0

y= 90

a= -90

b=0

z= -91

n=1

x= 1

y= 0

a= 3

b=-10

z= 27

n=2

x= 1

y= -5

a= 3

b=-10

z= 3.88521

n=3

Доказательство правильности результатов по ветвям разветвления:

Для первой строки таблицы x < y (0<90), тогда вычисления идут по первой ветки и находится = = -91 – верно

Для второй строки в таблице вычисления идут по второй ветви: y ≤ x < y+5 (0≤1<5), и вычисляется = max(27, 1) = 27 – верно

Для вычисления третьей ветви заданы значения в третьей строке, тогда ( ) = 3+ = 3.88521 – верно

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

  1. Вывод

Изучены логические данные и выражения, операторы разветвления VC++, программная реализация базовых разветвляющихся структур и типовых алгоритмов

Соседние файлы в предмете Информатика