这是我正在尝试修复的程序。我输入了1,5,6并且应该有2个解决方案,它说只有1个解决方案存在。我也试图让它显示十进制值(我应该使用double?)。以下是我的代码,我做错了什么?
#include <stdio.h>
#include <math.h>
int main(void)
{
int inputs[3], a, b, c, d, x, x1, x2, i, lastDigit;
char *os, *noSol = "No solution\n", *cont = 'y';
while (cont == 'Y' || cont == 'y')
{
printf("This program solves a quadratic equation\n");
for (i = 1; i <= 3; i++)
{
lastDigit = i % 10;
if (i >= 4 && i <= 20)
os = "th";
if (i == 1 || lastDigit == 1)
os = "st";
else if (i == 2 || lastDigit == 2)
os = "nd";
else if (i == 3 || lastDigit == 3)
os = "rd";
else
os = "th";
printf("Enter your %d%s number: ", i, os);
scanf("%d", &inputs[i - 1]);
}
a = inputs[0];
b = inputs[1];
c = inputs[2];
while (1)
{
if (a == 0)
{
if (b == 0)
{
printf(noSol);
break;
}
else
{
x = -c / b;
printf("The equation is not quadratic and the solution is %d\n", x);
break;
}
}
else
{
d = pow(b, 2) - 4 * a * c;
if (d < 0)
{
printf(noSol);
break;
}
else if (d == 0)
{
x1 = -b / 2 * a;
printf("One solution: %d\n", x1);
break;
}
else if (d > 0)
{
x1 = (-b + sqrt(d)) / 2 * a;
x2 = (-b - sqrt(d)) / 2 * a;
printf("Two solutions: %d and %d\n", x1, x2);
break;
}
}
}
printf("Run program second time? ( Y / N )\n");
scanf("%s", &cont);
}
getch();
}
答案 0 :(得分:3)
很多问题
数学部分应使用double
(或float
)代替int
。
double inputs[3], a, b, c, d, x, x1, x2;
printf()
&amp;对于double,格式说明符,scanf()
需要从%d
更改为%le
(或类似内容)以匹配double
。
数学错误:在3个地方,/ 2 * a;
应为/ (2 * a);
char *cont = 'y'
应为char cont[2] = "y"
scanf("%s", &cont);
应为scanf("%1s", cont);
。
错误处理:应该在
中检查scanf()
的返回值
if (1 != scanf("%lf", &inputs[i - 1])) { ; /* Handle error */ }
次要数学:if (d == 0)
案例导致“双根”,而不是单个解决方案。实际上,给定浮点数学四舍五入,人们并不总是知道d
应该在数学上完全零,因此“单个”根实际上是2个非常接近的根。此外,对于选择值,如果sqrt(d)
远小于b
,则“两个解决方案”将具有相同的值。