2016-10-15 7 views
-1

変数ratePerHour、hoursWorked、bonus、overtimeSalaryを計算して合計給与を計算するプログラムを作成しています。すべてうまく動作しますが、実行しようとすると、変数の入力値は格納されず、計算も行われません。関数の問題(char *プロンプト) - 計算

私は問題があるため、私のreadNumber機能の間違った何かをしていると思う:

double readNumber(char *prompt) { 
    double val; 
    //print the prompt: 
    printf("%s", prompt); 
    scanf(" %lf", &val); 

    if (scanf("%lf", &val) != 1) { 
     printf("Invalid input.\n"); 
    exit(0); 
} 

また別の問題は、彼はボーナスを受け取るか、またはされていない場合は、プログラムがユーザーに尋ねるべきであり、ユーザがnを置けば、それはshouldnボーナスを入力するように頼んではいませんが、何らかの理由で私のプログラムがします。

char readYesOrNo(char *prompt) { 
    char yn = 'n'; 
    //display the prompt: 
    printf("%s", prompt); 

    yn = scanf(" %c", &yn); 

    //return the value 
    return(yn); 
} 

ので、私は、私は私のプログラムがどのように見えるかの写真を添付し​​ます値を格納すると間違って何かがあると思うゼロとして最終的にそれは私の計算を示しています。私は本当にそれで苦労してきたので、私は本当に助けに感謝します。

enter image description here

+1

あなたのコードサンプルは複雑なので、コードとコメントは区別できません。それは人々が手助けするのを難しくします。 'yn = scanf("%c "、&yn)'という形式の文は、 'yn'に値を読み込み、' scanf()の戻り値で上書きすることで直ちに破棄します。 ' - ' int'から 'char'に切り詰められます)。 – Peter

+0

あなたは 'readNumber()'に 'exit(0);'をつけたくありません。代わりに 'return val;'が必要でしょう。また、コメント記法を使用してコードにコメントを埋め込んでください。あなたのコードは非常にCに似ており、非常にun-C++に似ています。 –

+0

テキストを画像ではなくテキストとして送信してください! – Olaf

答えて

1

readnumber()では、代わりに、またはexit(0)valを返す必要があります。

Nを入力しても、scanfの戻り値は1です。

1

あなたは何回あなたがvalを読む必要があると思いますか?あなたが優れている

double readNumber(char *prompt) { 
    double val;   /* you have 1 val */ 
    print the prompt: 
    printf("%s", prompt); 
    scanf(" %lf", &val);   /* you read it the 1st time here (unneeded) */ 

    if (scanf("%lf", &val) != 1) { /* you read whatever the next num is here */ 
     printf("Invalid input.\n"); 
    exit(0); 
} 

は不要な初期の読み取りを取り除くと、あなたがする機能を宣言しているようdoubleを返す、例えばばかり務め:

double readNumber (const char *prompt) 
{ 
    double val; 
    printf ("%s", prompt);   /* print the prompt */ 
    if (scanf ("%lf", &val) != 1) { /* read/validate the double value */ 
     fprintf (stderr, "error: Invalid input.\n"); 

     exit(0); /* you can handle the error how ever you like here 
        * since you are returning a double, indicating success or 
        * failure by numeric return is a difficult proposition. 
        */ 
    } 
    return val; 
} 

注:promptconst char *promptとしての意志を渡しますコンパイラがルーチンをさらに最適化するのを助ける - promptは変更されないことがわかっている)

fgetsで一度に1行を読み込み、バッファからsscanfの値を解析するか、または読み込みを解析/変換から切り離して入力偶発事象をより柔軟に処理できるようにすることができます)。

は、上記の修正としてreadNumberを試してみる(ノート:彼らはC++であるようreadnumberがCにずっと好意で使用されていないcamelCase変数を回避し、それはあなた次第ですので、それは、スタイルのことだが、それは確かに立ちますあなたのCコードを読み取るそれらのためにそれを望まないかもしれない方法)

で外に他の答えは、あなたがそれだと思う何をやっていない、私はここでは繰り返さないだろうynscanfリターンをカバーしています。