C语言程序设计教程件.ppt
5.1 关系运算符和关系表达式 6 种关系运算符种关系运算符: (小于)(小于) (小于或等于)(小于或等于) (大于)(大于) (大于或等于)(大于或等于) (等于)(等于) ! (不等于)(不等于) 5.1.1 关系运算符关系运算符优先级相同(高)优先级相同(低)结合性结合性:自左向右:自左向右 关系运算符的优先次序关系运算符的优先次序 与其它运算符优先级的比较与其它运算符优先级的比较:算术运算符算术运算符关系运算符关系运算符赋值运算符赋值运算符(高)(高)(低)(低)例如: c=da+b等效于:c=(d(a+b)1. 什么是关系表达式?什么是关系表达式?5.1.2 关系表达式关系表达式如:(ab)(bc) 、ay 、s+fd2. 关系表达式的值关系表达式的值运算结果运算结果 逻辑值逻辑值 1“真真” ,0“假假”如:如: 设设 a=3, b=2, c=1 求下面关系表达式求下面关系表达式 的值:的值: cb (a-b) = = 1 b+ca值为值为值为值为值为值为如果关系运算对象的类型不同,也要先进行类型转换如果关系运算对象的类型不同,也要先进行类型转换。关系表达式的应用。关系表达式的应用。main()char c=k;int i=4,j=2,k=5;float x=3e+5,y=7.56;printf(“%d,%dn”,a+3=k+1);printf(“%d,%dn”,i+j=-3*j,k=j=i+7);printf(“%d,%dn”,xa+b&ab等效于: c=(d(a+b)&(ab)1. 什么是逻辑表达式?什么是逻辑表达式?5.2.2 逻辑表达式逻辑表达式用逻辑运算符将逻辑运算对象连结起来的式子用逻辑运算符将逻辑运算对象连结起来的式子。如:(ab)&(bb 2. 逻辑表达式的值逻辑表达式的值运算结果运算结果 逻辑值逻辑值(只有假为只有假为0、真为、真为1两种取值两种取值)如:如: 53 & 2 | 84 b&d值为值为 1值为值为运算对象运算对象 以以数值非数值非0为真、为真、0为假为假注意事项:注意事项:(1)代数式不等式代数式不等式0 x0)&(x5),而不能直接写成而不能直接写成0 x y ) z = x;2. 双分子语句双分子语句if (表达式表达式) 语句语句1 else 语句语句2 执行过程: 当表达式的值为“真”(非零)时,执行语句1,否则,执行语句2。如如: if (xy) z=x ; else z=y ;3. 多分子语句多分子语句if (表达式表达式1) 语句语句1 else if(表达式表达式2) 语句语句2 else if(表达式表达式3) 语句语句3 : else if(表达式表达式m) 语句语句m else 语句语句n如:if (grade=85) level=A; else if (grade=70) level=B; else if (grade=60) level=C; else level=D; if 语句说明:语句说明: if后面的表达式一般为逻辑表达式或关系表后面的表达式一般为逻辑表达式或关系表 达式,也可以是任意数值类型表达式。达式,也可以是任意数值类型表达式。该语句是合法的:if(3) printf(“ok!”); if 语句中的语句中的“语句语句”为一个简单语句或复合语句。为一个简单语句或复合语句。 如:下面程序段是否有错?if (x=0) printf(“X is positive.”); x+;else printf(“X is negative.”);if (x=0) printf(“X is positive.”); x+;else printf(“X is negative.”);4. if 语句的嵌套语句的嵌套 在 if 语句中又包含一个或多个if 语句称为 if 语句的嵌套语句的嵌套。 一般形式:if (条件1) if (条件2)语句1 else 语句2else if (条件3)语句3 else 语句4内嵌if内嵌if如:if(x0) if(y0) printf(x0,y0); else printf(“x0,y0) printf(“x0); else printf(“x=0, y6) if (n12) printf(“6n12”);else printf(“n6) if (n12) printf(“6n12”);else printf(“n=6”); 缩缩 排排 #inclde main() int x; scanf(“%d”,&x); if (x0) printf(“X is positive.”); x=x+1; else printf (“X is negative.”); 缩进缩进缩进用用if 语句实现选择结构举例语句实现选择结构举例 -1 ;x0 main( ) int x,y; scanf(%d,&x); if(x0) y=-1; else if(x= =0) y=0; else y=1; printf(x=%d y=%d,x,y);例例 : 托运行李计费。用托运行李计费。用f代表收费,代表收费,w代表重量,并将它们定义代表重量,并将它们定义成实型数。则有关系成实型数。则有关系: w*0.205 (0=w=50) f = w*0.313 (50w200)main()float f,m;printf(“input weight:”);scanf(“%f”,&w);if(w200)f=(w-120)*0.413+10*0.23;else if(w50)f= w*0.313;else f= w*0.205;printf(“w=%f,f=%fn,w,f);5.3.2 条件运算符条件运算符1.条件运算符与条件表达式条件运算符与条件表达式条件表达式的一般形式条件表达式的一般形式:表达式1 ? 表达式2 表达式3如:如:max= (ab) ? a : b ; 若若 a=3, b=2, 则则 max=?如: (ab) ? a : b 目的目的 简化 if 语句。 if (ab) max=a; else max=b;等效于:条件运算符的优先级:条件运算符的优先级: 算数运算符算数运算符=关系运算符关系运算符=逻辑运算符逻辑运算符(除!除!) 赋值运算符赋值运算符c & cd ? a+b : d 等效于等效于: x = (a+b)c) & (cd) ? (a+b) : d) 条件运算符的结合方向条件运算符的结合方向: 自右至左自右至左 如:如:ab ? a : cd ? c : d等效于:等效于:ab ? a : (cd ? c : d)2.条件表达式与条件表达式与if语句的比较语句的比较 当当if语句中嵌套的语句是赋值语句,而且语句中嵌套的语句是赋值语句,而且两个分支都给同一个变量赋值时,条件表达式两个分支都给同一个变量赋值时,条件表达式能替代能替代if 语句语句 。 如下面的写法是错误的:如下面的写法是错误的: a0?printf(“abs(a)=%dn”,a):printf(“abs(a)=%dn”,(-1)*a); 此语句的本意是:此语句的本意是:if(a0)printf(“abs(a)=%dn”,a);elseprintf(“abs(a)=%dn”,(-1)*a);可以改写为:可以改写为:printf(“abs(a)=%dn”,a0?a:(-1)*a);例:把输入字符中的小写字符转换成大写并输出例:把输入字符中的小写字符转换成大写并输出 。#include main() char ch; scanf(%c,&ch); ch=(ch=a &chb) ? a : b ; max=(tc) ? t : c ; printf(max=%dn,max); 5.3.3 switch 5.3.3 switch 语句语句一般形式:一般形式:switch(表达式)(表达式) case 常量表达式常量表达式1:语句序列:语句序列1 case 常量表达式常量表达式2:语句序列:语句序列2 break; : case 常量表达式常量表达式n:语句序列:语句序列n break; default :语句序列:语句序列n+1 此处break用于退出switch语句break;执行过程:执行过程:例如:例如: switch(grade) case A : printf(“85100 ”); case B : printf(“7084 ”); case C: printf(“6069 ”); case D :printf(“60 ”); default : printf(“error ”); 若若grade = A,输出结果是什么?,输出结果是什么?85100 7084 6069 60 error 用用break语句处理后的程序段:语句处理后的程序段: switch(grade) case A : printf(“85100 ”); break; case B : printf(“7084 ”); break; case C : printf(“6069 ”); break; case D : printf(“60 ”); break; default : printf(“error ”); 若若gread= A,输出结果又是什么?,输出结果又是什么?85100完整程序完整程序 :main() char grade; printf(“Input grade(A,B,C,D):”); scanf(“%c”,&grade); switch(grade) caseA : printf(“85100 ”); break; case B : printf(“7084 ”); break; case C : printf(“6069 ”); break; case D : printf(“60 ”); break; default : printf(“error !”); 流程图为: grade输出 “85100”输出 “60”输出 “60-69”输出 “error”输出 “70-84”5.3.4 5.3.4 标号语句和标号语句和gotogoto标号语句一般形式:标号语句一般形式:语句标号:语句语句标号:语句例如:例如:end:,该标志符就成了语句标号,但标号不能用数值表该标志符就成了语句标号,但标号不能用数值表示,例如:示,例如:12:,:,3:,:,5:都是错误的。标号可以与变量同:都是错误的。标号可以与变量同名。名。 goto语句一般形式:语句一般形式:goto 语句标号;语句标号; goto语句的作用是使程序改变原来的执行顺序,语句的作用是使程序改变原来的执行顺序,而跳到指定的语句上执行。而跳到指定的语句上执行。 例如:例如:goto sd; sd:printf(“this is a cat!n”);说明: C语言允许在任何语句前加一个语句标号,作语言允许在任何语句前加一个语句标号,作为为goto语句的目标。给语句加标号的形式:语句的目标。给语句加标号的形式: 语句标号:语句语句标号:语句 goto语句是一种非结构化语句,结构化程语句是一种非结构化语句,结构化程序设计方法不提倡使用序设计方法不提倡使用goto语句,因为滥用语句,因为滥用goto语句将使程序流程无规律,可读性差。但语句将使程序流程无规律,可读性差。但也不是绝对禁止使用,只有在能够大大提高程也不是绝对禁止使用,只有在能够大大提高程序效率时才使用。序效率时才使用。且记:不要从循环体外跳到循环体内且记:不要从循环体外跳到循环体内!main() int i,sum=0;i=1; loop: if(i100)sum=sum+1;i+;goto loop;printf(“%d”,sum);一、例一、例 用用if 语句和语句和goto语句构成循环求语句构成循环求 1+2+3+100。二、用二、用goto语句和语句和 if 语句构成循环语句构成循环计算计算10!并输出结果。!并输出结果。 main() int i=1, sum=1;loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%dn”,sum); 运行结果:10!=24320本应是:10!=3628800 main() int i=1; long sum=1;loop: if (i=10) sum=sum*i; i+; goto loop; printf(“10!=%ldn”,sum); 5.4 5.4 选择结构程序设计举例选择结构程序设计举例例例 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。设:设:leap代表闰年信息,代表闰年信息,leap=1闰年,闰年,leap=0 非闰年非闰年不能被4整除非闰年被4整除,但不能被100整除闰年被100整除,又能被400整除闰年其他,非闰年非闰年main( ) int year, leap=0; scanf(“%d”, &year); /* 输入年份值 */ if (year%4= =0&year%100!=0)|(year%400= =0) leap=1; else leap=0; if(leap= =1) printf(“%d is leap ”, year); else printf(“%d is not leap ”, year); main( ) int year, leap=0; scanf(“%d”, &year); /* 输入年份值 */ if(year%4 != 0) leap=0; else if(year%100 != 0) leap=1; else if(year%400 != 0) leap=0; else leap=1; if(leap= =1) printf(“%d is leap ”, year); else printf(“%d is not leap ”, year); 例例 已知基本运费、货重,以及路程已知基本运费、货重,以及路程(s)和折扣的关和折扣的关系标准如下:系标准如下: s250km 没有折扣 250s500 %2折扣 500s1000 5%折扣 1000s2000 8%折扣 2000s=3000) c=12; else c= s / 250; /* 按按250分类分类 */ switch( c ) case 0: d=0 ; break ; /* s250 */ case 1: d=2 ; break ; /*250s500*/ case 2: /*500s750*/ case 3: d=5; break; /*750s1000*/ case 4: /*1000s1250*/ case 5: /*1250s1500*/ case 6: /*1500s1750*/ case7: d=8 ; break ; /*1750s2000*/ case8: /*2000s2250*/ case9: /*2250s2500*/ case10: /*2500s2750*/ case11: d=10 ; break; /*2750s=3000) d=15; else if (s=2000&s=1000&s=500&s=250&s0, 有两个不相等的实根有两个不相等的实根 4、b2-4ac0, 有两个共轭复根有两个共轭复根 5、如何判断实数为零(或大于零,或小于零)、如何判断实数为零(或大于零,或小于零) 特殊条件的处理特殊条件的处理#includemain() else if( disc1e-6) float a,b,c,d,disc,x1,x2,realpart,imapart; x1=(-b+sqrt(disc)/(2*a); scanf(“%f,%f,%f”,&a,&b,&c); x2=(-b-sqrt(disc)/(2*a); printf(“The equation ”); if(fabs(a)=1e-6) else printf(“is not a quadratic”) ; realpart=-b/(2*a); else imagpart=sqrt(-disc)/(2*a); disc=b*b-4*a*c; printf(“has complex roots:n”) ; if(fabs(disc)=1e-6) 打印虚根; printf(“has two equal roots: %7.4fn”,-b/(2*a); 有问题吗?有问题吗?习题习题 给一个不多于给一个不多于5位的正整数位的正整数,要求要求:求出它是几位数求出它是几位数;分分别打印出每一位数字别打印出每一位数字;按逆序打印出各位数字按逆序打印出各位数字,例如原数为例如原数为321,应输出应输出123。 #include main() long int num; int n1,n2,n3,n4,n5,bits; scanf(“%ld”,&num); if (num9999) bits=5 else if (num999) bits=4; else if(num99) bits=3; else if(num9) bits=2; else bits=1; printf(“bits=%dn”,bits); n5=num/10000; n4= (int)(num-n5*10000)/1000; n3=(int)(num- n5*10000- n4*1000)/100; n2=(int)(num- n5*10000- n4*1000- n3*100)/10; n1=(int)(num-n5*10000-n4*1000-n3*100- n2*10); switch(bits) case 5:printf(“Every bit is:%d,%d,%d,%d,%dn”, n5,n4,n3,n2,n1); printf(“Reverse is: %d,%d,%d,%d,%dn”, n1,n2,n3,n4, n5); break; case 4: printf(“Every bit is: %d,%d,%d,%dn”, n4,n3,n2,n1); printf(“Reverse is: %d,%d,%d,%dn”, n1,n2,n3,n4); break; case 3: printf(“Every bit is: %d,%d,%dn”, n3,n2,n1); printf(“Reverse is: %d,%d,%dn”, n1,n2,n3); break; case 2: printf(“Every bit is: %d,%dn”, n2,n1); printf(“Reverse is:%d,%dn”, n1,n2); break; case1: printf(“Bit is: %dn”, n1); printf(“Reverse is: %dn”, n1); 运行情况:运行情况:12345 Inputbits=5Every bit is: 1,2,3,4,5Reverse is: 5,4,3,2,1Output5.5 5.5 小结小结(1)(1)C C语言提供的关系运算符有语言提供的关系运算符有6 6种:种:(小于小于) ),=(大于大于) ),=大于等于大于等于) ),= =(= =(等于等于) ),!=(!=(不等于不等于) )。用关系运算符将两个表达式连。用关系运算符将两个表达式连接起来,进行关系运算的式子称为关系表达式。接起来,进行关系运算的式子称为关系表达式。(2)(2)C C语言提供的逻辑运算符有语言提供的逻辑运算符有3 3种:种:&(&(逻辑与逻辑与) ),|(|(逻辑或逻辑或) ),!(!(逻辑逻辑非非) )。用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子。用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子称为逻辑表达式。称为逻辑表达式。(3)(3)ifif语句的三种基本形式如下:语句的三种基本形式如下: 单分支单分支if语句语句 双分支双分支if语句语句 多分支多分支if语句语句 (4)(4)使用使用ifif语句的注意事项如下:语句的注意事项如下: ifif语句中的语句中的“表达式表达式”必须用必须用“()()”括起来。括起来。 “ “表达式表达式”,除常见,除常见的关系表达式或逻辑表达式外,也允许是其他类型的数据,如整型、实的关系表达式或逻辑表达式外,也允许是其他类型的数据,如整型、实型、字符型等。型、字符型等。 elseelse子句子句( (可选可选) )是是ifif语句的一部分,必须与语句的一部分,必须与ifif配对使用,不能单独配对使用,不能单独使用。使用。 “语句组语句组1 1”和和“语句组语句组2 2”,可以只包含一个简单语句,也可以是,可以只包含一个简单语句,也可以是复合语句。当复合语句。当ifif和和elseelse后面的语句组,仅由一条语句构成时,也可不使后面的语句组,仅由一条语句构成时,也可不使用复合语句形式用复合语句形式( (即去掉花括号即去掉花括号) )。 if语句允许嵌套,但嵌套的层数不宜太多。语句允许嵌套,但嵌套的层数不宜太多。 (5)switch语句用来实现多分支结构的程序设计。语句用来实现多分支结构的程序设计。