0

私は if ステートメントの作成を練習しようとしていますが、これにはほとんど運がありません。現在、if ステートメントを使用して、非常に単純な三角関数の計算機を作成しようとしていますが、動作させることができません。実際の問題は、三角関数 (サイン、コサイン、タンジェント) を入力した後に発生します。これが起こることです。
1. コンパイルします
2. ユーザープロンプトを出力します
3. 関数を入力して Enterキーを押します
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();
}

実際に助けてくれて、私の理解不足について無礼ではなかったすべての人に感謝します。単なる文字ではなく数字の文字を追加する必要があることに気づきませんでした.

4

4 に答える 4

7

簡単な(最小限の)修正

はい、経験豊富なプログラマーがばかげていると呼ぶさまざまなことを行う寸前ですが、それらは初心者が犯す種類の間違いです (間違いを犯したのはあなたが最初でも最後でもありません)。

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)

主な問題はsinecosineまたはtangent値を指定していないため、等式を機能させるために何を入力すればよいかわかりません。

二次的な問題は、浮動小数点数を等しいかどうか比較するのは得策ではないということです。

あなたはおそらく次のようなもので最善を尽くすでしょう:

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)

これは多かれ少なかれオーソドックスであり、整数を読み取って等しいかどうかを比較することは信頼できます。sine名前、cosine、およびtangentを列挙 (整数) 定数として先取りしたため、アクションを変更する必要があります。定数に大文字の名前を使用するか(これはかなりオーソドックスです)、名前にプレフィックスを使用するか、または...

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 はそれに値するものを取得します (これは、入力した名前が認識されなかったという丁寧なエラー メッセージになります)。

これはまだ素晴らしいコードではありません。先頭と末尾の空白を取り除き、入力を小文字に変換するのが合理的かもしれません。おそらく、メッセージの 1 つで有効な関数名が識別されるはずです。コードを繰り返しループさせることは可能ですが、その場合は、プロンプトを表示して応答を読み取る関数などが必要になります。これらはすべて、初心者のプログラマーにとって不必要に複雑なコードを犠牲にして使いやすさを追加します。

于 2012-12-30T02:48:49.550 に答える
2

入力値を設定されていない浮動小数点値と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");
}

とてつもなくバカ?いや。プログラミングを始めたばかりのときに犯しやすい間違いです。それにこだわります。私たちは皆そこにいました。

于 2012-12-30T02:49:09.307 に答える
1

そもそもプログラムに何を入力しているのかわかりませんが、これがエラーの原因です。文字配列 (「文字列」) を入力し、それが に渡されるx場合、それを浮動小数点値と比較することはできません。また、sinecosine、およびtangent変数には値がありません/何も割り当てられていません。問題を解決するには、次のように変数に番号を割り当てfloat sine = 1;、コマンド ラインに入力して渡す対象がx番号であることを確認します。「コサイン」を入力してその値を に渡したい場合はxx変数を などの char 配列に変更してから、 、、char[] x = ""および を変更する必要があります。sinecosinetangent変数も文字配列になります。変数を配列に変更する場合は、忘れずに&scanf ステートメントから -> のように削除してくださいscanf("%s", x);

于 2012-12-30T02:59:41.760 に答える
1

現在、このコード:

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が、それを の現在の値と比較しますsine。残念ながら、 を初期化していないsineため、未知の半ランダムな値と比較しています。

と を比較するcosinetangent、より多くのことを行っています。

これらの比較はどれも意味のある結果をもたらしません (たとえば、それらはすべて真である可能性があります)。

"sine"おそらく、ユーザーに文字列を入力させ、それを、"cosine"、および"tangent"を使用して値と比較させたいと思うでしょうstrcmp

于 2012-12-30T02:48:45.297 に答える