资源描述
第4章 控制结构,本章要求:,掌握选择控制语句if语句、switch语句以及他们的嵌套应用; 掌握循环控制语句for语句、while语句、dowhile语句以及他们的嵌套应用; 掌握break语句、continue语句的应用; 能够运用3种结构进行综合程序设计。,4.1 关系运算与逻辑运算,例子: 三个数中找最大 判断是否是闰年 判断密码的正确与否 关键点:判断的条件如何确立?,选择结构,4.1.1 关系运算符与关系表达式,比较两个量的运算符称为关系运算符: ,= , = ,!= 关系运算符的优先级: “、=、 关系运算符 赋值运算符 一般形式为:表达式 关系运算符 表达式其值: 关系成立为“真”,不成立则为“假” C语言中用 “1” 表示 “真” ; “0” 表示 “假”,如 56 x=3 xc)a!=(c=b) (a=3)(b=5),又如:当 a=5, b=4 时 a+=3b,-False(0),-True(1),-False(0),-6,4. 1. 2 逻辑运算符与逻辑表达式,1、逻辑运算符 ! 非运算 执行过程:若表达式的值为真(非0)则执行其后的语句, (0)否则不执行该语句。,判断0或非0可以是: 关系表达式 逻辑表达式 数学表达式 等等,只能是一个语句,若要执行多个语句,可以使用 ,例:输入任意两个整数x , y,比较后,确保x要大于等于y,再输出。 void main() int x, y, t; printf(Enter x and y:n); scanf(%d%d, ,2双分支结构ifelse.语句 使用格式: if (表达式) ; else ; 语句的执行过程: 当表达式的值为非0(条件成立)时执行, 否则执行else后面。,例:输入三个数,然后输出其中最大的数。 void main() int a, b, c, max; scanf(“%d%d%d”, ,3ifelse if语句(多分支结构) 语句形式: if (表达式1) 语句1; else if (表达式2) 语句2; . else if (表达式n) 语句n; else 语句块n+1;,例:简单计算器,例:已知百分制成绩x,显示对应的五级制成绩,下列哪些正确。,4. 使用if语句中应注意以下问题,if(a=5) 语句; if(b) 语句; 都是允许的。,if(xy) t=x; x=y; y=t; ,if(ab) max=a;,5if语句的嵌套,当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。如:,if(表达式1) if (表达式2) 语句;,if (表达式1) if (表达式2) 语句1; else 语句2; else if (表达式3) 语句3;,要特别注意if和else的配对问题。例如: 其中的else究竟是与哪一个if配对呢? if(表达式1) if(表达式1) if(表达式2) if(表达式2) 语句1; 语句1; else else 语句2; 语句2;,语言规定:else 总是与它前面最近的if配对,4.2.2 条件运算符和条件表达式,条件运算符为 ? : 它是一个三目运算符。 条件表达式的一般形式为: 表达式1 ? 表达式2 :表达式3 其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。例如:,if(ab) max=a; else max=b;,max=(ab)?a:b;,条件运算符的说明:,运算优先级:低于关系运算符和算术运算符,高于赋值符。如:max=ab?a:b 条件运算符? :是一对运算符,不能分开单独使用。 结合方向:自右至左。例如:,ab?a:cd?c:d,cd?c:d,例:若输入的大写字母转换成相应的小写字母,否则原样输出。,void main() char ch; scanf(%c, ,if (ch=A ,4.2.3 switch语句(开关语句),switch语句使用的一般形式为: switch(表达式) case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式n: 语句n; default : 语句n+1; ,计算表达式的值k,若k等于常量表达式的值,则执行对应语句,若k与上诉常量均不相同,执行该语句,例:使用switch语句实现百分制成绩化五级制成绩。,switch(x/10) case 10: case 9: printf(A); case 8: printf(B); case 7: printf(C); case 6: printf(D); default:printf(E); ,break; break; break; break;,使用switch语句的通常形式为:,switch(表达式) case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; case 常量表达式n: 语句n; break; default : 语句n+1; ,添加break;后:,例:输入17(分别代表星期一到星期天),输出相应的内容。,void main() int a; printf(input integer number: ); scanf(%d, ,说明:,在case后的各常量表达式的值不能相同,否则会出现错误。 在case后,允许有多个语句,可以不用括起来。 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。但需要配合“break;”使用。 default子句可以省略不用。,4.2.3 选择结构的嵌套,if (表达式1) 语句1; else if (表达式2) 语句2; . else if (表达式n) 语句n; else 语句n+1;,switch(表达式) case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; case 常量表达式n: 语句n; break; default : 语句n+1; ,这些语句部分,都可以包含另一个完整的if语句或switch语句,例:输入三个数,从小到大排列,if(ab) t=a; a=b; b=t; if(bc) t=b; b=c; c=t; if(ab) t=a; a=b; b=t; ,说明:,嵌套只能在一个分支内嵌套,不出现交叉。其嵌套的形式将有很多种,嵌套层次也可以任意多。 在swicth结构中,每一个case分支可以完整包含另一个ifelse结构,也可完整包含另一个swicth结构。 提示:为了便于阅读和维护,建议在写含有多层嵌套的程序时,使用缩进对齐方式。,4.2.5 选择结构程序举例,例:小学数学题,要求: 随机产生两道数学题(参加运算的数在110之间),一道加法,一道减法。 产生一道题后,让用户输入答案;判断答案的正确性,并给出提示。 记录用户答对的题数,并对最终的成绩作出评价。 可以使用if语句,或switch语句。,4.3 循环结构,循环结构的特点: 在给定条件成立时,反复执行某程序段, 直到条件不成立为止。 注意两个概念: 给定的条件称为循环条件 反复执行的程序段称为循环体 在C语言中,实现循环结构的语句主要有3种: while doWhile for语句,4.3.1 while语句,while语句的一般形式为: while(表达式) 语句;表达式是循环条件,语句为循环体 执行过程:计算表达式的值,当值为真(非0)时, 执行循环体语句。否则,退出,例:在屏幕上打印110,说明:,计算的值,若表达式的值为真(非0)时,则执行循环体语句;不断反复,直到表达式的值为假(0),则不执行循环体语句,而直接转向循环体外的第一条语句。 是循环反复执行的程序,称为“循环体”,当需要执行多条语句时,应使用“ ”括起来组成一个复合语句。 while语句是先判断条件,后执行循环体,为“当型”循环,因此若条件不成立,有可能一次也不执行循环体。,例: 编程序求:s=1+2+3+100,main() int s=0,n=1; while (n=100) s=s+n; n+; printf(S=%d,s); ,4.3.2 do.while语句,一般形式为: do 语句; while (表达式); 执行过程:先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。,例: 编程序求:s=1+2+3+100,void main() int s=0,n=1; do s=s+n; n+; while (n=100); printf(S=%d,s); ,while (n=100) s=s+n; n+; ,用辗转相除法求两自然数m,n的最大公约数和最小公倍数。 例 求 m=28 ,n=20 的最大公约数. if (mn) t=m; m=n; n=t; r=m%n; while (r!= 0) m=n; n=r; r= m%n; ,循环 m n r 赋好初值时:28 20 8 第一次结束:20 8 4 第二次结束: 8 4 0,注意以下几点:,在if语句,while语句中,表达式后面都不能加分号,而在 do-while语句的表达式后面则必须加分号。 当循环体由多个语句组成时,也必须用括起来组成一个复合语句。 如果循环至少要执行一次, while和do-while语句可以相互替换。,4.3.3 for循环语句,一般形式为: for(表达式1;表达式2;表达式3) 语句; 表达式1(控制变量的初始化):用来给循环变量赋初值,也允许在for语句外给循环变量赋初值,此时可以省略该表达式。 表达式2(循环的条件):循环条件,一般为关系表达式或逻辑表达式。 表达式3(循环控制变量的更新 ):用来修改循环变量的值,一般是赋值语句。,当循环体由多个语句组成时,也必须用 ,for语句的执行过程:,注意:在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。,例: 编程序求:s=1+2+3+100,void main() int n,s=0; for(n=1;n=100;n+) s=s+n; printf(s=%dn,s); getch(); ,void main() int s=0,n=1; while (n=100) s=s+n; n+; printf(“s=%d,s); ,例:打印20个1020的随机数在屏幕上。,for(表达式1;表达式2;表达式3) 语句;,表达式1; while(表达式2) 语句; 表达式3; ,有关for语句的几点说明:,for语句中的“表达式1”、“表达式2”和“表达式3”都可以省略,但两个分号不能省略。 若 “表达式2”省略了,则判定循环控制条件为真(非0) “表达式1”和 “表达式3”,可以是一个简单的表达式,也可以是逗号表达式。 注意:三个表达式都可以是任何表达式。,4.3.4 循环的嵌套多重循环结构,一个循环内完整地包含另一个循环结构,则称为多重循环 嵌套一层称为二重循环,嵌套二层称为三重循环 例子: 打印九九乘法表 打印由数字组成的如下所示金字塔图案,4.3.5 三种循环语句比较,4.4 其它控制语句,4.4.1 break语句 作用范围:switch 语句或循环语句 功能:跳出switch语句或跳出本层循环, 转去执行后面的程序。 break语句的一般形式为: break; 注意:break语句用于循环体中,一般与if语句联合使用,例:车牌抽取程序,要求,用户可以有5次机会选择。 若选到中意的号码,可以使用键盘中的Y键来确定 若已确定选中号码,则无需再继续选择了。 若5次都没有选中,进行提示,表示选中失败。,4.4.2 continue语句,作用范围:只能用在循环体中 功能:结束本次循环,转入下一次循环条件的判断与执行。 其一般格式是: continue; 注意:本语句只结束本层本次的循环,并不跳出循环。,例,计算半径为1到15的圆的面积,仅打印出超过50的圆面积。,void main() int r; float area; for(r=1;r=15;r+) area=3.141593*r*r; if(area50.0) continue; printf( square=%fn,area); ,break与continue的区别,continue:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。,break:语句只能用在switch 语句或循环语句中, 其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。,4.4.3 goto语句(无条件转移语句),一般格式: goto 语句标号; 如: label: i+; goto label1; 注意:语言不限制程序中使用标号的次数,但不得重名。 注意:在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。,4.5 应用程序举例 4.5.1 素数与哥德巴赫猜想,例:判断一个给定的整数是否为素数 基本思想: 把m作为被除数,将2Int(Sqrt(m)作为除数,如果都除不尽,m就是素数,否则就不是。可用以下程序段实现,k=sqrt(m); for(i=2;i=k) printf(Yesn); else printf(Non);,例:编一程序验证哥德巴赫猜想,for(n1=3;n1k) printf(%d=%d+%dn,n,n1,n2); ,发现n1不是素数后无需判断n2了,执行continue;后,当前次循环的后半部分无需执行,4.5.2 穷举法,基本思想:一一列举各种可能的情况,并判断哪一种可能是符合要求 例:将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合? 分析:5元的最少1张,最多100张 1元的最少1张,最多100张 0.5元的最少1张,最多100张列出所有的情况,把真正符合要求的情况打印出来。,void main() int x, y, z, n; printf( 5yuan 1yuan 0.5yuann); n=0; for(x=1; x=100;x+) for(y=1;y=100;y+) for(z=1;z=100;z+) if(x+y+z=100 ,4.5.3 迭代法,递推法:有一只猴子,捡到了一框桃子。它每天吃现存桃子的一半再多一个。到了第7天,它只有一个桃子了,问它第一天捡到了几个桃子? 解:注意后一天和前一天的桃子数的关系。 x=(x+1)*2;,例,用迭代法求平方根,已知迭代公式为: 编程分析: 可假定一个初值x0=a/2(估计值), 根据迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x; 再以新值作为初值,即:x1x0,重新按原来的方法求x1, 重复这一过程直到|x1-x0|(某一给定的精度)。此时可将x1作为问题的解。,x0 = a / 2; /* 取迭代初值 */ x1 = 0.5 * (x0 + a / x0); while (fabs(x1 - x0) 0.00001) x0 = x1; /* 为下一次迭代作准备 */ x1 = 0.5 * (x0 + a / x0); printf(%f s sqrt is:%fn, a, x1);,迭代法求平方根部分代码,
展开阅读全文