C中方程的根

C中方程的根,c,calculator,quadratic,C,Calculator,Quadratic,我对C语言比较陌生,正在努力提高自己。我做了一个计算器,加上了二次方程求解器,因为我知道求根的公式。但我面临两个问题 代码: #包括 #包括 #包括 #包括 main(){ 浮点数A1、A2、A、B、C、ans、Z; printf(“欢迎使用二次方程求解器。输入系数X^2,后跟系数X,后跟整数值。\n\n输入值:”; scanf(“%f%f%f”、&A、&B和&C); CheckF=(B*B-4*A*C); 如果(检查f=0){ Z=功率(检查f,1/2); A1=(-B+Z)/(A+A); A

我对C语言比较陌生,正在努力提高自己。我做了一个计算器,加上了二次方程求解器,因为我知道求根的公式。但我面临两个问题

代码:

#包括
#包括
#包括
#包括
main(){
浮点数A1、A2、A、B、C、ans、Z;
printf(“欢迎使用二次方程求解器。输入系数X^2,后跟系数X,后跟整数值。\n\n输入值:”;
scanf(“%f%f%f”、&A、&B和&C);
CheckF=(B*B-4*A*C);
如果(检查f<0){
系统(“彩色B4”);
printf(“此计算器十六进制,目前无法处理复数。\n请原谅我的开发人员。我现在将您重定向到主菜单。\n”);
系统(“暂停”);
系统(“cls”);
系统(“颜色F1”);
转到开始;
}否则如果(检查f>=0){
Z=功率(检查f,1/2);
A1=(-B+Z)/(A+A);
A2=(-B-Z)/(A+A);
如果(A1==A2){
ans=A1;
printf(“\n方程的根是%f(重复根)\n”,ans);
睡眠(250);
}如果(A1!=A2),则为else{
printf(“方程的根是%f和%f\n”,A1,A2);
睡眠(250);
}
}
}
问题1: 当我运行代码并输入
3 32 2
时,数学上的输出应该是
方程的根是-0.06287和-10.6038
,我用我的夏普计算器仔细检查了这两个方程。然而,我得到的输出是关闭的:
方程的根是-5.166667和-5.500000
我完全不确定为什么它不能计算方程的正确根

问题2:
有些根没有系数X^2,例如(2X+2),可以通过求解得到-2的重复根(6X-3),从而得出X是0.5的重复根。然而,根据二次方程,它被2A除,将永远不起作用,因为它被0除。摆脱这种局面的可能途径是什么?是否要检查A=0,然后执行其他操作?任何帮助都将是可观的。

整数除法

pow(CheckF,1/2)
是1.0,因为1/2是商为0的整数除法

// Z  = pow(CheckF, 1/2);
Z  = pow(CheckF, 1.0/2.0);
// or better
Z  = sqrt(CheckF);
// Even better when working with `float`.
// Use `float sqrtf(float)` instead of `double sqrt(double)`.
Z  = sqrtf(CheckF);
最佳-使用
double
而不是
float
重新写入。在这里使用
float
的理由很少
double
是C goto浮点类型

其他问题

//#include <maths.h>
#include <math.h>

// main() {
int main(void) {

// CheckF = (B * B - 4 * A * C);
float CheckF = (B * B - 4 * A * C);

// goto Start;
/#包括
#包括
//main(){
内部主(空){
//CheckF=(B*B-4*A*C);
浮点数f=(B*B-4*A*C);
//转到开始;

使用自动格式化程序

我发现代码存在一些问题。首先,我建议您使用double而不是float。它们提供更好的精度,理想的计算器需要精度。其次,您需要:

Z  = pow(CheckF, 1/2);
您应该使用sqrt(CheckF),因为C中有一个专门的平方根函数!下面的代码对我很有用,所以如果您解决了上述两个问题,您的代码可能会工作

int main() {
    double A1, A2, A, B, C, ans, Z;
    printf("Welcome to Quadratic Equation solver. Enter the coefficient of X^2, followed by\nthe coefficient of X, followed by the integer value.\n\nEnter values: ");
    A = 3;
    B = 32;
    C = 2;
    double CheckF = (B * B - 4 * A * C);
    if (CheckF >= 0) {
        Z  = sqrt(CheckF);
        A1 = (-B + Z) / (A + A);
        A2 = (-B - Z) / (A + A);
        if (A1 == A2) {
            ans = A1;
            printf("\nRoot of equation is %f (Repeated root)\n", ans);
        } else if (A1 != A2) {
            printf("Roots of equation are %f and %f \n", A1, A2);
        }
    }
}

对于问题2,任何没有x^2项的方程都不是二次方程。它只是一条直线,很容易解。@Christophermore那么,我们应该添加一个if条件来检查a!=0吗?如果是0,那么ans=-C/B,否则如果不是==0,继续二次方程吧?不,它不是二次方程。你不能用它解线性方程。林ear方程只有两个项,一个项有一个变量。用简单的代数应该很容易解。@ChristopherMoore哦,好的,我会试试。但是第一个问题呢?或者你需要完整的代码来运行它吗?创建一个最小的可重复的例子。你当前的例子看起来基本上很好。只要确定定义了你的我们不知道的示例。
powf()
sqrtf()
更好,因为OP使用浮点数而不是双精度。@Shawn对
浮点数
类型提出了很好的建议。@chux:有没有办法处理负数的根?对于可能出现的虚数根。上面,我刚说这个计算器不能处理虚数,但有没有办法?我看到了一些方法正在生成printf(“%fi”,ans);但仍然不能work@UnfreeHeX
complex双d=csqrt(检查F)
是一种直接的方法。@chux.Oh。我想我的编译器没有附带的
复杂的.h
头文件。我查找了它的源代码,但它包括其他文件,如
bits/math.def
和类似的文件,我也找不到。不用担心。我会把它作为错误保留。谢谢。祝你玩得开心好的,先生。
int main() {
    double A1, A2, A, B, C, ans, Z;
    printf("Welcome to Quadratic Equation solver. Enter the coefficient of X^2, followed by\nthe coefficient of X, followed by the integer value.\n\nEnter values: ");
    A = 3;
    B = 32;
    C = 2;
    double CheckF = (B * B - 4 * A * C);
    if (CheckF >= 0) {
        Z  = sqrt(CheckF);
        A1 = (-B + Z) / (A + A);
        A2 = (-B - Z) / (A + A);
        if (A1 == A2) {
            ans = A1;
            printf("\nRoot of equation is %f (Repeated root)\n", ans);
        } else if (A1 != A2) {
            printf("Roots of equation are %f and %f \n", A1, A2);
        }
    }
}