C语言循环结构程序设计01.ppt_第1页
C语言循环结构程序设计01.ppt_第2页
C语言循环结构程序设计01.ppt_第3页
C语言循环结构程序设计01.ppt_第4页
C语言循环结构程序设计01.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、循环结构,引言,循环结构 是程序中一种很重要的结构。 是指需要反复执行的程序段。 其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。 例:求1100的累计和。 解题思路: 根据已有的知识,可以用“1+2+100”来求解,但显然很繁琐。现在换个思路来考虑: 首先设置一个累计器sum,其初值为0,利用sum+=n来计算(n依次取1、2、100),只要解决以下3个问题即可: (1)将n的初值置为1; (2)每执行1次“sum+= n”后; (3)n+; (4)当n增到101时,停止计算。此时,sum的值就是1100的累计和。 根据已

2、有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),C语言提供了3条循环语句来实现,以简化、并规范循环结构程序设计。 在语言中,可用以下语句实现循环: (1)用for语句。 (2)用while语句。 (3)用do-while语句。,FOR循环,for语句 for语句的一般格式 for(表达式1;表达式2;表达式3) 语句; 适用于已知循环次数的循环。 它的执行过程如下: (1)先求解表达式1。 (2)求解表达式2, (2-1)若其值为真(非0),则执行for语句中指定的内嵌循环体语句,然后执行下面第(3)步; (2-2)若其值为假(0),则结束循环,转到第(

3、5)步。 (3)求解表达式3。 (4)转回上面第(2)步继续执行。 (5)循环结束,执行for语句下面的一个语句。 for语句最简单的应用形式也是最容易理解的形式如下: for(循环变量赋初值;循环条件;循环变量增量) 语句; 循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式,它决定什么时候退出循环; 循环变量增量,定义循环控制变量每循环一次后按什么方式变化。 这三个部分之间用“;”分开。 例如: for(i=1;i100时,结束循环。,表达式1,循环体语句,表达式2,假,真,表达式3,循环外语句,FOR循环,for语句 for语句的几种格式 for循环

4、中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。 (1)省略了“表达式1(循环变量赋初值)”:for(;表达式2;表达式3) 表示不对循环控制变量赋初值。 使用条件是:循环控制变量的初值不是已知常量,而是在前面通过计算得到,例如: i=m-n; . for(;i100) break; 例3-01:编制菜单控制程序 #include stdio.h main() char ch; for(;) printf(please input choice(Q=Exit):);/*显示菜单语句块:*/ scanf(%c,

5、 ,FOR循环,for语句 for语句的几种格式 (3)省略了“表达式3(循环变量增量)”: for(表达式1;表达式2;)语句 表示不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。 例如:for(i=1;i=100;)sum=sum+i;i+; (4)在for语句中,表达式1、表达式3都可以有一项或多项。 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。 例如:for(sum=0;i=100;i+)sum=sum+i; 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。 例如: for(sum=0,i=1;i=100;i+)sum=sum+i;

6、 例如: for(i=0,j=100;i=100;i+,j-)k=k+i+j; 表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。 例如:for(i=0;(c=getchar()!=n;i+=c); 例如:for(;(c=getchar()!=n;) printf(“%c”,c); 打印输入的字符,直至回车。,FOR循环,for语句 for循环练习 例3-02:计算s=1+2+3+100 使用for循环 #include stdio.h main() int i,s; s=0; for(i=1;i=100;i+) s+=i;/累加器 printf

7、(%dn,s); return 0; ,FOR循环,for语句 for循环练习 例3-03:求n的阶乘n!(n!=1*2*n) #include stdio.h main() int i,n; long fact; fact=1;/将累乘器fact初始化为1 printf(Input n:); scanf(%d, ,FOR循环,for语句 for循环练习 例3-04:求1到整数N的倒数之和。 指出下列程序的错误之处: #include stdio.h main() int i,s,n; s=0; scanf(“%d”, ,#include stdio.h main() int i,n; flo

8、at s; s=0; scanf(%d, ,FOR循环,for语句 for循环练习 例3-05:计算S1=2+4+6+200 S2=12+22+32+ #include stdio.h main() int i,s1,s2,n; s1=s2=0; for(i=2;i=200;i+=2) s1+=i; /for(i=1;i=100;i+) s1+=2*i; scanf(%d, ,FOR循环,for语句 for循环练习 例3-06:根据下面的公式计算的近似值: #include stdio.h main() double pi; long n,i; scanf(%ld, ,FOR循环,for语句

9、for循环练习 例3-07:输出1n之间中能被3整除,且被5除余1的所有整数。 #include stdio.h main() int i,n; scanf(%d, ,FOR循环,for语句 for循环练习 例3-08:求整数n的全部正约数。 解题思路(1):从1n能被n整除的数就是正约数 #include stdio.h main() int i,n; scanf(%d, 解题思路(2):由于n=a*b;a,b均为n的正约数,其中a或b必有一个不大于sqrt(n) 证明:反证法; 若a,b都大于sqrt(n),则必有a*bn,与题意不符。,(i=1;i=sqrt(n);i+),#includ

10、e math.h,if (n%i=0) if (i=n/i) printf(%d ,i); else printf(%d %d ,i,n/i);,FOR循环,for语句 for循环练习 例3-09:打印出斐波那契数列的前30个数。 算法思路: 斐波那契数列初时1,1; 以后每个数是前面两个数的和:2,3,5,8,13,21,. 设前两个数的第一个数为A,第二个数为B; 初始时A=1;B=1; 两个数一组:A=A+B; B=A+B; #include stdio.h main() long A=1,B=1; int i; printf(%ld,%ldn,A,B); for (i=1;i=14;i

11、+) A=A+B; B=B+A; printf(%ld,%ldn,A,B); return 0; ,FOR循环,for语句 for循环练习 例3-10:任何一个自然数的立方都可以写为一串连续奇数之和。这就是著名的尼科梅切斯(Nicomachus)定理。 编程输入n,求n3是那些奇数之和。例: 13=1 23=3+5=8 33=7+9+11=27 43=13+15+17+19=64 #include stdio.h main() int i,n,s; scanf(%d, ,n,n*(n-1)+1,n,5,21,5,4,13,4,3,7,3,2,3,2,1,1,1,个数,开始的数值,N,while

12、循环,while语句 while语句的一般形式为: while(表达式)语句 while语句适用于“未知循环次数或当指定条件成立时进行循环”的情况。 其中表达式是循环条件,语句为循环体。 while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可如图表示。 说明: 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。 while语句的特点是先判断,后执行,若条件不成立,有可能一次也不执行。 为了能使while循环正常终止,循环体中一定要有改变表达式值的操作,否则该循环就是一个死循环。 显然,while循环是for循环的一种简化形式(缺省“变量赋初值”和“循

13、环变量增值”表达式)。,while语句,while语句 使用while语句应注意 while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。 例3-11:统计从键盘输入一行字符的个数。 #include stdio.h main() int n=0; printf(input a string:n); while ( )n+; printf(%d,n); return 0; ,getchar()!=n,while语句,while语句 例3-12:输入一个字符串,以作为结束字符,分别统计其中数字中的奇数和偶数出现的次数。 分析:由于不知字符串长度,但字符元素和结

14、束符特征明显,用while循环来控制最合适不过。对输入的字符进行类型转换,成为一个一位数,再进行奇偶判断和统计即可。具体程序如下: 程序实现:模拟; 读一个字符 判断该字符是否为结束字符 判断是否为数字字符 判断奇偶数并计数 继续读一个字符 #include stdio.h main() char ch; int oddnum,evennum; oddnum=0; evennum=0; scanf(%c, ,ch!=#,while语句,while语句 例3-13:根据下面的公式计算的近似值: 直到计算的值与3.141592的误差不大于10-6时,n为多少? 程序实现: 由于n未知,故应用whi

15、le循环。 如何实现(-1)n? 初始时:n=1;pi=0.0;t=-1; 当fabs(3.1415926-pi*4)误差超过10-6时 计算pi值; n值增加; 利用t改变正负号,#include stdio.h #include math.h main() double pi,t; long n; n=1; t=-1; pi=0.0; while (fabs(3.141592-4*pi)=1e-6) pi=pi+t/(1-2*n); t=-t; n+; pi=pi*4 ; printf(pi=%lf;n=%ldn,pi,n); return 0; ,while语句,while语句 例3-1

16、4:求两个自然数m,n的最小公倍数。 分析:最小公倍数是大数的倍数。 程序实现: m,n比较大小,m为大数,n为小数。 当 m的倍数不能整除n 时 m扩大倍数,#include stdio.h main() int m,n,i,s; printf(input m:); scanf(%d, ,do.while循环,do.while语句 do-while语句的一般形式为: do 语句 while(表达式); 这个循环与while循环的不同在于: 它先执行循环中的语句; 然后再判断表达式是否为真; 如果为真则继续循环; 如果为假, 则终止循环。 因此, do-while循环至少要执行一次循环语句。其

17、执行过程可如图表示。 说明: 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。 在循环体中必须包含改变循环控制变量的操作,以确保表达式的值为假时结束循环。 do.while循环与while循环可以完全互换,但需要改变表达式和初值。 显然,do.while循环也是for循环的一种简化形式(缺省“变量赋初值”和“循环变量增值”表达式),do.while循环,do.while语句 do.while循环与while循环可以完全互换,但需要改变表达式和初值。 while和do-while循环比较。 (1) main() int sum=0,i=1; scanf(“%d”, ,(2)main()

18、 int sum=0,i=1; scanf(“%d”, ,do.while循环,do.while语句 例3-15:计算sin(x)=x-x3/3!+x5/5!-x7/7!+. 直到最后一项的绝对值小于10-7时为止。 程序实现: 此题用while循环和do.while循环均可。 这道题使用递推方法来做。 让多项式的每一项与一个变量 n对应,n的值依次为1,3,5,7,.,从多项式的前一项算后一项,只需将前一项乘一个因子: (-x2)/(n-1)*n) 即n=5时由n=3,(x3/3!)乘以(-x2)/(4*5) 算法流程: 输入x值;并根据1角度=/180(弧度)计算成弧度。 设置初值n; d

19、o 增加n值; 根据上一项计算当前项的值; 计算总和 while 当前项的值不大于1e-7时退出;,#include math.h #include stdio.h #define pi 3.14159 main() double sin,t,x; long n; printf(please input x:); scanf(%lf, ,循环嵌套,循环嵌套 (1)循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。 (2)嵌套过程可以有很多重。一个循环外面仅包围一层循环叫二重循环;一个循环外面包围两层循环叫三重循环;一个循环外面包围多层循环

20、叫多重循环。 (3)三种循环语句for、while、do.while可以互相嵌套自由组合。但要注意的是,各循环必须完整,相互之间绝不允许交叉。如下面这种形式是不允许的: (4)内层循环的执行顺序快于外层循环。 (5)内外循环控制变量不能同名。,do 语句; for (;) 语句; while( ); ,循环嵌套,循环嵌套 例3-16:写出程序运行结果 #include stdio.h main() int i, j, k; printf(i j kn); for (i=0;i2;i+) for(j=0;j2;j+) for(k=0;k2;k+) printf(%d%d%dn,i,j,k); r

21、eturn 0; 打印出07的二进制数。,循环嵌套,循环嵌套 例3-17:利用循环嵌套结构输出下列图形。(n行m列) #include stdio.h main() int i,j,n,m; printf(n,m=n); scanf(%d%d, ,* * * * * (1),/外循环为行数,/每一行包含两项内容,/循环打印出一行中的每一列内容,/最后一个字符为回车,循环嵌套,循环嵌套 例3-18:利用循环嵌套结构输出下列图形。(n行m列) 分析:每行三项内容:空格、星号、回车 空格每行变化由n-1,n-2,.,1,0; 星号每行m个; 回车1个; #include stdio.h main()

22、 int i,j,n,m; printf(n,m=); scanf(%d%d, ,* * * * * (2),/外循环为行数,/每一行包含三项内容,/循环打印出一行中的空格,/最后一个字符为回车,/循环打印出一行中的星号,循环嵌套,循环嵌套 例3-19:利用循环嵌套结构输出下列图形。(只输入行数n) 分析:每行三项内容:空格、星号、回车 空格每行变化由n-1,n-2,.,1,0 ; 星号每行变化由1,3 ,.,2n-1; 回车1个; #include stdio.h main() int i,j,n; printf(n=); scanf(%d, ,* * * * * (3),/外循环为行数,/每一行包含三项内容,/循环打印出一行中的空格,/最后一个字符为回车,/循环打印出一行中的星号,/修改为while,for循环嵌套 while (i=n) for(j=1;j=n-i;j+)printf( ); for(j=1;j=2*i-1;j+)printf(*); printf(n); i+; ,循环嵌套,循环嵌套 例3-20:利用循环嵌套结构输出下列图形。(只输入行数n)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论