Пример выполнения лабораторной работы 13.




Лекция 14. Программирование алгоритмов регулярной циклической структуры. Примеры выполнения лабораторных работ

Пример выполнения лабораторной работы 13.

В примере выполнения лабораторного задания по теме «Программирование алгоритмов регулярной циклической структуры» решается задача формирования таблицы значений функции f(x)=sin(x+2)*12+cos(x*4)*15 при изменении x на отрезке [a;b] с шагом h (а=2, b=8, h=0.5). Кроме того, требуется найти наибольшее и наименьшее значения функции на этом же отрезке, а также число положительных и отрицательных значений функции. Будем считать, что вещественные исходные данные и результаты вычислений имеют тип float.

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

n = [(b – a)/h] + 1

где a и b – границы отрезка табуляции, h – шаг табуляции, а квадратные скобки обозначают операцию округления в меньшую сторону результата вычисления выражения в скобках.

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

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

· функция func, вычисляющая f(x) в заданной точке x;

· функция RegCikl, формирующая и выводящая таблицу значений f(x) на заданном отрезке значений x, а также определяющая наибольшее и наименьшее значения заданной функции на этом же отрезке и число положительных и отрицательных значений функции;

· функция Get, выполняющая ввод исходных данных: границ отрезка [a;b] и шага табуляции h;

· функция Put, выводящая найденные наибольшее и наименьшее значения f(x) и число положительных и отрицательных значений f(x);

· главная функция main, последовательно вызывающая функции Get, RegCikl и Put.

 

На рис. 1 приведена схема алгоритма функции func, вычисляющей f(x) в заданной точке x.

Вычисление производится в 2 приема для облегчения отладки. В промежуточную переменную A записывается результат вычисления первого слагаемого функции, в переменную B – второго слагаемого. Значение функции Y вычисляется суммированием A и B и возвращается в функцию RegCikl.

Рисунок 1 – Схема алгоритма функции func

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

Рисунок 2– Схема алгоритма функции RegCikl

 

Входными параметрами функции являются границы отрезка табулирования a и b, а также шаг таблицы h.

Вначале вычисляется количество повторений цикла n, устанавливаются равными нулю начальные значения переменных Npos (количество положительных значений) и Nneg (количество отрицательных значений). Устанавливаются начальные значения переменных Ymax (наибольшее значение функции) и Ymin (наименьшее значение функции).

Затем организуется цикл с параметром i, который повторяется n раз. При каждом повторении цикла прежде всего вычисляется очередное значение аргумента x (через параметр i), а затем, путем вызова функции func, вычисляется соответствующее значение функции y.

Вычисление количества положительных и отрицательных значений функции производится путем добавления 1 к счетчикам Npos и Nneg, если очередное значение функции, соответственно, положительно или отрицательно.

Вычисление наибольшего и наименьшего значения функции производится по той же схеме, как это делалось при выборе наибольшего или наименьшего из трех или более значений. Разница состоит в том, что там результирующей переменной сначала присваивалось значение одной из сравниваемых величин. Здесь же, чтобы избежать отдельного вычисления функции в первой точке, перед входом в цикл результирующим переменным присваиваются значения самого большого по абсолютной величине числа для данных типа float: Ymax = -1038, Ymin = 1038. Благодаря этому, при первых проверках условий y > Ymax и y < Ymin выполнение алгоритма пойдет по ветвям Да, и в переменных Ymax и Ymin зафиксируется значение функции в начальной точке.

В конце цикла выводится очередная точка таблицы (x;y).

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

В соответствии с заданием программные коды функций поместим в 3 раздельно компилируемых файла:

· файл GetPut.cpp, содержащий функцию ввода исходных данных и функцию вывода результатов;

· файл Calc.cpp с функциями вычислениязначенияфункции y=f(x) и построения таблицы ее значений;

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

 

На рис. 3 приведен программный код файла GetPut.cpp.

 

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

#include <iostream>

using namespace std;

 

void Get(float& a, float& b, float& h)

{

setlocale(LC_ALL, "rus");

cout<<"Введите нижнюю границу отрезка: ";

cin>>a;

cout<<"Введите верхнюю границу отрезка: ";

cin>>b;

cout<<"Введите шаг таблицы: ";

cin>>h;

}

 

 

void Put(float yMax, float yMin, int nPos, int nNeg)

{

setlocale(LC_ALL, "rus");

cout<<endl<<"Наибольшее значение функции: "<<yMax<<endl;

cout<<"Наименьшее значение функции: "<<yMin<<endl;

cout<<"Число положительных значений функции: "<<nPos<<endl;

cout<<"Число отрицательных значений функции: "<<nNeg<<endl;

}

Рисунок 3 – программный код файла GetPut.cpp

Функция Get предназначена для ввода исходных данных задачи: концов отрезка табулирования [ a;b ] и шага таблицы h. Соответствующие переменные являются выходными параметрами функции, передаваемыми по ссылке.

Функция Put предназначена для вывода результатов выполнения проекта: наибольшего значения функции yMax, наименьшего значения функции yMin, числа положительных nPos и отрицательных nNeg значений функции. Соответствующие переменные являются входными параметрами функции, передаваемыми по значению.

На рис. 4 приведен программный код файла Calc.cpp.

 

// файл Calc.cpp

#include <iostream>

#include <cmath>

using namespace std;

 

float func(float x);

 

void RegCikl(float a, float b, float h, float& yMax, float& yMin, int& nPos, int& nNeg)

{

setlocale(LC_ALL, "rus");

int n = floor((b-a)/h) + 1;

nPos = 0; nNeg = 0;

yMin = 1E38; yMax = -1E38;

float x, y;

cout<<endl<<"Таблица значений функции"<<endl;

cout<<"\tx\ty"<<endl;

for (int i=1; i<=n; i++)

{

x = a + (i-1)*h;

y = func(x);

if (y > yMax) yMax = y;

if (y < yMin) yMin = y;

if (y > 0) nPos++;

if (y < 0) nNeg++;

cout<<"\t"<<x<<"\t"<<y<<endl;

}

}

 

float func(float x)

{

float a, b;

a = float(12. * sin(x + 2.));

b = float(15. * cos(4. * x));

return a + b;

}

Рисунок 4 – программный код файла Calc.cpp

 

Функция RegCikl предназначена для формирования и вывода таблицы значений f(x) на заданном отрезке [ a;b ] с заданным шагом h, для определения ее наибольшего и наименьшего значений, а также числа положительных и отрицательных значений.

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

· левая граница отрезка a;

· правая граница отрезка b;

· шаг таблицы h.

Выходными параметрами функции, передаваемыми по ссылке, являются:

· наибольшее значение функции yMax;

· наименьшее значение функции yMin;

· число положительных значений nPos;

· число отрицательных значений nNeg.

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

Организация цикла и операции в теле цикла полностью соответствуют схеме алгоритма на рис. 2. Вычисление значений функции y производится путем вызова функции func.

Функция func получает входной параметр x по значению, вычисляет значение f(x) в соответствии с алгоритмом на рис. 1 и возвращает полученный результат в функцию RegCikl. При получении промежуточных результатов вычислений в переменных a и b выполняется явное преобразование выражений из типа double в тип float.

На рис. 5 приведен программный код файла main.cpp.

 

// файл main.cpp

#include <iostream>

 

void Get(float& a, float& b, float& h);

void Put(float yMax, float yMin, int nPos, int nNeg);

void RegCikl(float a, float b, float h, float& yMax, float& yMin, int& nPos, int& nNeg);

 

void main()

{

float a, b, h, yMax, yMin;

int nPos, nNeg;

Get(a, b, h);

RegCikl(a, b, h, yMax, yMin, nPos, nNeg);

Put(yMax, yMin, nPos, nNeg);

system("PAUSE");

}

Рисунок 5 - Программный код файла main.cpp

 

Файл содержит прототипы функций, вызываемых функцией main. Сама функция main содержит только определения используемых переменных и вызовы используемых функций.

На рис. 6 приведены результаты выполнения проекта.

 

Рисунок 6 - Результаты выполнения проекта

 

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

 



Поделиться:




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

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


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