版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 循环结构,2,结构化程序设计的三种控制结构,顺序结构 选择结构 循环结构,3, 顺序结构 ,A,B,4,P,A,B,T,F, 选择结构 ,P,A,T,F,5,P=1,A1,P=2,A2,P=n,An,F,T,T,T,F,F,F, 选择结构 ,6, 循环结构 ,P,A,T,F,P,A,T,F,7,学习目标,while语句 dowhile语句 for语句,8,内容,4.1 循环结构概述 4.2 while循环 4.3 do-while循环 4.4 for循环 4.5 循环的嵌套 4.6 循环的中途退出 4.7 算法举例,9,4.1 循环结构概述,【例4-1】从键盘上随机的输入10个数,输出
2、其中最大数 模仿 【例3-6】从键盘上随机的输入三个数,输出最大数,10,【例3-6】从键盘上随机的输入三个数,输出最大数,#include void main(void) int a, b, c, max; printf(输入三个数: ); scanf(%d%d%d, ,11,【例4-1】从键盘上随机的输入10个数,输出其中最大数,#include void main(void) int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, max; printf(“输入10个数: ); scanf(%d%d%d%d%d%d%d%d%d%d, ,12,if(a1ma
3、x) max=a1; if(a2max) max=a2; if(a3max) max=a3; if(a4max) max=a4; if(a5max) max=a5; if(a6max) max=a6; if(a7max) max=a7; if(a8max) max=a8; if(a9max) max=a9; printf(%d 是最大数n, max); ,13,【例4-1】从键盘上随机的输入10个数,输出其中最大数,#include void main() int x, max, n=1; scanf(%d, ,用循环程序实现,14,14,循环结构特点,在给定条件成立时,反复执行某程序段,直到
4、条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。,15,C语言中,实现循环的语句,1用 while 语句 2用 do-while 语句 3用 for 语句 4用 goto 语句和 if 语句构造循环,16,while(表达式) 语句,4.2 while循环,while语句 一般形式 执行流程,17,while循环特点,先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行(当循环条件不满足) while语句中的表达式可以是任何表达式,常用的是关系表达式和逻辑表达式,只要表达式的值为真(非0)即可继续循环,#include main() int i=1, sum=0;
5、 while ( i= 5 ) sum = sum + i; i+; printf(%d, sum); ,18,【例】用while循环求,i sum 0 sum=0+1=1 i+ 2 1 sum=1+2=3 i+ 3 3 sum=3+3=6 i+ 4 6 sum=6+4=10 i+ 5 10 sum=10+5=15 i+ 6 15,1+2+3+100?,100,循环变量初值,循环变量终值,循环变量增值,19,注 意,当循环体包含一个以上的语句时,应该用花括弧括起来,以复合语句形式出现。 如果不加花括弧,while语句的执行范围只到while后面的第一个分号处,while(i=100); sum
6、 = sum+i; i+; ,while(i=100) sum = sum+i; i+;,while(i=100) sum = sum+i; i+; ,20,main() int i, sum=0; i=1; while(i=100) sum = sum+i; i+; printf(%d, sum); ,【例4-2】求前n个数的平方和, n;,scanf(%d, ,n,*i;,printf(n=%d,sum=%d, n, sum);,输入一个整数n:5 n=0, sum=55 Press any key to continue,输入一个整数n:0 n=0, sum=0 Press any ke
7、y to continue,21,【例4-1】从键盘上随机的输入10个数,输出其中最大数。使用while语句完成,#include void main() int x , max, n=1; scanf(%d, ,while(n10) ,22,根据上例:输入10个整数,求其中正数的个数及其平均值,main() int a, i=0, n=0, sum=0; float aver; while ( i 0) sum = sum+a; n+; aver=(float)sum/n; printf(n=%d,aver=%f,n,aver); ,23,#include void main() int i
8、=1; float jc=1; while(i=10) jc = jc*i; i+; printf(%10.0fn, jc); ,#include void main( ) int i=1, n; float jc=1; scanf(%d, ,例求 10!,例任意输入n, 求 n!,24,#include void main() int letter=0; char ch; ch=getchar(); while(ch!=n) letter+; ch=getchar(); printf(“有%d个字符n, letter); ,P97例5-3从键盘输入一行字符,以n结束,统计输入的字符个数。,2
9、5,【例4-3】 猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子。,设第n天还剩个桃子Xn,Xn和Xn-1的关系? Xn = Xn-1/2 1 Xn-1= (Xn + 1)2,26,Xn-1= (Xn + 1)2 X9 = (X10 + 1)2 X8 = (X9 + 1)2 X1 = (X2 + 1)2 能不能设较少的变量仍然可以求出X1呢?,X1 = (X2 + 1)2 X2 = X1,?,27,#in
10、clude main() int day, x1, x2; day = 9; x2 = 1; while(day 0) x1 = (x2 + 1) * 2; x2 = x1; day-; printf(The total is %dn,x1); ,28,附加 条件运算符和条件表达式,一般形式: exp1 ? exp2 : exp3 执行过程 功能:相当于条件语句 条件运算符可嵌套 如 x0?1:x0?-1:0,例 if (ab) printf(%d,a); else printf(%d,b);,printf(%d,ab?a:b);,例 求 a+|b| value = b0?a+b:a-b;,2
11、9,结合方向:自右向左 如: x0?1:x0?1:(x0?-1:0 ) exp1、exp2、exp3类型可不同,表达式结果的类型取精度较高的类型,例 x?a:b /x=0,表达式值为b;x0,表达式值为a xy?1:1.5 /xy,值为1.0; x=y ,值为1.5,30,【例4-4】输入两个正整数a和b,求其最大公约数,几个自然数公有的约数,叫做这几个数的公约数。其中最大的就是最大公约数。 方法1定义法 具体步骤: STEP1 从键盘上输入m,n,求k=mn? m:n; STEP2 如果m%k=0且n%k=0,则k为最大公约数 STEP3 否则,k-,继续STEP2直到满足条件为止 方法2辗
12、转相除法 方法3相减法,31,【例4-4】输入两个正整数m和n,求其最大公约数,#include void main() int k, m, n; printf(请输入2个数: ); scanf(%d%d, ,请输入2个数:32 12 最大公约数:4 Press any key to continue,32,【例4-5】 将一个大于1的正整数分解成质因数。例如:输入90,打印出 90=2*3*3*5,题目分析:为了将n分解成质因数,应先找到一个最小的质数k,然后按下述步骤完成: STEP1 如果n=k,则说明分解质因数的过程已经结束,输出即可 STEP2 如果n!=k,但n能被k整除,则应打印
13、出k的值,并用n除以k的商,作为新的正整数n,重复执行STEP1 STEP3 如果n不能被k整除,则用k+1作为新的k,重复执行STEP1,33,#include void main() int n, k=2; printf(please input a number:); scanf(%d, ,34,1.while(0) . 由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。 2.while(1) . 由于循环的条件表达式恒等于1,所以不可能通过循环控制条件来结束循环体的执行,称为“死循环”。 3.为了保证循环正常运行,应该特别注意: 循环条件 循环条件的初始状态(初始值)
14、 i=1; 循环体内部对控制条件的影响 i+;,While 使用注意,35,do 语句 while(表达式);,4.3 do-while循环,Do-while语句 一般形式 执行流程,36,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,37,【例4-6】 从键盘输入一个整数,计算它的位数。例如:输入12345,输出5; 输入-123,输出3, 输入0,输出1。,12345,38,#include void main(void) long number; int count = 0; printf(“ Please enter a numbe
15、r: ); scanf(“%ld”, ,39,main() int number,count = 0; scanf(“%d”, ,例:输入一个整数,反序输出该数。 如输入12345,输出54321。,12345%10 = 5 12345/10 =1234,1234%10 = 4 1234/10 = 123,123%10 = 3 123/10 = 12,12%10 = 2 12/10 = 1,1%10 = 1 1/10 = 0,40,【例4-7】用格里高利公式求的近似值。要求精确到最后一项的绝对值小于1e-5。,格里高利公式为: 分子 flag:1,-1,1,-1 分母 n: 1,3,5,7,.
16、 项 item = flag/n,41,#include #include void main() double pi=0, item; int n=1, flag=1; do item = flag*1.0/n ; pi = pi+item; n = n+2; flag = -flag; while(fabs(item)1e-5); pi=pi*4; printf(pi=%lfn, pi); ,42,#include main() int i,sum=0; scanf(%d, ,#include main() int i,sum=0; scanf(%d, ,while和dowhile比较:,
17、1 sum=55,1 sum=55,11 sum=0,11 sum=11,43,for(exp1;exp2;exp3) statement,4.4 for循环,for语句 一般形式 执行流程,44,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,for语句一般应用形式,45,说明 for语句中exp1,exp2,exp3类型任意,都可省略,但分号;不可省略 无限循环:for(;) for语句可以转换成while结构,for(exp1;exp2;exp3) 循环体语句;,exp1; while(exp2) 循环体语句; exp3; ,46,【例4-8】计算s=1+2+3+.+9
18、9+100,#include void main() int i, s=0; for(i=1; i=100; i+) s = s+i; printf(s=%d,n=%dn, s, i); ,47,【例4-9】用for语句实现,从0开始,输出n个连续的偶数,#include void main() int i, n; printf(input n: ); scanf(%d, ,#include void main() int a=0, n; printf(input n: ); scanf(%d, ,48,【例4-10】打印出所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于
19、该数本身如:153是一个“水仙花数”,因为153=135333,题目分析: 利用for循环检验100-999中的每一个三位数 对于每个三位数分解出个位、十位、百位数,然后判断它是否为“水仙花数”。 设n为一个三位数,i、j、k分别为百位,十位和个位,怎样获得i、j、k呢?,49,#include void main() int i, j, k, n; printf(water flower number is:);,50,for(n=100; n1000; n+) i=n/100; j=n/10%10; k=n%10; if(n = i*i*i+j*j*j+k*k*k) printf(%-5d
20、, n); printf(n); ,51,【例4-11】有一分数序列:2/1,3/2,5/3,8/5,3/8,.,求出这个数列的前20项之和,题目分析:,a = a+b b = a,t = a,t,52,#include void main() int n, t, number = 20; float a = 2, b = 1, s = 0; for(n = 1; n = number; n+) s = s + a/b; t = a; a = a + b; b = t; printf(sum is %9.6fn, s); ,53,几种循环的比较,for和while先判断循环条件后执行循环体,d
21、o-while语句先执行循环体后判断循环条件。 while、do-while、for可以相互替换使用。 通常使用情况 while语句多用于循环次数不定的情况。 for语句多用于循环次数固定的情况。 do-while语句多用于至少要运行一次的循环控制,54,(3)用for循环语句 #include void main() int s = 0, i; for (i=1;i=10;i+) s = s+i; printf(s=%d,s); ,54,【例4-12】求s=1+2+3+10,分别用三种循环语句实现,比较他们的异同。,(2)用dowhile循环 #include void main() int
22、 s=0,i=1; do s=s+i; i+; while(i=10); printf(s=%d,s); ,(1)用while循环 #include void main() int s= 0, i=1; while(i = 10) s = s+i; i+; printf(s=%d, s); ,55,4.5 循环的嵌套,三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉,(1)while() while() . ,(2)do do while( ); . while( );,(3)while() do while( ); . ,56,main() int i, j, k;
23、 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); ,【例4-13】 分析程序的运行结果,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1,i,j,k,57,【例4-14】 打印出乘法九九表,58,找一找 i和j的规律 行i从19,即i (1i9) 列j从1i,即j (1ji),59,#include main() int i, j; for(i=1; i=9; i+) for(j=1; j=i; j+) pr
24、intf(%d*%d=%-3dt, j, i, j*i); printf(n); ,60,【例4-15】两个乒乓球队进行比赛,各出三人。甲队为a、b、c三人,乙队为x、y、z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x、z比,请编程序找出三对比赛选手的名单。,题目分析 分别用三个字符变量i、j、k表示甲队a、b、c三人的对手 用穷举法把所有的情况列出来,把a、b、c三人对手是同一个人的情况排除,再把a的对手是x,c的对手是x和z的情况排除。,61,#include void main() char i,j,k; for(i=x; i=z; i+) for(j
25、=x; j=z; j+) for(k=x; k=z; k+) if( i!=j ,62,例 用循环打印出如下的图形,* * * * * * * * * * * * * * *,1、简化问题 1i5 1j5 2、稍复杂一点 1i5 1ji 3、再复杂一点 1i5 1j5-i,* * * * * * * * * * * * * * * * * * * * * * * * *,* * * * * * * * * * * * * * *,63,#include main() int i, j, k; for(i=1; i=5; i+) for(j=1; j=5-i; j+) printf( ); fo
26、r(j=1; j=i; j+) printf(*); printf(n); ,打印第i行的空格,打印第i行的星号,打印第i行的换行符,64,4.6循环的中途退出,break语句中止语句 功能:在循环语句和switch语句中,终止并跳出循环体或开关体 说明: break只能终止并跳出最近一层的结构 Break只能用于循环语句或switch语句,65,exp, ,F,T,while,break;,break;,break;,66,67,void main() int n; for (n=1; n=10; n+) if (n%2 = 0) break; printf(“%5d”,n); ,运行结果为
27、: 1,写出程序的运行结果,68,【例4-16】从键盘上输入一个正整数n,判断n是否为素数。,分析 素数:只能被1和它本身整除的自然数 Step1 先输入任意一个正整数n Step2 令除数i从2n-1取值,检查i能否被n整除,若整除则不用继续检查了,否则继续Step2 Step3 若in-1,则表明任意i都不能整除n,则n是素数,否则n不是素数,69,#include void main() int n, i; printf(please input a number:); scanf(%d, ,70,程序改进,为了提高程序的执行效率,缩小检验区间 检验区间:,2n-1,2sqrt(n),7
28、1,#include #include void main() int n, i; printf(please input a number:); scanf(%d, ,sqrt(n);,72,continue语句中断语句 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,73,假(0),exp3,continue;,continue;,continue;,74,void main() int n; for (n=1;n=10;n+) if (n%2=0) continue; printf(“%5d”,n); ,break;,运行结果为: 1 3
29、 5 7 9,运行结果为: 1,写出程序的运行结果,75,【例4-17】 输出能被3和7整除的三位正整数,#include void main() int i; for(i=100;i1000;i+) if(i%3!=0) continue; if(i%7!=0) continue; printf( %d,i); printf(n); ,76,4.7算法举例,穷举法 递推法 迭代法,77,穷举法,基本思想:对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止 穷举法是一种重复型算法,通常使用循环 穷举法的关键 数学模型 适宜进行穷举的数学模型 决定程序是否正确 穷举的范围 明确
30、的穷举终止条件 决定穷举的效率,范围过大,则效率太低,78,【例4-18】百钱买百鸡,这是一个经典的不定方程的求解问题。其问题如下:公鸡5元一只;母鸡3元一只;小鸡一元3只。问:用100元钱买100只鸡,公鸡、母鸡、小鸡各买多少只?,题目分析: 设:要买x只公鸡,y只母鸡,z只小鸡 列出方程为: x + y + z = 100 5x +3y + z/3 = 100,5,3,1/3,0 x20 0y33 0z100 (z必须是3的倍数),79,#include void main() int x, y, z, n=0; printf(序号 公鸡 母鸡 小鸡n); for(x=0; x=20; x+) for(y=0; y=33; y+) z=100-x-y; if(15*x+9*y+z=300 ) printf(%4d %4d %4d %4dn, +n, x, y, z); ,80,递推法,基本思想 是从已知的初始条件出发,逐步推出题目所要求的各中间结果和最后结果的算法,81,【例4-19】求n!,题目分析: n!=1*2*3*n=n*(n-1)!; 我们首先求出1!;计算2*1!,则推出2!;进一步推出3!、4!n!,82,#inc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 军事理论与国防教育(河北软件职业技术学院)知到智慧树答案
- 城轨交通工程材料考试课模拟试卷A
- 《内环境与稳态》课件
- 乡村卫生室建设项目可行性研究报告
- 《排序题解题技巧》课件
- 《患者饮食护理》课件
- 道德讲堂课件-个人品德篇
- (部编版八年级《政治》课件)第2课时-坚持国家利益至上
- 高鼎《村居》课件
- 《精美培训小故事》课件
- 2024年非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力试题及答案
- 绿化工程完工质量验收报告
- 《妇产科学》课件-15.3绝经综合征
- 2024宾馆装修合同样本
- 2024年度智慧农业项目开发与实施合同
- DB14-T 2862-2023 柿树容器大苗培育技术规程
- 2024年湖南省中考英语真题卷及答案解析
- 储能科学与工程基础知识单选题100道及答案解析
- 食品干杂供销合同(2篇)
- 湖北省鄂东南省级示范高中教育教学改革联盟学校2024-2025学年高一上学期期中联考英语试题 含答案
- 2024-2025学年河南省“金太阳联考”高一年级上学期期中考试数学试题(含答案)
评论
0/150
提交评论