第 4章 选择结构程序设计第一课:
一、教学内容:
学习选择结构程序设计方法,if— else语句。
二、教学目标:
掌握选择结构程序的流程图的画法,并会用 if— else语句实现 C语言程序。
三、教学重点:
if语句中 if— else的匹配关系,if语句的嵌套。
1,if语句的简单形式
if(表达式)
语句
2,if语句的标准形式
if(表达式)
语句 1
else
语句 2
语句的执行过程:先判断或计算表达式的值,若结果为
,真,(非 0),则执行语句 1,否则执行语句 2。
(一) if语句例:输入任意三个整数 num1,num2,num3,求三个数中的最大值。
main()
{int num1,num2,num3,max;
printf("Please input three numbers:");
scanf("%d,%d,%d",&num1,&num2,&num3);
if (num1>num2)
max=num1;
else
max=num2;
if (num3>max)
max=num3;
printf("The three numbers
are:%d,%d,%d\n",num1,num2,num3);
printf("max=%d\n",max);
}
程序运行情况如下:
Please input three numbers:11,22,18↙
The three numbers are:11,22,18
max=22
本例中的第 1个 if语句,可优化为如下不带 else子句的形式:
max=num1;
if(num2>max) max=num2;
这种优化形式的基本思想是:首先取一个数预置为
max(最大值),然后再用 max依次与其余的数逐个比较,
如果发现有比 max大的,就用它给 max重新赋值,比较完所有的数后,max中的数就是最大值。这种方法,对从 3
个或 3个以上的数中找最大值的处理,非常有效。请同学们仔细体会。
例,输入任意三个数 num1,num2,num3,按从小到大的顺序排序输出 。
main()
{int num1,num2,num3,temp;
printf("Please input three numbers:");
scanf("%d,%d,%d",&num1,&num2,&num3);
if (num1>num2) {temp=num1;num1=num2;num2=temp;}
if (num2>num3) {temp=num2;num2=num3;num3=temp;}
if (num1>num2) {temp=num1;num1=num2;num2=temp;}
printf("Three numbers after sorted,%d,%d,%d\n",num1,num2,num3);
}
程序运行情况如下:
Please input three numbers:11,22,18↙
Three numbers after sorted,11,18,22
3,if语句的嵌套与嵌套匹配原则
if语句允许嵌套 。 所谓 if语句的嵌套是指,在
,语句组 1”或 ( 和 ),语句组 2”中,又包含有 if语句的情况 。
if语句嵌套时,else子句与 if的 匹配原则,与在它上面,距它最近,且尚未匹配的 if配对 。
为明确匹配关系,避免匹配错误,强烈建议,
将内嵌的 if语句,一律用花括号括起来 。
例,写一程序,从键盘上输入 1年份 year( 4位十进制数 ),判断其是否闰年 。 闰年的条件是:
能被 4整除,但不能被 100整除,或者能被 400整除 。
算法设计要点,
( 1) 如果X能被Y整除,则余数为0,
即如果X % Y的值等于0,则表示X能被
Y整除 !
( 2) 首先将是否闰年的标志 leap预置为
0( 非闰年 ),这样仅当 year为闰年时将
leap置为 1即可 。 这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请同学们仔细体会 。
参考程序如下,
main()
{int year,leap=0; /* leap=0:预置为非闰年 */
printf("Please input the year:");
scanf("%d",&year);
if (year % 4==0) {if (year % 100 != 0) leap=1;}
else {if (year%400==0) leap=1; }
if (leap) printf("%d is a leap year.\n",year);
else printf("%d is not a leap year.\n",year);
}
课后小结:
本节课我们主要学习了分支(选择)
程序设计,if—else语句;要求同学们拿到一个问题能够画出它的流程图,并用
if—else语句将它实现成一个 C语言程序。
第二课一、教学内容:
对 if—else嵌套形式进行复习。
利用 switch语句直接处理多路分支选择问题。
二、教学目的:
会画多路分支的流程图。
会使用 switch语句直接处理多路分支选择问题。
三、教学重点:
switch语句的应用。
(一)复习巩固 if— else嵌套形式例 4.7 程序(一)
main()
{
int x,y;
printf(“Enter the x:,);
scanf(“%d,&x);
if(x>0) y=1;
if(x= =0) y=0;
if(x<0) y=-1;
printf(“x=%d,y=%d\n”,x,y);
}
程序(二)
main()
{
int x,y;
printf(“Enter the x:,);
scanf(“%d”,&x);
if(x<=0)
if(x= =0) y=0;
else y=-1
else y=1
printf(“x=%d,y=%d\n”,x,y);
}
例 4.4的流程图:
1,switch语句的一般形式
switch(表达式 )
{ case 常量表达式 1:语句组; break;
case 常量表达式 2:语句组; break;
......
case 常量表达式n:语句组; break;
[default:语句组; [break; ] ]
}
2,执行过程
( 1) 当 switch后面,表达式,的值,与某个 case后面的,常量表达式,的值相同时,就执行该 case后面的语句
( 组 ) ;当执行到 break语句时,跳出 switch语句,转向执行 switch语句的下一条 。
(二 ) switch语句
( 2) 如果没有任何一个 case后面的,常量表达式,
的值,与,表达式,的值匹配,则执行 default 后面的语句 ( 组 ) 。 然后,再执行 switch语句的下一条 。
3,说明
( 1) switch后面的,表达式,,可以是 int,char和枚举型中的一种 。
( 2) 每个 case后面,常量表达式,的值,必须各不相同,否则会出现相互矛盾的现象 ( 即对表达式的同一值,有两种或两种以上的执行方案 ) 。
( 3) case后面的常量表达式仅起语句标号作用,并不进行条件判断 。 系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上 break语句,
以便结束 switch语句 。
( 4) 各 case及 default子句的先后次序,不影响程序执行结果 。
( 5) 多个 case子句,可共用同一语句 ( 组 ) 。
( 6) 用 switch语句实现的多分支结构程序,
完全可以用 if语句或 if语句的嵌套来实现 。
例题,从键盘上输入一个百分制成绩 score,按下列原则输出其等级,score≥90,等级为 A;
80≤score<90,等级为 B; 70≤score<80,等级为 C;
60≤score<70,等级为 D; score<60,等级为 E。
main()
{int score,grade;
printf(“Input a score(0~100):,);
scanf(“%d”,&score);
grade = score/10; /*将成绩整除 10,转化成 switch语句中的
case标号 */
switch (grade)
{case 10:
case 9,printf(“grade=A\n”); break;
case 8,printf("grade=B\n"); break;
case 7,printf("grade=C\n"); break;
case 6,printf("grade=D\n"); break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0,printf(“grade=E\n”); break;
default,printf(“The score is out of range!\n”);
}
}
程序运行情况如下:
Input a score(0~100),85↙
grade=B
例,已知某公司员工的保底薪水为 500,某月所接工程的利润
profit( 整数 ) 与利润提成的关系如下 ( 计量单位:元 ),
profit≤1000 没有提成;
1000< profit≤2000 提成 10%;
2000< profit≤5000 提成 15%;
5000< profit≤10000 提成 20%;
10000< profit 提成 25%。
算法设计要点:
为使用 switch语句,必须将利润 profit与提成的关系,转换成某些整数与提成的关系 。 分析本题可知,提成的变化点都是 1000的整数倍
( 1000,2000,5000,…… ),如果将利润 profit整除 1000,则当:
profit≤1000 对应 0,1
1000< profit≤2000 对应 1,2
2000< profit≤5000 对应 2,3,4,5
5000< profit≤10000 对应 5,6,7,8,9,10
10000< profit 对应 10,11,12,……
为解决相邻两个区间的重叠问题,最简单的方法就是:利润
profit先减 1( 最小增量 ),然后再整除 1000即可:
profit≤1000 对应 0
1000< profit≤2000 对应 1
2000< profit≤5000 对应 2,3,4
5000< profit≤10000 对应 5,6,7,8,9
10000< profit 对应 10,11,12,……
main()
{long profit;
int grade;
float salary=500;
printf("Input profit,");
scanf("%ld",&profit);
grade= (profit – 1) / 1000; /*将利润 -1,再整除 1000,转化成
switch语句中的 case标号 */
switch(grade)
{ case 0,break; /*profit≤1000 */
case 1,salary += profit*0.1; break; /*1000< profit≤2000 */
case 2:
case 3:
case 4,salary += profit*0.15; break; /*2000< profit≤5000 */
case 5:
case 6:
case 7:
case 8:
case 9,salary += profit*0.2; break; /*5000< profit≤10000 */
default,salary += profit*0.25; /*10000< profit */
}
printf("salary=%.2f\n",salary);
}
课后小结通过本节我们学习 switch语句,通过用
switch语句可以实现多路分支结构,更清楚、
简单、明了。