第3章逻辑运算与程序控制_上_第1页
第3章逻辑运算与程序控制_上_第2页
第3章逻辑运算与程序控制_上_第3页
第3章逻辑运算与程序控制_上_第4页
第3章逻辑运算与程序控制_上_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第 3 章2重要提示 本章内容是程序设计的基础,极为重要。我们要通过听课、阅读教材、编写程序和上机实习,切实掌握程序设计的基础知识和基本方法,为以后的学习打下坚实基础。3 实际问题中,常常需要根据是否满足实际问题中,常常需要根据是否满足某种条件来做出判断。某种条件来做出判断。 例如,如果例如,如果a0,则,则a为负数;为负数; 又如,一元二次方程又如,一元二次方程 ax2+bx+c=0 有两有两个实根,必须同时满足两个条件:个实根,必须同时满足两个条件: a0 b2-4ac04 再如,年龄再如,年龄18岁,才是成年人。岁,才是成年人。 判断各种条件是否成立,需要使用关判断各种条件是否成立,需

2、要使用关系运算或系运算或逻辑运算,运算结果为逻辑值。逻辑运算,运算结果为逻辑值。逻辑值只有两种:逻辑值只有两种: 真真 (用用1表示表示) 假假 (用用0表示表示) 在在C语言中,将任何非语言中,将任何非0值看作真,值看作真,0看看作假。作假。53.1.1 关系运算符和关系表达式关系运算符和关系表达式 关系运算是一种比较运算。关系运算是一种比较运算。C语言提供语言提供6种关系运算符:种关系运算符: 运运 算算 符符优先级优先级结合性结合性 小于小于6自左向右自左向右 大于大于 = 大于或等于大于或等于 = 等于等于7 != 不等于不等于6 关系表达式关系表达式 用关系运算符将两个表达用关系运算

3、符将两个表达式连接起来便构成关系表达式。例如:式连接起来便构成关系表达式。例如: 关关 系系 表表 达达 式式值值 2 a 1 32=40 1.0/3*3=1.00等价于等价于 x =(5-2=4)1.0/3 的商是一个近似值,所以的商是一个近似值,所以1.0/3*3 !=1.0,即表达式的值为即表达式的值为 0关系运算符为左结合性,计算顺序从关系运算符为左结合性,计算顺序从左向右。左向右。325 相当于相当于(32)5字符比较是比较其字符比较是比较其ASCII 码的大小码的大小7 例例3.1 写出下面程序的输出结果。写出下面程序的输出结果。 #include void main() int

4、x=2, y=2; char z=b; printf(%dn, x+y!=x*y); printf(%dn, z B+10); 输 出 结 果输 出 结 果:01 B的的ASCII码为码为66z的值是字符的值是字符b, b的的ASCII码为码为9883.1.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 C语言提供语言提供3种逻辑运算符种逻辑运算符:运运 算算 符符优先级优先级结结 合合 性性操作对象操作对象 ! 非非 21 & 与与112 | 或或122 与运算规则:与运算规则:有有0则则0,全非,全非0才才1 例如例如:0 & 6 结果为结果为0 5 & 1 结果

5、为结果为19 或运算规则:或运算规则:有非有非0则则1,全,全0才才0 例如:例如:5 | 0 结果为结果为1 0 | 0 结果为结果为0 非运算规则非运算规则:0变变1,非非0变变0 例如:例如:x的值为的值为0,!x 的值为的值为1 x的值为的值为3,!x 的值为的值为0 逻辑表达式逻辑表达式 用逻辑运算符连接关系表达用逻辑运算符连接关系表达式或其他类型的表达式便构成逻辑表达式。式或其他类型的表达式便构成逻辑表达式。逻辑表达式可以表示复杂条件。逻辑表达式可以表示复杂条件。 例如,一元例如,一元10二次方程具有两个实根的条件是:二次方程具有两个实根的条件是: a!=0 & b*b-4

6、*a*c=0 例例3.2 写出下面程序的输出结果。写出下面程序的输出结果。 #include void main() int a=5, b=6, c=7, d=8, m, n; printf(%dn, a5 & b8); printf(%dn, a=5 | c10 | bb)&(n=cd); 输出输出0输出输出1输出输出1输出输出011a%2=0 1. 能够判断整型变量能够判断整型变量a是否为偶数的表达是否为偶数的表达 式是式是 。课 堂 练 习2. 能够判断字符型变量能够判断字符型变量c是否为英文字母是否为英文字母的逻辑表达式为:的逻辑表达式为: 。 c=a & c=

7、A & c=0 是否成立;是否成立; 若条件成立,则输出若条件成立,则输出 n 的值;的值; 若条件不成立,则将若条件不成立,则将n取负,然后输取负,然后输出出n的值。的值。 这种描述方法不直观,也较为烦琐。这种描述方法不直观,也较为烦琐。 方法方法2:用传统流程图描述算:用传统流程图描述算法法 这种方法是用不同形状的框图及流程线这种方法是用不同形状的框图及流程线17来描述算法:来描述算法: 开始开始结束结束输出输出n输入输入nn=0?n=-nYN 这 种 方 法这 种 方 法的优点是直观的优点是直观清晰、易于理清晰、易于理解;解; 缺点是当缺点是当问题比较复杂问题比较复杂时,流程图很

8、时,流程图很复杂,不太适复杂,不太适用。用。18 方法方法3:用:用N-S图描述算法图描述算法 这种方法不使用流程线,比较紧凑。这种方法不使用流程线,比较紧凑。 编写程序时,有了流程图或编写程序时,有了流程图或N-S图作参图作参考,可使思路清晰,效率更高。考,可使思路清晰,效率更高。 输入输入n n=0? Y N n=-n 输出输出n193.2.2 基本程序控制结构基本程序控制结构 结构化程序设计方法指出,任何程序结构化程序设计方法指出,任何程序都可以由以下都可以由以下3种基本结构组成。种基本结构组成。 1. 顺序结构顺序结构 是一种最简单的程序控制是一种最简单的程序控制结构,即按着语句的先后

9、顺序依次执行。结构,即按着语句的先后顺序依次执行。 2. 选择结构选择结构 是根据判断条件的不同取是根据判断条件的不同取值执行不同的语句序列。值执行不同的语句序列。 2. 循环结构循环结构 在给定条件成立时,重复在给定条件成立时,重复执行某些操作。执行某些操作。20 选择结构也叫分支结构,是结构化程序选择结构也叫分支结构,是结构化程序设计的三种基本结构之一。设计的三种基本结构之一。 实现选择结构的方式有实现选择结构的方式有3种:种: if 语句语句 switch 语句语句 条件表达式条件表达式213.3.1 if 语句语句 格式格式1: if( e ) 语句语句1 else 语句语句2 其中,

10、其中,e是判断条件;语句是判断条件;语句1、语句语句2可可以是任何类型的以是任何类型的单个语句单个语句(包括复合语句或包括复合语句或空语句空语句)。 e 即即expression 表达式表达式 if 语句通常有语句通常有2个个分支,省略分支,省略else及语句及语句2时为单分支时为单分支if 语句语句22 if 语句执行过程语句执行过程: 计算计算e的值;的值; 若若e的值非的值非0,则,则执行语句执行语句1,然后执行然后执行if语句后面的语句;语句后面的语句; 若若e的值为的值为0,则,则执行语句执行语句2,然后执行然后执行if 语句后面的语句。语句后面的语句。计算计算e语句语句1非非00语

11、句语句2 if ( e ) 语句语句1 else 语句语句2 23 例例3.3 输入被除数输入被除数x和除数和除数y,如果,如果y0,则做除法,输出结果;否则,不做除法,则做除法,输出结果;否则,不做除法,什么也不输出。什么也不输出。 #include void main() float x, y; printf(input x, y:); scanf(%f,%f, &x, &y); if(y!=0) printf(x/y=%fn, x/y); 运行情况:运行情况:input x, y:10,4x/y=2.500000单分支单分支if 语句语句24 例例3.4 输入输入3个值存

12、入个值存入a、b、c,如果它,如果它们能构成三角形,则输出三角形的面积;否们能构成三角形,则输出三角形的面积;否则,输出错误信息。则,输出错误信息。 注意:注意:a、b、c构成三角形的充要条件构成三角形的充要条件是任意两边之和大于第三边。是任意两边之和大于第三边。 #include #include void main() float a, b, c, s, area; 25 printf(input a,b,c:); scanf(%f,%f,%f, &a, &b, &c); if(a+bc & b+ca & c+ab) s=(a+b+c)/2; are

13、a=sqrt(s*(s-a)*(s-b)*(s-c); printf(area=%fn, area); else printf(It is not a triangle.n); 26 格式格式2: 多分支多分支if 语句语句 if( e1 ) 语句语句1 else if( e2 ) 语句语句2 else if( en ) 语句语句n else 语句语句n+1 其中语句其中语句1语句语句n+1可以是任可以是任何类型的单个语何类型的单个语句句(包括复合语句包括复合语句或空语句或空语句)27 n=3是赋值表达式,其值为是赋值表达式,其值为3 (非非0), 条件永远成立;条件永远成立; n=3是关系表

14、达式,当是关系表达式,当n的值为的值为3时,时,条件成立条件成立;当当n的值为其它值时,条件不的值为其它值时,条件不成立。成立。4. 以下两个以下两个 if 语句中的表达式有何语句中的表达式有何区别?区别? if( n=3 ) if( n=3 ) ?28 3.3.2 switch 语句语句 这是一种多分支语句这是一种多分支语句,一般形式为:一般形式为: switch ( e ) case 常量表达式常量表达式1: 语句段语句段1 case 常量表达式常量表达式2: 语句段语句段2 case 常量表达式常量表达式n: 语句段语句段n default: 语句段语句段n+1 e为整型或字符型为整型或

15、字符型29 switch 语句执行过程语句执行过程: 计算计算e的值;的值; 将将e的值逐个与各常量表达式的值进的值逐个与各常量表达式的值进行比较。当行比较。当e的值与某个常量表达式的值相的值与某个常量表达式的值相等时,就执行其后面的语句段等时,就执行其后面的语句段(若遇到若遇到break语句,则跳出语句,则跳出switch语句;否则继续执行后语句;否则继续执行后面的各语句段面的各语句段)。如果。如果e的值与所有常量表达的值与所有常量表达式的值都不相等,则执行式的值都不相等,则执行default后面的语句后面的语句段。段。30 补充例题补充例题1 输入一个百分制成绩输入一个百分制成绩(整数整数

16、),输出相应的等级。,输出相应的等级。 # include void main() int s; scanf (%d, &s); switch (s/10) /整数的商仍为整数整数的商仍为整数 case 10: case 9: printf(An); break; case 8: printf (Bn); break; 多个多个case 可共用一个语句段可共用一个语句段31 case 7: case 6: printf (Cn); break; default: printf(Dn); 32AB C switch( s/10 ) case 10: case 9: printf(An);

17、 case 8: printf(Bn); case 7: case 6: printf(Cn); 5. 当当 s为90时,输出结果是时,输出结果是 。 输出结果是错误的,修改方法是:输出结果是错误的,修改方法是:在每条在每条 printf 语句后面加一个语句后面加一个 break 语句语句,如:,如: printf(An); break;?33 关于关于switch 语句的说明语句的说明: 执行执行switch中的某个语句段时,遇到中的某个语句段时,遇到break语句,便跳出语句,便跳出switch语句;如果未遇到语句;如果未遇到break语句,则向下顺序执行,不再进行判语句,则向下顺序执行,

18、不再进行判断。断。 在在switch语句中,表达式语句中,表达式e及各常量及各常量表达式的值必须是整型或字符型。表达式的值必须是整型或字符型。 default及其后的语句段可缺省。及其后的语句段可缺省。343.3.3 条件表达式条件表达式 条件运算符条件运算符“ ? : ”与与3个表达式可构个表达式可构成条件表达式:成条件表达式: e1 ? e2 : e3 3个表达式可以是任意类型。个表达式可以是任意类型。 执行过程执行过程: 计算计算e1的值;的值; e1的值非的值非0,取,取e2的值为条件表达式的值为条件表达式的值;否则,取的值;否则,取e3的值为条件表达式的值。的值为条件表达式的值。 3

19、5 例如:例如: x=ab ? a-b : b-a; 这是一个赋值语句,赋值号右边是一个这是一个赋值语句,赋值号右边是一个条件表达式。条件运算符的优先级为条件表达式。条件运算符的优先级为13级,级,高于赋值运算符,所以先计算条件表达式的高于赋值运算符,所以先计算条件表达式的值,然后把计算结果赋给值,然后把计算结果赋给x。相当于:。相当于: if(ab) x=a-b; else x=b-a; 36 3.3.4 选择结构的嵌套选择结构的嵌套 选择结构嵌套是指在一个分支的语句选择结构嵌套是指在一个分支的语句段中,又出现了一个选择结构。段中,又出现了一个选择结构。 例例3.8 根据分数给出不同的等级:

20、根据分数给出不同的等级: 059分:分: 不及格不及格 6079分:分: 及格及格 80100分:优秀分:优秀 # include void main() int s; 37 printf(请输入请输入分数分数:); scanf(%d, &s); if(s=60) if(s=80) / 该语句段又是一个该语句段又是一个if 语句语句 printf (优秀优秀n); else printf (及格及格n); else printf (不及格不及格n);38 条件表达式可以嵌套。例如:条件表达式可以嵌套。例如: ab ? a : cd ? c : d 条件运算符为右结合性,上式等价于:条件

21、运算符为右结合性,上式等价于: ab ? a : (cd ? c : d) 即第即第3个表达式本身又是一个条件表达个表达式本身又是一个条件表达式。先计算右边条件表达式的值式。先计算右边条件表达式的值,计算结果计算结果作为第作为第3个表达式,然后,再计算左面条件个表达式,然后,再计算左面条件表达式的值。表达式的值。39 循环循环 是指在满足给定条件时,重复执是指在满足给定条件时,重复执行某些操作,直到不满足条件为止。循环行某些操作,直到不满足条件为止。循环结构是一种最常用、最重要的控制结构。结构是一种最常用、最重要的控制结构。 C语言提供语言提供 3 种循环语句:种循环语句: for while

22、 do-while 403.4.1 for 循环循环 一般形式:一般形式: for( e1; e2; e3 ) 循环体循环体 注意:注意:圆括号内有圆括号内有3个表达式,由个表达式,由2个个分号隔开;圆括号后面没有分号。分号隔开;圆括号后面没有分号。41for 语句执行过程语句执行过程循环体循环体非非0计算计算e2的值的值计算计算e1的值的值 只执行只执行 1 次次计算计算e3的值的值042 例例3.12 运动员绕运动员绕400米跑道跑米跑道跑5圈,每圈,每跑一圈输出一次信息:当前是第几圈,已跑一圈输出一次信息:当前是第几圈,已经跑完多少米。经跑完多少米。 分析:一共跑分析:一共跑5圈,已知循

23、环次数为圈,已知循环次数为5次,适合用次,适合用 for 语句编写程序。语句编写程序。 # include void main() int dis=0, i; 43 for( i=1; i=5; i+ ) dis=dis+400; / 每跑一圈,距离累加每跑一圈,距离累加400米米 printf(当前是第当前是第%d圈圈,已经跑完已经跑完%d米米n, i,dis); 运行结果:运行结果:44 补充例题补充例题2 计算:计算:s=1+2+3+99+100 分析:设分析:设n表示加数表示加数,初值为初值为1,终值为终值为100,适合用,适合用 for 语句编程。语句编程。 # include vo

24、id main() int n, s; for( n=1, s=0; n=100; n+ ) s=s+n; printf (s=%dn, s ); e1是逗号表达式,是逗号表达式,s 的初值为的初值为0运行结果:运行结果:s=5050请思考:要计算奇数之和请思考:要计算奇数之和 s=1+3+5+99程序应如何修改?程序应如何修改?45 for语句的变形语句的变形 for语句中的语句中的3个表达式个表达式可以缺省可以缺省1个、个、2个或个或3个,但个,但2个分号不可个分号不可缺省。例如,可将表达式缺省。例如,可将表达式1放在放在for语句之前语句之前: n=1, s=0; for( ; n=10

25、0; n+ ) s=s+n ; 也可以将表达式也可以将表达式3 放在循环体中:放在循环体中: n=1, s=0; for ( ; n=100 ; ) s=s+n; n+; 46 可见,可见,for 语句形式多样、使用灵活。语句形式多样、使用灵活。但不规则的写法会降低程序的可读性,少但不规则的写法会降低程序的可读性,少用为妙。用为妙。473.4.2 while 循环循环 一般形式:一般形式: while( e ) 循环体循环体 其中表达式其中表达式e可以是可以是任意类型。任意类型。计算计算 e循环体循环体非非0执行过程执行过程048 例例3.13 编写程序,使用编写程序,使用while循环输出循

26、环输出 110之间的偶数。之间的偶数。 分析:该问题循环次数已知,可以用分析:该问题循环次数已知,可以用for循环,也可以用循环,也可以用while循环。循环。 # include printf(n); void main() int num=1, i; while(num=10) if(num%2=0) printf(%-3d, num); num+; 输出结果:输出结果:2 4 6 8 1049 例例3.14 编写程序,使用编写程序,使用while循环把从循环把从键盘输入的字符及其键盘输入的字符及其ASCII值显示出来,并值显示出来,并统计一共输入了多少个字符。统计一共输入了多少个字符。

27、分析:该问题循环次数未知,适合用分析:该问题循环次数未知,适合用while循环处理。循环处理。 #include void main() int n=0; / 计数器初值设为计数器初值设为0 char ch; 50 while (ch=getchar()!=n) printf(%c %dn, ch, ch); n+; / 统计字符个数统计字符个数 printf(一共输入一共输入%d个字符个字符n, n); 运行情况:运行情况:输入输入:a1输出:输出: a 97 1 49 一共输入一共输入2个字符个字符51 补充例题补充例题3 求和:求和:s=1+2+3+ n 分析:求前分析:求前n个自然数之

28、和,循环次数未个自然数之和,循环次数未知,适合用知,适合用while循环。循环。 # include void main() int n, i=1, s=0; / i表示加数,表示加数,s存放和存放和 scanf(%d, &n); while(i=n) s=s+i; i+; / 或或 s+=i+; printf (s=%dn, s); 52 3.4.3 do-while 循环循环 一般形式一般形式: do 循环体循环体 while( e ); 表达式表达式e可以是任意可以是任意类型,其值为类型,其值为0或非或非0。这。这是一种是一种“直到型直到型”循环。循环。0循环体循环体非非0计算计

29、算e执行过程执行过程这里有分号这里有分号53 补充例题补充例题4 使用使用do-while 循环计算:循环计算: s=1+3+5+99 #include void main() int s=0, n=1; do s+=n; n=n+2; while(n=99); printf(s=%dn, s); do-while循环特点:循环特点: 先执行循环体,后判断条先执行循环体,后判断条件;循环体至少被执行件;循环体至少被执行1次。次。 运行结果:运行结果:s=250054 例例3.15 编写程序,使用辗转相除法编写程序,使用辗转相除法求求a和和b的最大公约数。的最大公约数。 辗转相除求最大公约数的算

30、法:辗转相除求最大公约数的算法: 求求a%b,余数为,余数为m; 把把b赋给赋给a,把把m赋给赋给b; 若若m!=0,则重复求余数则重复求余数a%b,一直一直到到m=0为止,这时,为止,这时,a就是最大公约数。就是最大公约数。 #include void main()55运行情况:运行情况:请输入整数请输入整数a, b: 12,18最大公约数是最大公约数是6 int a, b, m; 交换交换a、b的值的值 printf(请输入整数请输入整数a, b:); m scanf(%d,%d, &a, &b); if(ab) m=a, a=b, b=m; a b do m=a%b; a

31、=b; b=m; while(m!=0); printf(最大公约数是最大公约数是%dn, a); 56 do-while循环先执行循环体,后判循环先执行循环体,后判断条件,循环体至少被执行断条件,循环体至少被执行1次;次; while循环先判断条件,后执行循循环先判断条件,后执行循环体,如果条件不成立,则循环体环体,如果条件不成立,则循环体1次次也不被执行。也不被执行。 6. do-while 循环与循环与 while 循环最主循环最主要的区别是什么?要的区别是什么? ?573.4.4 多重循环多重循环 当循环体内又出现循环语句时,便构成当循环体内又出现循环语句时,便构成循环嵌套,即多重循环

32、。循环嵌套,即多重循环。 注意,循环可以嵌套,但不能交叉:注意,循环可以嵌套,但不能交叉: 外循环外循环 外循环外循环 内循环内循环 内循环内循环 循环嵌套循环嵌套 错误的交叉错误的交叉58 例例3.16 编程输出以编程输出以下图形。下图形。 * * * * * 此三角形有此三角形有5行,每行,每行星号数与行号行星号数与行号i相等;相等;外循环循环外循环循环1次,内循环次,内循环循环循环i次,输出次,输出i个星号。个星号。#include void main() int i, j; for(i=1;i=5;i+) for(j=1;j=i;j+) printf(*); printf(n); 59

33、 例例3.17 编程输出乘法口诀表。编程输出乘法口诀表。 11=1 12=2 13=3 19=9 21=2 22=4 23=6 29=18 31=3 32=6 33=9 39=27 41=4 42=8 43=12 49=36 51=5 52=10 53=15 59=45 61=6 62=12 63=18 69=54 71=7 72=14 73=21 79=63 81=8 82=16 83=24 89=72 91=9 92=18 93=27 99=8160 分析:乘法口诀表共有分析:乘法口诀表共有9行,每行有行,每行有9个表达式。每个表达式为行号与列号的乘个表达式。每个表达式为行号与列号的乘积:

34、积: ij=k 使用双重循环编程,外循环每循环使用双重循环编程,外循环每循环1次次时,内循环循环时,内循环循环9次,输出次,输出9个表达式。个表达式。 程序如下:程序如下: #include void main() int i, j, k; 61 for(i=1; i=9; i+) for(j=1;j=9; j+) / 输出输出9个表达式个表达式 k=i*j; printf(%d%d=%dt, i, j, k); printf(n); 62 有时,需要改变程序的执行顺序,转移有时,需要改变程序的执行顺序,转移到程序的某个位置继续执行;有时,需要提到程序的某个位置继续执行;有时,需要提前终止正在执行的循环。前终止正在执行的循环。 本节介绍几种转移语句:本节介绍几种转移语句: break continue goto 633.5.1 break语句语句 格式:格式: break; 功能:功能: 用在各种循环用在各种循环语句中,中断并跳出语句中,中断并跳出循环,如右图所示。循环,如右图所示。 用在用在 switch 语语句中,跳出句中,跳出switch语语句句 。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论