4

我对编码还很陌生,目前正在学习 C。在课堂上,我被分配了一个程序来编写一个程序,该程序使用我们自己的函数来计算三角形的斜边。但是,我编写的代码似乎有问题。

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y, double z);

int main(void) {
    double side1, side2, side3, counter;

    side3 = 1;

    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf_s("%d %d", &side1, &side2);

        printf("%.2f\n", hypotenuse(side1, side2, side3));
    }

    return 0;
}

double hypotenuse(double x, double y, double z) {
    x *= x;
    y *= y;
    z = sqrt(x + y);

    return z;
}

我的老师说我们可以使用数学库的平方根函数sqrt。我面临的主要错误是:

1)side3未定义(这就是为什么我只是随意将其设置为 1,但是还有其他方法可以防止此错误发生吗?)
2) 例如,如果我输入 3 和 4 作为side1and side2,那么side3应该是 5 . 然而,打印出来的结果却是一个长得离谱的数字。

感谢您的帮助!任何建议都表示赞赏。

4

5 回答 5

3

您不需要 side3 变量 - 它不用于计算。而你的函数hypotenuse返回结果,所以你可以直接输出sqrt.

于 2017-04-08T11:02:32.797 回答
3

我使用 Ubuntu Linux 并以这种方式编写它。喜欢的话请看。

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y) {
    double z = sqrt(x * x + y * y);
    return z;
}

int main(void) {
    double b1, b2, counter;
    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf("%lf %lf", &b1, &b2);
        printf("%.2f\n", hypotenuse(b1, b2));
    }
    return 0;
}

测试

$ ./a.out 
Enter values for two sides: 1 1.73
2.00
于 2017-04-08T11:17:53.423 回答
2

OP的代码有一些问题:

关键问题:代码本应生成编译器警告,按照scanf()指示将&side1其视为int *. 打开所有编译器警告以节省您的时间。使用代码"%d"而不是匹配"%lf"来读取double. 还应检查返回值以验证输入。

double side1, side2, side3, counter;
...
// scanf_s("%d %d", &side1, &side2);
if (scanf_s("%lf %lf", &side1, &side2) != 2) puts("Input error");

size3不需要。使用 2 个参数调用hypotenuse()@ghostprgmr

// printf("%.2f\n", hypotenuse(side1, side2, side3));
printf("%.2f\n", hypotenuse(side1, side2));

// double hypotenuse(double x, double y, double z) {
double hypotenuse(double x, double y) {
   double z = ...

Minor:用于"%.2f"打印斜边值的代码。对于 OP 代码的选择输入值,这可能没问题,但通常是一个糟糕的选择。如果输入值变化很小,例如 0.001 和 0.002,输出将打印 0.00 的舍入值。对于非常大的值,结果将显示许多不重要的数字,因为 OP 用130899030500194208680850288727868915862901750748094271410143‌​232.00.

对于开发和调试,可以考虑使用"%e""%g"或者"%a"查看相关的double.


请注意,即使在数学上处于该范围内,x * x + y * y也容易出现溢出/不足的情况。这是标准功能的优势之一,因为它通常可以很好地处理这些边缘情况。 sqrt(x * x + y * y)doublehypot(x,y)

于 2017-04-08T15:52:02.493 回答
1

作为查看此问题的任何人的参考:

不需要编写自己的函数。标准 C 提供了计算斜线的函数

7.12.7.3hypot功能

概要

#include <math.h>
double hypot(double x, double y);
float hypotf(float x, float y);
long double hypotl(long double x, long double y);

请注意,您可能需要与 链接,尽管在 C 标准的函数文档和最新的 POSIX 文档-lm中都没有明确列出。它可能记录在标准的其他地方。

链接到 C11 [draft] 标准- 可能寿命更长。)

于 2017-04-08T11:18:49.430 回答
1

使用正确的格式说明符!双精度的格式说明符不是 %d!休息就好。

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y, double z);

int main(void) {
    double side1, side2, side3, counter;

    side3 = 1;

    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf("%lf %lf", &side1, &side2);

        printf("%.2f\n", hypotenuse(side1, side2, side3));
    }

    return 0;
}

double hypotenuse(double x, double y, double z) {
    x *= x;
    y *= y;
    z = sqrt(x + y);

    return z;
}

您也可以将其修改为:

#include <stdio.h>
#include <math.h>

double hypotenuse(double x, double y);

int main(void) {
    double side1, side2, counter;



    for (counter = 0; counter <= 2; counter++) {
        printf("Enter values for two sides: ");
        scanf("%lf %lf", &side1, &side2);

        printf("%.2f\n", hypotenuse(side1, side2));
    }

    return 0;
}

double hypotenuse(double x, double y) {
    x *= x;
    y *= y;
    return sqrt(x + y);


}
于 2017-04-08T16:19:28.067 回答