C 如果声明有问题?

C 如果声明有问题?,c,C,我试图练习做if语句,但在这方面运气很差。现在我正试图用if语句制作一个三角计算器,一个非常简单的计算器,但我无法让它工作。实际问题发生在输入触发函数正弦、余弦、切线后。事情就是这样。 1.我编译它 2.它输出用户提示 3.我输入函数并点击回车键 4.程序跳转到一个新的空行 5.如果我按enter键,则不会发生任何事情,程序将关闭 下面是代码本身。如果我做了一些非常愚蠢的事,请原谅我,我对C很陌生 #include <stdio.h> #include <math.h>

我试图练习做if语句,但在这方面运气很差。现在我正试图用if语句制作一个三角计算器,一个非常简单的计算器,但我无法让它工作。实际问题发生在输入触发函数正弦、余弦、切线后。事情就是这样。 1.我编译它 2.它输出用户提示 3.我输入函数并点击回车键 4.程序跳转到一个新的空行 5.如果我按enter键,则不会发生任何事情,程序将关闭

下面是代码本身。如果我做了一些非常愚蠢的事,请原谅我,我对C很陌生

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

int main(void)
{
    float x;
    float a, o, h;
    float sine, cosine, tangent;

    printf("Enter the trig function you wish to calculate: ");
    scanf("%f", &x);

    if (x == sine)
    {    printf("Enter the value of the opposite leg: ");
         scanf("%f", &o);
         printf("Enter the value of the hypotenuse: ");
         scanf("%f", &h);

         sine = o / h;
         printf("The sine is equal to %f", sine);
    }

    if (x == cosine)
    {    printf("Enter the value of the adjacent leg: ");
         scanf("%f", &a);
         printf("Enter the value of the hypotenuse: ");
         scanf("%f", &h);

         cosine = a / h;
         printf("The cosine is equal to %f", cosine);
    }

    if (x == tangent)
    {    printf("Enter the value of the opposite leg: ");
         scanf("%f", &o);
         printf("Enter the value of the adjacent leg: ");
         scanf("%f", &a);

         tangent = o / a;
         printf("The tangent is equal to %f", tangent);
    }

    getch();
}
感谢所有帮助我的人,他们没有因为我的理解力不足而无礼,我不知道我必须添加一个数字字符,而不仅仅是一个字符。

现在,以下代码:

float x;
float a, o, h;
float sine, cosine, tangent;

printf("Enter the trig function you wish to calculate: ");
scanf("%f", &x);

if(x == sine)
…将值读入x,然后将其与正弦的当前值进行比较。不幸的是,您还没有初始化正弦,所以它与一些未知的半随机值进行比较

当你与余弦和切线相比,你做的更多

这些比较没有一个有意义的结果,例如,它们很可能都是真的

猜测一下,您可能希望用户输入一个字符串,并使用strcmp将其与正弦、余弦和切线值进行比较。

Simple minimal fixes 是的,你正处在做各种各样的事情的边缘,一个有经验的程序员会称之为愚蠢,但是这些都是新手犯的错误,你不是第一个也不是最后一个犯的

int main(void)
{
    float x;
    float a, o, h;
    float sine, cosine, tangent;

    printf("Enter the trig function you wish to calculate: ");
    scanf("%f", &x);

    if (x == sine)
主要的问题是,您没有给出正弦、余弦或切线值,因此您不知道输入什么才能使相等生效

第二个问题是比较浮点数是否相等不是一个好主意

您可能会在以下方面做得最好:

int main(void)
{
    int x;
    float a, o, h;
    enum { sine, cosine, tangent };

    printf("Enter the trig function (0 = sine, 1 = cosine, 2 = tangent): ");
    scanf("%d", &x);

    if (x == sine)
这或多或少是正统的,读取和比较整数是否相等是可靠的。您必须更改操作,因为我已将正弦、余弦和切线的名称作为枚举整数常量进行了抢占。你可以通过使用大写的名字来解决这个问题,或者使用前缀来命名,或者

int main(void)
{
    int x;
    float a, o, h;
    float sine, cosine, tangent;
    enum { SINE, COSINE, TANGENT };

    printf("Enter the trig function (0 = sine, 1 = cosine, 2 = tangent): ");
    scanf("%d", &x);

    if (x == SINE)
友好的输入 正如您可能从下面的评论中了解到的,最好允许用户输入他们想要输入的函数的名称,而不是让他们输入编码的数字。要可靠地编写代码有点困难,这就是我用数字留下上面答案的主要原因

#include <stdio.h>
#include <string.h>

int main(void)
{
    char line[4096];

    printf("Enter trig function you wish to calculate: ");
    if (fgets(line, sizeof(line), stdin) != 0)
    {
        char *nl = strchr(line, '\n');
        if (nl != 0)
            *nl = '\0';
        if (strcmp(line, "sine") == 0)
        {
            /* Process sine */
        }
        else if (strcmp(line, "cosine") == 0)
        {
            /* Process cosine */
        }
        else if (strcmp(line, "tangent") == 0)
        {
            /* Process tangent */
        }
        else
        {
            fprintf(stderr, "Unrecognized trig function (%s)\n", line);
        }
    }
}
4096只是一个很大的整数,它太长了,所以不太可能有人会进入比这更长的一行。如果他们真的输入了这样一行,那么GIGO和他们将得到他们应得的,这将是一个礼貌的错误消息,他们输入的名字没有被识别

这仍然不是很好的代码。去掉前导空格和尾随空格可能是合理的,也可能将输入大小写转换为小写,其中一条消息可能会标识有效的函数名。重复代码循环是可能的,但是你需要一个函数来提示和读取响应,等等。所有这些都增加了可用性,但牺牲了更多的代码,这对新手程序员来说是不必要的。你的if语句不起作用,因为你在比较输入值x,使用尚未设置的浮点值。我想你要做的是:

int x;
printf("Enter the trig function you wish to calculate\n");
printf("1=sine, 2=cosine, 3=tangent: ");
scanf("%d", &x);

if (x == 1)
{
    // do sine
}
else if (x == 2)
{
    // do cosine
}
else if (x == 3)
{
    // do tangent
}
else
{
    printf("I don't know that function.\n");
}

愚蠢至极?不。当你第一次开始编程时,很容易犯这样的错误。坚持下去。我们都去过那里。

我不确定您首先要在程序中输入什么,但这就是您的错误所在。如果您输入的字符数组是字符串,并且该字符串被传递给x,则无法将其与浮点值进行比较。此外,正弦、余弦和切线变量没有值/未分配任何内容。为了解决这个问题,给变量分配一个数字,比如float sine=1;并确保在命令行中输入要传递给x的是一个数字。如果要输入余弦并将该值传递给x,则必须将x变量更改为字符数组,例如char[]x=,然后将正弦、余弦和切线变量更改为字符数组。如果您确实将变量更改为数组,请记住从scanf语句中删除&,如->scanf%s,x

在将正弦、余弦和切线与x进行比较之前,你不应该先给它们一些值吗?你是否试图输入正弦、余弦等,并希望这能起作用?如果是这样的话,您的困难就比构建一个可以工作的If语句要深。仅供参考:getch不是在您包含的任何头中声明的标准函数。我相信这是Windows上的一个常用功能,在中声明。这个板异常活跃!在国际海事组织,这是一个相当大的问题
或者,这种想法应该被允许和通常使用它的MS-DOS程序一起消亡。如果用户要选择正弦、余弦或切线,则应允许用户输入正弦、余弦或切线。在20世纪80年代,强迫他们为非数字输入输入数字是有意义的,但以这种方式保存每一个可能的代码字节已经没有意义了,而且至少在20年前都没有意义,除非你真的需要支持微型嵌入式设备。@JerryCoffin是的,但是对于初学者来说,它仍然具有非常容易实现的优点。当然,下一个项目应该是接受更多的人工输入,但对于初学者来说,灵活地做到这一点相当困难。@JerryCoffin:虽然我同意你的观点,让用户输入数字而不是文字,但我认为在入门课上使用数字仍然很有用。否则,试图获得逻辑控制流的基本概念的初学者将被迫处理字符串输入和比较的复杂性。每次只做一件事。当你第一次开始编程时,很容易犯这样的错误。坚持下去。我们都去过那里。这一开始的麻烦不应该让你失望。他否决了所有人,因为他不喜欢让人否决他无关的答案。@JimMischel-我不是否决者,正如你似乎暗示的那样。@selbie:不,我不是暗示是你。还有一个。不过,现在这已经无关紧要了,因为他扭转了他的反对票。