printf("maxis%d\n",max);
}
(2)指定else子句(图(b))
3、if语句的嵌套
if语句的嵌套是在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。
else子句与if的匹配原则是:
else子句与它上面、距它最近、且尚未匹配的if语句配对。
说明:
(1)在程序语句组中,可以将不可或缺的若干语句,用{}把它们括起来,这样的语句体称为复合语句。
复合语句在逻辑上等价于一条语句,复合语句内部还可嵌套复合语句。
建议:
将内嵌的if语句,使用复合语句来表现,这样有利于程序的阅读。
(2)if后面的“表达式”:
除关系(逻辑)表达式外,也允许是整型、实型、字符型等其它类型的数据。
(3)在语句组1和语句组2中,每个语句后面的分号不可少。
【例2】解方程ax2+bx+c=0。
分析:
(1)若b2-4ac>0,方程有两个不等的实根;
(2)若b2-4ac=0,方程有两个相等的实根;
(3)若b2-4ac<0,方程有两个复根。
main()
{floata,b,c,delta,x1,x2,realpart,imagepart;
printf(″请输入a,b,c:
\n″);
scanf(″%f,%f,%f″,&a,&b,&c);
if(fabs(a)<=1e-6)
printf(″这是一次方程x=%f\n″,-c/b);
else
{delta=b*b-4*a*c;
if(fabs(delta)<=1e-6)
printf(″有两个相等的实根:
x1=x2=%8.4f\n″,-b/(2*a));
elseif(delta>1e-6)
{x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
printf(″有两个不等的实根:
x1=
%8.4f和x2=%8.4f\n″,x1,x2);}
else
{
realpart=-b/(2*a);
imagepart=sqrt(-delta)/(2*a);
printf(″有两个虚根:
″);
printf(″%8.4f+%8.4fi\n″,
realpart,imagepart);
printf(″%8.4f-%8.4fi\n″,
realpart,imagepart);
}
}
}
4、条件运算符和条件表达式
条件运算符是C语言中惟一的三目运算符,其一般格式为:
表达式1?
表达式2:
表达式3
执行过程是:
先求解表达式1,当值为非0(真)时,表达式
2的值就是整个条件表达式的值;否则表达式3的值是整个条
件表达式的值。
例如:
若x=3,y=4则下式
x>y?
x:
y的值为4
条件运算符的优先级低于算术运算符、关系运算符和逻
辑运算符。
条件运算符的结合性为自右至左。
例如:
a>b?
a:
c>d?
c:
d相当于a>b?
a:
(c>d?
c:
d)
小结:
本次课主要讲解了If语句的单分支、多分支及if语句的嵌套,通过例题讲解让同学们理解各种语句的使用方法并利用if语句解决实际问题。
作业:
1、从键盘输入三个整数,并按从大到小的顺序输出。
2、从键盘输入一个整数,判断这个整数是奇数还是偶数。
3、从键盘输入一个年份,判断是否为闰年。
第二讲
复习回顾:
上次课讲到了if语句的单分支、双分支及If语句的嵌套(多分支)情况,本节课学习使用switch语句完成多分支结构。
一、switch语句
用if语句只能进行两路选择,但在实现多路选择时须使用多个if语句,因此用if语句解决多路问题非常不方便,这时可利用switch语句实现多条件多分支程序设计。
1、一般形式
switch(表达式)
{
case常量表达式1:
语句组1;break;
case常量表达式2:
语句组2;break;
......
case常量表达式n:
语句组n;break;
default:
语句组n+1;
}
2、执行流程——指定break语句
(1)当“表达式”的值与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,转向执行switch语句的下一条语句。
(2)如果没有任何一个case后面的“常量表达式”的值与“表达式”的值匹配,则执行default后面的语句(组)。
然后,再执行switch语句的下一条。
3、执行流程——缺省break语句
case后面的常量表达式仅起语句标号作用,并不进行条件判断。
缺省break语句时,系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,其执行流程如右图所示:
【例3】给一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’。
90分以上为'A',80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'。
程序如下:
main()
{intg;
printf("Enteramark:
");
scanf("%d",&g);/*g中存放学生的成绩*/
printf("g=%d:
",g);
switch(g/10)
{
case10:
case9:
printf("A\n");
case8:
printf("B\n");
case7:
printf("C\n");
case6:
printf("D\n");
default:
printf("E\n");
}
}
程序分析:
当执行以上程序输入一个85分的学生成绩后,接着执行
switch语句,首先计算switch后一对括号中的表达式:
85/10,
它的值为8; 然后寻找与8吻合的case 8分支,开始执行其后
的各语句。
程序的输出结果如下:
g=85:
B
C
D
E
在输出与85分相关的B之后,又同时输出了与85分毫不相
关的等级C、D、E,这显然不符合原意。
如果想只输出我们
输入的分数与相应的等级,在每条case语句后面加break语句
即可。
后面我们将具体介绍break语句的作用。
说明:
(1)switch是关键字,switch语句后面用花括号括起来的部分称为switch语句体。
(2)紧跟在switch后一对括号的“表达式”可以是整型表达式及后面将要学习的字符型或枚举型表达式等。
表达式两边的一对括号不能省略。
(3)case也是关键字,与其后面的常量表达式合称case语句标号。
常量表达式的类型必须与switch后的表达式类型相同。
各case语句标号的值应该互不相同。
(4)default也是关键字,起标号的作用,代表所有case标号之外的那些标号。
default标号可以出现在语句体中任何标号位置上。
在switch语句体中也可以没有default标号。
(5)case语句标号后的语句1、语句2等,可以是一条语句,也可以是若干条语句。
(6)必要时,case语句标号后的语句可以省略不写。
(7)在关键字case和常量表达式之间一定要有空格,例如case10,不能写成case10:
作业:
1、已知某公司员工的保底薪水为500,某月所接工程的利
润profit(整数)与利润提成的关系如下(单位:
元):
profit≤1000没有提成;
1000<profit≤2000提成10%;
2000<profit≤5000提成15%;
5000<profit≤10000提成20%;
10000<profit提成25%。
算法设计要点:
将利润profit与提成的关系,转换成某些整数与提成的关系。
2、根据输入的数字输出相应的英文星期名称。
3、判断输入一个数的奇偶性。
小结
本章主要讲解选择结构,也就是根据条件的成立与否而执行不同的程序段,通常程序有两个分支,条件为“真”执行一个分支,为否执行另一个分支,如果有多个条件就要考虑选择结构的嵌套和switch语句。