2017-04-02 12 views
0

私は比較的新しいコーディングをしています。現在Cを勉強しています。私は教科書の運動に関するいくつかの問題を抱えていました。whileループ変数の初期化と変数のタイプ(C)

練習の主な目的は、従業員が受け取るべき給与の合計を、実行された作業時間と時間単位の時間を入力することによって計算することです。料金は100%から40時間までですが、40時間後には150%まで上がります。ここで私が書いたコードは次のとおりです。

#include <stdio.h> 

int main (void) { 
    int employee, hour, ratenormal, totalrate, counter, rate; 
    int salary; 

    hour = 1; 

    while (hour != -1) { 
     printf("Enter # of hours worked (-1 to end): "); 
     scanf_s("%d", &hour); 
     if (hour == -1) break; 

     printf("Enter hourly rate of the work ($00.00): $"); 
     scanf_s("%d", &rate); 

     if (hour <= 40) { 
      salary = hour * rate; 
     } 
     else if (hour > 40) { 
      salary = salary + ((hour - 40) * (rate * 1.5)); 
     } 

     printf("Salary is $%d\n\n", salary); 
    } 

    return 0; 
} 

私は質問のカップルを持っていた:

1)私はfloat型として変数「給与」を宣言した場合つまり、なぜ、その結果のみ0を出力しますか?

2)ループはうまく動作しますが、最初の反復でのみ機能します。問題は、変数の給与を再度初期化する必要があることです。それ以外の場合は、以前に使用された値の一部を保存し続けます。どうすればこのことができますか?

ありがとうございました!

答えて

1

問題はsalary初期化されていないsalary> 40時間の計算です。それは、変数を初期化することが常に良いことを考えることができます。次に、salaryの通常レート部分には40 * rateを時間> 40の給与計算式で単に代用するだけです。

#include <stdio.h> 

int main (void) { 
    int hour = 0; 
    float rate = 0.0, salary = 0.0; 

    while (hour != -1) { 
     printf("Enter # of hours worked (-1 to end): "); 
     if (scanf ("%d", &hour) != 1) { 
      fprintf (stderr, "error: invalid hours input.\n"); 
      return 1; 
     } 
     if (hour == -1) break; 

     printf("Enter hourly rate of the work ($00.00): $"); 
     if (scanf ("%f", &rate) != 1) { 
      fprintf (stderr, "error: invalid rate input.\n"); 
      return 1; 
     } 

     if (hour <= 40) { 
      salary = hour * rate; 
     } 
     else if (hour > 40) { 
      salary = 40 * rate + ((hour - 40) * (rate * 1.5)); 
     } 

     printf("Salary is $%.2f\n\n", salary); 
    } 

    return 0; 
} 

使用例/出力

$ ./bin/salary2 
Enter # of hours worked (-1 to end): 20 
Enter hourly rate of the work ($00.00): $10.50 
Salary is $210.00 

Enter # of hours worked (-1 to end): 60 
Enter hourly rate of the work ($00.00): $10.50 
Salary is $735.00 

注:は、私はLinux上で何scanf_s機能を(彼ら_s味主にwindoze)持っていないので、私は上記のscanfが、scanf_s意志を使用していましたあなたのケースでうまく動作します。

0

最後の行printf("Salary is $%d\n\n", salary);宣言salary = 0;それ以外の条件が正しく機能しない場合は、以前の値も取得されます。

0

1)と答えてください。 floatとして給与を宣言した後フォーマット%の.2f 2つの小数のようにフロートを印刷するよう

printf("Salary is $%.2f\n\n", salary); 

ようにそれを印刷します。給与は550.5だったのであれば、それは
給与を適切に私はあなたがあれば、あなたのコードで給料

salary = hour * rate; 
    if (hour > 40) { 
     salary = salary + ((hour - 40) * (rate * 1.5)); 
    } 

を計算し、これを行うにしたいと思います$ 550.50

私は質問2を理解した場合)されて印刷し最初の反復の後に40より大きい時間を入力すると、以前の反復の給与値が再利用されます。すべてのケースで常に標準レートで給与額を再計算したい場合は、時間数が40を超える場合、給与に追加時間に超過時間数を乗じた数値

0

あなたはfloatとして給与を使用しているなら、あなたは

printf("Salary is $%f\n\n", salary); 
salary=0.0; 
を印刷する必要があり