我正在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语言中是否有解决此问题的方法,如果可以,怎么办? 如果不是为什么?。
非常感谢您的帮助。 谢谢。
答案 0 :(得分:0)
尝试
scanf("%s",equ);
或
scanf("%s",&equ[0]);
==是“等于”运算符。您可能需要将其更改为=(赋值运算符)
重新检查用于提取二次方程中系数的索引值。
系数以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);
现在我将尝试解决问题
scanf("%d",&equ[20])
,仅给scanf("%s",equ)
。 here是解释。==
是一个比较运算符,将其更改为赋值运算符=
。(-b + ope)/(2*a)
上加上一个括号,因为您的/2
首先评估的是*a
,因此是operator precedence and associativity。5x^2+3x+1
,这是因为在5x^2+3x+2
的情况下,b*b -4*a*c
的值为-31
,是负数,您不能以浮点类型存储虚数。here和here是该主题的不错读物。要花些时间才能掌握所有这些,但不要放弃。
快乐编码!
编辑:如第1点所述,正确的占位符应用于相应的数据类型。
%d
更改为%f
,以打印root1和root2,它们分别是float
和NOT int
。 here对于初学者来说是一本不错的书。