题目要求:
设计一个类,该类可以表示一个一元三次函数。
1.该类数据成员包括:函数的参数、变量的取值区间、函数在该区间内的最大值和最小值。
2.该类成员函数包括:求最大值、求最小值。
3.编写一个主程序,能够根据所设计的类定义一元二次函数对象,调用成员函数,分别实现最大值和最小值的计算。
程序清单:
头文件1.2 hanshu2.h:
#pragma once
#include<iostream>
#include <math.h>
using namespace std;
class hanshu2
{
public:
hanshu2(double aa, double bb, double cc, double dd);//构造函数
void maximum(double m, double n);//求最大值、求最小值的函数
void show();//展示函数
private:
double a, b, c, d;//函数的参数
double m, n;//函数的定义域(取值区间)
double max, min;//最大值与最小值
};
源文件1.2 hanshu2.cpp:
#include"1.2 hanshu2.h"
hanshu2::hanshu2(double aa, double bb, double cc, double dd) :a(aa), b(bb), c(cc), d(dd) {}//构造函数的实现
void hanshu2::show()//展示函数的实现
{
cout << "最大值为:" << max << endl;
cout << "最小值为:" << min << endl;
}
void hanshu2::maximum(double m, double n)//求最大值、求最小值函数的实现
{
if (a == 0 && b == 0)
{
if (c >= 0)
{
max = c * n + d;
min = c * m + d;
}
else
{
max = c * m + d;
min = c * n + d;
}
}
else
{
double x1, x2, w;
w = b * b - 3 * a * c;
x1 = ((-b) + pow(w, 0.5)) / (3 * a);
x2 = ((-b) - pow(w, 0.5)) / (3 * a);
if (x1 > x2)
{
double temp = x1;
x1 = x2;
x2 = temp;
}
double y1, y2, ym, yn;
y1 = a * x1 * x1 * x1 + b * x1 * x1 + c * x1 + d;
y2 = a * x2 * x2 * x2 + b * x2 * x2 + c * x2 + d;
ym = a * m * m * m + b * m * m + c * m + d;
yn = a * n * n * n + b * n * n + c * n + d;
if (a == 0)
{
double e = (-c) / (2 * b);
double h = (-c * c) / (4 * b) + d;
if (b > 0)
{
if (e >= m && e <= n)
{
min = h;
if (ym > yn)
{
max = ym;
}
else
{
max = yn;
}
}
else if (e >= n)
{
max = ym;
min = yn;
}
else if (e <= m)
{
max = yn;
min = ym;
}
}
else if (b < 0)
{
if (e >= m && e <= n)
{
max = h;
if (ym > yn)
{
min = yn;
}
else
{
min = ym;
}
}
else if (e >= n)
{
max = yn;
min = ym;
}
else if (e <= m)
{
max = yn;
min = yn;
}
}
else
{
if (c > 0)
{
max = yn;
min = ym;
}
else if (c < 0)
{
max = ym;
min = yn;
}
else
{
max = d;
min = d;
}
}
}
else if (w > 0)
{
if (a > 0)
{
if (n <= x1)
{
max = yn;
min = ym;
}
else if (m >= x2)
{
max = yn;
min = ym;
}
else if (m >= x1 && n <= x2)
{
max = ym;
min = yn;
}
else if (n >= x1 && n <= x2 && m <= x1)
{
max = y1;
if (ym > yn)
{
min = yn;
}
else
{
min = ym;
}
}
else if (m >= x1 && m <= x2 && n >= x2)
{
min = y2;
if (ym > yn)
{
max = ym;
}
else
{
max = yn;
}
}
else if (n >= x2 && m <= x1)
{
if (ym > y2)
{
min = y2;
}
else
{
min = ym;
}
if (yn > y1)
{
max = yn;
}
else
{
max = y1;
}
}
}
else
{
if (n <= x1)
{
max = ym;
min = yn;
}
else if (m >= x2)
{
max = ym;
min = yn;
}
else if (m >= x1 && n <= x2)
{
max = yn;
min = ym;
}
else if (n >= x1 && n <= x2 && m <= x1)
{
min = y1;
if (ym > yn)
{
max = ym;
}
else
{
max = yn;
}
}
else if (m >= x1 && m <= x2 && n >= x2)
{
max = y2;
if (ym > yn)
{
min = yn;
}
else
{
min = ym;
}
}
else if (n >= x2 && m <= x1)
{
if (ym > y2)
{
max = ym;
}
else
{
max = y2;
}
if (yn > y1)
{
min = y1;
}
else
{
min = yn;
}
}
}
}
else
{
if (a > 0)
{
max = yn;
min = ym;
}
else
{
max = ym;
min = yn;
}
}
}
}
源文件2.一元三次函数最值计算.cpp:
#include"1.2 hanshu2.h"
int main()
{
double a, b, c, d, m, n;
cin >> a >> b >> c >> d >> m >> n;
hanshu2 s(a, b, c, d);
s.maximum(m, n);
s.show();
return 0;
}
实验案例:
实验结果分析:
在第一行,我们输入一元三次方程的四个系数,从而构建出一个完整的一元三次方程。
在第二行,我们输入取值范围,在该范围内寻找一元三次函数的最值。
按下回车,程序便会输出所求得的自定义一元三次函数在自定义范围内的最大值与最小值。
与一元二次函数同理,为了应对多种可能的情况,输入的系数与范围可以是整数、小数或者零。
要点讲解:
1.以上代码使用的是类的分文件编写,运用了构造函数,使得在定义对象的时候可以附上对应的值。
2.一元二次函数的最值判断需要6个参数,分别是a,b,c,d,m,n,其中abcd是定义一元三次函数的参数,m和n分别是取值范围的左右区间。
3.对此代码中所有变量的属性,建议统一使用double或float类型,原因在于即使输入的参数全为整数,结果的数字也有小数的可能,为了计算准确,建议使用浮点型进行编写。
4.为了使代码得到简化,我在编写实现一元三次函数范围最值求取的函数中,设定了当输入的三次系数为零的时候,调用一元二次函数的求解,简化了代码的编写,提高了代码的复用性。