Лекция 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. Правильность определения наибольшего и наименьшего значений функции, а также числа положительных и отрицательных значений, следует из непосредственной проверки результатов.