二次函数 函数平移 0点坐标 C++实现

问题:

二次函数 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;
}

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值