问题:
二次函数 ax^2+bx+c,用重载实现求0点坐标,求对称轴,函数平移
代码:
class Function{
friend Function operator+(Function f1,Function f2);
friend Function operator-(Function f1,Function f2);
private:
double a;
double b;
double c;
public:
Function():a(0),b(0),c(0){} /*默认构造函数*/
Function(double a,double b,double c):a(a),b(b),c(c){}/*构造函数*/
void operator()(void);/*重载()*/
double a_value(){
return a;
}
double b_value(){
return b;
}
double c_value(){
return c;
}
void display(){
if(a != 0) cout<<a<<"x^2";
if(b > 0) cout<<"+"<<b<<"x";
else if(b < 0) cout<<b<<"x";
if(c > 0) cout<<"+"<<c;
else if(c < 0) cout<<c;
cout<<endl;
}
/*已知x求y*/
double result(double x){
return a * pow(x,2) + b * x + c;
}
/*求对称轴*/
double axis(){
return (-1 * b)/(2 * a);
}
};
/*用重载实现求0点坐标*/
void Function:: operator()(){
double tmp = pow(b,2) - 4 * a * c; /* b^2-4ac */
/* vector: 第一个元素代表解的个数,后面依次是x1,y1,x2,y2*/
vector<double> vec;
if(tmp == 0){ /*有一个解*/
double x =axis();
vec = {1,x,result(x)};
}
else if(tmp > 0){ /* 有两个解 */
double x1 = (sqrt(tmp) - b)/(2 * a);
double x2 = ((-1 * sqrt(tmp)) - b)/(2 * a);
vec = {2,x1,result(x1),x2,result(x2)};
}
else{ /*没有解*/
vec = {0};
}
/* 相当于解包,先读vector的第一个元素然后再决定读取方法 */
if(vec[0] == 0){
cout<<"have no 0 point"<<endl;
}
else if(vec[0] == 1){
cout<<"("<<vec[1]<<","<<vec[2]<<")"<<endl;
}
else{
cout<<"("<<vec[1]<<","<<vec[2]<<"),("<<vec[3]<<","<<vec[4]<<")"<<endl;
}
}
/*函数右移*/
Function operator+(Function f1,double x){
double a = f1.a_value();
double b = f1.b_value() - 2 * x * f1.a_value();
double c = f1.c_value() - x * f1.b_value() - f1.a_value() * pow(x,2);
return Function(a,b,c);
}
/*函数左移*/
Function operator-(Function f1,double x){
double a = f1.a_value();
double b = f1.b_value() + 2 * x * f1.a_value();
double c = f1.c_value() + x * f1.b_value() + f1.a_value() * pow(x,2);
return Function(a,b,c);
}
int main(){
Function f1(2,3,0);
f1.display();
f1();
Function f2 = f1 + 2;
f2.display();
return 0;
}