0

我有几个文件:

评估_sin.c:

int evaluate_sin(int deg) {
    double j = deg_to_rad(deg);
    j = sin(j);
    printf("sin(%d) =  %d\n", deg, j);
    return j;
}

deg_to_rad.c

double deg_to_rad(int deg) {
    double rad = (3.14 * deg) / 180;
    return rad;
}

当我将evaluate_sin 函数中的“deg”变量(它是一个整数)传递给deg_to_rad 时,j 最终会变成一些随机数,例如-90503293。为什么是这样?

4

3 回答 3

1

请注意 j 是双精度数,而不是整数

所以printf("sin(%d) = %d\n", deg, j);应该放在printf("sin(%d) = %f\n", deg, j);

于 2013-03-06T04:25:41.993 回答
1

您尚未声明deg_to_rad()

extern double deg_to_rad(int deg);

在你使用它之前。您的代码假定它返回 anint并将其转换为double.

你应该有一个标题degtorad.h

degtorad.h

#ifndef DEGTORAD_H_INCLUDED
#define DEGTORAD_H_INCLUDED

extern double deg_to_rad(int deg);

#endif /* DEGTORAD_H_INCLUDED */

(在此示例中,标头保护不是 100% 必需的,但对于需要标头保护的更复杂情况,这是一个很好的基础。)

然后您的程序文件包含此标头。在某个地方,您也需要声明evaluate_sin();它可以进入同一个标题。

评估_sin.c:

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

double evaluate_sin(int deg)
{
    double j = deg_to_rad(deg);
    j = sin(j);
    printf("sin(%d) =  %.6f\n", deg, j);
    return j;
}

还要注意返回类型的变化(double而不是int);它将返回 0,除非您设法传入 π/2 的奇数倍数(当它返回 -1 或 +1 时)。以及值格式的更改double%.6f而不是%d,它将打印一个整数)。

如果您使用的是 GCC,则需要打开编译警告;至少-Wall

deg_to_rad.c

#include "deg_to_rad.h"

double deg_to_rad(int deg)
{
    double rad = (3.14 * deg) / 180;
    return rad;
}
于 2013-03-06T04:28:59.747 回答
0

虽然printf("%f", doubleValue)可以使用双打,但我仍然建议尽可能简单地使用双打scanf()所需的方式%lf。这给了程序一致性的感觉。

所以是的,我建议:

printf("sin(%d) = %lf\n", deg, j);

于 2013-03-06T04:30:35.557 回答