《《C语言程序设计》第4章控制结构.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》第4章控制结构.ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章控制结构控制结构本章要求:本章要求:掌握选择控制语句掌握选择控制语句if语句、语句、switch语句以及他们的嵌套应用语句以及他们的嵌套应用;掌握循环控制语句掌握循环控制语句for语句、语句、while语句、语句、dowhile语句以及他们的嵌套语句以及他们的嵌套应用应用;掌握掌握break语句、语句、continue语句的应用语句的应用;能够运用能够运用3种结构进行综合程序设计。种结构进行综合程序设计。4.1关系运算与逻辑运算关系运算与逻辑运算例子:例子:三个数中找最大三个数中找最大判断是否是闰年判断是否是闰年判断密码的正确判断密码的正确与否与否关键点:关键点:判断的条件如何判断的
2、条件如何确立?确立?条件条件语句语句1语句语句2YN(a)选择结构选择结构4.1.1关系运算符与关系表达式关系运算符与关系表达式比较两个量的运算符称为关系运算符:比较两个量的运算符称为关系运算符:,=,=,!=关系运算符的优先级:关系运算符的优先级:“、=、关系运算符关系运算符赋值运算符赋值运算符一般形式为:一般形式为:表达式表达式关系运算符关系运算符表达式表达式其其值值:关系成立为关系成立为“真真”,不成立则为,不成立则为“假假”C语言中用语言中用“1”表示表示“真真”;“0”表示表示“假假”如如56x=3xx+1a=5由于表达式中也可以包含关系表达式。由于表达式中也可以包含关系表达式。因此
3、因此出现出现嵌套嵌套的情况,例如:的情况,例如:当当a=5,b=4,c=3时时ac)a!=(c=b)(a=3)(b=5)又如:当又如:当a=5,b=4时时a+=3b&cdl!b=c|dc&x+yb)&(cd)(!b)=c)|(dc)&(x+y)b)逻辑表达式的值:逻辑表达式的值也为逻辑表达式的值:逻辑表达式的值也为“真真”和和“假假”两种,用两种,用“1”和和“0”来表来表示。示。0和和非非0的区别的区别例:表示数学表达式:例:表示数学表达式:3x7正确的表达式:正确的表达式:3=x&x=7错误的表达式:错误的表达式:3=x=73=x|x=7 a小数小数b大数大数xb时用时用|a小数小数b大数
4、大数axb时用时用&例:用人单位招聘秘书,条件如下:例:用人单位招聘秘书,条件如下:年龄(年龄(age)小于)小于40岁岁女性(女性(sex为为m为男性,为男性,sex为为f为女性)为女性)学历(学历(edu)专科(为)专科(为2)或本科(为)或本科(为3)正确:正确:age40&sex=f&(edu=2|edu=3)考虑:若分别写成:考虑:若分别写成:age40&sex=f&(edu=2&edu=3)age40|sex=f|(edu=2|edu=3)3、关于逻辑运算的说明、关于逻辑运算的说明表达式表达式a&b&c的求解过程的求解过程只有只有a为真时,才判为真时,才判别别b的值;只有的值;只有
5、a和和b均为真时,才判别均为真时,才判别c的值。的值。只要只要a为假,就不再为假,就不再判别判别b和和c的值,直接的值,直接求得表达式的值为假。求得表达式的值为假。表达式表达式a|b|c的的求解过程求解过程只要只要a为真,就不再为真,就不再判别判别b和和c的值,直的值,直接求得表达式的值接求得表达式的值为真。为真。只有只有a为假时,才判为假时,才判别别b的值;只有的值;只有a和和b均为假时,才判均为假时,才判别别c的值。的值。4.2选择结构选择结构4.2.1if条件语句条件语句if语句有单分支、双分支和多分支等结构语句有单分支、双分支和多分支等结构1 1单分支单分支ifif语句。语句。使用格式
6、:使用格式:if(表达式表达式)语句语句;执行过程:执行过程:若表达式的值为真若表达式的值为真(非(非0)则执行其后的语句,)则执行其后的语句,(0)否则不执行该语句。)否则不执行该语句。判断判断0或或非非0可以是:可以是:关系表达式关系表达式逻辑表达式逻辑表达式数学表达式数学表达式等等等等只能是一个语句,只能是一个语句,若要执行多个语若要执行多个语句,可以使用句,可以使用例:输入任意两个整数例:输入任意两个整数x,y,比较后,确,比较后,确保保x要大于等于要大于等于y,再输出。,再输出。voidmain()intx,y,t;printf(Enterxandy:n);scanf(%d%d,&x
7、,&y);if(xy)t=x;x=y;y=t;printf(x=%d,y=%dn,x,y);2 23 31 1tyx2 2双分支结构双分支结构ifelse.ifelse.语句语句 使用格式:使用格式:if(表达式表达式);else;语句的执行过程语句的执行过程:当表达式的值为非当表达式的值为非0(条件成立)时执行(条件成立)时执行,否则执行否则执行else后面后面。例:输入三个数,然后输出其中最大的数。例:输入三个数,然后输出其中最大的数。voidmain()inta,b,c,max;scanf(“%d%d%d”,&a,&b,&c);if(ab)max=a;elsemax=b;if(cmax)
8、max=c;printf(“Max=%dn,max);3 3ifelse ififelse if语句(多分支结构)语句(多分支结构)语句形式:语句形式:if(表达式表达式1)语句语句1;elseif(表达式表达式2)语句语句2;.elseif(表达式表达式n)语句语句n;else语句块语句块n+1;例:简单计算器例:简单计算器例:已知百分制成绩例:已知百分制成绩x,显示对应的五级制成,显示对应的五级制成绩,下列哪些正确。绩,下列哪些正确。if(x=90)printf(A);elseif(x=80)printf(B);elseif(x=70)printf(C);elseif(x=60)print
9、f(D);elseprintf(E);if(x=60)printf(D);elseif(x=70)printf(C);elseif(x=80)printf(B);elseif(x=90)printf(A);elseprintf(E);if(x60)printf(E);elseif(x70)printf(D);elseif(x80)printf(C);elseif(x90)printf(B);elseprintf(A);4.使用使用if语句中应注意以下问题语句中应注意以下问题if(a=5)语句;语句;if(b)语句;语句;都是允许的。都是允许的。if(xb)max=a;要有分号要有分号赋值表达式
10、的值为赋值表达式的值为5(非(非0),所以执行语句),所以执行语句 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(表达式表
11、达式2)if(表达式表达式2)语句语句1;语句语句1;elseelse语句语句2;语句语句2;语言规定语言规定:else:else 总是与它前面最近的总是与它前面最近的ifif配对配对 4.2.2条件运算符和条件表达式条件运算符和条件表达式条件运算符为条件运算符为?:它是一个三目运算符。它是一个三目运算符。条件表达式的一般形式为:条件表达式的一般形式为:表达式表达式1?表达式表达式2:表达式表达式3其求值规则为:如果表达式其求值规则为:如果表达式1的值为真,则的值为真,则以表达式以表达式2的值作为条件表达式的值,否则的值作为条件表达式的值,否则以表达式以表达式3的值作为整个条件表达式的值。的值
12、作为整个条件表达式的值。条件表达式通常用于赋值语句之中。例如条件表达式通常用于赋值语句之中。例如:if(ab)max=a;elsemax=b;max=(ab)?a:b;条件运算符的说明:条件运算符的说明:运算优先级:低于关系运算符和算术运算运算优先级:低于关系运算符和算术运算符,高于赋值符。如:符,高于赋值符。如:max=ab?a:b条件运算符条件运算符?:是一对运算符,不能分开是一对运算符,不能分开单独使用。单独使用。结合方向:自右至左。结合方向:自右至左。例如:例如:ab?a:cd?c:dcd?c:d表达式表达式1表达式表达式2表达式表达式3,又是一个,又是一个条件表达式条件表达式例:若输
13、入的大写字母转换成相应的小写字例:若输入的大写字母转换成相应的小写字母,否则原样输出。母,否则原样输出。voidmain()charch;scanf(%c,&ch);ch=(ch=A&ch=A&chb)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结构,也可完结
14、构,也可完整包含另一个整包含另一个swicth结构。结构。提示:为了便于阅读和维护,建议在写含有提示:为了便于阅读和维护,建议在写含有多层嵌套的程序时,使用缩进对齐方式。多层嵌套的程序时,使用缩进对齐方式。4.2.5选择结构程序举例选择结构程序举例例:小学数学题,要求:例:小学数学题,要求:随机产生两道数学题(参加运算的数在随机产生两道数学题(参加运算的数在110之间),一道加法,一道减法。之间),一道加法,一道减法。产生一道题后,让用户输入答案;判断答产生一道题后,让用户输入答案;判断答案的正确性,并给出提示。案的正确性,并给出提示。记录用户答对的题数,并对最终的成绩作记录用户答对的题数,并
15、对最终的成绩作出评价。出评价。可以使用可以使用if语句,或语句,或switch语句。语句。4.3循环结构循环结构循环结构的特点:循环结构的特点:在给定条件成立时,反复执行某程序段,在给定条件成立时,反复执行某程序段,直到条件不成立为止直到条件不成立为止。注意两个概念:注意两个概念:给定的条件称为循环条件给定的条件称为循环条件反复执行的程序段称为循环体反复执行的程序段称为循环体在在C语言中,实现循环结构的语句主要有语言中,实现循环结构的语句主要有3种:种:whiledoWhilefor语句语句4.3.1while语句语句while语句的一般形式为:语句的一般形式为:while(表达式表达式)语句
16、;语句;表达式是循环条件,表达式是循环条件,语句为循环体语句为循环体执行过程:执行过程:计算表达式的值,计算表达式的值,当值为真当值为真(非非0)时,时,执行循环体语句。执行循环体语句。否则,退出否则,退出求表达式值求表达式值表达式表达式语句语句例:在屏幕上打印例:在屏幕上打印110说明:说明:计算计算的值,若表达式的值为真的值,若表达式的值为真(非非0)时,则执行循环体语句;不断反复,时,则执行循环体语句;不断反复,直到表达式的值为假直到表达式的值为假(0),则不执行循环,则不执行循环体语句,而直接转向循环体外的第一条语体语句,而直接转向循环体外的第一条语句。句。是循环反复执行的程序,称为是
17、循环反复执行的程序,称为“循循环体环体”,当需要执行多条语句时,应使用,当需要执行多条语句时,应使用“”括起来组成一个复合语句。括起来组成一个复合语句。while语句语句是先判断条件,后执行循环体,是先判断条件,后执行循环体,为为“当型当型”循环,因此若条件不成立,有循环,因此若条件不成立,有可能一次也不执行循环体。可能一次也不执行循环体。例:例:编程序求:编程序求:s=1+2+3+100main()ints=0,n=1;while(n=100)s=s+n;n+;printf(S=%d,s);4.3.2do.while语句语句一般形式为:一般形式为:do语句;语句;while(表达式表达式);
18、执行过程:执行过程:先执行循环体语句一次,先执行循环体语句一次,再判别表达式的值,再判别表达式的值,若为真若为真(非非0)则继续循环,则继续循环,否则终止循环。否则终止循环。求表达式值求表达式值表达式表达式语句语句例:例:编程序求:编程序求:s=1+2+3+100voidmain()ints=0,n=1;dos=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;w
19、hile(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语句可以相互替换。语句可
20、以相互替换。4.3.3for循环语句循环语句一般形式为:一般形式为:for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句;语句;l表表达达式式1(控控制制变变量量的的初初始始化化):用用来来给给循循环环变变量量赋赋初初值值,也也允允许许在在for语语句句外外给给循循环环变变量赋初值,此时可以省略该表达式。量赋初值,此时可以省略该表达式。l表表达达式式2(循循环环的的条条件件):循循环环条条件件,一一般般为关系表达式或逻辑表达式。为关系表达式或逻辑表达式。l表达式表达式3(循环控制变量的更新(循环控制变量的更新):):用来用来修改循环变量的值,一般是赋值语句。修改循环变量的值,一般是
21、赋值语句。当循环体由多个当循环体由多个语句组成时,也语句组成时,也必须用必须用for语句的执行过程:语句的执行过程:注意:注意:在整个在整个for循环过程中,循环过程中,表达式表达式1只计算只计算一次,表达式一次,表达式2和表达式和表达式3则可则可能计算多次。能计算多次。求解表达式求解表达式2求解表达式求解表达式1求解表达式求解表达式3语句语句0非非0例:例:编程序求:编程序求:s=1+2+3+100voidmain()intn,s=0;for(n=1;n=100;n+)s=s+n;printf(s=%dn,s);getch();voidmain()ints=0,n=1;while(n=100
22、)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”,可以是,可
23、以是一个一个简单的表达式,也可以是逗号表达式。简单的表达式,也可以是逗号表达式。注意:三个表达式都可以是任何表达式。注意:三个表达式都可以是任何表达式。4.3.4循环的嵌套循环的嵌套多重循环结构多重循环结构一个循环内完整地包含另一个循环结构,一个循环内完整地包含另一个循环结构,则称为多重循环则称为多重循环嵌套一层称为二重循环,嵌套二层称为三嵌套一层称为二重循环,嵌套二层称为三重循环重循环例子:例子:打印九九乘法表打印九九乘法表打印由数字组成的如下所示金字塔图案打印由数字组成的如下所示金字塔图案4.3.5三种循环语句比较三种循环语句比较 4.4其它控制语句其它控制语句4.4.1break语句语句
24、 作用范围:作用范围:switch语句或循环语句语句或循环语句功能:跳出功能:跳出switch语句或跳出本层循环,语句或跳出本层循环,转去执行后面的程序。转去执行后面的程序。break语句的一般形式为:语句的一般形式为:break;注意:注意:break语句用于循环体中,一般与语句用于循环体中,一般与if语语句联合使用句联合使用例:车牌抽取程序,要求例:车牌抽取程序,要求用户可以有用户可以有5次机会次机会选择。选择。若选到中意的号码,若选到中意的号码,可以使用键盘中的可以使用键盘中的Y键来确定键来确定若已确定选中号码,若已确定选中号码,则无需再继续选择了。则无需再继续选择了。若若5次都没有选中
25、,次都没有选中,进行提示,表示选中进行提示,表示选中失败。失败。4.4.2continue语句语句l作用范围:只能用在循环体中作用范围:只能用在循环体中l功能:结束本次循环,转入下一次循环条件功能:结束本次循环,转入下一次循环条件的判断与执行。的判断与执行。l其一般格式是:其一般格式是:continue;l注意:注意:本语句只结束本层本次的循环,并不本语句只结束本层本次的循环,并不跳出循环。跳出循环。例,计算半径为例,计算半径为1到到15的圆的面积,仅打印出的圆的面积,仅打印出超过超过50的圆面积。的圆面积。voidmain()intr;floatarea;for(r=1;r=15;r+)ar
26、ea=3.141593*r*r;if(area50.0)continue;printf(square=%fn,area);break与与continue的区别的区别continue:结结束束本本次次循循环环,即即不不再再执执行行循循环环体体中中continue 语语句句之之后后的的语语句句,转转入入下下一一次次循循环环条条件件的的判判断断与与执执行行。应应注注意意的的是是,本本语语句句只只结束结束本层本次本层本次的循环,并不跳出循环。的循环,并不跳出循环。break:语语句句只只能能用用在在switch 语语句句或或循循环环语语句句中中,其其作作用用是是跳跳出出switch语语句句或或跳跳出出
27、本本层层循循环环,转去执行后面的程序。转去执行后面的程序。4.4.3goto语句(无条件转移语句)语句(无条件转移语句)一般格式:一般格式:goto语句标号;语句标号;如:如:label:i+;gotolabel1;l注意:语言不限制程序中使用标号的次数,注意:语言不限制程序中使用标号的次数,但不得重名。但不得重名。l注注意意:在在结结构构化化程程序序设设计计中中一一般般不不主主张张使使用用goto语语句句,以以免免造造成成程程序序流流程程的的混混乱乱,使使理理解和调试程序都产生困难。解和调试程序都产生困难。4.5应用程序举例应用程序举例4.5.1素数与哥德巴赫猜想素数与哥德巴赫猜想例:判断一
28、个给定的整例:判断一个给定的整数是否为素数数是否为素数基本思想:基本思想:把把m作作为为被被除除数数,将将2Int(Sqrt(m)作作为为除除数数,如如果果都都除除不不尽尽,m就就是是素素数数,否否则则就就不不是是。可用以下程序段实现可用以下程序段实现k=sqrt(m);for(i=2;i=k)printf(Yesn);elseprintf(Non);例:编一程序验证哥德巴赫猜想例:编一程序验证哥德巴赫猜想for(n1=3;n1=n/2;n1+)k=sqrt(n1);for(j=2;j=k;j+)if(n1%j=0)break;if(j=k)continue;n2=n-n1;k=sqrt(n2
29、);for(j=2;jk)printf(%d=%d+%dn,n,n1,n2);发现发现n1不是素数后不是素数后无需判断无需判断n2了,执了,执行行continue;后,后,当前次循环的后半当前次循环的后半部分无需执行部分无需执行4.5.2穷举法穷举法基本思想:一一列举各种可能的情况,并判基本思想:一一列举各种可能的情况,并判断哪一种可能是符合要求断哪一种可能是符合要求例:将一张面值为例:将一张面值为100元的人民币等值换成元的人民币等值换成100张张5元、元、1元和元和0.5元的零钞,要求每种元的零钞,要求每种零钞不少于零钞不少于1张,问有哪几种组合?张,问有哪几种组合?分析:分析:5 5元的
30、最少元的最少1 1张,最多张,最多100100张张 1 1元的最少元的最少1 1张,最多张,最多100100张张 0.5 0.5元的最少元的最少1 1张,最多张,最多100100张张列出所有的情况,把真正符合要求的情况列出所有的情况,把真正符合要求的情况打印出来。打印出来。voidmain()intx,y,z,n;printf(5yuan1yuan0.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&5*x+y+0.5*z=100)printf(%d%d%dn,x,y,z);n+;printf
31、(Total%d,n);4.5.3迭代法迭代法递推法:有一只猴子,捡到了一框桃子。它每递推法:有一只猴子,捡到了一框桃子。它每天吃现存桃子的一半再多一个。到了第天吃现存桃子的一半再多一个。到了第7天,天,它只有一个桃子了,问它第一天捡到了几个桃它只有一个桃子了,问它第一天捡到了几个桃子?子?解:注意后一天和解:注意后一天和前一天的桃子数的前一天的桃子数的关系。关系。x=(x+1)*2;例,用迭代法求平方根例,用迭代法求平方根已知迭代公式为:已知迭代公式为:编程分析:编程分析:可假定一个初值可假定一个初值x0=a/2(x0=a/2(估计值估计值),根据迭代公式得到一个新的值根据迭代公式得到一个新的值x1x1,这个,这个新值新值x1x1比初值比初值x0 x0更接近要求的值更接近要求的值x x;再以新值作为初值,即:再以新值作为初值,即:x1x0 x1x0,重新按原,重新按原来的方法求来的方法求x1x1,重复这一过程直到重复这一过程直到|x1-x0|x1-x0|0.00001)x0=x1;/*为下一次迭代作准备为下一次迭代作准备*/x1=0.5*(x0+a/x0);printf(%fssqrtis:%fn,a,x1);迭代法求平方根迭代法求平方根部分代码部分代码
限制150内