10-19日(第七週週五)上課簡記switch語句
阿新 • • 發佈:2018-11-08
注意事項1:if結構中,該用{ }的地方一定要用,否則程式會出錯。
- 執行下列程式,看看有沒有問題?如果有,原因何在?該如何修改?
#include<stdio.h>
int main()
{
int a,b,max;
scanf("%d%d",&a,&b);
if(a>b)
max=a;
printf("max=%d\n",max);
else
max=b;
printf("max=%d\n",max);
return 0;
}
注意事項2 :else與哪個if相匹配???
if(a!=0) if(b!=0) c=a/b; else printf("Division by zero!\n");
該程式段儘管採用了縮排格式,試圖讓else與if(a!=0)中的if匹配,但事實上,else會與離他最近且沒有與其他else相配對的if相匹配,也就是與if(b!=0)中的if匹配。
如果想讓else與 if(a!=0)中的if匹配,需要利用{ }。
if(a!=0)
{
if(b!=0)
c=a/b;
}
else
printf("Division by zero!\n");
突然發現,()和{ }真是C語言程式設計的兩個利器,一個可以讓我們從運算子的優先順序中解脫處理,另一個可以使程式程式碼更清晰。
回顧:上一節給出的關於成績等級的三種if結構:單分支,雙分支及多分支
細細品味不同實現方法的區別,也要分析下三種實現方法的效率,選擇哪一個更為合適。
本節主要角色:switch閃亮登場
其實,當出現多分支的情況下,也即當選擇的條件很多的話,可以使用開關語句來實現,C語言是通過switch語句來實現開關的。
上述成績等級問題,用switch語句來實現的程式碼如下:
#include<stdio.h> int main() { int score,mark; scanf("%d",&score); mark=score/10; switch(mark) { case 0: case 1: case 2: case 3: case 4: case 5:printf("E\n"); break; case 6:printf("D\n"); break; case 7:printf("C\n"); break; case 8:printf("B\n"); break; case 9: case 10:printf("A\n"); break; default: printf("input error!\n"); } return 0; }
- 要求1::試著把某些break去掉,看看程式執行結果如何?你會真正領悟到break的奧祕,並且深知在何時何地需要用到它。
- 要求2:程式編好後,需要進行全面測試,以考查其是否健壯。
我們分別輸入0,15,25,36,48,55 時, 程式輸出為E;同理只要是0~100的資料,均可以輸出正確的等級結果。 - 要求3:也要輸入邊界值進行測試。其實,往往是邊界值會帶來程式的執行錯誤。
如果分別輸入邊界值:-10,110,-5,105呢,程式的執行結果會怎樣???
為何出現這些問題呢?
因為 mark=score/10,score為整型,所以score/10的結果也為整型。-10/10=-1, 110/10=11;-1和11均不會和一個case後面的常量相匹配,因而輸出input error! 而-5/10=0,105/10=10,所以會分別與case 0和case 10相匹配,因而執行它們的語句。
為了保證程式的健壯性,上述程式如何修改呢?
(1)改動方法1
只需改動一條語句即可
mark=score>=0&&score<=100?score/10:-1;
(2)改動方法2
遇到非法資料,提示錯誤並退出系統。switch只處理合法資料。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int score;
scanf("%d",&score);
if(score<0||score>100)
{
printf("input error!\n");
exit(1);
}
else
{
switch(score/10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:printf("E\n"); break;
case 6:printf("D\n"); break;
case 7:printf("C\n"); break;
case 8:printf("B\n"); break;
case 9:
case 10:printf("A\n"); break;
default: printf("input error!\n");
}
}
return 0;
}
改動方法3
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int score;
scanf("%d",&score);
if(score>=0&&score<=100)
{
switch(score/10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:printf("E\n"); break;
case 6:printf("D\n"); break;
case 7:printf("C\n"); break;
case 8:printf("B\n"); break;
case 9:
case 10:printf("A\n"); break;
default: printf("input error!\n");
}
}
else
printf("input error!\n");
return 0;
}
第2種方法和第3種異曲同工,一個是先去掉非法資料,另一個是先考慮合法資料。條條大路通羅馬,程式設計的奧祕也在於此。
**
再來看一個例項:
**
輸入一個由兩個整數和一個運算子組成的表示式,根據運算子完成相應的運算,並將結果輸出。
#include<stdio.h>
int main()
{
int a,b;
char op;
scanf("%d%c%d",&a,&op,&b);
switch(op)
{
case '+':printf("%d+%d=%d\n",a,b,a+b); break;
case '-':printf("%d-%d=%d\n",a,b,a-b); break;
case '*':printf("%d*%d=%d\n",a,b,a*b); break;
case '/':if(b!=0)
printf("%lf/%d=%.2lf\n",a*1.0,b,a*1.0/b);
else
printf("b==0 is illegal!\n";)
break;
default:printf("input error!\n");
}
return 0;
}
再囉嗦一句:在switch(表示式)中,表示式的值要麼是整型要麼是字元型。