《大学计算机基础与思维》第5章 循环结构程序设计

上传人:e****s 文档编号:243428579 上传时间:2024-09-23 格式:PPT 页数:55 大小:583KB
返回 下载 相关 举报
《大学计算机基础与思维》第5章 循环结构程序设计_第1页
第1页 / 共55页
《大学计算机基础与思维》第5章 循环结构程序设计_第2页
第2页 / 共55页
《大学计算机基础与思维》第5章 循环结构程序设计_第3页
第3页 / 共55页
点击查看更多>>
资源描述
C,语言程序设计,技术基础,太原理工大学计算机学院计算机基础部,第5章 循环结构程序设计,5.1 while 循环语句,5.2 do while循环语句,5.3 for循环语句,5.4 多重循环,5.5 break语句与continue语句,5.6,几种循环语句的比较,5.7,循环结构程序举例,第5章,循环结构程序设计,思考一个问题:,如何编程来计算1 + 2 + 3 + + 100?,程序如下:int s = 0;,s = s + 1;,s = s + 2;,s = s + 3;,s = s + 100;,printf (“s = %d”, s);,重复100次,晕!,有没有更好的方法来计算呢?,有!就是用循环来编程。,第3章已讨论,程序结构,顺序结构,选择结构,循环结构,本章讨论,第4章已讨论,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。,5.1 while 循环语句,一般格式,while(循环继续条件), 循环体语句组;,执行过程,先判断“循环继续条件”表达式,,再执行“循环体语句组”,说明:,(1) while循环对应当型循环结构。,(2)“循环继续条件”也称为循环条件表达式,构成循环的结束条件由“循环继续条件”决定。循环体内应该包括使条件为“假”的计算来终止循环。,(3)“循环体语句组”可以是一条语句,也可以是复合语句。,#include ,void main ( ),int i = 1, sum = 0;,while ( i =0),s=1;,i=1;,while(i=n),s=s*i; /*,实现累乘*,/,i+;,printf(%d!=%ldn,n,s);,else,printf(Sorry! You enter a wrong number.n);,运行结果:,please enter a integer: 5,5 !=120,例5-3 统计从键盘输入一行字符的个数。,分析:,本题需要执行重复计数的操作,显然可以用循环来实现。设置一个累加器 n (初值为0),每次只要输入字符不是换行符,累加器的值就加1。循环计算n+,可统计出从键盘输入的字符数。,n=0,n+,输出n,F,T,开始,结束,(getchar()!=,n,#include ,void main(),int n=0;,printf(input a string:n);,while(getchar()!=n) n+;,printf(%d,n);,运行结果:,input a string:hello,5,分析:,本题需执行重复的输入操作,用循环实现。本例的特点是“循环次数不确定”,已知循环结束的条件。,例5-4输入某班一门课的成绩并计算其平均成绩(人数不定,输入成绩为-1时结束),#include ,void main(),float score,sum=0;,int n=0;,printf(n enter a score(-1 for end):);,scanf(%f, /*循环变量赋初值*/,while(score!=-1),sum+=score;,n+;,printf(n enter a score(-1 for end):);,scanf(%f, /*改变循环变量的值*/,printf(n n=%d,aver=%f,n,sum/n);,运行结果:,80 90 100 70 60 59 -1,5.2 do -while循环语句,一般格式,do, 循环体语句组; ,while(循环继续条件);,执行过程,先执行“循环体语句组”,,再判断“循环继续条件”表达式,说明:,(1) while(循环继续条件);本行的分号不能省略。,(2) do -while循环对应直到型循环结构。,(3) “循环继续条件”也称为循环条件表达式,循环体内应该包括使条件为“假”的计算来终止循环。,(4) do -while循环至少要执行一次循环语句。,#include ,void main(),int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/,do,sum=sum+i; /*实现累加*/,i+; /*循环控制变量i增1*/,while(i=100);,printf(%dn,sum);,例5-5 用do -while语句求1 + 2 + 3 + + 100,运行结果:,sum = 5050,while语句和用do-while语句的比较:,一般情况,用while循环语句和用do -while循环语句处理问题时,若循环体部分一样,结果也一样。但是如果while循环语句循环条件一开始为“假”,则循环结果不同。while循环语句一次也不执行,而do -while循环语句不论条件是否成立,先执行一次循环体语句。,例5-6 while和do-while循环语句的比较,(1) #include (2) #include void main ( ) void main( ) int sum=0,i; int sum=0,i; scanf(“%d, ,运行结果:,1,sum=55,再运行一次:,11,sum=0,运行结果:,1,sum=55,再运行一次:,11,sum=11,说明:,(1)当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。,5.3 for循环语句,一般格式,for(变量赋初值;循环继续条件;循环变量增值), 循环体语句组;,执行过程,(1) 求解“变量赋初值”表达式。,(2) 求解“循环继续条件”表达式。,如果其值非0,执行(3);否则,,转至(4)。,(3) 执行循环体语句组,并求解,“循环变量增值”表达式,然后转,向(2)。,(4) 执行for语句的下一条语句。,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确 定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,例如:,for(i=1;i=100;i+) sum=sum+i;,它相当于以下语句:,i=1;,while(i=100),sum=sum+i;i+;,显然,用for语句简单、方便。,说明:,(1),“变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其他表达式(如逗号表达式)。如:,for(sum=0;i=100;i+) sum += i;,for(sum=0,i=1;i=100;i+) sum += i;,“循环继续条件”部分是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式,它决定什么时候退出循环。例如:,for(i=0;(c=getchar()!=n;i+=c);,“循环变量增值”定义循环控制变量每循环一次后按什么方式变化。例如:,for(i=1; i=100; i+)sum=sum+i;,说明:,(2) 省略了“循环变量赋初值”, 表示不对循环控制变量赋初值。,例如:,for(; i=100; i+)sum=sum+i;,这种情况可以在for语句执行前确定循环的初始值。例如:,i=1;,for(; i=100; i+)sum=sum+i;,执行过程:先判定循环继续条件,执行循环体语句,然后使循环变量增值,使循环变量变化,再判定循环继续条件。,说明:,(3),省略了“循环继续条件”, 相当于恒为“真”,如果不做其他处理,会成为死循环。执行过程:,先执行变量赋初值,由于循环继续条件恒为“真”,故执行循环体语句,再使循环变量增值,然后不停地重复判定循环继续条件(恒为“真”),循环结束不了,除非循环体中加入判定循环结束条件的指令。例如:,for(i=1;i+)sum=sum+i;,相当于:,i=1;,while(1),sum=sum+i;,i+;,说明:,(4),省略了“循环变量增量”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。执行过程:,先执行变量赋初值,然后判定循环继续条件,为“真”,执行循环体语句,因没有循环变量增值,故再次判定循环继续条件是否为“真”。例如:,for(i=1;i=100;),sum=sum+i;,i+;,说明:,(5),省略了“循环变量赋初值”和“循环变量增量”。先判定循环继续条件,为“真”,执行循环体语句,再次判定循环继续条件,为“真”,再执行循环体语句,循环要结束也得使循环体语句中有使循环结束的趋势条件。例如:,for(;i=100;),sum=sum+i;,i+;,相当于:,while(i=100),sum=sum+i;,i+;,在这种情况下,完全等同于while语句可见for语句比while语句功能强,除了可以给出循环条件外,还可,以赋初值,使循环变量自动增值等。,说明:,(6,),3个都可以省略,但是“;”不能省略。例如:,for(;)语句,相当于:,while(1),即不设初值,不判断条件(认为,循环继续条件,为真值),,循环变量不增值。无终止地执行循环体。,#include ,void main(),int i,sum=0; /*将累加器sum初始化为0*/,for(i=1; i=100; i+) sum += i;/*实现累加*/,printf(sum=%dn,sum);,程序运行的结果为:,sum=5050,解析:先执行变量赋初值,然后判定循环继续条件,如果为“真”,执行循环体语句,i 为运算项目和循环变量,执行完一次,增加一次,最后累加和。,例5-7用for语句求1 + 2 + 3 + + 100,例5-8输出50100之间不能被3整除的数。,分析:,设变量n表示每次待处理的数,n不能被3整除的条件是“n%3!=0”。循环结构的组成为:,循环体:判断n能否被3整除并进行相应的操作;,循环继续条件:n=100(循环变量n);,循环变量的初值:50;,循环变量的增值:n+。,#include ,void main(),int n; /*循环变量*/,for(n=50;n=100;n+),if(n%3!=0) /*循环体*/,printf(%5d,n);,运行结果:,50 52 53 55 56 58 59 61 62 64 65 67 68 70 71 73,74 76 77 79 80 82 83 85 86 88 89 91 92 94 95 97,98 100,当循环中的内嵌语句是循环语句时,称为循环的嵌套使用。内嵌的循环中嵌套循环,称为多重循环。,3种循环可互相嵌套,只要符合C语言的语法即可。,5.4 多重循环,输出下三角形乘法九九表。,1 2 3 4 5 6 7 8 9,-,1,2 4,3 6 9,4 8 12 16,5 10 15 20 25,6 12 18 24 30 36,7 14 21 28 35 42 49,8 16 24 32 40 48 56 64,9 18 27 36 45 54 63 72 81,例5-9输出下三角形乘法九九表,分析:,下三角形乘法九九表显示为9行,,由循环控制变量控制行的变化,,假设行号为i(1=i=9),假设列号为j(1=j=i),i=9,i=1,j=1,ji,printf,j+,i+,N,N,Y,Y,#include ,void main (),int i=1, j; /*i:行计数器 j:列计数器*/,while( i= 9 ) /*控制打印表头*/,printf ( %4d, i+);,printf (n-n);,i=1;,while ( i= 9 ) /*行控制*/,j=1; /*列计数器置1*/,while ( j = a & c = z),putchar (c a + A);,else,break;,程序运行的结果为:,howareyou,HOWAREYOU,continue语句的作用是结束本次循环,进行下一次循环判定。语法:continue;说明:(1)在循环中执行continue语句,程序将转到循环判定条件处继续运行,从而使程序跳过循环体中剩余的语句而强行执行下一次循环。(2) continue语句用在while、do -while、for等循环体中,常与if条件语句一起使用,用来加速循环。,例5-11 求输入的10个整数中正数的个数及其平均值。,分析:,假设从键盘输入的整数为a,,数据的个数为num,数据的,总和为sum。如果a0,则,计数num的值不增加,不计,入总和,得重新输入数据;,否则num的值加1,总和由,sum= sum+a得到。最后的,算术平均值为sum/num。,F,输出个数,和,平均值,int i,a,num=0;,float sum=0,开始,scanf (%d, &a),num+; sum += a;,a0,i10,T,T,F,i+,结束,#include ,void main (),int i, a, num=0;,float sum=0;,for (i=0; i 10; i+),scanf (%d, ,if (a = 0),continue;,num+;,sum += a;,printf (%d plus integers sum: %.0fn, num, sum);,printf (average value: %.2fn, sum / num);,程序运行的结果为:,假设输入的10个整数为:, 2 3 4 5 6 7 8 9 10,8 plus integers sum: 45,例5-12 打印出数字010,但跳过(即不输出)数字7。,#include ,void main (),int i,;,for (i=0;i=10;i+),if (i=7),continue;,printf (%5d,i) ;,程序运行的结果为:,0 1 2 3 4 5 6 8 9 10,(1) 当i=7时执行continue语句,它的作用是终止本次循环,即跳过printf语句,故不输出7。,(2) 如果在本例中将“continue;”语句改为“break;”语句,则输出结果为:,0 1 2 3 4 5 6,continue语句与break语句不同,它不终止循环的运行,而只是结束本次循环。break语句则是强制终止整个循环过程。,在嵌套循环的情况下,continue语句只对包含它的最内层的循环体语句起作用。break语句也只能终止并跳出最近一层的结构。, 5.6 几种循环语句的比较,共同点,(1) while、do -while、for循环在逻辑上是相同的,一般可以互相代替。,(2) while、do -while、for循环一般都需要设置循环的初始值、循环结束条件的判定、循环增量(或减量)的计算。,(3) while、do -while、for循环都可以用break语句来结束循环,用continue语句来结束一次循环。,不同点,while、do -while、for循环的不同点主要是设置循环的初始值、循环结束条件的判定、循环增量(或减量)的计算的程序顺序不同,while,do-while,for,设置循环的初始值,语句前,语句前,语句前或变量赋初值,循环结束条件的判定,先判后执行,先执行后判,先判后执行,循环控制计算,循环体内,循环体内,循环体内或循环变量增值,(1) do -while循环至少执行循环体一次,while、for循环可能一次也不执行。,(2) for循环的循环功能处理功能最强,while、do -while均可用for循环实现。,例5-13 判断输入的整数是否是素数。,分析:,素数又称为质数,是指除了能被1和它本身整除外,不能被其他任何整数整除的数。,判断一个数m(m3)是否是素数的方法:把m作为被除数,把2m/2间整数除,或被2 (取整数)之间的整数除,判断被除数与除数相除的结果,若都除不尽,则说明m是素数。,计算机解决此类问题采用“穷举法”。穷举法的基本原理是:根据已知条件,在给定的范围内对所有可能的答案按某种顺序进行逐一枚举和检验,从中找出那些符合要求的答案。穷举法的关键是列举所有可能情况和条件判断,列举可能情况用循环语句实现,条件判断用条件语句实现。,#include ,#include ,void main (),int m, i, k;,printf (input a number: );,scanf (%d, ,k=sqrt (m);,i=2;,while (i k),printf (%d is a prime numbern,m);,else,printf (%d is not a prime numbern,m);,程序运行的结果为:,input a number:19,19 is a prime number,k=,真,输入m,i=2,当i,k,假,m被i整除,用break,结束循环,真,假,输出 : m“是素数”,输出 : m“不是素数”,i,k+1,i=i+1,goto语句构成循环,一般格式为:,goto 标号;,goto语句是一种无条件转移语句。其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行goto语句后,程序将跳转到该标号处并执行其后的语句。,goto语句的作用是在不需要任何条件的情况下直接使程序跳转到该语句标号所标识的语句去执行,在多层嵌套退出时, 用goto语句则比较合理。,由于goto语句是非结构化的语句,不恰当的使用会破坏程序的逻辑结构,所以在结构化程序设计中一般不主张使用goto语句,。,例5-14 goto语句计算1 + 2 + 3 + + 100,#include ,void main(),int i,sum=0;,i=1;,loop: if(i=1e-7;循环控制变量:n;进入循环前给n赋初值:1;改变循环变量的值:n+2。,#include ,#include ,void main(),double s,t,x;,int n=1;,scanf(%lf,t=x;,s=x;,do,n=n+2;,t=t*(-x*x)/(n*(n-1);,s=s+t;,while(fabs(t)=1e-7);,printf(sin(%lf)=%lfn,x,s);,程序运行的结果为:,sin(1.570000)=1.000000,例5-16 百钱百鸡问题。中国古代数学家张丘建在他的算经中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,鸡翁、鸡母、鸡雏各几何?,分析:,设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程:,x + y + z=100 ,5 x + 3 y + z / 3=100,这是个不定方程中三元一次方程组问题(三个变量,两个方程),可以采用“穷举法”求解,把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。,穷举法的实现用循环。可以采用三重嵌套的循环对变量x、y、z 进行组合。对于不同的组合,如果满足上面的两个方程,就是问题的一个解。如果不满足,就不是问题的解。根据题目,可以确定x和y的取值范围:0 x、y、z 100。,#include ,void main(),int x, y, z, j=0; /*j为计数器,记录解的数量*/,for (x=0; x=100; x+) /*穷举变量x*/,for (y=0; y=100; y+) /*穷举变量y*/,for (z=0; z=100; z+) /*穷举变量z*/,if ( x+y+z=100 & 5*x+3*y+z/3=100 ) /*判断是否满足两个方程*/,printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j, x, y, z);,此为“最笨”之法,#include ,void main(),int x, y, z, j=0; /*j为计数器,记录解的数量*/,for (x=0; x=20; x+),for ( y=0; y=(100-5*x)/3; y+ )/*减少变量y的穷举范围*/,z=100-x-y;,if ( z%3=0 & 5*x+3*y+z/3=100 ),printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j, x, y, z ) ;,程序运行的结果为:,1: cock= 0 hen=25 chicken=75,2: cock= 4 hen=18 chicken=78,3: cock= 8 hen=11 chicken=81,4: cock=12 hen= 4 chicken=84,例5-17 求Fibonacci数列(斐波那契数列)的前20项。这个数列有如下的规律:第一项和第二项都为1,从第三项开始,每一项都等于前两项之和。F(1)=1 (n=1)F(2)=1 (n=2)F(n)=F(n-1)+F(n-2) (n3),分析:,斐波那契数列是一个关于加法算法的典型实例。,由,F,n,=F,n,-1+F,n,-2 ,得到数列F,n,=1,1,2,3,5,8,13,21,34,。,计算机善于利用循环处理这种递推问题,方法是重复利用变量名,一个变量名在不同的时间代表不同的项。假设用变量f代表F,n,,f 1,f 2分别代表F,n,-1和F,n,-2,则可以用f=f1+f2表示递推过程:求前两项的和用f存放,第一项用f1存放,第二项用f 2存放,由于f 1可以重复利用,可以存放f 2的值,f 2也可以重复利用,可以存放f的值。如此反复,可以计算出Fibonacci数列的每项值。,#include ,void main (),long f1,f2;,int i;,f1=f2 =1;,printf (%10ld%10ld, f1,f2);,for ( i=2; i=10; i+ ) /*产生第320项*/,f1=f1+f2; /*递推出两项*/,f2=f2+f1;,printf (%10ld%10ld, f1,f2);,if ( i%2=0 ),printf(n); /*每行输出4个数*/,程序运行的结果为:,1 1 2 3,5 8 13 21,34 55 89 144,233 377 610 987,1597 2584 4181 6765,例5-18 验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示。例如:6=3 + 3,98=19 + 79 。,分析:,从整体上对这个问题进行考虑:读入一个偶数n,将它分成p和q,使n=p+q。令p从2开始,每次加1,令q=n-p,如果p、q均为素数,则正为所求,否则令p=p+q再试。,例5-19编程显示图形,(,共,n,行,,n,由键盘输入,),。,*,* * *,* * * * *,* * * * * * *,* * * * * * * * *,分析:,对于有规律的几何图案的输出,此类题目分析的要点是:通过分析,找出每行空格、“*”与行号i、列号j及总行数n的关系。,小结,本章主要介绍了构成循环结构的3种循环语句:while语句、do -while语句和for语句。学习常用的3种循环语句的重点在于弄清它们的相同与不同之处,以便在不同场合下使用,这就要清楚3种循环的基本格式和执行顺序,将每种循环的流程理解透彻。,3种循环结构可以相互转换。for循环的循环功能处理功能最强,while、do -while均可用for循环实现。,3种循环语句可以相互嵌套组成多重循环。,3种循环都可以用break语句跳出循环,用continue语句结束本次循环。,顺序结构、分支结构和循环结构并不彼此孤立,实际编程过程中常将这3种结构相互结合以实现各种算法,设计出相应程序。本章通过例子介绍了几种基本算法,如计数、求和、求阶乘、递推法和穷举法。希望读者在接触一个任务时,学会分析问题的思路,设计合适的算法,编写程序并优化程序。,谢 谢 !,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!