分支程序设计.docx
《分支程序设计.docx》由会员分享,可在线阅读,更多相关《分支程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
分支程序设计
编号:
GXJG/JX-JL-12(08)保存期限:
三年
教案审批表
学
科
C语言程序设计
第三章分支程序设计
3.1条件语句
审批签字
授课时数
2
授课方法
多媒体讲授
授课时间
授课班级
12电子
教学目的
知识目标:
掌握if语句的格式及使用,掌握条件运算符的格式及使用。
能力目标:
熟练使用if语句。
情感目标:
培养学生的逻辑思维,提高学生知识应用能力。
教学重点
和难点
重点:
if语句的格式及使用,条件运算符的格式及使用。
难点:
条件运算符。
复习提问
C语言有哪些运算符?
教具
多媒体课件
课外作业
教学内容、方法和过程
附记
一、组织教学:
点名。
二、前课复习:
运算符,顺序结构程序设计。
三、新课导入:
讲解分支语句。
四、新课讲解:
见附页
五、总结回顾:
见附页
课题名称:
3.1条件语句
教学目标:
(1)知识目标:
掌握if语句的格式及使用,掌握条件运算符的格式及使用;
(2)能力目标:
熟练使用if语句;
(3)情感目标:
培养学生的逻辑思维,提高学生知识应用能力。
教学分析与准备:
1.教学重点
if语句的格式及使用,条件运算符的格式及使用。
2.教学难点
条件运算符。
3.教学策略
通过对比,讨论启发学生对if语句的认识,结合具体实例分析加深学生对if语句的认识。
4.课时安排
2课时(45分钟×2)
5.教学环境
多媒体教室
学习过程:
分支程序往往需要一个关系表达式或者逻辑表达式作为判决的条件。
根据其值是真还是假来决定执行相应的语句。
3.1.1if语句
if语句在C语言里有两种基本形式:
(1)if(条件)语句;
(2)if(条件)语句1;
else语句2;
无论是哪种形式的if语句,都要首先判断()内表达式的值,若为真(不为0),执行()后的语句(第
(2)种形式为语句1);若为假(为0)则执行()后面语句之后的语句(第
(2)种形式为else后的语句2)。
图7-1为这两种形式的程序框图。
图7-1两种if语句的程序框图
注意,这两种形式if后的“条件”大多是逻辑表达式或关系表达式,根据是0还是非0执行“假”或“真”的处理。
此外,语句之后一定有分号(;),它是语句的组成部分,不能省略(尤其是else前的分号)。
同时,若if和else后有多个语句,可以用{}形成复合语句。
例3-1输入两个实数,按代数值由小到大次序输出这两个数。
main()
{floata,b,x;
printf("Pleaseinputa,b:
\n");
scanf("%f,%f”,&a,&b);
if(a>b)
{x=a;a=b;b=x;}
printf("%f,%f\n",a,b);
}
运行情况如下:
4.5,2.8↙
2.8,4.5
if条件后面是复合语句,完成两个变量的交换,不能用a=b,b=a;来进行交换,常用第三个变量来暂存变量值。
例3-2若上例改为由大到小次序。
main()
{floata,b,x;
printf("Pleaseinputa,b:
\n");
scanf("%f,%f”,&a,&b);
if(a
{x=a;a=b;b=x;}
printf("%f,%f\n",a,b);
}
运行情况如下:
4.5,2.8↙
4.5,2.8
例3-3输入三个实数,求最大者,赋给变量max。
main()
{floata,b,c,max;
priintf("Pleaseinputa,b,c:
\n");
scanf("%f,%f,%f",&a,&b,&c)
max=a;
if(b>max)max=b;
if(c>max)max=c;
prinf("%5.2f\n",max);
}
运行情况如下:
pleaseinputa,b,c;
5.5,8,6.3↙
max=8.00
本例使用两个个if语句,以依次比较出最大者。
3.1.2if语句嵌套
一个if语句可以包含另一个或多个if语句称为语句配套,注意e1se总是与它最近的一个if配套,这一点与Pascal语言相同。
if(条件)
内嵌if
if(条件)语句1
else语句2
else
内嵌if
if(条件)语句3
else语句4
请注意以下两个语句的差别:
(1)if(条件1)
if(条件2)语句1
else语句2
(2)if(条件1)
{if(条件2)语句1}
else语句2
第
(1)个语句中else后面语句2与条件2有关,在条件1成立的情况下,条件2不成立就执行语句2,当条件1不成立时,语句1及语句2都不执行;第
(2)个语句指条件1和条件2均成立时,执行语句1,若条件1不成立就执行语句2,即语句2的执行与否同条件2无关。
例3-4以下程序输入一个x值,输出y值。
试判定下列程序段正确与否。
(1)main()
{intx,y;
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);
}
说明;该程序使用三个if语句,对y赋值,因为x取值只能使三个证语句中的一个条件为真,因此y只进行一次赋值,本程序是正确的。
(2)main()
{intx,y;
scanf("%d",&x);
y=1;
if(x!
=0)
if(x>0)y=-1;
elsey=0;
printf("x=%d,y=%d\n",x,y);
}
说明:
该程序中if(x!
=0)中内嵌一个if(x>0)语句,当输入x=0时,y值为1,显然与原意不符,程序有错,如果花括号把if(x>0)y=1;括起来,那么else就与if(x!
=0)匹配,这样当x=0时执行y=0;语句,程序就可以运行正确。
(3)main()
{intx,y;
scanf("%d",&x);
y=0;
if(x>=0)
if(x>0)y=-1;
elsey=1;
printf("x=%d,y=%d\n",x,y);
}
说明:
该程序当x<0时,输出y=0,显示与原意不同,其原因与上述相同,为更正它,也只需用花括号把if(x>0)y=1;括起来。
3.1.3条件运算符的作用
C语言中if(a
elsemin=b;
可简写为:
min=(a
a;b;
条件运算符的功能曾在第二章提到,它需要三个操作时象,是C语言唯一的三目运算符。
下面进一步可以说明,
(1)注意执行的顺序“el?
e2:
e3”中先执行表达式e1,若为非零(真)求解表达式e2,并把e2值作为整个表达式的值;若e1值为零(假)求解表达式e3,并把e3值作为整个表达式的值,在min=(a
a:
b;中把a、b中小的值赋于min。
(2)条件运算符优先于赋值运算符,即先求解后赋值,但条件运算符优先级又低于关系运算符和算术运算符,因此min=(a
a:
b;中括号可以省略,写成min=a
a:
b;
例如:
a>b?
a:
b+1
相当于a>b?
a:
(b+1);
不相当于(a>b?
a:
b)+1
(3)条件运算符是“自右向左”结合的。
例如:
若a=1,b=3,c=5,d=7,那么:
a>b?
a:
c>d?
c:
d;
相当于a>b?
a:
(c>d?
c:
d);该语句执行后,表达式值为7。
(4)条件表达式不能取代一般的if语句,只有if语句中内嵌语句为赋值语句且赋予同一变量时才能取代。
例如:
if(x>y)printf("%d",a)
elseprintf("%d",b);
不能用一个条件表达式替代,但可用以下语句代替:
printf("%d",x>y?
a:
b);
(5)el、e2、e3三个表达式类型可以不同,当e2、e3类型不同时自动进行类型转换。
例如:
x>y?
1.2:
2
若x>y表达式值为1.2,否则为2.0(整型→实型)。
课堂小结:
If语句,条件运算符。
编号:
GXJG/JX-JL-12(08)保存期限:
三年
教案审批表
学
科
C语言程序设计
第三章分支程序设计
3.2多分支语句
3.3分支程序设计实例
审批签字
授课时数
2
授课方法
多媒体讲授
授课时间
授课班级
12电子
教学目的
知识目标:
掌握switch语句格式及使用,掌握分支程序设计方法。
能力目标:
熟练分支程序设计。
情感目标:
培养学生的逻辑思维,提高学生分析问题解决问题的能力。
教学重点
和难点
重点:
switch语句的格式及作用,分支程序设计方法。
难点:
switch语句的执行过程。
复习提问
If语句怎么执行?
教具
多媒体课件
课外作业
教学内容、方法和过程
附记
一、组织教学:
点名。
二、前课复习:
if语句。
三、新课导入:
结合实际问题,讲解多分支语句的必要性。
四、新课讲解:
见附页
五、总结回顾:
见附页
课题名称:
3.2多分支语句
3.3分支程序设计实例
教学目标:
(1)知识目标:
掌握switch语句格式及使用,掌握分支程序设计方法;
(2)能力目标:
熟练分支程序设计;
(3)情感目标:
培养学生的逻辑思维,提高学生分析问题解决问题的能力。
教学分析与准备:
1.教学重点
switch语句的格式及作用,分支程序设计方法。
2.教学难点
switch语句的执行过程。
3.教学策略
通过对比,结合具体实例分析加深学生对switch语句的认识,通过实际操作进一步熟悉switch语句的使用。
4.课时安排
2课时(45分钟×2)
5.教学环境
多媒体教室
学习过程:
3.2Switch语句
if语句只有两个分支供选择,当有多个分支时应该使用嵌套if语句,但嵌套层次一多时,程序结构复杂,阅读和修改比较困难,C语句中提供多分支选择语句switch语句来解决多分支选择问题。
日常生活中,往往会遇到“分类”问题,例如学生成绩分类(90分及以上为'A'等,80~89分为'B'等,70~79分为'C'等,……)、人口统计分类(按年龄分为老年、中年、青年、少年,儿童……)、工资统计分类、银行存款分类等。
这些问题可用switch语句来解决。
switch语句的一般形式为:
switch(表达式)
{case常量1:
语句系列1;break;
case常量2:
语句系列2;break;
case常量3:
语句系列3;break;
default:
语句系列n+1;
}
switch语句执行流程是:
先计算“表达式”的值,然后顺序地与后面case子句中列出的各个常量相比较,若表达式值等于常量i则执行相应的“语句序列i”,再执行break语句跳出switch子句,若“表达式”值与case子句后所有常量都不相等,且有default子句,那么执行“语句序列n+1,如果没有default子句,则直接跳出switch语句。
使用switch语句应注意以下问题:
(1)switch语句和if语句不同,它只能判断一种逻辑关系,即表达式值是否等于指定的常量,而if语句可以计算并判断各种表达式。
(2)case子句后的常量可以是整型、字符型、枚举型数据或者是整型表达式,但不允许是变量,即允许是与switch后表达式类型一致的常量。
(3)同一个switch中case后的常量不能相同,但在相互嵌套的不同层次switch之间允许有相同的常量。
(4)default子句可以省略。
(5)case和defaulf后的“语句序列”允许由多个语句构成并且不必(也可)用花括号括起
来。
(6)case及defaulf语句出现的次序是任意的,可以变换位置,并不影响switch功能。
(7)多个case可共用一组执行语句,例如:
case'A':
case'B':
case'C':
prinf(">60\n");break;
当表达式值为'A'、'B'或'C'时都执行printf语句。
(8)switch语句中break语句作用是重要的,它保证语句序列执行结束后跳出switch语句,否则会执行下一个语句序列,当然最后一个语句后的break可以省略。
例如:
switch(grade)
{case'A':
printf"90-100\n"};
case'B':
printf("80-89\n");
case'C':
printf("70-89\n");
case'D':
printf("60—69\n");
case'E':
printf("<60\n");
default:
printf("error!
!
\n");
}
当grade='C'时,执行此switch语句,将输出:
70-79
60-69
<60
error!
!
因此在每个case后都应该用break跳出switch语句。
goto语句
goto语句是无条件语句,转向带有标号的语句行去执行,所谓标号同变量一样,用标识符来表示,只是其后加有冒号(:
)而已,标号加到goto语句转去执行的语句前面。
goto语句一般形式是:
goto标号;
使用goto语句应该注意三个问题:
(1)goto语句中有标号的必须是本函数段内已存在的合法标号。
(2)不能从switch或循环体外面转移到循环体或switch语句中。
(3)goto语句仅在函数内有效,不能在不同函数之间使用goto语句。
例如:
用if及goto语句计算
。
main()
{inti,sum=0;
i=1;
loop:
if(i<=100)
{sum=sum+i;i++;gotoloop;}
printf("sum=%d",sum)
}
运行结果:
sum=5050。
3.4分支程序设计实例
例3-5给出一个不多于3位的正整数,要求:
(1)求出它是几位数;
(2)
(2)分别打印每一位数字;
(3)(3)按逆序输出该数(例如原数为421,输出为124)。
分析:
假定3位数n=n3n2n1,其中i(i=1~3)为n中相应数位,即
n=n3×102+n2×101+n1×100
本题关键是如何从n中把ni分解出来,可以用整除的方法来解决此问题。
例如:
n3=n/100,n2=n/100-n3*10…,获得各个ni后,n又可作为输入数据的位数标志(n=1~3)。
程序:
main()
{intn,n3,n2,n1;
printf("pleaseinputn:
");
scanf("%d",&n);
n3=n/100;
n2=n/10-n3*10;
n1=n%10;
n=3;
if(n3==0)n=2;
if((n3==0)&&(n2==0))n=1;
printf("\nThisnumberis%ddigits\n",n);
printf("Thisnumber’sdigitsare;\n");
switch(n)
{case3:
pintf("%d,%d,%d",n3,n2,n2);break;
case2:
printf("%d,%d",n2,n1);break;
casel:
printf("%d",n1);
}
printf("\n\nThisoppositeordernumberis:
\n”);
printf("%d\n",n1*100+n2*10+n3);
}
运行情况:
pleaseinputn:
248↙
Thisnumberis3digits
Thisnumber'sdigitsare:
2,4,8
Thisoppositeordernumberis842
例3-6已知银行存款利率如下(年利率):
要求:
输入存款本金和期限,求到期时能得到的利息和本金总计。
分析:
活期存款利息公式是:
利息=本金×活期年利率×存款年限。
定期存款利息公式是:
利息=本金×存款年限×定期年利率。
计算出利息后再与本金相加为本利总计,我的可以定义本金为meney,年利率为rate,存取年限为year,本利总计为total。
既可以用嵌套的if语句,也可用switch语句来完成上述功能。
程序1:
#include〈stdio.h〉
main()
{floatyear,money,rate,totol;
printf("Inputmoney&year=?
\n");
scanf("%f,%f,&money,&year);
if(year>=5)
rate=0.0541;
elseif(year>=3)
rate=0.0433;
elseif(year>=1)
rate=0.0392;
elseif(year>=0)
rate=0.023;
else
rate=0;
total=money+money*rate*year;
printf("Total=%.2f\n",total);
}
说明:
为简化问题,认为超过年限部分的利息按照原年限计息而不是按活期计息。
程序2:
#include〈stdio.h〉
main()
{floatyear,money,rate,total;
printf("Inputmoney&year=?
\n");
scanf("%f,%f",&money,&year);
if(year<=0)
rate=0;
elseswith((int)year)
{case4:
case3:
rate=0.0433;break;
case2:
case1:
rate=0.0392;break;
case0:
rate=0.023;break;
default:
rate=0.0541;
}
total=money+money*rate*year;
printf(”Total=%.2f\n",total);
)
说明:
(int)year强制把实型转变为整型,当(int)year大于等于5时,均按5年计算利率,程序中要用default实现。
例3-7输入两个整数及一个字符操作符+、-、*、/分别对两数进行相应运算。
分析:
根据输入的字符ch为'+'、'='、'*'、'/'时,分别计算,因此可以采用:
switch语句。
程序:
main()
{inta,b;
charch;
printf("输人整数a和b及操作符ch:
\n");
scanf("%d,%d,%c",&a,&b,&ch);
switch(ch)
{case'+':
printf("%d+%d=%d\n",a,b,a+b);
break;
case'-':
prinf("%d-%d=%d\n",a,b,a-b);
break;
case'*':
printf("%d*%d=%d\n",a,b,a*b);
break;
case'/':
printf("%d/%d=%f\n",a,b,a/b);
break:
}
课堂小节:
多分枝语句,分支结构程序设计。