问题
编写一个计算二次方程的实根和虚根的函数
ax^2 +bx+c = 0
你应该处理三种类型的根。
提示:使用此函数原型:
int calculateRoots(int a,int b,int c,float* root1,float* root2);
我的问题:
void()
但我无法处理2个想象的根不确定如何返回真实+图像这是我到目前为止所得到的:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void calculateRoots(int a,int b,int c,float* root1,float* root2);
int main()
{
float r1,r2;
int a,b,c;
printf("enter the coefficients :\n");
scanf("%d%d%d",&a,&b,&c);
void calculateRoots(a,b,c,&r1,&r2);
printf("%d and %d are roots,r1,r2);
return 0;
}
void calculateRoots(int a,int b,int c,float* root1,float* root2)
{ float x=b*b-4*a*c;
if(x==0)
{
*root1=(-1*b)/(2*a);
*root2=(-1*b)/(2*a);
}
else if(x>0)
{
*root1=(-1*b+x)/(2*a) ;
*root2=(-1*b-x)/(2*a) ;
}
if(x<0)
{
root1=// Any help here
}
}
答案 0 :(得分:0)
函数求解二次方程如何返回int
您应该返回根数,因此您可以知道要打印多少根。
我无法处理2个想象的根不确定如何返回 真实+ IMAG
我假设(但也许@deamentiaemundi是正确的,因为对于这个问题,你真的只有两个不同的数字,在函数返回值的帮助下,允许重建有效的结果,并在再次阅读你的问题后,措辞可能暗示),你应该使用两个元素数组:
float resultRoot1[2];
float resultRoot2[2];
int numRoots = calculateRoots( a, b, c, resultRoot1, resultRoot2 );
内部calculateRoots
root1[0] = real_part;
root1[1] = imaginary_part;
例如,给定
2x^2 + 2x + 1 = 0
你应该回来
-0.5 - 0.5i
-0.5 + 0.5i
因此resultRoot1
应包含值-0.5
,-0.5
和resultRoot2
值-0.5
,0.5
。
除了你的阴影(为了将来的考虑),你可以尝试使用结构
struct ComplexNum
{
double re, im;
};
int calculateRoots( int a, int b, int c, struct ComplexNum* root1, struct ComplexNum* root2 )
{
...
root1->re = real_part;
root1->im = imaginary_part;
...
return num_roots;
}
...
struct ComplexNum resultRoot1, resultRoot2;
int numRoots = calculateRoots( a, b, c, &resultRoot1, &resultRoot2 );
甚至更好的复杂标题
#include <complex.h>
int calculateRoots( int a, int b, int c, double complex* root1, double complex* root2 )
{
...
*root1 = real_part + imaginary_part * I;
...
return num_roots;
}
...
double complex resultRoot1;
double complex resultRoot2;
int numRoots = calculateRoots( a, b, c, &resultRoot1, &resultRoot2 );
答案 1 :(得分:0)
DanielSęk提示的变化:
由于求解二次方程(w。实数系数)的规则非常简单,您可以像使用原型一样使用原型中的两个float
参数。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int calculateRoots(int a, int b, int c, float *root1, float *root2);
int main(void)
{
float r1, r2;
int a, b, c;
int ret;
puts("enter the coefficients a, b, c:");
ret = scanf("%d%d%d", &a, &b, &c);
// always, An I mean _always_ check the returns of scanf!
if(ret != 3){
puts("No, the three coeficients, please, and they have to be integers. Try again.");
return EXIT_FAILURE;
}
ret = calculateRoots(a, b, c, &r1, &r2);
// the function returns a value that is eather the sign of the
// determinant or an error.
switch (ret) {
case 0:
printf("r1 = r2 = %f\n", r1);
break;
case 1:
printf("r1 = %f and r2 = %f\n", r1, r2);
break;
case -1:
printf("r1 = %f + %fi and r2 = %f - %fi\n", r1, r2, r1, r2);
break;
default:
puts("No roots found, check input");
break;
}
return 0;
}
int calculateRoots(int a, int b, int c, float *root1, float *root2)
{
float x;
// shortcut: check for a== 0
if (a == 0) {
return -2;
}
// find determinant
x = b * b - 4 * a * c;
fprintf(stderr, "determinant is: %f\n",x);
// checking if a float is exactly equal to a number is highly problematic!
if (x == 0.0) {
*root1 = (-1 * b) / (2 * a);
*root2 = *root1;
return 0;
}
// macro avaliable with c >= c99
else if (isgreater (x , 0.0)) {
*root1 = (-b + sqrt(x)) / (2 * a);
*root2 = (-b - sqrt(x)) / (2 * a);
return 1;
}
// macro avaliable with c >= c99
if (isless(x , 0.0)) {
// not the nicest way possible, but good enough if documented:
// put the real part in one variable, the imaginary part in another,
// return the sign and let the caller sort it out.
*root1 = -b / (2 * a);
*root2 = sqrt(-x) / (2 * a);
return -1;
}
// notreached
return -3;
}
C99及更高版本的数字很复杂。你可以改用它们。