1、第五、六章 C程序流程设计,选择型程序设计(if else , switch)循环型程序设计(for, while)辅助控制语句(break, continue,goto,return),2019/6/26,2,5.1关系运算符和表达式功能:比较两个常量、变量或表达式的值的大小符号: = !=结合方向:从左向右优先级:= (6) = != (7)关系表达式的值:逻辑“真”和“假”,用1和0表示用途:循环语句和选择语句中,例 ca+b /c(a+b)ab!=c /(ab)!=ca=bc /a=(bc),例 int a=3,b=2,c=1,d,f;ab (ab)=c b+cb f=abc,例 in
2、t a=3,b=2,c=1,d,f;ab /表达式值1(ab)=c b+cb f=abc,例 int a=3,b=2,c=1,d,f;ab /表达式值1(ab)=c /表达式值1b+cb f=abc,例 int a=3,b=2,c=1,d,f;ab /表达式值1(ab)=c /表达式值1b+cb f=abc,例 int a=3,b=2,c=1,d,f;ab /表达式值1(ab)=c /表达式值1b+cb /d=1f=abc,例 int a=3,b=2,c=1,d,f;ab /表达式值1(ab)=c /表达式值1b+cb /d=1f=abc /f=0,例:若a=0; b=0.5; x=0.3;
3、则 a=x=b的值为,例:若a=0; b=0.5; x=0.3; 则 a=x=b的值为 0,例:5278在C中是允许的,值为,例:5278在C中是允许的,值为 0,例:int i=1, j=7,a; a=i+(j%4!=0); 则a=,例:int i=1, j=7,a; a=i+(j%4!=0); 则a= 2,例 a0 结果为A100 结果为,例 a0 结果为 1A100 结果为 0,关系运算请注意: (1) 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为,关系运算请注意: (1) 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 0,关系
4、运算请注意: (1) 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 0 可改写为:fabs(1.0/3.0*3.0-1.0)1E-6,(2) 注意区分“=”与“=” 如 int a=0,b=1;if(a=b) printf(“a equal to b”);elseprintf(“a not equal to b”);,(2) 注意区分“=”与“=” 如 int a=0,b=1;if(a=b) printf(“a equal to b”);elseprintf(“a not equal to b”);,(2) 注意区分“=”与“=” 如 int a=0,b=1;if
5、(a=b) printf(“a equal to b”);elseprintf(“a not equal to b”);,(2) 注意区分“=”与“=” 如 int a=0,b=1;if(a=b) printf(“a equal to b”);elseprintf(“a not equal to b”);,2019/6/26,3,5.2逻辑运算符和表达式功能:判断逻辑值和对逻辑值进行操作符号: ! & |逻辑运算真值表结合方向:!从右向左, & |从左向右优先级:! (2) & (11) | (12)逻辑运算中:运算参量:0表示假,非0表示真运算结果:0表示假,1表示真短路特性:逻辑表达式求解
6、时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,例 ab&xy a=b|x=y !a|ab,例 ab&xy a=b|x=y !a|ab,例 ab&xy /(ab)&(xy)a=b|x=y !a|ab,例 ab&xy /(ab)&(xy)a=b|x=y /(a=b)|(x=y)!a|ab,例 ab&xy /(ab)&(xy)a=b|x=y /(a=b)|(x=y)!a|ab /(!a)|(ab),例 a=4; b=5; !a a&b a|b !a|b 4&0|2 53&2|84-!0 c&d,例 a=4; b=5; !a /0a&b a|b
7、!a|b 4&0|2 53&2|84-!0 c&d,例 a=4; b=5; !a /0a&b /1a|b !a|b 4&0|2 53&2|84-!0 c&d,例 a=4; b=5; !a /0a&b /1a|b /1!a|b 4&0|2 53&2|84-!0 c&d,例 a=4; b=5; !a /0a&b /1a|b /1!a|b /14&0|2 53&2|84-!0 c&d,例 a=4; b=5; !a /0a&b /1a|b /1!a|b /14&0|2 /153&2|84-!0 c&d,例 a=4; b=5; !a /0a&b /1a|b /1!a|b /14&0|2 /153&2|8
8、3)&2|(8(4-(!0), 1c&d,例 a=4; b=5; !a /0a&b /1a|b /1!a|b /14&0|2 /153&2|83)&2|(8(4-(!0), 1c&d /1,例 a&b&c /只在a为真时,才判别b的值/只在a、b都为真时,才判别 c的值,例 a&b&c /只在a为真时,才判别b的值/只在a、b都为真时,才判别 c的值a|b|c /只在a为假时,才判别b的值/只在a、b都为假时,才判别 c的值,例 a(m=ab)&(n=cd),例 a(m=ab)&(n=cd) /结果m=0,n=1,2019/6/26,4,5.3 选择程序设计if 语句(条件选择语句)if 语句
9、的三种形式形式一:格式: if (expression) statement执行过程:形式二:格式: if (expression) statement1elsestatement2执行过程:,例:if (xy)printf(“%d”,x);,例:if (xy) max=x;else max=y;,2019/6/26,5,5.3 选择程序设计if 语句(条件选择语句)if 语句的三种形式形式一:格式: if (expression) statement执行过程:形式二:格式: if (expression) statement1elsestatement2执行过程:形式三:格式:执行过程:,i
10、f ( expr1 ) statement1 else if (expr2 ) statement2 else if (expr3 ) statement3 . else statementn ,例:if (salary1000) index=0.4; else if (salary800) index=0.3;else if (salary600) index=0.2;else if (salary400) index=0.1;else index=0;,2019/6/26,6,如: if(a=b,例 考虑下面程序的输出结果: #include main() int x,y;scanf(“%
11、d,%d”, ,例 考虑下面程序的输出结果: #include main() int x,y;scanf(“%d,%d”, ,关于if语句的说明:if后面的表达式类型任意语句可以是复合语句if(x) if(x!=0) if(!x) if(x= =0),Compile Error!,2019/6/26,7,/*ch4_1.c*/ #include main() int x,y;printf(“Enter an integer:“);scanf(“%d“, ,例1 求一个数的绝对值,运行:Enter an integer:-12integer:-12-absolute value :12,2019
12、/6/26,8,/*ch4_2.c*/ #include main() int a,b;printf(“Enter integer a:“);scanf(“%d“, ,例2 输入两个数并判断两数相等否,运行:Enter integer a:12Enter integer b:12a=b,运行:Enter integer a:12Enter integer b:9a!=b,2019/6/26,9,/*ch4_3.c*/ #include main() char c;printf(“Enter a character:“);c=getchar();if(c=0 ,例3 判断输入字符种类,运行: E
13、nter a character: The character is a control character,运行: Enter a character:8 The character is a digit,运行: Enter a character: DThe character is a capital letter,运行: Enter a character: hThe character is a lower letter,运行: Enter a character:* The character is other character,2019/6/26,10,if语句嵌套:,2019
14、/6/26,11,例 输入两数并判断其大小关系,/*ch4_4.c*/ #include main() int x,y;printf(“Enter integer x,y:“);scanf(“%d,%d“, ,运行:Enter integer x,y:12,23XYEnter integer x,y:12,12X=Y,if else 配对原则: 缺省 时,else总是和它上面离它最近的未配对的if配对,2019/6/26,12,例: if (a= =b)if(b=c)printf(“a=b=c”);elseprintf(“a!=b”);,修改: if (a=b) if(b=c)printf(“
15、a=b=c”);elseprintf(“a!=b”);,实现if else 正确配对方法:加 ,例 考虑下面程序输出结果:main() int x=100,a=10,b=20;int v1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;elseif(v2) x=10;x=-1;printf(“%d”,x);,结果:-1,if else 配对原则: 缺省 时,else总是和它上面离它最近的未配对的if配对,2019/6/26,13,条件运算符和表达式功能:相当于条件语句,但不能取代if语句形式: exp1 ? exp2 : exp3结合方向:从左向右优先级:13条件运算符可嵌
16、套 结果类型:取exp1、exp2和exp3中最高者,例 求 a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);,例 x0?1:(x0?-1:0),例 (a=b)?Y:N(x%2=1)?1:0(x=0)?x:-x(c=a & c=z)?c-a+A:c,例 x?a:b /x=0,表达式值为b; x0,表达式值为axy?1:1.5 /xy ,值为1.0; xy ,值为1.5,2019/6/26,14,switch( 表达式) case E1:语句组 1;break;case E2:语句组 2;break;.case En:语句组 n;break;default:语句组 ;br
17、eak; ,switch语句(开关分支语句)一般形式:,执行过程:,2019/6/26,15,关于switch语句的说明:E1,E2,En是常量表达式,且值必须互不相同语句标号作用内,必须用break跳出case后可包含多个可执行语句,且不必加 switch可嵌套多个case可共用一组执行语句,如: case A:case B:case C: printf(“score60n”);break;,例 switch(score) case 5: printf(“Very good!”);case 4: printf(“Good!”);case 3: printf(“Pass!”);case 2:
18、printf(“Fail!”);default : printf(“data error!”);,运行结果:score为5时,输出:Very good! Good! Pass! Fail! data error!,例 void main() int x=1,y=0,a=0,b=0;switch(x) case 1:switch(y) case 0: a+; break;case 1: b+; break;case 2: a+;b+; break;case 3: a+;b+;printf(“na=%d,b=%d”,a,b);,运行结果:a=2,b=1,2019/6/26,16,/*ch4_5.c
19、*/ #include main() int c;printf(“Enter m or n or h or other:“);c=getchar();switch(c) case m: printf(“nGood morning!n“);break;case n: printf(“nGood night!n“); break;case h: printf(“nHello!n“); break;default : printf(“n?n“); break; ,例 根据输入字母输出字符串,2019/6/26,17,6.1 循环程序设计C语言中可以实现循环的语句if 和 goto 构成循环while
20、 语句do while () 语句for 语句goto语句及用goto构成循环一般形式:功能:无条件转移,goto 语句标号;. 标号:语句;,警告: 不能用整数作标号只能出现在goto所在函数内,且唯一只能加在可执行语句前面限制使用goto语句,2019/6/26,18,例 用if 和goto语句构成循环,求,/*ch5_1.c*/ #include main() int i,sum=0;i=1; loop: if(i=100) sum+=i;i+;goto loop;printf(“%d“,sum); ,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=495
21、0+100=5050,2019/6/26,19,例 从键盘输入一组数据,以0结束输入,求数据和,/*ch5_11.c*/ #include main() int number,sum=0; read_loop: scanf(“%d“, ,2019/6/26,20,6.3 循环程序设计while语句一般形式:执行流程:判断表达式,后执行循环体,while(表达式) 循环体语句;,循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break, return, goto 无限循环: while(1)循环体;,2019/6/26,21,例 wh
22、ile语句构成循环,求,/*ch5_2.c*/ #include main() int i,sum=0;i=1;while(i=100) sum=sum+i;i+;printf(“%d“,sum); ,2019/6/26,22,例 显示110的平方,/*ch5_21.c*/ #include main() int i=1;while(i=10) printf(“%d*%d=%dn“,i,i,i*i);i+; ,运行结果: 1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100,2019/6/26,23,6.4
23、循环程序设计do while() 语句一般形式:执行流程:特点: 先执行循环体,再判断至少执行一次循环体可转化为while循环,do循环体语句; while(表达式);,2019/6/26,24,例 dowhile语句构成循环,求,/*ch5_3.c*/ #include main() int i,sum=0;i=1;do sum+=i;i+;while(i=100);printf(“%d“,sum); ,2019/6/26,25,例 while和dowhile比较,/*ch5_4.c*/ #include main() int i=1,sum=0;scanf(“%d“, ,#include
24、main() int i=1,sum=0;scanf(“%d“, ,2019/6/26,26,6.5 循环程序设计for 语句一般形式:执行流程:一般应用方式:,for(exp1; exp2; exp3)循环体语句;,for(循环变量赋初值; 循环条件; 循环变量增值) 循环体语句; ,expr1, expr2 , expr3 类型任意exp1, exp2, exp3都可省略,但分号不可省无限循环: for( ; ; )for语句可以转换成while结构,2019/6/26,27,例1 #includemain( ) int i=0;for(i=0;i10;i+)putchar(a+i);,运
25、行结果:abcdefghij,例2 #includemain( ) int i=0;for(;i10;i+)putchar(a+i);,例3 #includemain( ) int i=0;for(;i10;)putchar(a+(i+);,例4 #includemain( ) int i=0;for(;i10;putchar(a+i),i+);,例:多种方式连续输出多个字符,2019/6/26,28,例:打印加法表 #include main() int i,j,k;for(i=0,j=100;i=j;i+,j-) k=i+j;printf(“%d+%d=%dn“,i,j,k); ,例:打印
26、输入的多个字符 #include main() char c;for(;(c=getchar()!=n;)printf(“%c “,c); ,例:根据输入打印多个字符 #include main() int i,c;for(i=0;(c=getchar()!=n;i+=3)printf(“%c “,i+c); ,2019/6/26,29,例 梯形法求数值积分,#include main() float a,b; double s,h;double f(double x);int n,i;printf(“Input integral area a,b:“);scanf(“%f,%f“, ,dou
27、ble f(double x) return(sqrt(4.0-x*x); ,2019/6/26,30,(1) while() while() .,(2) do do while( );.while( );,(3) while() do while( );.,(4) for( ; ;) do while();while() . ,循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程嵌套循环的跳转禁止事项:从外层跳入内层跳入同层的另一循环向上跳转,2019/6/26,31,例 循环嵌套,输出九九表,/*ch5_5.c*/ #include main
28、() int i,j;for(i=1;i10;i+)printf(“%4d“,i);printf(“n-n“);for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?“%4dn“:“%4d“,i*j); ,2019/6/26,32,for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?“%4dn“:“%4d“,i*j);,2019/6/26,33,6.8 辅助控制语句break 语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外
29、的任何其它语句之中,2019/6/26,34,例1 输出圆面积,面积大于100时停止,#define PI 3.14159 main() int r;float area;for(r=1;r100)break;printf(“r=%d,area=%.2fn“,r,area); ,2019/6/26,35,例2 小写字母转换成大写字母, 直至输入非字母字符,#include main() int i,j;char c;while(1) c=getchar();if(c=a ,2019/6/26,36,6.8 辅助控制语句continue 语句功能:结束本次循环,跳过循环体中尚未执行的语句,进行下
30、一次是否执行循环体的判断说明:只能用于循环语句中,2019/6/26,37,例 求输入的十个整数中正数的个数及其平均值,/*ch5_12.c*/ #include main() int i,num=0,a;float sum=0;for(i=0;i10;i+) scanf(“%d“, ,2019/6/26,38,程序举例,分子:1,-1,1,-1 分母:1,3,5,7,.,*ch5_6.c*/ #include #include main() int s;float n,t,pi;t=1; pi=0; n=1.0; s=1;while(fabs(t)=1e-6) pi=pi+t;n=n+2;s
31、=-s;t=s/n;pi=pi*4;printf(“pi=%10.6fn“,pi); ,2019/6/26,39,例2 求Fibonacci数列 1,1,2,3,5,8,的前40个数,/*ch5_7.c*/ #include main() long int f1,f2;int i;f1=1; f2=1;for(i=1;i=20;i+) printf(“%12ld %12ld “,f1,f2);if(i%2=0) printf(“n“);f1=f1+f2;f2=f2+f1; ,2019/6/26,40,例3 判断m是否素数,/*ch5_8.c*/ #include #include main() int m,i,k;scanf(“%d“, ,2019/6/26,41,例4 译密码,例如输入:Hello,world! 译成密码:Lipps,asvph!,/*ch5_10.c*/ #include main() char c;while(c=getchar()!=n) if(c=a ,