![[理学]第5章 循环结构程序设计.ppt_第1页](http://file.renrendoc.com/FileRoot1/2018-12/23/7615a1d5-b339-429d-b94d-97e49e5a053f/7615a1d5-b339-429d-b94d-97e49e5a053f1.gif)
![[理学]第5章 循环结构程序设计.ppt_第2页](http://file.renrendoc.com/FileRoot1/2018-12/23/7615a1d5-b339-429d-b94d-97e49e5a053f/7615a1d5-b339-429d-b94d-97e49e5a053f2.gif)
![[理学]第5章 循环结构程序设计.ppt_第3页](http://file.renrendoc.com/FileRoot1/2018-12/23/7615a1d5-b339-429d-b94d-97e49e5a053f/7615a1d5-b339-429d-b94d-97e49e5a053f3.gif)
![[理学]第5章 循环结构程序设计.ppt_第4页](http://file.renrendoc.com/FileRoot1/2018-12/23/7615a1d5-b339-429d-b94d-97e49e5a053f/7615a1d5-b339-429d-b94d-97e49e5a053f4.gif)
![[理学]第5章 循环结构程序设计.ppt_第5页](http://file.renrendoc.com/FileRoot1/2018-12/23/7615a1d5-b339-429d-b94d-97e49e5a053f/7615a1d5-b339-429d-b94d-97e49e5a053f5.gif)
已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 循环结构程序设计,孙敦艳,图书馆301,程序的三种基本结构,1、顺序,5.1 为什么需要循环控制,在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题 要向计算机输入全班70个学生的成绩,分别统计全班70个学生的平均成绩 求100个整数之和,例如:全班有70个学生,统计各学生三门课的平均成绩。,scanf(“%f%f%f”,输入学生1的三门课成绩,并计算平均值后输出,scanf(“%f%f%f”,输入学生2的三门课成绩,并计算平均值后输出,要对70个学生进行相同操作,重复70次,这些问题,即某些代码会被重复执行 在编写程序处理这类问题,要用到循环结构,循环结构就是 某些代码会被重复执行。,大多数的应用程序都会包含循环结构 循环结构和顺序结构、选择结构是结构化程序设计的三种基本结构,它们是各种复杂程序的基本构造单元,C语言有三种循环语句: (1)for语句; (2)while语句; (3)dowhile语句;,举例:计算1+2+3+4+100,#include int main() int i; int sum = 0; for (i=1;i=100;i+) sum+=i; printf(“sum=%dn“,sum); return 0; ,5.4 用for语句实现循环结构,1、格式: for(表达式1;表达式2;表达式3) 语句 功能:先执行表达式1,再判断表达式2是否成立,如果成立,执行语句,否则结束循环; 然后执行表达式3,再判断表达式2是否成立,如果成立,执行语句,否则结束循环; 重复步骤,for(循环变量赋初值;循环条件;循环变量增值),for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句,设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值执行,for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句,循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环,for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句,作为循环的调整器,例如使循环变量增值,它是在执行完循环体后才进行的,for语句的一般形式为 for(表达式1;表达式2;表达式3) 语句,循环体,for(表达式1;表达式2;表达式3) 语句1 语句2,#include int main() int i; int sum = 0; for (i=1;i=100;i+) sum+=i; printf(“sum=%dn“,sum); return 0; ,举例:求10以内的奇数之和,#include int main() int i; int sum = 0; for (i=1;i10;i+=2) sum+=i; printf(“sum=%dn“,sum); return 0; ,注意: 1、for语句,条件测试是在循环开始时进行,有可能一次也进入不了循环体。,2、for语句中的三个表达式可以部分省略或全部省略,但;不能省略,若省略表达式2,则表示循环条件为真。,3、for语句中三个表达式可以是任何有效的C语言表达式。,for(表达式1;表达式2;表达式3) 语句,一个或两个或三个表达式均可以省略,for(sum=0,i=1 ; i=100; i+) sum=sum+i;,逗号表达式 合法,for(i=1,j=100; ij;i+,j-) k+=i+j; ,for与if的嵌套使用,例子:求5到100之间能被3整除的所有整数之和。 #include int main() int i; int sum = 0; for(i=5; i=100;i+) if (i%3=0) sum+=i; printf(“sum=%dn“,sum); return 0; ,for语句举例: 求1+1/2+1/3+1/4+1/100,#include int main() int i; float sum = 0; for(i=1; i=100;i+) sum= sum + 1/i; printf(“sum=%fn“,sum); return 0; ,求:2/1+3/2+5/3+8/5+13/8+21/13+前15项的和,#include int main() int i; float z=2,m=1,a,temp,sum = 0; for(i=1; i=15;i+) a=z/m; sum= sum + a; temp=z; z=m+temp; m=temp; printf(“sum=%fn“,sum); return 0; ,格式: while (表达式) 语句 功能:先判断表达式是否成立,若成立,执行语句,如不成立结束循环。,5.2 用while语句实现循环,while循环的特点是: 先判断条件表达式,后执行循环体语句,例5.1求1+2+3+100 解题思路: 这是累加问题,需要先后将100个数相加 要重复100次加法运算,可用循环实现 后一个数是前一个数加1而得 加完上一个数i后,使i加1可得到下一个数,#include int main() int i,sum = 0; i=1; while (i=100) sum+=i; i+; printf(“sum=%dn“,sum); return 0; ,#include int main() int i,sum = 0; for (i=1;i=100;i+) sum+=i; printf(“sum=%dn“,sum); return 0; ,while和for语句可相互替换,while举例: 用while判断回文数(如:121,12321等),#include int main() int val,t,sum; printf(“请输入要判断的数:n“); scanf(“%d“, ,5.3 用do-while语句实现循环,do-while语句的特点:先无条件地执行循环体,然后判断循环条件是否成立 do-while语句的一般形式为: do 语句 while (表达式); 功能:首先执行语句,再判断表达式是否成立,若成立,再执行语句,如不成立结束循环。,例5.2 用dowhile语句求: 1+2+3+100,即,i=1; sum=0; do sum=sum+i; i+; while(i=100);,#include int main() int i=1,sum=0; do sum=sum+i; i+; while(i=100); printf(“sum=%dn“,sum); return 0; ,例5.3 while和do-while循环的比较。,int i,sum=0; printf(“i=?”); scanf(“%d”,int i,sum=0; printf(“i=?”); scanf(“%d”,当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则不相同,5.5 循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套 内嵌的循环中还可以嵌套循环,这就是多层循环 3种循环(while循环、dowhile循环和for循环)可以互相嵌套,注意: 1、循环体内有多个语句要用括起来。 2、书写格式要清晰。,for ( ; ; ) . for ( ; ; ) . ,5.7 改变循环执行的状态,break语句提前终止循环 continue语句提前结束本次循环,复习:break在switch语句中,可以使流程跳过判断体,执行下面的程序。 新知识:break在循环体中,也可以从循环体内跳出循环体,提前结束循环。,5.7.1 用break语句提前终止循环,break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句,5.7.2 用continue语句提前结束本次循环,有时并不希望终止整个循环的操作,而只希望提前结束本次循环,而接着执行下次循环。这时可以用continue语句,在循环体中,break从循环体内跳出循环体,提前结束循环。,for(. ; . ; . ) break; ,continue:其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。,for(. ; . ; . ) continue; ,while( ) continue; ,a=10 ; y=0; do a+=2; y+=a; printf(“a=%d, y=%dn“, a, y); if (y50) break; while (a=14);,第一次:a=12 y=12,输出:a=12 , y=12,第二次:a=16 y=28,输出:a=16 , y=28,第三次:a=16 y=44,输出:a=16 , y=44,第四次:a=16 y=60,输出:a=16 , y=60,void main(void) int i; for (i=1 ; i=5 ; i+ ) if (i%2) putchar(*); else continue; putchar(#); printf(“$n“); ,1,真,1,*#,2,真,0,无,3,真,1,*#,4,真,0,无,5,真,1,*#,6,假,$,输出:*#*#*#$,#include void main() int i=5; do switch(i%2) case 0: i-; break; case 1: i-; continue; i-; printf(“%dn“, i); while(i0); ,5,真,1,4,无,4,真,0,2,2,2,假,0,0,0,输出:2 0,#include void main(void ) int k=0; char c=A; do switch (c+) case A: k+; break; case B: k-; case C: k+=2; break; case D: k=k%2; continue; case E: k=k*10; break; default: k=k/3; k+; while (cG); printf(“k=%dn“, k); ,输出:k=4,A,真,B,2,B,真,C,4,C,真,D,7,D,真,E,1,E,真,F,11,F,假,G,4,1、求素数:只可以被1与自身整除的数。,判断一个数 t 是否为素数,用2到t-1循环除。,for( i=2; it ; i+) if(t%i=0) break; if (i=t) printf(“是素数。n“); else printf(“不是素数n“);,进一步,由于 t 不可能被大于 t/2 的数整除,所以可将循环次数降低。,t/2,(i=t/2),求范围内的素数(50100):,for(t=50, k=0 ; t=100; t+) for( i=2; it ; i+) if(t%i=0) break; if (i= =t) printf(“%d “,t); k+; if(k%5=0) printf(“n“); ,判断t是否为素数,保证每行输出5个数据,2、 最大公约数与最小公倍数 求两自然数m , n的最大公约数 法一:欧几里德算法(mn) 1、 m 除以n得到余数r(0r n) r=m%n,m=6 n=4 r=m%n=6%4=2,while ( r=m%n ) m=n; n=r ; Printf(“公约数=%d”,n);,最小公倍数为两数之积除以最大公约数。m*n/最大公约数=4*6/2=12,2、判断r是否为0,是则结束,n为最大公约数,否则做步骤3,3、mn , nr , 回到步骤1,m=4 n=2 r=m%n=4%2=0 所以,公约数=2,法二:最大公约数:能同时被m和n整除的最大数。,r=mn?n:m for(i=1; i=r; i+) if(m%i=0,while(n) printf(“%dt“,n%10); n=n/10; ,3、求整数的每一位数字 如:将 12345 的每位分别打印出来。,12345105 12345/101234,1234104 1234/10123,123103 123/1012,12102 12/101,1%101 1/100,满足以下条件三位数n,它除以11所得到的商等于n的各位数字的平方和,且其中至少有两位数字相同。 131 131/11=11 12+32+12=11,分析:,数字应该从100循环到999,将每位数字剥出,判断其是否满足条件,#include int main() int i,a,b,c; for (i=100;i=999;i+) c=i%10; b=i/10%10; a=i/100; if (i/11=a*a+b*b+c*c) ,满足以下条件三位数n,它除以11所得到的商等于n的各位数字的平方和,且其中至少有两位数字相同。 131 131/11=11 12+32+12=11,分析:,用a,b,c分别代表三位数,a,b,c分别从0循环到9,组成所有可能的三位数,然后找出满足条件的数来。,#include int main() int a,b,c; for (a=1;a=9;a+) for (b=0;b=9;b+) for (c=0;c=9;c+) if (a*100+b*10+c)/11 = a*a+b*b+c*c) ,鸡兔共有30只,脚共有90只,问鸡兔各有多少?,#include void main(void) int i; /*i代表鸡,则兔为30-i只*/ for(i=0;i=30;i+) if(2*i+4*(30-i)=90) printf(“鸡: %dn“, i); printf(“兔: %dn“,30-i); ,编程计算:有36块砖要求36个人一次搬完,这36个人中有男人、女人和小孩。男人一次可搬4块砖,女人一次可搬2块砖,小孩两人搬1块砖,问36人中有多少男人、女人和小孩。(3, 5, 28),巍巍古寺在山中,不知寺内几多僧。三百六十四只碗,恰巧用尽不差争。三人共食一碗饭,四人共尝一碗羹。请问先生能算者,山中寺内几多僧。,计算:222222.22222?,累加和 s0,设通项为t,t的初值为2,22=2*10+2;,222=22*10+2;,2222=222*10+2;,t=t*10+2;,所以,通项的循环表示为:,前一项,当前项,循环体为:,4、具有通项公式的程序,void main(void) int t,s,i; s=0; t=2; for(i=0;i5;i+) s=s+t; t=t*10+2; printf(“%dn“,s); ,求级数公式:,首先写出通项,然后再用当前项(第n项)除前一项,得出后一项比前一项大多少倍。,通项:,t=(-1)*x*x/(2*n)*(2*n-1),第n项/第n-1项:,表明前一项比后一项大t倍,即后一项乘t等于前一项,后一项前一项t,S=0;term=1;n=1;/*一定要赋初值*/ while(fabs(term)=1e-5) S=S+term; term=(-1)*term*x*x/(2*n)*(2*n-1); n+; ,term=term*t;,前一项,当前项,旧的,新的,后一项前一项t,设通项为term,则可以写出迭代公式,t=(-1)*x*x/(2*n)*(2*n-1),#include #include int main() int n=1; double s=0,term=1,x=1; while(fabs(term)=1e-5) s=s+term; term=term * (-1)*x*x / (2*n)*(2*n-1); n+; printf(“%fn“,s); return 0; ,求n=1000时的近似值,分析:,通项:,s=st,迭代算法:,上次迭代的结果,本次计算的结果,迭代结束条件: 迭代 1000次,注意s与t的初始值,n从1开始迭代 s=1,#include int main() int n=1; double s=1,t=1; while(n=1000) t=2.0*n/(2*n-1)*2.0*n/(2*n+1); s=s*t; n+; printf(“%fn“,s); return 0; ,利用循环语句编程,打印下列图形: * * * * * * * * * * * * * * * *,找规律:,上面四行,行号:i 空格:4-i 星号:i,for(i=1;i5;i+) for(j=0;j4-i;j-) printf(“ “); for(k=0;ki;k+) printf(“*“); printf(“nn“); ,void main(void) int i,j,k; for(i=1;i5;i+) for(j=0;j4-i;j+) printf(“ “); for(k=0;ki;k+) printf(“*“); printf(“n“); for(i=1;i4;i+) for(j=0;j4-i;j+) printf(“*“); printf(“n“); ,打印图形: * * * * * * * * * * * * * * * * * * * * * * * * *,行号:i 空格:3-i 星号:2*i+1,下面程序的功能是用公式求的近似值,直到最后一项的值小于10-6为止。请填空。,void main(void ) int i=1; _ pi=0; while (i*i=10e+6) pi=_ ; i+; pi=sqrt (6.0 *pi) ; printf(“pi=%lfn“,pi); ,double,pi+1.0/(i*i),有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?请填空。,#include“stdio.h“ void main(void ) int day, x1, x2; day=0; x1=1020; while (_ ) x2=_; x1=x2; day+; printf(“day=%dn“day); ,x1,x1/2-2,补充算法,方程求解,1、牛顿切线法 只有为数不多的方程有精确解,一般都是用迭代方法近似求方程的解。方程f(x)=0的实数解实际上是曲线f (x)在x轴上交点的值。,f(x),x,y,x0,1、任选一x值x1,在y1=f(x1)处做切线与x轴相交于x2处。,f(x),x,y,x0,f(x1),x1,x2,2、若|f(x2)|小于指定的精度,则令x1=x2,继续做1。当其满足所需的精度时,x2就是方程的近似解。,x1,x2,牛顿切线法收敛快,适用性强,缺陷是必须求出方程的导数。,已知方程为f(x)=x*x-a时,用牛顿切线法求方程的解。给定初值x0,精度10-6,算法编程如下。,scanf(“%f“,上一循环的新值成为本次循环的旧值,2、弦截法,f(x),x,y,x,1、在x轴上取两点x1和x2, 要确保x1与x2之间有且只有方程唯一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 锚杆锚索安全教育培训课件
- 华瓷股份:审计报告
- 脊柱骨折康复课件
- 忻州会所音响工程方案(3篇)
- 《2025购地合同范本》
- 2025年农业用地流转协议模板
- 2025年技师资格考试试题及答案
- 2025设备租赁合同书范本(合同示范文本)
- 锅炉安全知识培训内容课件
- 工程投标创新方案(3篇)
- 火力发电厂节水导则DLT783-2023年
- 艾滋病梅毒丙肝检测与解释
- GB/T 22076-2008气动圆柱形快换接头插头连接尺寸、技术要求、应用指南和试验
- GB/T 12325-2008电能质量供电电压偏差
- CJJ28-2014城镇供热管网工程施工及验收规范
- 三字经全文带拼音注释打印版
- 函数的概念学习任务单-高一上学期数学人教A版(2019)必修第一册
- 产品技术规格书模板
- 《绿色建筑评价标准》解读
- 小学数学 北师大版 六年级上册 第二单元第1课时《分数混合运算(一)》 课件
- 《冷冲压工艺与模具设计》完整版ppt课件全套教程
评论
0/150
提交评论