《C语言程序设计 第4章循环结构.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计 第4章循环结构.pptx(151页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章循环结构,C语言程序设计,循环结构是在一定条件下反复执行某段程序的流程结构。在C语言中,有三种类型的循环语句:while语句、dowhile语句和for语句。,4.1while语句,1.while语句(1)while语句的一般形式如下:while(表达式)循环语句;注意:while后的表达式通常为关系表达式或逻辑表达式,当表达式的值为0时,表示条件为假;非0时,表示条件为真。循环体若是复合语句,需用“”括起来。如果第一次计算时表达式的值就为0,则循环语句一次也不被执行,流程直接跳过while语句,执行下一条语句。,4.1while语句,在循环体中应有使循环趋向于结束的语句。(2)执行过程
2、:计算while后表达式的值,当值为非0时,执行循环体中的语句并重新计算表达式的值;当值为0时,退出while循环。(如图4-1-1所示),4.1while语句,注意:进入while循环后,一定要有能使此表达式的值变为0的操作,或者有能在某种情况下强行终止循环的语句(如break语句);否则,循环将会无休止地进行下去,即进入死循环。在程序设计中,是不允许死循环出现的。while语句的表达式可以是任何类型,只要表达式的值为真就可继续循环。例如:intx=0,n=2;while(n-)printf(%dn,x+*2);上述语段将执行2次循环,每执行一次,n值减1,循环体输出表达式x+*2的值。,4
3、.1while语句,应该注意条件的选择以避免死循环。例如:inta=5,n=0;while(a=5)printf(%dn,n+);上例中,while语句的循环条件为赋值表达式a=5,因此该表达式的值永远为真,而循环体中又没有其他的终止循环的语句而形成死循环。如果while(表达式)后加了分号“;”,则循环体为空。,4.1while语句,2.while语句实例【例4.1.1】用while语句计算1+2+3+100。算法:步骤一:先赋变量sum初始值为0,i初始值为1。步骤二:当i小于等于100时,重复执行步骤三和四,否则执行步骤五。步骤三:sum+i后赋给sum。步骤四:i+1后赋给i,转回步骤
4、二继续执行。步骤五:输出sum的值。流程图如图4-1-2所示。,4.1while语句,4.1while语句,程序运行结果:sum=5050,4.1while语句,【分析】变量sum的初始值为0,i的初始值为1,计算while后表达式的值1=100为真,执行循环体中的语句sum+=i相当于sum=sum+i,i+相当于i=i+1后,此时sum的值为1,i的值为2,并重新计算while(i=100)表达式的值,若为真继续执行循环体,为假则退出循环体,从而继续执行输出sum的值。在循环体中若没有改变循环变量的值,导致循环条件永远为真,程序会出现死循环。,4.1while语句,【例4.1.2】求s=1
5、+12+13+14+15+110。算法:步骤一:先赋变量s初始值为0,i初始值为1。步骤二:当i小于等于10时,重复执行步骤三和四,否则执行步骤五。步骤三:s+1/i后赋给s。步骤四:i+1后赋给i,转回步骤二继续执行。步骤五:输出s的值。流程图如图4-1-3所示。,4.1while语句,4.1while语句,程序运行结果:s=2.928968,4.1while语句,【分析】变量s的初始值为0,i的初始值为1,计算while后表达式的值i=10为真,执行循环体中的语句s=s+(float)1/i,i+相当于i=i+1后,此时s的值为1.0,i的值为2,并重新计算while(i=10)表达式的值
6、,若为真继续执行循环体,为假则退出循环体,从而继续执行输出s的值。在C语言中,构造s的表达式时,由于i为整型,则表达式1/i的值为整型,当i的值为2时,则表达式1/i的值为0,故采用(float)1/i,强制转换为float型后再进行计算,当i的值为2时,则表达式(float)1/i的值为0.5。将语句“s=s+(float)1/i;”改为“s=s+1.0/i;”也可。,4.1while语句,【例4.1.3】求s=1+3+5+7+9+,其和大于等于500的最大项。算法:步骤一:先赋变量s初始值为0,i初始值为1。步骤二:当s小于等于500时,重复执行步骤三和四,否则执行步骤五。步骤三:s+i后
7、赋给s。步骤四:i+2后赋给i,转回步骤二继续执行。步骤五:输出i-2的值。流程图如图4-1-4所示。,4.1while语句,4.1while语句,程序运行结果:i=45,4.1while语句,【分析】变量s的初始值为0,i的初始值为1,计算while后表达式的值0=500为真,执行循环体中的语句s=s+i,i=i+2,此时s的值为1,i的值为3,并重新计算while(s=500)表达式的值,若为真继续执行循环体,为假则退出循环体,从而继续执行输出i-2的值。本题是利用求和变量s作为循环条件,由于求和项i在退出循环体时多加了一次,故应输出i-2,而不是i的值。,4.2dowhile语句,1.d
8、owhile语句(1)dowhile的一般形式如下:do循环语句;while(表达式);注意:do是C语言的关键字,必须与while配对使用。while(表达式)后的分号“;”不可少,它是dowhile语句的结束标志。while后括号中的表达式可以是任意合法的表达式,由它来控制循环是否执行。,dowhile之间的循环体可以是一条可执行语句,也可以是由“”构成的复合语句。(2)执行过程:先执行循环体,然后判断表达式的值,若表达式的值为非0,再返回重新执行循环语句,如此重复;若表达式的值为0,则退出循环语句,执行下一条语句。(如图4-2-1所示),4.2dowhile语句,注意:dowhile语句
9、先执行循环语句,后判断表达式的值,因此,dowhile语句的循环语句至少被执行一次。dowhile语句可以组成多重循环,也可以和while语句相互嵌套。如果dowhile语句的循环体由多个语句组成时,必须加“”组成一个复合语句。dowhile和while语句可以相互替换,但要注意修改循环控制条件。要把dowhile的条件设为假。循环体中一定要有相应的语句改变表达式的值或有强行终止循环的语句(如break语句),否则将成为死循环。,4.2dowhile语句,4.2dowhile语句,2.dowhile语句实例【例4.2.1】用dowhile语句计算1+2+3+100。算法:步骤一:先赋变量sum
10、初始值为0,i初始值为1。步骤二:sum+i后赋给sum。步骤三:i+1后赋给i。步骤四:当i小于等于100时,重复执行步骤二和三。步骤五:输出sum的值。流程图如图4-2-2所示。,4.2dowhile语句,4.2dowhile语句,程序运行结果:sum=5050,【分析】变量sum的初始值为0,i的初始值为1,先执行循环体中的语句sum+=i相当于sum=sum+i,i+相当于i=i+1后,此时sum的值为1,i的值为2,计算while后表达式的值1=100为真,继续执行循环体,然后重新计算while(i=100)表达式的值,若为真继续执行循环体,为假则退出循环体,从而继续执行输出sum的
11、值。在循环体中若没有改变循环变量的值,导致循环条件永远为真,程序会出现死循环。,4.2dowhile语句,4.2dowhile语句,【例4.2.2】用dowhile语句计算算法:步骤一:先赋变量s初始值为0,i初始值为1。步骤二:s+1/i后赋给s。步骤三:i+2后赋给i。步骤四:当i小于等于20时,重复执行步骤二和三。步骤五:输出s的值。流程图如图4-2-3所示。,4.2dowhile语句,4.2dowhile语句,程序运行结果:s=2.133256,【分析】变量s的初始值为0,i的初始值为1,先执行循环体中的语句s=s+1.0/i,然后执行i=i+2后,此时s的值为1.0,i的值为3,计算
12、while后表达式的值3=20为真,继续执行循环体,然后重新计算while(i=20)表达式的值,若为真继续执行循环体,为假则退出循环体,从而继续执行输出s的值。语句s=s+1.0/i也可写成s=s+(float)1/i,但如果语句s=s+1.0/i写成s=s+1/i,则会导致运行结果出错。对于while(i=20)写成while(i20)或写成while(i=19)均可,不影响运行结果。,4.2dowhile语句,【例4.2.3】用dowhile语句计算100以内能被3整除且个位不为7的数的和。算法:步骤一:先赋变量s初始值为0,i初始值为1。步骤二:如果i%3=0且i%10!=7,则s+i
13、后赋给s。步骤三:i+1后赋给i。步骤四:当i小于等于100时,重复执行步骤二和三。步骤五:输出s的值。流程图如图4-2-4所示。,4.2dowhile语句,4.2dowhile语句,4.2dowhile语句,程序运行结果:s=1512,【分析】变量s的初始值为0,i的初始值为1,先执行循环体中的if语句,此时条件(i%3=0表达式2;表达式3)循环语句;但注意省略表达式1时,其后的分号不能省略。此时,应在for语句之前给循环变量赋初值。如果省略表达式2:for(表达式1;表达式3)循环语句;则表示表达式2的值始终为真,循环将无终止地进行下去。例如:,4.3for语句,for(i=1;i+)p
14、rintf(%d,i);将无限循环输出1,2,3,4,5,6,如果省略表达式3:for(表达式1;表达式2;)循环语句;此时,也将产生一个无穷循环。因此,程序设计者应另外设法保证循环能正常结束,可以将循环变量的修改部分(即表达式3)放在循环语句中控制。例如:,4.3for语句,for(i=1;i=100;)sum+=i;i+;上述for语句中没有表达式3,而是将表达式3(i+)放在循环语句中,作用相同,都能使循环正常结束。注意表达式2后面的分号不能省略。可以同时省略表达式1和表达式3:for(;表达式2;)循环语句;,4.3for语句,即省略了循环的初值和循环变量的修改部分,此时完全等价于wh
15、ile语句。同时省略表达式1、表达式2和表达式3,但两个分号不能缺省:for(;)循环语句;相当于赋循环变量的初值,循环控制条件始终为真,不修改循环变量,故循环将无终止地进行下去。在for语句中,表达式1和表达式3不仅可以使用简单表达式,也可以使用逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。在逗号表达式内按自左至右求解,整个表达式的值为其中最右边的表达式的值。例如:,4.3for语句,for(i=1;i=100;i+,sum=sum+i)相当于for(i=1;i=100;i+)sum=sum+i;在for语句中,表达式一般为关系表达式或逻辑表达式,但也可以是其他表达式(如字符表达式
16、、数值表达式)。for语句的循环语句可以是空语句。空语句用来实现延时,即在程序执行中等待一定的时间。例如:for(i=1;i=1000;i+);注意以上语句最后的分号不省略,则代表一个空语句。,4.3for语句,4.3for语句,2.for语句实例【例4.3.1】用for语句计算1+2+3+100。算法:步骤一:先赋变量sum初始值为0,i初始值为1。步骤二:当i小于等于100时,重复执行步骤三和四,否则执行步骤五。步骤三:sum+i后赋给sum。步骤四:i+1后赋给i,转回步骤二继续执行。步骤五:输出sum的值。流程图如图4-3-2所示。,4.3for语句,程序运行结果:sum=5050,4
17、.3for语句,【分析】变量sum的初始值为0,计算表达式1的值即i的值为1,计算表达式2的值即i=100,如果i=100为真,则执行for循环体,再计算表达式3的值即i+,然后再计算表达式2的值,依此类推;如果表达式2为假,则结束循环,执行for语句下面的一条语句,输出sum的值。,4.3for语句,【例4.3.2】输出500以内的所有水仙花数。水仙花数是一个三位数,其各位数立方和等于该数本身(例如:13+53+33=153)。算法:步骤一:i初始值为100。步骤二:当i小于等于500时,重复执行步骤三和四,否则执行步骤五。步骤三:分离数i各位上的数字,如果各位数字上的立方和等于该数本身i,
18、则输出数i。步骤四:i+1赋给i,转回步骤二继续执行。步骤五:程序结束。流程图如图4-3-3所示。,4.3for语句,4.3for语句,4.3for语句,程序运行结果:153370371407【分析】计算表达式1的值即i的值为100,计算表达式2的值即i=500,如果i=500为真,则执行for循环体,分离出个、十、百位上的数字g、s、b,执行if条件中的表达式,如果为真输出i,再计算表达式3的值即i自动加1,然后再计算表达式2的值,依此类推;如果表达式2为假,则结束循环,程序结束。,4.3for语句,【例4.3.3】用for语句计算s=1-3+5-7+-99+101。算法:步骤一:先赋求和变
19、量s初始值为0,标志变量f初始值为1,循环变量i初始值为1。步骤二:当i小于等于101时,重复执行步骤三、四和五,否则执行步骤六。步骤三:执行s+f*i赋给s。步骤四:f乘以-1赋给f。步骤五:i+2后赋给i,转回步骤二继续执行。步骤六:输出s的值。流程图如图4-3-4所示。,4.3for语句,4.3for语句,程序运行结果:s=51,4.3for语句,【分析】变量s的初始值为0,f的初始值为1,计算表达式1的值即i的值为1,计算表达式2的值即i=101,如果i=101为真,则执行for循环体,执行s+f*i赋给s和f乘以-1赋给f,再计算表达式3的值即i=i+2,然后再计算表达式2的值,依此
20、类推;如果表达式2为假,则结束循环,执行for语句下面的一条语句,输出s的值。,4.3for语句,4.4循环结构的嵌套,1.循环结构的嵌套在一个循环体内又完整地包含了另一个循环,称为循环嵌套。循环的嵌套可以是多层,但每一层循环在逻辑上必须是完整的。在书写上,循环的嵌套应采用缩进的形式,以使程序层次分明,可读性强。(1)循环嵌套的形式while与while二重嵌套while()while(),dowhile与dowhile二重嵌套dodowhile();while();,4.4循环结构的嵌套,for与for二重嵌套for(;)for(;)(2)循环嵌套的说明三种循环语句不仅各自可以嵌套,而且还可
21、以互相嵌套。例如:,4.4循环结构的嵌套,while与dowhile二重嵌套while()dowhile();,4.4循环结构的嵌套,while与for二重嵌套while()for(;),4.4循环结构的嵌套,dowhile与for二重嵌套dofor(;)while();,4.4循环结构的嵌套,使用嵌套时,应注意一个循环结构应完整地嵌套在另一个循环体内,不允许循环体间交叉。除了上述二重嵌套外,还可以有三重嵌套、四重嵌套等多层嵌套。嵌套的外循环和内循环的循环控制变量不得同名,但并列的内、外循环允许有同名的循环控制变量。例如:,4.4循环结构的嵌套,4.4循环结构的嵌套,2.循环结构嵌套的实例【例
22、4.4.1】求s=1!+3!+5!+7!。,4.4循环结构的嵌套,【例4.4.2】输出以下图案。,4.4循环结构的嵌套,4.4循环结构的嵌套,4.4循环结构的嵌套,【分析】外循环包括两个内循环,两个内循环为并列的关系,其中,外循环用来控制图案的行数,第一个内循环用来控制该行的空格个数,第二个内循环用来控制该行的*个数。,4.5break和continue语句,while、dowhile和for循环三种循环异同点:用while和dowhile循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在表达式1中进行;while循环和for循环都是先判断表达式,后执行循环体,而dowhile循
23、环是先执行循环体后判断表达式,也就是说dowhile的循环体至少被执行一次,而while循环和for循环的循环体可能一次都不执行。在循环体中都有改变循环变量的值的操作,从而最终终止循环。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环。,4.5break和continue语句,1.break和continue语句在循环体中的作用(1)break语句使用break语句可以使流程跳出switch语句体,在循环结构中,也可以使用break语句使流程跳出本层循环体,从而提前结束本层循环。break语句的一般形式如下:break;注意:break语句只能用于switch语句体
24、和循环体中,不能用于其他语句中。break语句在循环语句中只能用于循环体内,而不能用在循环语句上。如“for(i=1;i10;break,i+)”是不正确的。,4.5break和continue语句,break语句只能跳出一层循环,即从当前循环层中跳出,可能还在外层的循环体中。如果要跳出多层循环,可使用goto语句。当循环体中嵌套有switch语句时,如果break语句出现在switch语句体中,则只表示跳出switch语句体,而非跳出循环。(2)continue语句continue语句的一般形式如下:continue;其作用是结束本次循环,即跳过本次循环体中余下的尚未执行的语句,立刻进行下一
25、次的循环条件判定。,4.5break和continue语句,具体来说,对于while和dowhile语句,遇continue语句后,转向执行while之后圆括号内的条件表达式的判断;对于for语句,遇continue语句后,转向执行表达式3。注意:continue语句只能用于循环语句中,执行continue语句并没有使整个循环终止,只是结束本次循环,而break语句的作用则是跳出本层循环,终止当前层的循环。,4.5break和continue语句,2.break和continue语句实例【例4.5.1】输入数n,判断该数是否为素数。算法:步骤一:输入数n。步骤二:i初始值为2。步骤三:当i小于
26、n时,重复执行步骤四和五,否则执行步骤五。步骤四:执行表达式n%i=0,若为真则转步骤五,否则执行i+1赋给i,重复执行步骤三。步骤五:执行表达式in,若为真输出n是合数,否则输出n是素数。流程图如图4-5-1所示。,4.5break和continue语句,4.5break和continue语句,4.5break和continue语句,程序运行结果:请输入整数n:1010是合数【分析】先输入数n,计算表达式1的值即i的值为2,计算表达式2的值即i=n时则退出循环体。然后继续执行表达式in,若in为真则输出n是合数,否则输出n是素数。,4.5break和continue语句,【例4.5.2】输出
27、100200之间不能被3整除的数。算法:步骤一:i初始值为100。步骤二:当i=200时,重复执行步骤三和四,否则执行步骤五。步骤三:计算表达式i%3=0,若为真则转步骤四,否则输出数i。步骤四:执行i+1赋给i,重复执行步骤二。步骤五:运行程序结束。流程图如图4-5-2所示。,4.5break和continue语句,4.5break和continue语句,4.5break和continue语句,程序运行结果:100101103104106107109110112113115116118119121122124125127128130131133134136137139140142143145
28、146148149151152154155157158160161163164166167169170172173175176178179181182184185187188190191193194196197199200【分析】计算表达式1的值即i的值为100,计算表达式2的值即i200时则退出循环体,程序结束。,4.6循环结构程序实例,1.数位分离【例4.6.1】程序填空:将1001000之间个位、十位、百位均相同的三位数输出来。(例如:111、222),4.5break和continue语句,【参考答案】1i=1002i3i/100,4.6循环结构程序实例,1.数位分离【例4.6.1】程
29、序填空:将1001000之间个位、十位、百位均相同的三位数输出来。(例如:111、222),【参考答案】1i=1002i3i/100,4.6循环结构程序实例,4.6循环结构程序实例,1.数位分离【例4.6.1】程序填空:将1001000之间个位、十位、百位均相同的三位数输出来。(例如:111、222),【参考答案】1i=1002i3i/100,4.6循环结构程序实例,4.6循环结构程序实例,【例4.6.2】程序填空:从键盘输入一个十进制整数,将其转换为二进制后反序再转成新的十进制后输出。(例如:111011110113),【参考答案】1&n2n!=03n%24n/25x,4.6循环结构程序实例
30、,4.6循环结构程序实例,【例4.6.3】程序填空:求的值,其中a为一个数字,要求a以及所加数字个数由键盘输入。(例如:3+33+333+3333+33333),【参考答案】1a2ik5m,4.6循环结构程序实例,【例4.6.12】程序填空:求100到200间的所有素数,输出时每个数占5个字符宽度,10个一行。(要求在奇数中找素数。),4.6循环结构程序实例,【参考答案】1math.h2sqrt(m)3m%i=04m5n%10=0,4.6循环结构程序实例,4.6循环结构程序实例,5.素数最大公约数和最小公倍数辗转相除法求两整数a和b最大公约数算法如下:步骤一:a%b得余数c。步骤二:若c等于0
31、,则b即为两数的最大公约数,结束。步骤三:若c不等于0,则a=b,b=c,再转回执行步骤一。例如:a=25,b=15,a/b=110,15/10=15,10/5=20,最后一个为余数为0的除数是5,5就是所求最大公约数。最小公倍数:两数的积除以最大公约数。,【例4.6.13】程序填空:用辗转相除法求两数的最大公约数,两数由键盘输入。,4.6循环结构程序实例,【参考答案】1r2r!=03n4m%n5n,4.6循环结构程序实例,【例4.6.14】程序填空:用辗转相除法求两数的最大公约数和最小公倍数,两数由键盘输入。,4.6循环结构程序实例,【参考答案】1&m2m3m*n4r%m5m,4.6循环结构
32、程序实例,注意:m与n也可以不交换,只是要多循环一次。用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。若求三个数的最小公倍数,先求两个数的最小公倍数,然后再求出这个最小公倍数与第三个数的最小公倍数,即为这三个数的最小公倍数。,4.6循环结构程序实例,6.闰年【例4.6.15】程序填空:输出从公元2000年至3000年所有闰年的年号,每输出10个年号换一行。判断公元年是否为闰年的条件:(1)公元年数如能被4整除,而不能被100整除,则是闰年。(2
33、)公元年数能被400整除的也是闰年。,4.6循环结构程序实例,4.6循环结构程序实例,【参考答案】102i%4=03i%400=04i5n%10=0,4.6循环结构程序实例,【例4.6.16】程序填空:输入一个年月日,要求输出这一天是该年的第几天。(例如:2000年3月2日是该年的第62天。),4.6循环结构程序实例,4.6循环结构程序实例,【参考答案】1imonth2break3304year%4=0&year%100!=0|year%400=05days+day,4.6循环结构程序实例,4.6循环结构程序实例,7.统计判断【例4.6.17】程序填空:求由键盘输入的五个数中的最大值和最小值。
34、,【参考答案】1stdio.h2i=13j=10-i4j=2*i-15n,4.6循环结构程序实例,【例4.6.22】程序填空:编写程序打印如下图形。,4.6循环结构程序实例,4.6循环结构程序实例,【参考答案】1i=42j=4-i3k=2*i-14i=35k=7-2*i,4.6循环结构程序实例,【例4.6.23】程序填空:编写程序打印如下图形,图案的行数由输入的整数确定。,4.6循环结构程序实例,4.6循环结构程序实例,【参考答案】1&n2j=n-i3k=2*i-14%c5n,4.6循环结构程序实例,4.6循环结构程序实例,9.其他【例4.6.24】程序填空:将一张100元钞票换成等值的10元
35、,5元,2元和1元的小钞,每次换成40张小钞,要求每一种小钞都要有,编程求出所有可能的换法总数并输出各换法的组合。,4.6循环结构程序实例,【参考答案】1i+2i+j+k+m=403i*10+j*5+k*2+m*1=1004m5s+,4.6循环结构程序实例,本章主要介绍了循环结构中的while语句、dowhile语句和for语句;掌握循环结构语句的一般形式和执行过程,理解break和continue语句在循环体中的作用;能运用循环语句进行简单的循环结构程序设计,能初步分析程序运行结果。,本章小结,1.程序填空:要求计算1-2+3-4+5-100的值。,习题,2.程序填空:要求统计10个整数中的奇偶数的个数。,习题,3.程序填空:要求按下图所示格式输出99乘法表。,习题,4.程序填空:求前100个素数,要求输出时每个数占5个字符宽度,且10个一行。,习题,5.程序填空:要求输出如下所示图案的程序。,习题,6.程序填空:求s=1+2+3+n(n由键盘输入)。,习题,7.编程:,习题,8.编程:输出100到999之间的各位数字之和等于15的所有整数,输出时每10个一行。,习题,9.编程:求n的阶乘。,习题,10.编程:求s=1+3+5+7+9+,其和小于等于500的最大项。,习题,谢谢观看THANKYOU,