C程序无法打印出正确的输出

时间:2016-12-08 09:39:16

标签: c function

我编写了以下代码来计算二次方程的根:

int quadroots(int *ap, int *bp, int *cp,int *root1p, int *root2p, int *dp);
int main (void) {
    int ap,bp,cp;
    int dp, root1p, root2p;
    quadroots(&ap, &bp, &cp, &root1p, &root2p, &dp);
    printf("The solutions are: %f, %f", root1p, root2p);
    }

int quadroots(int *ap, int *bp, int *cp,int *root1p, int *root2p, int *dp){
    int a, b, c, d, root1, root2;
    printf("Enter a, b, c \n");
    scanf("%d, %d, %d", &a, &b, &c);
    if (a==0) {
        printf ("The system is linear. The roots cannot be computed using this program: a cannot be 0. Please recompile");

    return 0;
    }
    int b_sqared = b*b;

    d = b_sqared - (4 * a * c);

    if (d<0) {

    d=-d;
    printf("The roots of this equation are the complex numbers: \n");
    printf("%.3f+%.3fi", ((-b) / (2*a)), (sqrt(d) / (2 * a)));
    printf(", %.3f%.3fi", (-b / (2*a)), (-sqrt(d) / (2*a)));

    }

    else if (d==0) {
        printf("The root of this equation are real and equal. \n");

        root1= (-d / (2*a));
        printf("The roots of this equation are: %.3f, %.3f", root1, root1);
        }

    else {

        printf ("The roots of the quadratic equation are real numbers. \n");
        root1 = (-b + sqrt(d)) /  (2*a);    
        root2 = (-b - sqrt(d)) / (2*a);

        printf("Roots of the quadratic equation are the real numbers %.3f, %.3f", root1,root2);

        }

    return 0;
    *root1p=root1;
    *root2p=root2;   
}

这是基于我之前编写的有效的代码,但在那时,我还没有使用函数。

就像现在一样,它编译并运行正常(即它接收数字并执行计算),但它打印出的答案是完全错误的。

EG。输入&#34; 1 5 6&#34; (对应于等式x ^ 2 + 5x + 6,它应该打印出来&#34;根是实数。 根是实数6和1&#34; 因为那些是等式的根源。但是,它没有。印刷的是一些荒谬的巨大数字(输入a,b,c 1 5 6 这个等式的根源是复数: -2719010580126301300000000000.000 + 0.000i,-2719010580126301300000000000.0000.000i解决方案:0.000000,0.000000)

非常感谢任何帮助。

非常感谢!最好的。

2 个答案:

答案 0 :(得分:0)

  "instanceView": {
    "bootDiagnostics": null,
    "disks": [
      {
        "name": "testvm-1480595334683-os-disk",
        "statuses": [
          {
            "code": "ProvisioningState/succeeded",
            "displayStatus": "Provisioning succeeded",
            "level": "Info",
            "message": null,
            "time": "2016-12-01T12:30:35.583526+00:00"
          }
        ]
      }
    ]

您在printf("%.3f+%.3fi", ((-b) / (2*a)), (sqrt(d) / (2 * a))); 中使用整数除法因此您将获得某些数字的不正确值。

你可以使用。

((-b) / (2*a))

在分割前强制转换为双精度。您需要对代码中两个整数之间的所有除法执行此操作。

答案 1 :(得分:0)

这个程序的设计很可怕,但如果你

  • 添加#include <math.h>(因此sqrt已知)
  • 将所有int替换为float s(此处不想要整数数学)
  • scanf("%f, %f, %f", &a, &b, &c);替换为scanf("%f %f %f", &a, &b, &c);scanf的正确格式字符串)。

它应该或多或少地起作用。

我没有进一步挖掘,所以可能还有其他问题。