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

标签 c arrays scanf

我正在上一门 C 语言类(class),其中要求我找到二次方程的根。首先,我尝试通过硬编码,它起作用了。 接下来我使用 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语言是否有办法解决这个问题,如果有的话怎么解决? 如果不是为什么?.

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

最佳答案

您好,这是更改后的代码:

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 值的链接,请注意,1 的 ASCII 值为 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 的情况下code> b*b -4*a*c 的值为 -31,它是负数,并且不能在 float 类型中存储虚数。 herehere有一些关于这个主题的好读物。

掌握这一切需要一些时间,但不要放弃。

祝你编码愉快!

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

  • 在最后两行中,我将 %d 更改为 %f 以打印 root1 和 root2,它们是 float 而不是 inthere对于初学者来说这是一本很好的读物。
  • 关于c - 如何通过Scanf将二次方程作为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385532/

    相关文章:

    java - 将数据添加到 JTable 对象的 object[][]

    c - C 中的文本到数组

    c - 内存问题阻止输入到结构中?

    python - ccTalk 硬币接收器插入硬币时没有反应

    c++ - 改变其他静态库使用的静态库

    c++ - 预处理器#if 语句的工具/解析器?

    c - 设置无线接口(interface)但捕获以太网数据

    c++ - 将特定索引处的 char 数组的内容与 char 文字进行比较 - cpp

    c - 在头文件中通过宏定义数组

    c - C语言获取多个单词不获取\n