二次方程根函数

时间:2017-10-20 15:29:12

标签: c

问题

编写一个计算二次方程的实根和虚根的函数

ax^2 +bx+c = 0

你应该处理三种类型的根。

提示:使用此函数原型:

int calculateRoots(int a,int b,int c,float* root1,float* root2);

我的问题:

  • 求解二次方程的函数如何返回int?我对这意味着什么无能为力
  • 我将功能返回类型更改为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
        }
    }

2 个答案:

答案 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.5resultRoot2-0.50.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及更高版本的数字很复杂。你可以改用它们。