1、给一个不多于5位的正整数,求它是几位数,分别打印每一位数字,并按逆序打印出各位数字。 求num的各位数字: ten_tho=num/10000; tho=(num-ten_tho*10000)/1000; hun=(num-ten_tho*10000-tho*1000)/100; ten=(num-ten_tho*10000-tho*1000-hun*100)/10; indiv=(num-ten_tho*10000-tho*1000-hun*100-ten*10),习题:,习题:,有4个圆塔,圆心为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1,这4个塔高10m,它以外无
2、建筑物。现输入任意一点的坐标,求该点的建筑高度(塔外高度为0)。,知识点:goto循环while循环dowhile循环for循环break、continue语句 重点:while循环do - while循环for循环 难点:for循环,第6章 循环控制,6.1 概述,循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。 (1) 用goto语句和if语句构成循环;(2) 用while语句;(3) 用dowhile语句;(4) 用for语句。,6.2 goto语句以及用goto语句构成循环,goto语句为无条件转向语句,它的一般形式为goto 语句标号
3、; 例如:goto label1;结构化程序设计方法主张限制使用goto语句。一般来说,可以有两种用途: 与if语句一起构成循环结构; 从多层循环的内层循环跳到外层循环外时才用到goto语句。这种用法不符合结构化原则,一般不宜采用,只有在不得已时(例如能大大提高效率)才使用。,例 用if语句和goto语句构成循环,求 。,6.2 goto语句以及用goto语句构成循环,main() int i, sum=0;i=1;loop: if(i=100) sum=sum+i;i+;goto loop;printf(“nsum=%d“,sum); ,sum=5050,while语句用来实现“当型”循环结
4、构。其一般形式如下:while (表达式) 语句组 当表达式为非0值时,执行while语句中的内嵌语句组。其特点是:先判断表达式,后执行语句组。,6.3 while语句,6.3 while语句,例 求 。用传统流程图和N-S结构流程图表示算法。,main() int i,sum=0;i=1;while (i=100) sum=sum+i;i+; printf(“%d“,sum);,5050,6.3 while语句,例 输入两个正整数m和n,求其最大公约数和最小公倍数。算法:n*m p;大数放在n中,小数放在m中;m!=0,继续;否则,最后一步;r=n%m; mn; r m;回到判断m!=0步;
5、最大公约数为n,最小公倍数为p/n。,input n and m 12,35 greatest common divisor is 1 lease common multiple is 420,6.3 while语句,例 求Sn=a+aa+aaa+aaa n个a之值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5),n由键盘输入。算法:,input a and n:2,5 a+aa+aaa+.=24690,需要注意:循环体如果包含一个以上的语句,应该用“ ”括起来,以复合语句形式出现。在循环体中应有使循环趋向于结束的语句(即改变表达式的值为0)。如果无此语句,则表达
6、式的值始终不改变,循环永不结束。,6.3 while语句,do while语句的一般形式为:do 语句组 while (表达式);先执行一次指定的语句组,然后判别表达式,当表达式的值为非0时,返回重新执行语句组,如此反复,直到表达式的值等于0为止,此时循环结束。其特点是:先执行语句组,后判断表达式。,6.4 do while语句,例 用do_while语句求 。,6.4 do while语句,main() int i,sum=0;i=1;do sum=sum+i;i+; while(i=100);printf(“%d“,sum); ,5050,如果while后面的表达式一开始就为假(0值)时,
7、两种循环的结果是不同的。例 while和do-while循环的比较。2次运行程序,各输入1和11,6.4 do while语句,结论:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同(指二者具有相同的循环体的情况)。,main() int i,sum=0;scanf(“%d“, ,main() int i,sum=0;scanf(“%d“, ,for语句的一般形式为: for(表达式1;表达式2;表达式3) 语句组 执行过程: 先求解表达式1。 求解表达式2,若其值为真(值为非0),则执行for语句中的内嵌语句,然后执行下一步。若为假(值为0),则结
8、束循环。 求解表达式3。 转回上面第二步,继续执行。 循环结束,执行for语句下面的一个语句。,6.5 for 语句,for语句最简单的应用形式也就是最易理解的如下形式:for(循环变量赋初值;循环条件;循环变量增值) 语句组 相当于以下语句:表达式1;while(表达式2)语句表达式3;例: for(i=1;i=100;i+)sum=sum+i;,6.5 for 语句,i=1; while (i=100) sum=sum+i; i+; ,说明:表达式1省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如for(;i=100;i+) sum=sum+i;执行
9、时,跳过“求解表达式1”这一步,其他不变。如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1; ;i+) sum=sum+i;表达式1是一个赋值表达式,表达式2空缺。它相当于: i=1;while(1)sum=sum+1; i+;,6.5 for 语句,表达式3省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=1;i=100;)sum=sum+i; i+;表达式1和表达式3省略,只有表达式2,即只给循环条件,如:for(;i=100;) while(i=100)sum=sum+i; 相当于 sum=sum+i;i+; i
10、+;在这种情况下,完全等同于while语句。,6.5 for 语句,三个表达式都省略for(;) 语句组 相当于 while(1) 语句组。即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。表达式3也如此。表达式1和表达式3也可以是逗号表达式。如:for (sum=0;i=100;i+) sum=sum+i;for(sum=0,i=1;i=100;i+) sum=sum+i; for(i=0,j=100;i=j;i+,j-) k+=i*j;for(i=1;i=100;i+,i+) s
11、um=sum+i;相当于for(i=1;i=100;i=i+2) sum=sum+i;,6.5 for 语句,表达式一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:for(i=0;(c=getchar() != n;i+=c);for( ;(c=getchar()!=n;)printf(“%c“,c);作用是每读入一个字符后立即输出该字符,直到输入一个“换行”为止。注意,从终端键盘向计算机输入时,是在按Enter键以后才送到内存缓冲区中去的。运行情况:computer (输入)computer (输出) 而不是ccoommppuu
12、tteerr,6.5 for 语句,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。三种循环(while循环、dowhile循环和for循环)可以互相嵌套。例如,下面几种都是合法的形式:,6.6 循环的嵌套,(2) dodo while( );while( );,(3) for(;) for(; ;),(4) while( )dowhile( );,(5) for(; ;)while( ) ,(1) while( )while( ),(6) do for (; ;) while( );,四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。while
13、和do.while循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i+,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。用while和dowhile循环时,循环变量初始化的操作应在while和dowhile语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。while循型、dowhile循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。而对用goto语句和if语句构成的循环,不能
14、用break语句和continue语句进行控制。,6.7 几种循环的比较,break语句break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。break语句的一般形式为:break;break语句不能用于循环语句和switch语句之外的任何其他语句中。,6.8 break语句和continue语句,for(r=1;r100) break;printf(“%f“,area);,continue语句一般形式为:continue;作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:cont
15、inue语句只结束本次循环,而不是终止整个循环的执行。break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,6.8 break语句和continue语句,while(表达式1) if(表达式2) break;,6.8 break语句和continue语句,while(表达式1)if(表达式2) continue;,例 把100200之间的不能被3整除的数输出。,6.8 break语句和continue语句,main() int n,i=0;for (n=100;n=200;n+)if (n%3=0) continue;i+;printf(“ %d“,n);if (i%6=0)
16、printf(“ n“); ,例 用/41-1/3+1/5-1/7+公式求的近似值,直到最后一项的绝对值小于10-6为止。 用N-S结构化流程图表示算法,6.9 程序举例,Pi= 3.141594,6.9 程序举例,例 求fibonacci数列40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即: f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n3),6.9 程序举例,1 1 2 35 8 13 2134 55 89 144233 377 610 9871597 2584 4181 676510946 17711 28657
17、 4636875025 121393 196418 317811514229 832040 1346269 21783093524578 5702887 9227465 1493035224157817 39088169 63245986 102334155,例 判断m是否素数。,6.9 程序举例,17 17 is a Prime number,例 求100200间的全部素数。,6.9 程序举例,101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199,6.9 程序举例,例 打印出所有
18、的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33。,范围:100999 算法: 1.xyz/100x 2.xyz/10-x*10y 3.xyz%10z 4.判断x3+y3+z3=xyz,“narcissus“ is: 153 370 371 407,知识点:goto循环while循环dowhile循环for循环break、continue语句 重点:while循环do - while循环for循环 难点:for循环,第6章 循环控制,P166-1、2、4、7 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数。有一分数序列 2/1,3/2,5/3,8/5,13/8,21/13,求出这个数列的前20项之和。,作业:,6 its factors are 1,2,3,sum=32.660259,