我的 C++ 代码有什么问题?对于 a = 90 Z 应该等于 -1,但我得到完全不同的答案。为什么?

What's wrong with my c++ code? for a = 90 Z should be equal to -1, but I'm getting completly different answer. Why?

我试图编写可以计算三角函数的代码,但它出错了,我不知道该怎么做,因为我看不到任何错误

using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <iostream>
#include <conio.h>
#include <cmath>

int main()
{`

    const double pi = M_PI;
    double Z, a, sin1, cos1, X, Y;

    //printf("Input a =");
    printf("%s", "Input a = ");
    scanf("%g", &a);
    a = a * pi / 180;
    sin1 = sin(3 * pi - 2 * a);
    X = (sin1 * sin1)*2;
    cos1 = cos(5 * pi - 2 * a);
    Y = cos1 * cos1;
    Z = X - Y;
    printf("Z = %g\n\n", Z);

    _getch();
    return 0;


}`

如上述评论所述,启用编译器警告消息应该表明问题并提出解决方案,因此删除_CRT_SECURE_NO_WARNINGS可能有助于查看问题和解决方案:

(15,11): warning C4477: 'scanf' : format string '%g' requires an argument of type 'float *', but variadic argument 1 has type 'double *'
(15,11): message : consider using '%lg' in the format string
(15,5): error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

使用编译器时建议:

scanf("%lg", &a);

如上述评论中所述,我们仍然收到有关使用 scanf:

的警告
(15,5): error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

因此,当我们包含 _CRT_SECURE_NO_WARNINGS 并获得预期输出时继续使用 scanf,但是使用编译器建议的 scanf_s(并删除 _CRT_SECURE_NO_WARNINGS)也会产生预期的结果输出。

但是,由于您包含了 iostream,c++ 提供了 class iostream 的 cin 对象,因此最简单的解决方案可能是按照建议使用 cin在上面的评论中。