1、第四讲 选择结构程序设计,C语句概述 选择结构程序设计,4.1 C语句概述,C语句:以“;”作分隔符,编译后产生机器指令 C语句分类 表达式语句:表达式加分号构成,如: total=total+limit; a=3;ab;func( ); printf(“Hello,world!n”);,空语句: ;,程序控制语句(种),复合语句:用 括起来的一组语句 一般形式: 数据说明部分; 执行语句部分;,说明: “”后不加分号 语法上和单一语句相同 复合语句可嵌套,main() int a,b;a=10; printf(“%d,%d”,a,b); ,4.2 选择结构程序设计,if 语句(条件选择语句)
2、if语句的三种形式 形式一: 格式:if (exp) statement,形式二: 格式:if (exp)statement1elsestatement2,执行过程,执行过程,形式三格式:,执行过程:,if (exp1) statement1 else if (exp2) statement2 else if (exp3) statement3 else statement ,说明:,第二、第三种形式的if语句中,在每个else前面有一个分号,整个语句结束出有一个分号。,If(x0)printf(“%f”,x);elseprintf(“%f”,-x);,在if和else后面如果有多个操作语句,
3、此时用“”将几个语句括起来形成一个复合语句,If(a+bc,说明:if后面的表达式类型任意,语句可以是复合语句,考虑下面程序的输出结果: /* EX5-1.C */ main() int x,y;scanf(“%d,%d”, ,Compile Error!,if(a=b,Error 9:Misplaced else in function main,/* ex5-2.c */ main() float a,b,t;scanf(“%f,%f“,3.6,-3.2 -3.20,3.60,例5-2 输入两个实数,按代数值由小到大输出,例5-3 输入三个数,要求按由小到大顺序输出,分析: If ab 将
4、a和b对换 If ac 将a和c对换 If bc 将b和c对换 需要定义几个变量?才能完成对换? 在有“变量对换”这一类的操作中,都要定义一个暂存变量,常起名为或者,/*ex5-3.c*/ main() float a,b,c,t;scanf(“%f,%f,%f”, ,3,7,1 1.00,3.00,7.00,例5-3 输入三个数,要求按由小到大顺序输出,例5-4 写程序,判断某一年是否是闰年,判断闰年的条件是: 能被4整除,且不能被100整除 或 能被400整除,/* ex5-4.c */ main() int year,leap;scanf(“%d“, ,2000 2000 is a le
5、ap year,1998 1998 is not a leap year,/*定义变量leap表示输入的年份是否是闰年*/*输入变量year的值*/*假设此年不是闰年*/*如果是闰年,变量leap = 1*/,If 语句嵌套: 在if语句中又包含一个或多个if语句,称为if语句嵌套 一般形式:,If else配对原则 :它缺省时, else总是与上面的 最近的 未配对的 if配对,if (exp1) if (exp2) statement1 elsestatement2,例5-5 有一函数:编一程序输入一个x值输出y值,分析 输入x 若x y =-1否则 若 x=0 = y=0若 x0 = y
6、=1 输出y,开始,输入x,y=-1,x=0,y=0,y=1,输出y,x0,结束,/*ex5-5.c*/ main() int x,y;scanf(“%d“, ,12 x=12,y=1,例5-5 有一函数:编一程序输入一个x值输出y值,0 x=0,y=0,-10 x=-10,y=-1,if(x=0) if(x0) y=1;else y=0;else y=-1;,y=-1;if (x!=0)if (x0) y=1;else y=0;,y=0;if (x=0)if (x0) y=1;else y=-1;,例5-6 求方程 的解, ,#include main() float a, b, c ,di
7、sc, x1, x2, p, q;scanf(“%f,%f,%f“,注意 实数在计算和存储时有微小的误差, 应避免直接对实数作相等或不等的判断。 若判断:实数表达式=实数值 应判断: |实数表达式-实数值|=110-6,if (fabs(disc)1e-6)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(“has distinct real roots:%8.4 8.4f”,x1,x2);else p=-b/(2*a);q=sqrt(-disc)/(2*a);printf(“has complex roots:n”);printf(
8、“%8.4f+%8.4fin”,p,q);printf(“%8.4f-%8.4fin”,p,q); ,switch(表达式) case E1:语句组 1;break;case E2:语句组 2;break;.case En:语句组 n;break; default:语句组 n+1;break; ,switch语句(开关分支语句) 格式,执行过程,case后可包含多个可执行语句,且不必加 switch可嵌套多个case可共用一组执行语句, case A: case B: case C: printf(“score60n”);break;,说明: E1,E2,En是常量表达式,且值必须互不相同 c
9、ase语句起到标号的作用,必须用break跳出,ex5-7-1,例5-7 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:,运费=单价(元/公里吨)*重量*路程*(1-折扣),main() int c,s;float price,weight,discount,freight;scanf(“%f,%f,%d”,case 4: case 5:,case 6:case 7: discount=8; break;case 8:case 9:case 10:case 11: discount = 10; break;case 12: discount = 15; break;freight = price*weight*s*(1-discount/100.0);printf(“%freight=%15.4f”,freight); ,100,20,300 freight = 588000.0000,作业,作业: 5.3、5.5 (if) 5.10(switch),