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