2017-02-02 12 views
-1

私は給与から控除を見つけるためにユーザー入力を得ようとしているので、IDとそのID番号の範囲にある給料を入れます。たとえば、ID 1を入力してから給与500を入力し、入力した給与、給与控除、および正味給与を出力する必要があります。それはすべてですが、給与が正しいID番号の範囲内にあるかどうかをチェックするところでは、入力されたIDがチェックされた後でも、すべてのID番号でチェックします。if文が成功した後で停止する方法は? Cのプログラミング

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

int main() 
{ 
    int ID; // variable for ID 
    float Base_Salary; // variable for base salary 
    float Amount_Deducted; // variable for amount deducted from employee 
    float Net_Salary; // variable for employees' net salary 

    printf("%s", "Enter ID: \n"); // prompt for ID number 
    scanf("%d", &ID); 

    // Validate user's ID 
    if (ID == 1) 
     printf("You have entered the ID 1\n"); 
    else { if (ID == 2) 
      printf("You have entered the ID 2\n"); 
      else { if (ID == 3) 
       printf("You have entered the ID 3\n"); 
        else { if (ID == 4) 
         printf("You have entered the ID 4\n"); 
          else { if (ID == 5) 
           printf("You have entered the ID 5\n"); 
            else { if (ID < 1 && ID > 5) 
             printf("You didn't enter a proper ID\n"); 
            } 
          } 
        } 
      } 
    } 

    printf("%s", "Enter your salary in the appropriate range: \n"); 
    scanf("%f",&Base_Salary); 

    // Validations 

     if (ID == 1 && Base_Salary >= 100 && Base_Salary <= 1000) { 
      printf("Base salary is in range for ID given.\n"); 
     } 
     else { 
      printf("Salary must be between 100-1000 for ID 1.\n"); 
     } 

     if (ID == 2 && Base_Salary >= 1001 && Base_Salary <= 5000) { 
      printf("Base salary is in range for ID given.\n"); 
     } 
     else { 
      printf("Salary must be between 1001-5000 for ID 2.\n"); 
     } 

     if (ID == 3 && Base_Salary >= 5001 && Base_Salary <= 10,000) { 
      printf("Base salary is in range for ID given.\n"); 
     } 
     else { 
      printf("Salary must be between 5001-10,000 for ID 3.\n"); 
     } 

     if (ID == 4 && Base_Salary >= 10,001 && Base_Salary <= 15,000) { 
      printf("Base salary is in range for ID given.\n"); 
     } 
     else { 
      printf("Salary must be between 10,001-15,000 for ID 4.\n"); 
     } 

     if (ID == 5 && Base_Salary >= 15,001 && Base_Salary <= 20,000) { 
      printf("Base salary is in range for ID given.\n"); 
     } 
     else { 
      printf("Salary must be between 15,001-20,000 for ID 5.\n"); 
     } 

    // Calculations 
    if (ID == 1) { 
     Amount_Deducted = Base_Salary * 0.50; 
     Net_Salary = Base_Salary - Amount_Deducted; 
     printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
     printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
     printf("The Net Salary is = %.2f.\n", Net_Salary); 
    } 
    if (ID == 2) { 
     Amount_Deducted = Base_Salary * 1.50; 
     Net_Salary = Base_Salary - Amount_Deducted; 
     printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
     printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
     printf("The Net Salary is = %.2f.\n", Net_Salary); 
    } 

    if (ID == 3) { 
     Amount_Deducted = Base_Salary * 2.50; 
     Net_Salary = Base_Salary - Amount_Deducted; 
     printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
     printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
     printf("The Net Salary is = %.2f.\n", Net_Salary); 
    } 

    if (ID == 4) { 
     Amount_Deducted = Base_Salary * 3.50; 
     Net_Salary = Base_Salary - Amount_Deducted; 
     printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
     printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
     printf("The Net Salary is = %.2f.\n", Net_Salary); 
    } 

    if (ID == 5) { 
     Amount_Deducted = Base_Salary * 4.50; 
     Net_Salary = Base_Salary - Amount_Deducted; 
     printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
     printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
     printf("The Net Salary is = %.2f.\n", Net_Salary); 
    } 

} 
+4

switch文はどうですか? – bruceg

+2

いい階段があります。それを取り除く! – bolov

+3

行 '55、61、67' - "警告:カンマ式の左辺オペランドは効果がありません "* - あなたはコンパイラの警告を読んでいませんか? –

答えて

1

それは本当にswitch-caseのように見えますがif-elseよりも適切である:これは、 "ID == 1 & &が...給与の範囲...他の印刷エラーをチェックすると、"

// Validate user's ID 
switch (ID) 
{ 
case 1: 
    printf("You have entered the ID 1\n"); 
    if (Base_Salary >= 100 && Base_Salary <= 1000) 
    { 
     printf("Base salary is in range for ID given.\n"); 
    } 
    Amount_Deducted = Base_Salary * 0.50; 
    Net_Salary = Base_Salary - Amount_Deducted; 
    break; 

case 2: 
    printf("You have entered the ID 2\n"); 
    /* Base Salary & Amount Deducted, code here. */ 
    break; 

case 3: 
    printf("You have entered the ID 3\n"); 
    /* Base Salary & Amount Deducted, code here. */ 
    break; 

case 4: 
    printf("You have entered the ID 4\n"); 
    /* Base Salary & Amount Deducted, code here. */ 
    break; 

case 5: 
    printf("You have entered the ID 5\n"); 
    /* Base Salary & Amount Deducted, code here. */ 
    break; 

default: 
    printf("You didn't enter a proper ID\n"); 
    break; 
} 
+0

おそらく 'if(ID> = 1 && ID <= 5){printf("あなたはID%d \ n "、ID)を入力しました。 } else {printf( "あなたは正しいIDを入力しなかった\ n");}; ' –

0

ロジックは述べていますIDが1でないすべてのIDを意味する場合は、エラーを出力します。

私はあなたがこの変更したいと思う:これまで

if (ID == 1 && Base_Salary >= 100 && Base_Salary <= 1000) { 
    printf("Base salary is in range for ID given.\n"); 
} 
else { 
    printf("Salary must be between 100-1000 for ID 1.\n"); 
} 

if (ID == 1) { 
    if (Base_Salary >= 100 && Base_Salary <= 1000) { 
     printf("Base salary is in range for ID given.\n"); 
    } 
    else { 
     printf("Salary must be between 100-1000 for ID 1.\n"); 
    } 
} 

を、あなたはあまりにも他のブロックのそれぞれを変更する必要があります。

あなたの給与情報を保持する配列と給与を反復するループを使用すると、このコードははるかに良いでしょうし、難しいすべてのif/elseステートメントを取り除くことができます読んで維持するのが難しい。

1

正確な質問を解決するには、elseifを使用してください。

IF文が真の場合、その下の他のすべてのelseifはスキップされます。

if (ID == 1) { 
    Amount_Deducted = Base_Salary * 0.50; 
    Net_Salary = Base_Salary - Amount_Deducted; 
    printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
    printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
    printf("The Net Salary is = %.2f.\n", Net_Salary); 
} 

else if (ID == 2) { 
     Amount_Deducted = Base_Salary * 1.50; 
     Net_Salary = Base_Salary - Amount_Deducted; 
     printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
     printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
     printf("The Net Salary is = %.2f.\n", Net_Salary); 
    } 

else if (ID == 3) { 
    Amount_Deducted = Base_Salary * 2.50; 
    Net_Salary = Base_Salary - Amount_Deducted; 
    printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
    printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
    printf("The Net Salary is = %.2f.\n", Net_Salary); 
} 

else if (ID == 4) { 
    Amount_Deducted = Base_Salary * 3.50; 
    Net_Salary = Base_Salary - Amount_Deducted; 
    printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
    printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
    printf("The Net Salary is = %.2f.\n", Net_Salary); 
} 

else if (ID == 5) { 
    Amount_Deducted = Base_Salary * 4.50; 
    Net_Salary = Base_Salary - Amount_Deducted; 
    printf("The Base Salary you have entered = %.2f.\n", Base_Salary); 
    printf("The Amount of salary deducted is = %.2f.\n", Amount_Deducted); 
    printf("The Net Salary is = %.2f.\n", Net_Salary); 
} 

コードを非常に冗長にして、各IFブロック内で配列を使用し、それらをループするためのインデックスを使用する方が賢明です。それをメソッドに簡単にリファクタリングしたり、FORループ内に書き込んでコードの再利用を最大限にしたり、コードの重複を減らしたりすることができます。

+0

はい、そうです。私はそれを逃して答えを編集しました。 – Uppsilon

0

元のコメントから引き続き、コンパイラは最初のエラーがどこにあるかを伝える必要があります。警告が有効になっていない場合は、少なくとも-Wall -Wextraをコンパイルして有効にしてから、を読むと、はすべての警告でコンパイルされたコードを受け付けません。 (警告を排除できない正当なシナリオに遭遇することはほとんどありません)また、選択した場合は、追加の警告として-pedanticを追加することもできます。

コンパイラがあなたに指示するはずです。

salary.c:55:60: warning: left-hand operand of comma expression has no effect 
[-Wunused-value] 
    if (ID == 3 && Base_Salary >= 5001 && Base_Salary <= 10, 000) { 
                  ^

始めるように、第二に(例えば、あなたが数内commaを含めることはできません)

問題を指しているあなたに曲折'^')を与えるのに十分であってもいいですC言語でのプログラミングでは、は常にすべてのユーザー入力を検証します。scanfの返品をチェックして)適切な変換が行われたことを確認できない場合は、コード内のその時点の実際の値を実際に処理しているという確信がなくなる可能性があります。それについては何も難しいことではありません。予想されるコンバージョンの数が実際に起こったことを確認するだけです。また、その時点で入力された値の範囲を検証することもできます。 (単純な定数で#define IDMAX 5を定義した):

printf ("Enter ID: "); /* prompt for ID number & validate */ 
if (scanf ("%d", &ID) != 1 || ID < 1 || ID > IDMAX) { 
    fprintf (stderr, "error: invalid ID\n"); 
    return 1; 
} 

注:それはあなたのAmount_Deductedが実際にそうでない場合は、あなたのNet_Salaryは次のようになり、1より大きい値を乗じて計算されていることを非常にそうある 。最後に

、配列のうち、作成された次のような例では、範囲及び控除率を検証するための多くの方法、簡単なルックアップテーブルがある一方で、if ... else ...またはswitch文の無数に反対している非常に効率的なソリューションを提供します。たとえば:

#include <stdio.h> 

#define IDMAX 5 

int main (void) /* affirmatively indicate no arguments expected */ 
{ 
    int ID = 0, /* initialize variables */ 
     range [][2] = {{ 100, 1000}, /* salary range lookup */ 
         { 1001, 5000}, 
         { 5001, 10000}, 
         { 10001, 15000}, 
         { 15001, 20000}}; 
    float Base_Salary = 0.0, 
     Amount_Deducted = 0.0, 
     Net_Salary = 0.0, 
     rate[] = { .05, .15, .25, .35, .45 }; /* rate lookup */ 

    printf ("Enter ID: "); /* prompt for ID number & validate */ 
    if (scanf ("%d", &ID) != 1 || ID < 1 || ID > IDMAX) { 
     fprintf (stderr, "error: invalid ID\n"); 
     return 1; 
    } 

    printf ("Enter your salary in the appropriate range: "); 
    if (scanf ("%f", &Base_Salary) != 1) { /* validate entry */ 
     fprintf (stderr, "error: invalid Base_Salary\n"); 
     return 1; 
    } 

    /* validate Base_Salary in range */ 
    if (Base_Salary < range[ID-1][0] || Base_Salary > range[ID-1][1]) { 
     fprintf (stderr, "error: Salary must be between %d-%d for ID %d.\n", 
       range[ID-1][0], range[ID-1][1], ID); 
     return 1; 
    } 
    else 
     printf ("Base salary is in range for ID given.\n"); 

    Amount_Deducted = Base_Salary * rate[ID-1]; /* calculations */ 
    Net_Salary = Base_Salary - Amount_Deducted; 

    printf ("The Base Salary you have entered = %.2f.\n", Base_Salary); 
    printf ("The Amount of salary deducted is = %.2f.\n", 
      Amount_Deducted); 
    printf ("The Net Salary is = %.2f.\n", Net_Salary); 

    return 0; /* main is type 'int' and returns a value */ 
} 

使用例/出力

$ ./bin/salary 
Enter ID: 1 
Enter your salary in the appropriate range: 99 
error: Salary must be between 100-1000 for ID 1. 

$ ./bin/salary 
Enter ID: 1 
Enter your salary in the appropriate range: 1000 
Base salary is in range for ID given. 
The Base Salary you have entered = 1000.00. 
The Amount of salary deducted is = 50.00. 
The Net Salary is = 950.00. 

$ ./bin/salary 
Enter ID: 2 
Enter your salary in the appropriate range: 1000 
error: Salary must be between 1001-5000 for ID 2. 

常に有効に警告してコンパイルすると、それは警告なしでコンパイル、およびデバッグ時間が大幅に削減されますまで、任意のコードを除く外ません。コードコメントにもいくつかの追加ポインタが含まれています。ご質問がある場合はお知らせください。

最終注:エラーではないが、Cのための標準的なスタイルは、一般的に全て小文字の賛成でMixed_CasecaMelCase変数名を回避し、マクロやプリプロセッサ定義のため大文字を予約します。あなたの変数名はそのままにしておきます。これはニトロですが、意識する価値があります。

関連する問題