如何通过Scanf将二次方程式作为输入?

时间:2019-01-27 06:10:46

标签: c arrays scanf

我正在C语言中学习一门课程,要求我找出二次方程的根。首先,我尝试通过硬编码进行操作,然后开始工作。 接下来,我使用scanf(如a,b,c)给出了有效的输入。 但是在将整个二次表达式作为输入即(ax ^ 2 + bx + c)并从表达式中检索这些a,b,c值的情况下,我失败了。 我花了很多时间在网上搜索,找不到答案,所以我在这里寻求帮助。

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

#define PI 3.14

int main(void)
{

puts("---- ROOTS ----");

char equ[20]; //Quadratic Expression in an Array 
float a,b,c,ope;
float root1,root2;

printf("please provide the expression :");
scanf("%d",&equ[20]);//Example : 5x^2+3x+1 as input

a == equ[0];//since ax^2+bx+c in the above expression a==5
b == equ[3];//b==3
c == equ[6];//c==1

ope = sqrt(b*b -4*a*c);
root1 = (-b + ope)/2*a;
root2 = (-b - ope)/2*a;

printf("The root 1 of the expression is : %d", root1); 
printf("\nThe root 2 of the expression is : %d", root2);

return EXIT_SUCCESS;
}

输出:

PS F:\Thousand C GO> gcc 3.c
PS F:\Thousand C GO> ./a
---- ROOTS ----
please provide the expression :5x^2+3x+1//edited
The root 1 of the expression is : 0
The root 2 of the expression is : 0  

我想知道在C语言中是否有解决此问题的方法,如果可以,怎么办? 如果不是为什么?。

非常感谢您的帮助。 谢谢。

2 个答案:

答案 0 :(得分:0)

  1. 要读取字符串-

尝试

scanf("%s",equ);

scanf("%s",&equ[0]);
  1. ==是“等于”运算符。您可能需要将其更改为=(赋值运算符)

  2. 重新检查用于提取二次方程中系数的索引值。

  3. 系数以ASCII值存储在字符数组中。您需要将它们转换为适当的整数或数字值。

答案 1 :(得分:0)

嗨,这是更改后的代码:

scanf("%s",equ);//Example : 5x^2+3x+1 as input NOT

a = equ[0]-48;//since ax^2+bx+c in the above expression a==5
b = equ[5]-48;//b==3
c = equ[8]-48;//c==1
//printf("\n%f %f %f",a,b,c);

ope = sqrt(b*b -4*a*c);
printf("\n%f",ope);
root1 = (-b + ope)/(2*a);
root2 = (-b - ope)/(2*a);

printf("\nThe root 1 of the expression is : %f", root1); 
printf("\nThe root 2 of the expression is : %f", root2);

现在我将尝试解决问题

  1. 尝试使用正确的占位符输入“%s”而不是“%d”的字符数组。
  2. 不要为扫描字符数组提供scanf("%d",&equ[20]),仅给scanf("%s",equ)here是解释。
  3. 索引值不正确。
  4. 字符存储为ASCII值。 here是所有ASCII值的链接,请注意ASCII值1为49,因此在转换为浮点(implicit typecasting)时,请转换为适当的值。在您的情况下,请减去48。
  5. ==是一个比较运算符,将其更改为赋值运算符=
  6. (-b + ope)/(2*a)上加上一个括号,因为您的/2首先评估的是*a,因此是operator precedence and associativity
  7. 现在是主要问题,请注意,我已将方程式更改为5x^2+3x+1,这是因为在5x^2+3x+2的情况下,b*b -4*a*c的值为-31,是负数,您不能以浮点类型存储虚数。herehere是该主题的不错读物。

要花些时间才能掌握所有这些,但不要放弃。

快乐编码!

编辑:如第1点所述,正确的占位符应用于相应的数据类型。

  1. 在最后两行中,我将%d更改为%f,以打印root1和root2,它们分别是float和NOT inthere对于初学者来说是一本不错的书。