《【教学课件】第4章控制结构.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章控制结构.ppt(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章第四章 控制结构控制结构 C语句语句:表达式语句表达式语句:表达式;空语句表达式;空语句:;块语句块语句(复合语句复合语句):使用一对花括号括起来的语句序列使用一对花括号括起来的语句序列 选择语句选择语句:if、if else、switch 循环语句循环语句:while、do while、for 转移语句转移语句:goto、break、continue 控制结构控制结构:顺序结构顺序结构选择结构选择结构循环结构循环结构顺序结构顺序结构的语句是自上而下顺序执行的。表达式语句:任何一个表达式的末尾加上一个分号(;),便 组成一条表达式语句。用来计算表达式的值 和确定表达式功能的。例如,已知,
2、int a=3,b=5,x=6,y=8;a+;y=a|b&x;x=a3;a=6,b=5,a+b;ab?a+b:a-b;!x&y|b;空语句:只有分号的一种语句。它是一种不做任何操作的 特殊语句。复合语句:由一对花括号()括起来的一组语句。在语法上相当于一条语句。在可以出现一条 语句的地方都可以出现复合语句。语句分为:说明语句 用来定义或说明变量和函数的。执行语句 用来对定义或说明的变量或函数进行操作的。选择结构选择结构的特点是根据给定的条件决定执行哪个分支中的语句。这种结构有三种形式:语句语句表达式表达式假假真真单分支选择结构真真语句语句1表达式表达式语句语句2假假双分支选择结构语句语句1语句
3、语句2语句语句n语句语句n+1=值值1=值值2=值值n=其它其它表达式表达式多分支选择结构if 语句格式:if(表达式)语句#include#include void main()int magic;/*magic number*/int guess;/*users guess*/magic=rand();/*generate the magic number*/printf(“guess the magic number:”);scanf(“%d”,&guess);if(guessmagic)printf(“It is grater!n”);注意:语句可以是C+的任何语句,当然也可以是if语
4、句,这时称为if语句的嵌套。输入一个整数,若是大于5且小于10的,则输出“5AND10”。#includevoid main()int x;scanf(“%d”,&x);if(x5)if(x10)printf(“5AND5&x10)printf(“5AND10n”);if else 语句格式:if(表达式)语句1else 语句2 例如,从键盘上输入两个浮点数,比较大小并输出。#includevoid main()double x,y;printf(“input x,y:n”);scanf(“%lf%lf”,&x,&y);if(x!=y)if(xy)printf(“xyn”);else prin
5、tf(“xyn”);else printf(“x=yn”);注意:一个if最多只能有一个else与之配对,所以在嵌套中else只能与最近的一个没有与else配对的if配对。思考:还可以用其他形式来实现吗?编程上机试一试。分析下列程序的输出结果,指出该程序中的else是与哪个if配对的。#includevoid main()int i=7,j=5;if(i!=j)if(i=j)i+=8;printf(“%dn”,i);else j-=2;printf(“%dn”,j);printf(“%dn”,i+j);i+=8;printf(“%dn”,i);j-=2;printf(“%dn”,j);i!=j
6、 i=j真真真真假假假假 switch语句 格式:switch(表达式)case:case:case:default:注意:1、“表达式”的类型和“常量表达式1n”的类型必须一致,且只能是 字符型、整型或枚举类型。2、各case子句起标号作用,要求case后面的 常量表达式的值各不相同。3、各语句序列中通常最后一句为break,以退出switch语句。但根据需要 可以没有break,语句序列也可为空。4、switch语句可以嵌套。5、使用switch的地方也可使用if语句,反之,在使用if的地方使用switch,要看是否满足switch语句中各表达式的条件。已知:int a=2,b=1;下列s
7、witch语句中,()是正确的。A.switch(a)B.C.case a:a+;break;D.case b:b+;break;E.B.switch(a+b)C.D.case 3:a+;E.case 4:b+;F.C.switch(a*b)D.E.case 1,2:a+b;F.case 3,4:a-b;G.D.switch(a/10+b)E.F.case a+b:+a;break;G.case a-b:-b;H.循环语句循环语句的特点是根据给定的条件判断是否执行循环体。三种循环语句的格式:(1)while(表达式)(2)do (3)for(表达式1;表达式2;表达式3)语句 语句 语句 wh
8、ile(表达式);表达式表达式语句语句非非00退出循环退出循环非非0表达式表达式语句语句0退出循环退出循环非非0计算表达式计算表达式1计算表达式计算表达式2语句语句计算表达式计算表达式30退出循环退出循环注意:1、循环体执行的次数。2、避免死循环。3、各循环允许嵌套。表达式1;while(表达式2)语句 表达式3;编程求出1到100之和。(1)#includevoid main()int i=1,sum=0;while(i=100)sum+=i;i+;printf(“sum=%dn”,sum);输出结果:sum=5050思考:如果将循环体写成如下形式:sum+=i+;是否可行?(2)#incl
9、udevoid main()int i=1,sum=0;do sum+=i+;while(i=100);printf(“sum=%dn”,sum);i=100sum+=i;i+;真真假假(3)#includevoid main()int sum=0;for(int i=1;i=100;i+)sum+=i;printf(“sum=%dn”,sum);int i=1,sum=0;for(;i=100;i+)sum+=i;int i=1,sum=0;for(;i=100;)sum+=i+;for(int i=1,sum=0;i=100;sum+=i+);int i=1,sum=0;for(;)sum
10、+=i;if(i=100)break;i+;多重循环 多重循环是指在某个循环语句的循环体内还有循环语句,这又称为循环的嵌套。三种循环可以自身嵌套,也允许相互嵌套。嵌套时要注意在一个循环体内包含另一个完整的循环结构。例如,九九乘法表:#include void main()int i,j;for(i=1;i=9;i+)for(j=1;j=9;j+)/矩形乘法表 printf(“%d*%d=%dt”,i,j,i*j);printf(“n”);for(j=1;j=i;j+)/左下三角形 for(j=i;j=9;j+)/左上三角形 for(j=1;ji;j+)printf(t);for(;ji;j-)
11、printf(“t”);for(j=1;j=i;j+)/右下三角形 printf(“%d*%d=%dt”,i,j,i*j);printf(“n”);转移语句 goto 无条件转移语句 break 退出语句 continue 结束本次循环语句 goto语句格式:goto 语句标号;语句标号可以放在语句的最左边,或者独占一行,均要用冒号分隔。goto语句只能在一个函数体内转移,在一个函数体内,语句标号是唯一的。例如,求自然数1到100之和,也可以用goto语句实现。#includevoid main()int i=1,sum=0;loop:sum+=i+;if(i=100)goto loop;pr
12、intf(“sum=%dn”,sum);sum+=i+;i=100真真假假转移语句 break 退出语句 格式:break;功能:功能:用在switch的语句序列中,其功能是退出该switch语句。用在循环语句的循环体中,其功能是退出该重循环。continue 结束本次循环语句格式:continue;功能:功能:用在循环语句的循环体中,用来结束本次循环,接着再判断条件决定是否执行下一次循环。它同break语句一样,常常与if语句结合使用。分析下列程序的功能:#includevoid main()int num,sum=0,i;printf(“Input number:”);for(i=0;i1
13、0;i+)scanf(“%d”,&num);if(num0)break;sum+=num;printf(“sum=%dn”,sum);continue;分析下列程序的输出结果:#includevoid main()int a=7;do switch(a%2)case 1:a-;break;case 0:a-;continue;printf(“%dn”,a);while(a0);6420有关程序设计的问题程序设计的目的是要用正确的方法解决实际问题。学习程序设计的主要任务是学习如何组织程序,表达实际问题的已有解决方法(利用现有的数学方法和结论),而不是去寻找实际问题的解决方法。一个复杂性不大的小问
14、题,可将其看作是一个过程,该过程具有输入、处理和输出。n对于问题的求解,输入对应问题给出的条件,处理对应求解问题的算法,输出对应问题的解。n对于程序的描述,输入对应数据定义和初始化,处理对应结构语句的一个序列,输出对应打印输出语句。程序设计更多的是体现其艺术性,在保证程序正确的前提下,可读性是我们追求的重要目标。程序设计方法有3个层次:(1)简单的问题求解分析方法(过程化方法)。适用于简单、孤立的问题求解。(2)结构化程序设计方法。适用于问题大小适中,能够方便地分解成相对独立的几个功能模块。(3)面向对象程序设计方法。它将问题看作包含若干 个小对象的大对象,层层分解对象,研究里面的 数据和行为
15、。目前我们处于用第1种方法的层次上。例题:求最大公约数、最小公倍数 例1、输入两个正整数m和n,求其最大公约数和最小公倍数。可以用两种方法求解:(1)用两数中较小的数作为因子去除该两数,若均能除尽,表明它就是最大 公约数。否则将它减1后再去除,直到除尽为止。最小公倍数可由两数的乘积除以最大公约数得到。#includevoid main()int m,n,x,y;scanf(“%d%d”,&m,&n);mn?x=n:x=m;while(m%x!=0|n%x!=0)x-=1;y=m*n/x;printf(“%dn%dn”,x,y);(2)用辗转相除法:对于两数m和n(设mn),用n去除m,若余数为
16、0,则n为 最大公约数,否则将n作为m,余数作为n,再用n去除m,直到n为0,m即为 最大公约数。例如:m(n)n(m%n)27 18 18 9 9 0#includevoid main()int m,n,x,y;scanf(“%d%d”,&m,&n);if(m1)是否是素数。一种方法是:若n不能被从2到n/2的数整除,则n是素数。而更快的一种方法是:若n不能被从2到根号n的数整除,则n一定是素数。#include#includevoid main()int n,i;scanf(“%d”,&n);for(i=2;isqrt(n)printf(“是素数n”);else printf(“不是素数n
17、”);思考:试求100以内的所有素数。例题:打印图形编程输出下列图案。编程输出下列图案。*分析:可把此图分为上下两部分:上4行,下3行(上3行,下4行)上部分的规律:共4行,第i行空出8-2i个字符位置,第i行输出j个*,j=2i-1。同理得出下部分的规律:共3行,第i行空出2i个位置,第i行输出j个*,j=7-2i。#include void main()int i,j,k;for(i=1;i=4;i+)for(k=1;k=8-2*i;k+)printf(“”);for(j=1;j=2*i-1;j+)printf(“*”);printf(“n”);for(i=1;i=3;i+)for(k=1
18、;k=2*i;k+)printf(“”);for(j=1;j=7-2*i;j+)printf(“*”);printf(“n”);例题:报数设有m个人(代号1m)围坐在圆桌旁,从第1个位置开始报数,数到n的人出列表演一个节目,表演完后,下一个人又从1开始报数,再数到n的人又出列表演一个节目,依次重复下去,直到最后一个人表演结束(表演后回到原座位,并参加报数,但每个人只能表演一个节目)。编程输出依次者的代号。(其中m和n互质)例如,m=8,n=5,输出依次为:5,2,7,4,1,6,3,8 1 8 7 3 6 4#include void main()int t=0,m,n,i;scanf(“%d
19、%d”,&m,&n);for(i=1;i=m;i+)t=(t+n)%m;if(t)printf(“%d,”,t);else printf(“%dn”,m);/输入/对报到m的人的处理/输出小结循环是一组语句,计算机反复执行这组语句直到满足终止条件为止。可以通过循环变量来控制循环。如果事先不知道循环次数,可以在循环体中通过条件判断中间跳转的方法终止循环。(continue,break)while,dowhile和for语句都是循环语句,它们可以相互转化。switch是多分支语句,是if语句的一个补充,但并不是必须的,当用它编程会带来良好的可读性时,采用之。现代程序设计反对用goto编程,因为它破坏程序过程中的结构,使之不可读,难维护。习题从键盘输入一个简单的算术表达式:两个整数,一个运算符(+、-、*、/),并输出对应的结果。求:求:A,B,使使 AB-BA=45 成立成立求求 A,B,C,使使 ABC+BCC=532 成立成立求100以内的所有素数。求出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153=13+53+33。求1000以内所有的“完数”。“完数”是一个正整数,其所有小于该数的因子之和等于该数。例如:6=1+2+3;又如:28=1+2+4+7+14。求一个整数的反转。例如输入一个整数123,输出另一个整数321。
限制150内