子函数解一元二次方程

发布于 2023-05-06  111 次阅读


注意

这里采用了数组进行代替解方程,一元二次系数有三个,解方程的解有两个于是设置元素为五位的数组

题目要求用子函数解之后用主函数输出

解的情况

  1. b^2 - 4ac > 0:方程有两个实数解
  2. b^2 - 4ac = 0:方程有唯一解
  3. b^2 - 4ac < 0;方程有两个负数解

实数解的时候可以直接用根与判别式关系计算

唯一解其实就是实数解的特殊情况

复数解可以将根与判别式关系拆分

数组的使用

传参的时候可以只传数组名,据此可以将整个数组的地址传过去,子函数正常接收即可

由于数组传参是传地址所以可以直接在子函数内对数组进行操作不需要返回任何值

代码

#include<stdio.h>
#include<math.h>

double less_than(double a[])
{
	a[3] = -a[1] / (2 * a[0]);
	a[4] = sqrt(-a[1] * a[1] + 4 * a[0] * a[2]) / (2 * a[0]);
	return 0;
}

double large_than(double a[])
{
	double k1 = -a[1] / (2 * a[0]), k2 = sqrt(a[1] * a[1] - 4 * a[0] * a[2]) / (2 * a[0]);
	a[3] = k1 + k2;
	a[4] = k1 - k2;
	return 0;
}

double equal_to(double a[])
{
	a[3] = -a[1] / (2 * a[0]);
	return 0;
}

int main()
{
	double large_than(double a[]);
	double less_than(double a[]);
	double equal_to(double a[]);

	double a[5] = { 0 };
	printf("请输入需要求根的一元二次方程的各个系数a,b,c(空格隔开)\n");
	scanf("%lf %lf %lf", &a[0], &a[1], &a[2]);

	if (a[1] * a[1] - 4 * a[0] * a[2] < 0)
	{
		less_than(a);
		printf("这个一元二次方程在实数域上无解\n在复数域上根\nx1 = %lf + %lf * i\nx2 = %lf - %lf * i", a[3], a[4], a[3], a[4]);
	}
	else if (a[1] * a[1] - 4 * a[0] * a[2] > 0)
	{
		large_than(a);
		printf("这个一元二次方程在实数域上有解\n根为%lf, %lf", a[3] + a[4], a[3] - a[4]);
	}
	else if (a[1] * a[1] - 4 * a[0] * a[2] == 0)
	{
		equal_to(a);
		printf("这个一元二次方程在实数域上有唯一解\n根为%lf", a[3]);
	}
	return 0;
}