【C語言及程序設計】項目1-26-2&3&5:成績等級 & 分段函數求值switch語句版 & 個人所得稅計算器switch語句版


switch語句常用於解決多分支、分段問題,該語句的關鍵就在於將具體問題中的分段、分支條件轉化為常量constant

首先,一定要理解switch語句是如何執行的:

 

項目1-26-2:成績等級

 1 /* 成績等級(switch).cpp: 
 2 問題描述:給出一百分制成績,要求輸出成績等級’A’,’B’,’C’,’D’,’E’。90分以上為’A’,80-89分為’B’,70-79分為’C’,60-69分為’D’,60分以下為’E’。
 3 */
 4 
 5 #include "stdafx.h"
 6 
 7 int main()
 8 {
 9     int dgrade, dgrade_10;
10 
11     printf("Input the number form of the grade.\n");
12     scanf_s("%d", &dgrade);
13     
14     //dgrade_10 = dgrade/10;
15 
16         switch (dgrade/10)
17         {
18         case 0:
19         case 1:
20         case 2:
21         case 3:
22         case 4:
23         case 5: printf("grade E"); break;
24 
25         case 6: printf("grade D"); break;
26 
27         case 7: printf("grade C"); break;
28 
29         case 8: printf("grade B"); break;
30 
31         case 9: printf("grade A"); break;
32 
33         case 10: printf("grade A"); break;
34 
35         default:printf("invalid value");break;
36         }
37 
38     return 0;
39 }

 

程序中,利用了整型數據運算的特性(舍去小數部分)每一個分數段通過運算轉化為一個特定的常數;

 

項目1-26-3:分段函數求值switch語句版

問題描述

 

通過運算轉化的方案:

 1 #include <stdio.h>  
 2 #include <math.h>  
 3 int main ( )  
 4 {  
 5     int x, a;  
 6     double y;  
 7     scanf("%d", &x);  
 8     a = x/2;   //注意是整數相除  
 9     if (a<0)  
10         a=0;    //這樣,x<0時,a值也是0  
11     switch(a)  
12     {  
13     case 0: //即x<2時  
14         y=x;  
15         break;  
16     case 1:  
17     case 2://a為1、2,對應x>=2 && x<6時  
18         y=x*x+1;  
19         break;  
20     case 3:  
21     case 4://a為3、4,對應x>=6 && x<10時  
22         y=sqrt(x+1);  
23         break;  
24     default://如果走到這一分支,對應的是x>=10的所有情況  
25         y=1.0/(x+1);  
26     }  
27     printf("%f\n", y);  
28     return 0;  
29 }  

 

利用邏輯運算的方案(更優):

#include "stdafx.h"
#include <math.h>


int main()
{
    int x, t;
    scanf_s("%d", &x);

    t = (x < 2) + (x < 6) + (x < 10);

    switch (t)
    {
    case 3: printf("%d", x); break;

    case 2: printf("%d", x*x +1); break;

    case 1: printf("%lf", sqrt(x+1)); break;

    case 0: printf("%lf", 1.0/(1+x)); break;

    default:break;
    }

    return 0;
}

 

很顯然第二個方案普適性更高,而第一個方案只適合特殊情形(分段較均勻、有規律)

 

項目1-26-5:個人所得稅計算器switch語句版

問題描述

 

利用if-else語句轉化的方案:

 1 #include <stdio.h>  
 2 int main ( )  
 3 {  
 4     double dSalary,dTax=0,dNetIncome=0; //請欣符合匈牙利命名法的變量名  
 5     double dValue;   //在模板基礎上加一個變量,表示超出起征點的收入  
 6     double dRate, dOffset;  //分別表示稅率和速算扣除數  
 7     int iStep;       //用於確定交稅的“檔次”  
 8     printf("請輸入您本月的收入總額(元):");  
 9     scanf("%lf", &dSalary);  
10     // 下面求解應繳個人所和稅dTax和稅后收入dNetIncome  
11     dValue = dSalary - 3500;   //在起征點基礎上考慮納稅  
12     if(dValue <= 0.0)  
13         dTax = 0.0;  //不需要交稅  
14     else  
15     {  
16         //這一組if語句確定交稅的檔次  
17         if(dValue <= 1500)  
18             iStep = 1;  
19         else if(dValue <= 4500)  
20             iStep = 2;  
21         else if(dValue <= 9000)  
22             iStep = 3;  
23         else if(dValue <= 35000)  
24             iStep = 4;  
25         else if(dValue <= 55000)  
26             iStep = 5;  
27         else if(dValue <= 80000)  
28             iStep = 6;  
29         else  
30             iStep = 7;  
31   
32   
33         //根據確定的檔次,得到稅率和速算扣除數  
34         switch(iStep)  
35         {  
36         case 1:  
37             dRate = 0.03, dOffset = 0.0;  
38             break;  
39         case 2:  
40             dRate = 0.1, dOffset = 105.0;  
41             break;  
42         case 3:  
43             dRate = 0.2, dOffset = 555.0;  
44             break;  
45         case 4:  
46             dRate = 0.25, dOffset = 1005.0;  
47             break;  
48         case 5:  
49             dRate = 0.3, dOffset = 2755.0;  
50             break;  
51         case 6:  
52             dRate = 0.35, dOffset = 5505.0;  
53             break;  
54         case 7:  
55             dRate = 0.45, dOffset = 13505.0;  
56         }  
57         dTax = dValue * dRate - dOffset;  //計算所得稅,體會將“確定參數”與“計算”分開的好處:思路更明晰,不易在計算公式上犯大錯  
58     }  
59     dNetIncome = dSalary-dTax;        //計算稅后收入  
60     printf("您本月應繳個人所和稅 %.2lf 元,稅后收入是 %.2lf 元。\n", dTax, dNetIncome);  
61     printf("依法納稅,共享繁榮。謝謝使用!\n");  
62     return 0;  
63 }  

 

利用邏輯運算的方案:

 1 #include "stdafx.h"
 2 
 3 
 4 int main()
 5 {
 6     double dSalary, dTax = 0, dNetIncome = 0;
 7     printf("請輸入您本月的收入總額(元):");
 8     scanf_s("%lf", &dSalary);
 9 
10     double dover, tax_rate, quick_deduction;
11     int x;
12 
13     dover = (dSalary - 3500)/100;
14     
15     x = (dover < 15) + (dover < 45) + (dover < 90) + (dover < 350) + (dover < 550) + (dover < 800);
16 
17         if (dSalary <= 3500)
18         {
19             printf("您本月應繳個人所和稅 0 元。\n");
20             printf("依法納稅,共享繁榮。謝謝使用!\n");
21             return 0;
22         }
23         else
24         {
25             switch (x)
26             {
27             case 6: tax_rate = 0.03, quick_deduction = 0; break;
28 
29             case 5: tax_rate = 0.1, quick_deduction = 105; break;
30 
31             case 4: tax_rate = 0.2, quick_deduction = 555; break;
32 
33             case 3: tax_rate = 0.25, quick_deduction = 1005; break;
34 
35             case 2: tax_rate = 0.3, quick_deduction = 2755; break;
36 
37             case 1: tax_rate = 0.35, quick_deduction = 5505; break;
38 
39             case 0: tax_rate = 0.45, quick_deduction = 13505; break;
40 
41             default:
42                 break;
43             }
44 
45             dTax = (dSalary - 3500) * tax_rate - quick_deduction;
46             dNetIncome = dSalary - dTax;
47 
48             printf("您本月應繳個人所和稅 %.2lf 元,稅后收入是 %.2lf 元。\n", dTax, dNetIncome);
49             printf("依法納稅,共享繁榮。謝謝使用!\n");
50         }
51 
52     return 0;
53 }

 

利用if-else 語句轉化更為通用,但是要說cleanness,還是邏輯運算轉化的方案最優。

 

 

 

 

=


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM