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,還是邏輯運算轉化的方案最優。
=