1、第第5 5章章 循环结构程序设计循环结构程序设计 北京科技大学北京科技大学 计算机系计算机系C C 语言程序设计语言程序设计第1页/10/102问题问题1 1:怎样依据收入,确定一个人纳税百分比及纳税额怎样依据收入,确定一个人纳税百分比及纳税额怎样依据收入,确定一个人纳税百分比及纳税额怎样依据收入,确定一个人纳税百分比及纳税额?当一个企业有多名员工时,怎样计算每个人纳当一个企业有多名员工时,怎样计算每个人纳当一个企业有多名员工时,怎样计算每个人纳当一个企业有多名员工时,怎样计算每个人纳税百分比及纳税额?税百分比及纳税额?税百分比及纳税额?税百分比及纳税额?提出提出问题:C语言:语言:循环语句循
2、环语句 问题问题2 2怎样依据学生分数判断是否及格?怎样依据学生分数判断是否及格?怎样依据学生分数判断是否及格?怎样依据学生分数判断是否及格?怎样依据全班学生分数,分别判怎样依据全班学生分数,分别判怎样依据全班学生分数,分别判怎样依据全班学生分数,分别判断他们是否及格?断他们是否及格?断他们是否及格?断他们是否及格?第2页/10/103本章主要内容本章主要内容l lwhile循环控制循环控制l ldo-while循环控制循环控制l lfor循环控制循环控制l l用用goto语句实现循环控制语句实现循环控制l l循环结构中跳转语句循环结构中跳转语句l l循环嵌套循环嵌套l l循环结构程序设计举例
3、循环结构程序设计举例第3页/10/1045.1 while循循环控制控制 l l语句普通格式句普通格式 while(表示式表示式)语句语句 l l普通为普通为普通为普通为关系关系关系关系表示式表示式表示式表示式或或或或逻辑逻辑逻辑逻辑表示式,也表示式,也表示式,也表示式,也能够是能够是能够是能够是C C语言其它类语言其它类语言其它类语言其它类型正当表示式型正当表示式型正当表示式型正当表示式 l l用来控制循环体是用来控制循环体是用来控制循环体是用来控制循环体是否执行否执行否执行否执行l l称为称为称为称为内嵌语句内嵌语句内嵌语句内嵌语句,能够是基本语句、能够是基本语句、能够是基本语句、能够是基
4、本语句、控制语句,也能控制语句,也能控制语句,也能控制语句,也能够是复合语句够是复合语句够是复合语句够是复合语句l l是循环重复执行是循环重复执行是循环重复执行是循环重复执行部分部分部分部分 第4页/10/105功效:功效:l l计计算表示式算表示式算表示式算表示式值值,为为非非非非0 0(逻辑逻辑真)真)真)真)时时,重复,重复,重复,重复执执行行行行内嵌内嵌内嵌内嵌语语句句句句,每,每,每,每执执行一次,就判断一次表示式行一次,就判断一次表示式行一次,就判断一次表示式行一次,就判断一次表示式值值,直到表示式直到表示式直到表示式直到表示式值为值为0 0 时结时结束循束循束循束循环环,转转去去
5、去去执执行行行行whilewhile后面后面后面后面语语句。句。句。句。当表示式为真当表示式为真 语句语句N-SN-S结构图结构图结构图结构图N NY Y流程图流程图流程图流程图表表示示式式非非0?语句语句循环控制条件循环控制条件循环控制条件循环控制条件循环体循环体循环体循环体第5页/10/106比如:比如:【例【例5.1】编写程序,求】编写程序,求100个自然数和个自然数和即:即:s=1+2+3+100 思绪:寻找思绪:寻找加数加数与与求和求和规律规律 加数加数i i从从1变到变到100,每循环一次,使,每循环一次,使i增增1,直到直到i值超出值超出100。i i初值初值初值初值设为设为1。
6、求和求和设变量设变量 sum sum 存放和存放和,循环求,循环求sum=sum+isum=sum+i,直至直至i超出超出100。第6页/10/107算法和程序:算法和程序:main()int i,sum;i=1;sum=0;while(i=100)sum=sum+i;i+;printf(sum=%dn,sum);运行运行jc5_1程序输出结果:程序输出结果:sum=5050i i:循环控制变量循环控制变量sumsum:累加器累加器 i=1,sum=0 当当i=100 sum=sum+i i+输出输出sum第7页/10/108注意:注意:l l假如假如while(表示式表示式)值为0,则循循环
7、体一体一次也不次也不执行行(比如当比如当i初初值=101)。l l在循在循环体中必体中必须有使循有使循环趋向向结束操作,束操作,不然循不然循环将无限将无限进行(行(死循死循环)。)。l l在循在循环体中,体中,语句先后位置必句先后位置必须符合符合逻辑,不然会影响运算不然会影响运算结果。果。思索程序段输出?思索程序段输出?while(i=100)i+;sum=sum+i;运行后,输出:运行后,输出:运行后,输出:运行后,输出:sum=5150sum=5150原因是什么?原因是什么?原因是什么?原因是什么?第8页/10/109 int i=0;while(+i=100+i +i;+i;判断判断判断
8、判断 i=100i=100 sum+=i;int i=0;while(i+100i+判断判断判断判断i100i100;i+i+sum+=i;int i=0;while(i +i;sum+=i+i;sum+=i不一不一样while 语句形式句形式设:设:sum=0;int i=1;while(i sum+=i;+i;sum+=i;+i;运行结束后:运行结束后:i i、sum=?sum=?运行结束后运行结束后:i=101,sum=5050i=101,sum=5050i=101,sum=5050i=101,sum=5050i=101,sum=5050i=101,sum=5050i=101,sum=5
9、050i=101,sum=5050i=101,sum=5050i=101,sum=5050i=101,sum=5050i=101,sum=5050i=100,sum=5050i=100,sum=5050i=100,sum=5050i=100,sum=5050运行运行运行运行jC5_ajC5_ajC5_ajC5_a第9页/10/1010其它其它while 语句形式句形式l lwhile(while(0 0).).因为表示式恒等于因为表示式恒等于因为表示式恒等于因为表示式恒等于0 0,所以循环体永远也不,所以循环体永远也不,所以循环体永远也不,所以循环体永远也不会执行,是一个逻辑会执行,是一个逻辑
10、会执行,是一个逻辑会执行,是一个逻辑错误语句错误语句错误语句错误语句l lwhile(while(1 1).).因为表示式恒等于因为表示式恒等于因为表示式恒等于因为表示式恒等于1 1,所以不可能经过循环,所以不可能经过循环,所以不可能经过循环,所以不可能经过循环控制条件来结束循环体执行,即控制条件来结束循环体执行,即控制条件来结束循环体执行,即控制条件来结束循环体执行,即死循环死循环死循环死循环。l l为了确保循环正常运行,应该尤其注意:为了确保循环正常运行,应该尤其注意:为了确保循环正常运行,应该尤其注意:为了确保循环正常运行,应该尤其注意:循环控制条件描述循环控制条件描述循环控制条件描述循
11、环控制条件描述 控制条件初始状态(初始值)控制条件初始状态(初始值)控制条件初始状态(初始值)控制条件初始状态(初始值)循环体内部对控制条件影响循环体内部对控制条件影响循环体内部对控制条件影响循环体内部对控制条件影响第10页/10/10115.2 do-while语句句l l语句普通格式句普通格式 do 语句语句 while(表示式表示式););l l功效:功效:先执行内嵌语句先执行内嵌语句(循环体),之后计算(循环体),之后计算表示式值,不为表示式值,不为0(逻辑真)时,再执(逻辑真)时,再执行循环体并判断条件,直到表示式值为行循环体并判断条件,直到表示式值为 0 结束循环,转去执行结束循环
12、,转去执行while下面语句。下面语句。第11页/10/1012 do-while循循环算法算法 循环体循环体当表示式为真当表示式为真N-S结构图结构图NY循环体循环体表示式非表示式非0?流程图流程图main()main()int i=1,sum=0;int i=1,sum=0;dodo sum=sum+i;sum=sum+i;i+;i+;while(i=100);while(i=100);printf(%dn,sum);printf(%dn,sum);用用用用do-whiledo-while语句语句语句语句求求求求100100个自然数和个自然数和个自然数和个自然数和 第12页/10/1013
13、说明:明:l lwhile和和do-while都能都能实现循循环控制,控制,while结构程序通常都能构程序通常都能够转换成成do-while结构构l l区分:区分:do-while 语句语句先执行循环体再判断条先执行循环体再判断条件,循环体件,循环体最少执行一次最少执行一次;while 语句语句先判断条件再执行循环体,先判断条件再执行循环体,循环体有可能一次也不执行循环体有可能一次也不执行l ldowhile循环体中一定要有能使表示式值循环体中一定要有能使表示式值趋于趋于0操作操作(如如i+),不然会出现不然会出现死循环死循环。第13页/10/1014do-while语句句简单应用用【例【例
14、5.3】用辗转相除法求】用辗转相除法求m和和n最大条约数最大条约数思绪:思绪:先求先求m和和n相除余数相除余数r然后将然后将mn,将将nr,并判断并判断r(或或n)假如假如r0,再重复求余数,直到再重复求余数,直到 r 等于等于 0 时结束循环时结束循环此时此时m为最大条约数为最大条约数第14页/10/1015算法和程序:算法和程序:main()main()int m,n,r;int m,n,r;scanf(%d,%d,&m,&n);scanf(%d,%d,&m,&n);if(mn)if(mn)r=m;m=n;n=r;r=m;m=n;n=r;dodo r=m%n;r=m%n;m=n;n=r;m
15、=n;n=r;while(r!=0);while(r!=0);printf(%dn,m);printf(%dn,m);运行运行jc5_3程序运行情况以下:程序运行情况以下:程序运行情况以下:程序运行情况以下:24,6024,60 1212定义定义m、n、rmnT F m和和n交换交换r=m%nm=nn=r 当当r!=0时时输出最大条约数输出最大条约数m第15页/10/10165.3 for语句句 l l语句普通格式句普通格式 for(表示式表示式1;表示式表示式2;表示式表示式3)语句语句 l l功效:功效:计算表示式计算表示式计算表示式计算表示式1 1值,再值,再值,再值,再判断表示式判断表
16、示式判断表示式判断表示式2 2,假如其值,假如其值,假如其值,假如其值为非为非为非为非0 0(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(逻辑真),则执行内嵌语句(循环体循环体循环体循环体),并,并,并,并计算表示式计算表示式计算表示式计算表示式3 3;之后再去判断表示式;之后再去判断表示式;之后再去判断表示式;之后再去判断表示式2 2,一直到其值为一直到其值为一直到其值为一直到其值为0 0时结束循环,执行后续语句。时结束循环,执行后续语句。时结束循环,执行后续语句。时结束循环,执行后续语句。循环初始条件循环初始条件循环初始条件循环初始条件循环控制条件循环控制
17、条件循环控制条件循环控制条件循环体循环体循环体循环体第16页/10/1017for语句算法句算法N-S结构图结构图for(表示式表示式1;表示式表示式2;表示式表示式3)语句语句NY流程图流程图计算表示式计算表示式1 语句语句计算表示式计算表示式3表示式表示式2为真为真?比如:比如:比如:比如:main()main()int i,sum;int i,sum;sum=0;sum=0;for(i=1;i=100;i+)for(i=1;i=100;i+)sum=sum+i;sum=sum+i;printf(sum=%dn,sum);printf(sum=%dn,sum);可部分或全部省略,可部分或全
18、部省略,可部分或全部省略,可部分或全部省略,但但但但“;”不可省略不可省略不可省略不可省略第17页/10/1018省略省略for语句表示式句表示式 表示式表示式表示式表示式1 1、2 2、3 3全省略,全省略,全省略,全省略,即:即:即:即:for(;)for(;)就等同于:就等同于:就等同于:就等同于:while(while(1)1),会无限循环(会无限循环(会无限循环(会无限循环(死循环死循环死循环死循环)注意:在省略某个表示式时,应在适当位置进行循注意:在省略某个表示式时,应在适当位置进行循环控制必要操作,以确保循环正确执行环控制必要操作,以确保循环正确执行 省略表示式省略表示式省略表示
19、式省略表示式1 1和表示式和表示式和表示式和表示式3 3,即:即:即:即:for for(;(;(;(;表示式表示式表示式表示式2 2;);););)就等同于:就等同于:就等同于:就等同于:whilewhile(表示式表示式表示式表示式2 2)省略表示式省略表示式省略表示式省略表示式2 2,即:即:即:即:forfor(表示式表示式表示式表示式1 1;表示式;表示式;表示式;表示式3 3)就等同于:就等同于:就等同于:就等同于:表示式表示式表示式表示式1;1;while(1while(1)表示式表示式表示式表示式3;3;第18页/10/1019比如:比如:i=1;for(;i100)for(i
20、=1;i100)i+;第19页/10/1020说明:明:l l全部用全部用 while 语句句实现循循环都能都能够用用for 语句句实现。等价于:等价于:for(表示式表示式1;表示式表示式2;表示式表示式3)语句;语句;表示式表示式1;while(表示式表示式2)语句;语句;表示式表示式3;第20页/10/1021for语句句简单应用用【例【例5.4】求】求n!,即计算即计算p=123n值。值。思绪:求阶乘与求累加运算处理过程类似,只要将思绪:求阶乘与求累加运算处理过程类似,只要将“+”变为变为“*”。设置:设置:乘数乘数乘数乘数i i,初值为,初值为1,终值为,终值为n(n是循环控制终是循
21、环控制终值,需要从键盘输入)值,需要从键盘输入)累乘器累乘器累乘器累乘器 p p,每次循环令,每次循环令p=p*i第21页/10/1022程序:程序:main()int i,n;long p;p=1;printf(Enter n:);scanf(%d,&n);for(i=1;i=n;i+)p=p*i;printf(p=%ld n,p);思索:思索:思索:思索:怎样输出怎样输出怎样输出怎样输出1!,2!,1!,2!,n!n!?怎样求怎样求怎样求怎样求s=1!+2!+n!s=1!+2!+n!?运行运行jc5_4第22页/10/1023熟悉几个循熟悉几个循环语句句l lwhile(!x)x+;whi
22、le(!x)x+;当当当当 x=0 x=0 时,执行循环体时,执行循环体时,执行循环体时,执行循环体x+;x+;l lwhile(c=getchar()!=n)n=n+1;while(c=getchar()!=n)n=n+1;n n 称为称为称为称为计数器计数器计数器计数器,作用是统计输入字符个数,作用是统计输入字符个数,作用是统计输入字符个数,作用是统计输入字符个数l lwhile(num+=2);printf(%dn,num);while(num+5);do x*=-3;while(x5);先执行循环体先执行循环体先执行循环体先执行循环体x*=-3x*=-3,再判断条件再判断条件再判断条件
23、再判断条件(x5)(x5)l lfor(n=0;n26;n+)printf(%c ,n+A);for(n=0;n26;n+)printf(%c ,n+A);作用是作用是作用是作用是输出输出输出输出2626个大写字母个大写字母个大写字母个大写字母l lfor(sum=0,i=1;i=100;sum=sum+i,i+=2);for(sum=0,i=1;i=100;sum=sum+i,i+=2);作用是作用是作用是作用是计算计算计算计算100100以内奇数和以内奇数和以内奇数和以内奇数和 第23页/10/1024几个循几个循环语句比句比较l lwhilewhile和和和和do-whiledo-whi
24、le语句语句语句语句表示式表示式表示式表示式只有只有只有只有一个一个一个一个,forfor语句语句语句语句有有有有三个三个三个三个。l lwhile while 和和和和forfor先判断先判断先判断先判断循环条件循环条件循环条件循环条件后执行后执行后执行后执行循环体,循环体,循环体,循环体,do-do-whilewhile语句语句语句语句先执行先执行先执行先执行循环体循环体循环体循环体后判断后判断后判断后判断循环条件。循环条件。循环条件。循环条件。whilewhile语句多用于语句多用于语句多用于语句多用于循环次数不定循环次数不定循环次数不定循环次数不定情况情况情况情况do-whiledo-
25、while语句多用于语句多用于语句多用于语句多用于最少要运行一次最少要运行一次最少要运行一次最少要运行一次情况情况情况情况forfor语句语句语句语句多用于要多用于要多用于要多用于要赋初值赋初值赋初值赋初值或或或或循环次数固定循环次数固定循环次数固定循环次数固定情况情况情况情况第24页/10/10255.4 用用goto语句句实现循循环l有有兴趣同学自学趣同学自学l不提倡使用不提倡使用goto语句句注意注意:goto语句能实现程序无条件转移,为编程语句能实现程序无条件转移,为编程提供了便利。不过无限制地使用,会破坏提供了便利。不过无限制地使用,会破坏程序结构化程度。程序结构化程度。所以应限制使
26、用。所以应限制使用。第25页/10/10265.5 循循环结构中跳构中跳转语句句l l有以下三种有以下三种语句句实现跳跳转:continue语句语句 break语句语句 goto语句语句l l在循在循环语句循句循环体中使用,能体中使用,能够进行循行循环流程控制流程控制第26页/10/1027后续语句后续语句语句语句Y YN N表示式表示式表示式表示式?后续语句后续语句语句语句表示式表示式表示式表示式?Y YN N5.5.1 continue语句及句及应用用 l l功效:功效:中止循环体中止循环体中止循环体中止循环体此次此次此次此次执行(即跳过循环体中还未执行(即跳过循环体中还未执行(即跳过循环
27、体中还未执行(即跳过循环体中还未执行语句),马上开始执行下一次循环。执行语句),马上开始执行下一次循环。执行语句),马上开始执行下一次循环。执行语句),马上开始执行下一次循环。continue;continue;whilewhile语句语句语句语句continue;continue;do-whiledo-while语句语句语句语句后续语句后续语句计算表示式计算表示式计算表示式计算表示式3 3计算表示式计算表示式计算表示式计算表示式1 1语句语句语句语句表示式表示式表示式表示式2?2?Y YN Ncontinue;continue;forfor语句语句语句语句第27页/10/1028比如:比如:
28、int x,n=0,s=0;int x,n=0,s=0;while(n10)while(n10)scanf(%d,&x);scanf(%d,&x);if(x0)continue;if(x0)continue;s+=x;n+;s+=x;n+;int x,n=0,s=0;int x,n=0,s=0;dodo scanf(%d,&x);scanf(%d,&x);if(x0)continue;if(x0)continue;s+=x;n+;s+=x;n+;while(n10);while(n10);for(n=0,s=0;n10;)for(n=0,s=0;n10;)scanf(%d,&x);scanf(
29、%d,&x);if(x0)continue;if(x0)continue;s+=x;n+;s+=x;n+;第28页/10/1029应用用举例例【例【例5.7】把】把100200之间能被之间能被7整除数,整除数,以十个数为一行形式输出,最终输以十个数为一行形式输出,最终输出一共有多少个这么数。出一共有多少个这么数。思绪:思绪:思绪:思绪:设变量设变量设变量设变量n n,从从从从100100改变到改变到改变到改变到200200;对每个对每个对每个对每个n n进行判断,进行判断,进行判断,进行判断,当当当当n n不能被不能被不能被不能被7 7整除时,终止此次整除时,终止此次整除时,终止此次整除时,终
30、止此次循环,循环,循环,循环,不然就输出这个数;不然就输出这个数;不然就输出这个数;不然就输出这个数;设变量设变量设变量设变量j j作为输出个数计数器,每输出一个数就令作为输出个数计数器,每输出一个数就令作为输出个数计数器,每输出一个数就令作为输出个数计数器,每输出一个数就令j j+;当输出了当输出了当输出了当输出了1010个数时(即个数时(即个数时(即个数时(即j%10j%10等于等于等于等于0 0),输出),输出),输出),输出 n n退出循环后输出退出循环后输出退出循环后输出退出循环后输出j j值。值。值。值。第29页/10/1030算法和程序算法和程序main()main()int n
31、,j=0;int n,j=0;for for(n=100;n=200;n+)(n=100;n=200;n+)if(n%7!=0)if(n%7!=0)continue;continue;printf(%6d,n);printf(%6d,n);j+;j+;if(j%10=0)if(j%10=0)printf(n);printf(n);printf(n);printf(n);printf(j=%dn,j);printf(j=%dn,j);for(n=100;n=200;n+)n不能被不能被7整除整除 T F 终止此次循环终止此次循环 输出输出n 输出输出10个数个数 T F 换行换行运行运行jc5_
32、7第30页/10/1031后续语句后续语句语句语句Y YN N表示式表示式表示式表示式?后续语句后续语句语句语句表示式表示式表示式表示式?Y YN N5.5.2 循循环中中break应用用l l功效:功效:利用利用break语句能够强迫终止语句能够强迫终止本层本层循环,循环,转到后续语句执行。转到后续语句执行。break;break;whilewhile语句语句语句语句break;break;do-whiledo-while语句语句语句语句后续语句后续语句计算表示式计算表示式计算表示式计算表示式3 3计算表示式计算表示式计算表示式计算表示式1 1语句语句语句语句表示式表示式表示式表示式2?2?
33、Y YN Nbreak;break;forfor语句语句语句语句第31页/10/1032比如:比如:int x,n=0,s=0;int x,n=0,s=0;while(n10)while(n10)scanf(%d,&x);scanf(%d,&x);if(x0)break;if(x0)break;s+=x;n+;s+=x;n+;int x,n=0,s=0;int x,n=0,s=0;dodo scanf(%d,&x);scanf(%d,&x);if(x0)break;if(x0)break;s+=x;n+;s+=x;n+;while(n10);while(n10);for(n=0,s=0;n10
34、;n+)for(n=0,s=0;n10;n+)scanf(%d,&x);scanf(%d,&x);if(x0)break;if(x0)break;s+=x;s+=x;第32页/10/10335.6 循循环嵌套嵌套l l假如循假如循环语句循句循环体内又包含了另一条循体内又包含了另一条循环语句,句,则称称为循循环嵌套嵌套l l比如:比如:#include main()int i,j;for(for(i=1;i10;i+i=1;i10;i+)for(for(j=1;j=j=1;j=i i;j+;j+)printf(j=i)?%4dn:%4d,i*j);printf(j=i)?%4dn:%4d,i*j
35、);运行运行jc5_a外循环语句外循环语句内循环语句内循环语句外循环体外循环体外循环体外循环体内循环体内循环体内循环体内循环体第33页/10/1034注意:注意:lwhile、do-while、for循循环语句能句能够并列,并列,也能也能够相互嵌套,但相互嵌套,但要要层次清楚,不能出次清楚,不能出现交叉。交叉。l l多多重重循循环程程序序执行行时,外外层循循环每每执行行一一次,内次,内层循循环都需要循都需要循环执行屡次。行屡次。l l比如:比如:for(a=1;a=10;a+)for(b=0;b2n2)f fn n=l l设设设设 变变变变 量量量量 f1f1、f2f2和和和和 f3f3,并并
36、并并 为为为为 f1f1和和和和 f2f2赋赋赋赋 初初初初 值值值值 1 1,令令令令f3=f1+f2f3=f1+f2得到第得到第得到第得到第3 3项;项;项;项;l l将将将将f1f2f1f2,f2f3 f2f3,再求再求再求再求f3=f1+f2f3=f1+f2得到第得到第得到第得到第4 4项;项;项;项;l l依这类推求第依这类推求第依这类推求第依这类推求第5 5项、第项、第项、第项、第6 6项项项项这是一个这是一个这是一个这是一个递推算法递推算法递推算法递推算法应采取循环实现应采取循环实现应采取循环实现应采取循环实现第35页/10/1036算法和程序算法和程序#define defin
37、e N N 20 20main()main()int i,f1,f2,f3;int i,f1,f2,f3;f1=f2=1;f1=f2=1;printf(n%8d%8d,f1,f2);printf(n%8d%8d,f1,f2);for(i=3;i=for(i=3;i=N N;i+);i+)f3=f1+f2;f3=f1+f2;f1=f2;f1=f2;f2=f3;f2=f3;printf(%8d,f3);printf(%8d,f3);if(i%5=0)printf(n);if(i%5=0)printf(n);f1=1,f2=1并输出并输出for(i=3;i=20;i+)f3=f2+f1 f1=f2,
38、f2=f3 输出输出f3 输出输出输出输出5 5个数个数个数个数 T F 换行换行运行运行jc5_5第36页/10/1037举例例2【例【例5.12】判断输入某个数】判断输入某个数m是否为素数。是否为素数。若是素数,输出若是素数,输出“YES”,若不是,若不是,输出输出“NO”。思绪:素数是指只能被思绪:素数是指只能被思绪:素数是指只能被思绪:素数是指只能被1 1和它本身整除数,如和它本身整除数,如和它本身整除数,如和它本身整除数,如5 5、7 7、1111、1717、等。等。等。等。l分分别别用用2 2、3 3、,m-1m-1尝尝试试能能否否整整除除整整数数m m m m。假如假如假如假如m
39、m能被某个能被某个能被某个能被某个数数数数整除,则整除,则整除,则整除,则mm就不是素数就不是素数就不是素数就不是素数。l l这是一个这是一个这是一个这是一个穷举算法穷举算法穷举算法穷举算法l l设除数为设除数为设除数为设除数为j j,从从从从2 2循环到循环到循环到循环到m-1m-1第37页/10/1038算法和程序:算法和程序:#include math.hinclude math.hmain()main()int j,m,k;int j,m,k;printf(Enter an integer number:);printf(Enter an integer number:);scanf(
40、%d,&m);scanf(%d,&m);for(j=2;for(j=2;j=m-1j=mj=m)printf(YESn);printf(YESn);else else printf(NOn);printf(NOn);输入一个数输入一个数mfor(j=2;j=m T F输出输出YES“输出输出NO运行运行jc5_12第38页/10/1039程序程序优化化l l对于于穷举法法来来说,为了提升程序效率,就了提升程序效率,就要降低要降低尝试次数次数。#include math.hmain()int j,m,k;printf(Enter an integer number:);scanf(%d,&m);
41、k=sqrt(m);k=sqrt(m);for(j=2;j=kj=k+1j=k+1)printf(YESn);else printf(NOn);设设设设m=15m=15,1515=3 3*5 5;尝试了尝试了尝试了尝试了1515%3 3 后,没有必后,没有必后,没有必后,没有必要再尝试要再尝试要再尝试要再尝试1515%5 5即:即:即:即:k k是尝试中点是尝试中点是尝试中点是尝试中点作业作业作业作业(1)(1):怎样输出:怎样输出:怎样输出:怎样输出100100200200中全部素数中全部素数中全部素数中全部素数 ,4,4个个个个1 1行行行行第39页/10/1040举例例3【例【例5.13
42、】用牛顿迭代法求方程】用牛顿迭代法求方程 2x3+4x2-7x-6=0 在在x=1.5附近根。附近根。思绪:思绪:思绪:思绪:设设xn为一个靠近为一个靠近xa近似根,过近似根,过(xn,f(xn)点点做切线,切线方程为:做切线,切线方程为:即即:xnxn+1xy0f(x)(xn,f(xn)(xn+1,f(xn+1)xa 方程根方程根方程根方程根牛顿迭代公式牛顿迭代公式牛顿迭代公式牛顿迭代公式 第40页/10/1041算法基本步算法基本步骤:先先先先设设设设一一一一个个个个方方方方程程程程近近近近似似似似根根根根x0 x0,求求求求出出出出方方方方程程程程f f值值值值和和和和方方方方程程程程导
43、导导导数数数数f1f1值值值值;f=f=2 2x0 x03 3+4+4x0 x02 2-7-7x0 x0-6-6f1=f1=6 6x0 x02 2+8+8x0 x0-7-7 用用用用迭迭迭迭代代代代公公公公式式式式x x=x0-f/f1=x0-f/f1进进进进行行行行迭迭迭迭代代代代,求求求求出出出出x x比比比比x0 x0要要要要靠靠靠靠近方程真实根;近方程真实根;近方程真实根;近方程真实根;当当当当|x x-x0 x0|大大大大于于于于某某某某个个个个很很很很小小小小数数数数时时时时(如如如如1010-6)-6),认认认认为为为为未未未未找找找找到到到到,此此此此时时时时将将将将x xx0
44、 x0,再再再再次次次次求求求求f f、f1f1,并并并并迭迭迭迭代代代代,又又又又求求求求出出出出一个新更靠近方程根一个新更靠近方程根一个新更靠近方程根一个新更靠近方程根x x;一直到一直到一直到一直到|x x-x0 x0|1010-6-6时得到方程近似根:时得到方程近似根:时得到方程近似根:时得到方程近似根:x x或或或或x0 x0。l l这是一个这是一个这是一个这是一个迭代算法迭代算法迭代算法迭代算法l l用循环实现用循环实现用循环实现用循环实现第41页/10/1042算法和程序:算法和程序:#include math.hinclude math.hmain()main()float x
45、,x0,f,f1;float x,x0,f,f1;x=1.5x=1.5;do do x0=x;x0=x;f=f=2*x0*x0*x0+4*x0*x0-7*x0-6;2*x0*x0*x0+4*x0*x0-7*x0-6;f1=6*x0*x0+8*x0-7;f1=6*x0*x0+8*x0-7;x=x0-f/f1;x=x0-f/f1;while(while(fabs(x-x0)fabs(x-x0)1e-61e-6););printf(%fn,x);printf(%fn,x);x赋初值赋初值x0=x计算计算f计算计算f1 计算计算x=x0-f/f1当当|x-x0|10-6时时输出输出x运行运行jc5_1
46、3第42页/10/1043举例例4【例【例5.11】编程序求】编程序求210000以内完全数。以内完全数。完全数:完全数:完全数:完全数:一个数因子(除了这个数本身)之和等一个数因子(除了这个数本身)之和等于该数本身。于该数本身。思绪:思绪:思绪:思绪:设定设定设定设定i i从从从从2 2变到变到变到变到1000010000,对每个,对每个,对每个,对每个i i找到其因子和找到其因子和找到其因子和找到其因子和s s;判定判定判定判定 i=si=s?若相等,则若相等,则若相等,则若相等,则i i为完全数,不然不是。为完全数,不然不是。为完全数,不然不是。为完全数,不然不是。比如:比如:比如:比如
47、:6 6因子因子是是1、2、3,因子和因子和 1+2+36 6所以所以所以所以 6 6 是完全数是完全数是完全数是完全数l l使用使用使用使用穷举算法穷举算法穷举算法穷举算法l l用用用用双层循环双层循环双层循环双层循环实现实现实现实现第43页/10/1044算法和程序:算法和程序:main()main()int i,j,s;int i,j,s;forfor (i=2;i=10000;i+)(i=2;i=10000;i+)s=0;s=0;forfor(j=1;ji;j+)(j=1;ji;j+)if(i%j=0)if(i%j=0)s+=j;s+=j;if(i=s)if(i=s)printf(%6
48、dn,s);printf(%6dn,s);for(i=2;i=10000;i+)s=0 for(j=1;ji;j+)i%j=0 T F s=s+j i=s T F i是完全数是完全数运行运行jc5_11第44页/10/1045举例例5【例【例5.10】编程序,输出以下列图形。】编程序,输出以下列图形。*一共有一共有一共有一共有4 4 行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数按行增加,星号按行降低按行增加,星号按行降低按行增加,星号按行降低按行增加,星号按行降低变量变量变量变量 i i 控制输出行数,控制输出
49、行数,控制输出行数,控制输出行数,从从从从1 1改变到改变到改变到改变到4 4变量变量变量变量 j j 控制输出每行空格和星号:控制输出每行空格和星号:控制输出每行空格和星号:控制输出每行空格和星号:j j 从从从从1 1改变到改变到改变到改变到 i i,每次输出一个空格每次输出一个空格每次输出一个空格每次输出一个空格 j j 从从从从1 1改变到改变到改变到改变到 8-28-2*i i1 1,每次输出一个星号每次输出一个星号每次输出一个星号每次输出一个星号使用使用使用使用双重循环双重循环双重循环双重循环实现实现实现实现思绪:思绪:思绪:思绪:第45页/10/1046算法和程序:算法和程序:m
50、ain()main()int i,j;int i,j;forfor(i=1;(i=1;i=4i=4;i+);i+)forfor(j=1;(j=1;j=ij=i;j+);j+)printf();printf();forfor(j=1;(j=1;j=8-(2*i-1)j=8-(2*i-1);j+);j+)printf(printf(*););printf(n);printf(n);for(i=1;i=4;i+)for(j=1;j=i;j+)输出一个空格输出一个空格 for(j=1;j=8-(2*i-1);j+)输出一个星号输出一个星号 换行换行作业作业作业作业(2)(2):l l怎样输出怎样输出怎