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(表达式)中,表达式的值要么是整型要么是字符型。

猜你喜欢

转载自blog.csdn.net/lvcongying0601/article/details/83149178
今日推荐