1. 程式人生 > >10-19日(第七週週五)上課簡記switch語句

10-19日(第七週週五)上課簡記switch語句

注意事項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(表示式)中,表示式的值要麼是整型要麼是字元型。