第5章 循环结构程序设计 学习时长: 2周 学习目标 知识目标: 理解循环的概念。 理解循环条件的变化,死循环的处理与防止。 理解for、while、dowhile三种循环语句的相同和不同之处。 能力目标: 熟练使用for、while、dowhile实现循环程序设计。 掌握各种循环的嵌套。 掌握break和continue语句在循环结构中的应用。 本章内容概要 5.1循环的概念 5.2while语句(本章重点) 5.3dowhile语句(本章重点) 5.4for语句(本章重点) 5.5break语句和continue语句 5.6循环的嵌套(本章难点) 5.7循环结构综合应用实例 5.1循环的概念 在日常生活中,有很多工作需要重复劳作,比如超市的收银、数学中的迭代运算等。这些重复的工作如果能由计算机来处理,那就可以大大减轻人们的工作量。C语言提供了这样的语句——循环语句,能对重复的工作进行控制。 循环结构语句根据给定条件反复执行某些操作,当给定条件不成立时,循环就会停止。给定的条件称为循环条件,反复执行的操作称为循环体。C语言提供了while语句、dowhile语句和for 语句对循环进行控制。 例如: 求1+2+3+…+100的和。 算法分析: 如果直接计算,表达式要表述为1+2+3+…+100,实在是太长了。 这时可以这样设想,定义一个变量i,从1开始,每循环一次增加1,直到100为止。每循环一次就把i的值累加到一个变量s中。 即每次循环重复执行语句: “s=s+i;”。 5.2while语句 while也称作当型循环,即当条件为真就重复执行语句,当条件为假则不执行。 一般结构形式: while (表达式) 语句 图51while循环结构示意图 这里的语句称为循环体,它可以是一条单独的语句,也可以是复合语句。 while语句执行流程,如图51所示。 (1) 先计算表达式的值。 (2) 如果表达式的值为真(非0),则执行循环体语句。 (3) 重新计算表达式的值。 (4) 如果表达式的值为假(0)值,则退出循环结构,执行循环体外的后续语句。 while循环的特点是: 每执行完一次循环体后,要判断表达式的真假,为真时继续执行循环体,为假时结束while语句。即当表达式为真时,反复执行循环体。 使用说明: (1) while语句的特点是先计算表达式的值,然后根据表达式的值决定是否执行循环体中的语句。如果表达式的值一开始就为0,则语句一次也不会被执行。 (2) 循环重复执行的语句只是一条简单语句,即到第一个分号结束。如果必须包含多条语句要使用{}把多条语句变成复合语句。 (3) 如果循环永远重复执行,则循环为死循环,编程时应该避免死循环。因此,在循环体内应有使循环趋于结束的语句,即包含改变条件判断表达式值的语句,使表达式的值最终为假而退出循环。 (4) 单独一个分号也为一条有效的语句,即空语句,表示什么也不执行。空语句作为循环体时,一般用作延时。 【例51】用while语句求1+2+3+…+100的和。 分析: 这是一个多个数求和的问题,可以用循环语句来解决。 #include main( ) { int i=1,s=0;   /*初始化循环变量i和累计器s, i的初值为1,s的初值为0*/ while(i<=100) /*i终值为100,条件判断,控制循环*/ { /*多条语句用{}*/ s+=i; /*每次把i累加到s中,实现累加*/ i++; /*i的值每次增加1*/ } printf("SUM=%d\n", s); } 运行结果: SUM=5050 在该例的循环体中,循环变量i每次加1,使条件表达式的值趋于为假。 【例52】统计从键盘输入一行字符的个数。 #include main() { int n=0; printf("请输入一行字符:\n"); while(getchar()!=' \n' ) n++; printf("字符个数为:%d\n",n); } 运行结果: 请输入一行字符: 123ert 字符个数为:6 本例中的循环条件为getchar()!='\n',其意义是,只要从键盘上输入的字符不是回车符就继续循环。循环体用来对输入字符个数计数,n表示输入字符的个数。 【例53】从键盘输入一批学生的成绩,计算平均分。 分析: 这是一个累加求和的问题,先累加求出学生的成绩总和,再除以学生人数,得到平均分。本题的难点在于确定循环条件,由于题目中没有给出学生的数量,所以事先无法确定循环次数,自己要设计循环条件。可用一个特殊的数据作为正常输入数据的结束标志,这里选用一个负数作为结束标志。循环条件是输入的数据grade>=0。 #include main() { int num;double grade,total; /*num记录人数,grade存放输入的成绩,total保存成绩的和*/ num=0;total=0; printf("请输入学生分数:"); scanf("%lf",&grade); while(grade>=0) { total=total+grade; /*累加成绩*/ num++; /*计数*/ scanf("%lf",&grade);   /*读入一个新数据,为下次循环做准备*/ } if(num!=0) printf("平均分是%.2f\n",total/num); else printf("平均分是0\n"); } 运行结果: 请输入学生分数: 56 57 58 -2 平均分是57.00 本例中-2作为输入的结束标志,运行时,前面3个正数都被累加到total中,直到输入-2为止。 while语句先判断数据是否满足循环条件,如果该数不是负数才能进入循环,在进入循环之前,先输入了第一个数据,如果该数大于或等于零,就进入循环并累加成绩,然后再输入新的数据,继续循环。 5.3dowhile语句 dowhile也称作“直到型循环”,即先执行循环体中的语句,再通过判断表达式的值来决定是否继续循环,循环条件的测试是在循环的尾部进行的。 一般结构形式: do{ 语句 }while (表达式); 图52dowhile循环结构 示意图 dowhile 语句执行流程,如图52所示。 (1) 首先执行语句。 (2) 再计算表达式。 (3) 如果表达式的值为真(非0),则继续下一次循环。 (4) 如果表达式的值为假(0),则退出循环结构,执行循环体外的后续语句。 dowhile结构语句具有循环体语句至少会执行一次的特点,如果表达式的值一开始就为假(0),也会执行一次语句。 而while循环,如果表达式的值一开始就为假(0),则语句一次也会被不执行。 【例54】用dowhile语句求1+2+3+…+100的和。 #include main( ) { int i=1,s=0;   /*初始化循环变量i和累计器s, i的初值为1,s的初值为0*/ do{ /*多条语句用{}括起来*/ s+=i; /*每次把i累加到s中*/ i++; /*i每次增加1*/ } while(i<=100); /*i终值为100*/ printf("SUM:%d\n",s); } 说明: (1) 在if语句和while语句中,表达式后面都不加分号,而在dowhile 语句的表达式后面则带有分号。 (2) while和dowhile都能实现循环控制,while结构程序通常都可以转换成dowhile结构。当循环语句至少要执行一次时,while和dowhile语句可以互相替换。 (3) while循环与dowhile循环相比,当第一次循环条件为真时,二者是完全一样的。但当第一次循环条件不为真时,while循环语句一次都不执行,dowhile循环语句要执行一次。 分析以下程序中变量i的作用。 例如: i=1; while (i<=100) putchar('*'); i++; 这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,语句i++; 不属于循环体。我们可以使用{}将语句i++; 包含进循环体,改进程序如下: i=1; while (i<=100) { putchar('*'); i++; } 【例55】从键盘读入一个整数,统计该数的位数。例如,输入12345,输出5; 输入-99,输出2; 输入0,输出1。 分析: 一个整数由多位数字组成,统计过程需要按位去数,因此是一个循环过程,循环次数由整数的位数决定。思路为将输入的整数不断地整除10,直到该数最后变成了0,整除的次数就是该数的位数。例如,123整除10商为12,12再整除10商为1,1再整除10商为0并结束循环。循环次数为3,故该数的位数为3。 #include main() { int count,number;   /*count记录整数number的位数*/ count=0; printf("请输入一个整数:"); scanf("%d",&number); do { number=number/10; /*整除后减少末位数,组成一个新数*/ count++; /*位数加1*/ }while(number!=0); /*判断循环条件*/ printf("该数的位数为%d\n",count); } 运行结果: 请输入一个整数:5436 该数的位数为4 5.4for语句 for循环是C语言最有特点、使用效率最高、最为灵活方便的循环语句。 for语句通常用于循环次数已经确定的情况,但也可用于循环次数不确定而只给出循环结束条件的情况。 一般结构形式: for(表达式1;表达式2;表达式3) 语句 图53for循环结构示意图 如图53所示,for循环执行流程如下。 (1) 先计算表达式1,用于循环开始前设置变量初值。 (2) 接着计算表达式2,表达式2是个逻辑值,如果为真(非0),则执行步骤3,如果为假(0),则循环结束,执行for的下一条语句。 (3) 执行循环体语句。 (4) 计算表达式3。 (5) 返回步骤2。 表达式1通常给循环控制变量赋初值,一般是赋值表达式,也允许在for语句外给循环控制变量赋初值,此时可省略表达式1。表达式2通常是循环条件,一般为关系表达式或逻辑表达式。表达式3通常用来修改循环控制变量的值(增量或减量运算),一般是赋值语句,它使得在有限次循环后,可以正常结束循环。 所有用 while 语句实现的循环都可以用for 语句实现,因此以上for语句等价于 表达式1; while (表达式2) { 语句 表达式3; } 【例56】用for语句求1+2+3+…+100的和。 #include main( ) { int i,s; /*i为循环变量*/ for(i=1,s=0;i<=100;i++) s+=i; /*每次把i累加到s中*/ printf("SUM:%d\n",s); } 运行结果: SUM:5050 该程序中for循环的执行步骤: (1) i=1, s=0; (2) i<=100; (3) s+=i; (4) i++; (5) 返回步骤2,重新判断条件。 这里的循环语句也是到第一个分号结束。如果有多个语句一定要用{}。 使用说明: (1) 在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可多次执行,也可能一次都不执行。 (2) for语句形式非常灵活,有多种变形,各表达式是可以省略的,但分号间隔符不能省略。 ① 如先给循环控制变量赋过值,则可以省略表达式1。 例如: for(; i<100; i++)语句。 应该注意,尽管省略了表达式1,但表示表达式1的分号却不能省略。 ② 如果想在循环体里改变循环控制变量的值,则可以省略表达式3。 例如: for(i=0; i<100;)语句。 ③ 如果表达式1和表达式3都省略,语句格式完全等同于while语句。 例如: for(; i<100;)语句等效于while(i<100)语句。 ④ 如果三个表达式全部省略,就会形成死循环,必须在循环体里使用break语句来终止循环。 (3) 在for语句的表达式中使用逗号表达式。 for语句中的表达式1和表达式3可以是逗号表达式,即每个表达式都可由多个表达式组成。例如: for(sum=0,i=1; i<=100; i++,sum+=i)。 注意这个语句末尾的分号表示循环体为空语句,不可省略。 从以上分析可知C语言的for语句形式变化多样,但这些变化往往会使for语句显得杂乱,可读性降低,建议编程时尽量用for语句的基本形式。 【例57】求算式77777-7777-777-77-7,利用从键盘输入数符m和最大位数值n来计算该算式的结果。 分析: 77777、7777、777、77和7由同一个数符7组成,位数有从5位变化到1位的规律。我们定义变量m表示数符,变量n表示最大位数的值。可以用一个循环求出由数符m组成的最大位数的数,再利用一个循环逐次减去n-i位的数,就可以实现该算式的计算。 #include main() {long a, s; int i, m, n; scanf ( "%d, %d", &m, &n ); a=0; for(i=1; i<=n; i++) /* 第一次循环构造出算式中最大位数的那个数 */ a=a*10+m; s=a; for(i=1; i main( ) { double i , j ; double s=0.0; for( i=1, j=100; i<=j; i++, j--) s = s + i/j; printf (" \n s=%f", s); } 运行结果: s=19.505390 请思考,如果将i,j改为int类型能否正确计算出结果。 【例59】从键盘输入一个正整数,计算n!。 分析: 由于n!=1×2×n是个连乘的重复过程,每次循环完成一次乘法,共循环n次。设置变量fact为累乘器,i为乘数,兼做循环控制变量。fact用于保存乘积, 初值应置为1,不能置为0,否则其值就恒为0。 #include main() { int i,n,fact; printf("请输入n:"); scanf("%d",&n); fact=1;   /*fact是累乘器,存放是阶乘值,初值为1*/ for(i=1;i<=n;i++)   /*i为乘数,兼作循环控制变量,循环执行n次,计算n!*/ fact=fact*i; printf("%d!=%d",n,fact); } 运行结果: 输入:请输入n:8 输出:8!=40320 既然循环结构有三种不同的语句,那么三种循环结构有什么区别呢?确定要使用循环时,应该使用哪个呢?首先,while和dowhile语句的表达式只有一个,for语句有三个; 其次,while 和for先判断循环条件后执行循环体,dowhile语句先执行循环体后判断循环条件。所以,while语句多用于循环次数不定的情况; dowhile语句多用于至少要运行一次的情况; for语句多用于要赋初值或循环次数固定的情况,其中尤以for语句最灵活方便。 5.5break语句和continue语句 前面介绍的循环只能在循环条件不成立的情况下才能退出循环。可是有时人们希望从循环中直接退出来或重新下一次循环,这时就要用到以下这类跳转语句。这类语句是非结构化的语句,基本功能都是改变程序的执行结构,使程序从其所在的位置转向另一处,但结果是有差异的。 1. break语句 break语句的作用是使流程转向所在结构之后去执行,简单说就是跳出当前所在的结构。在switch分支结构中,我们使用break语句可以使流程跳出switch分支结构。 同样,在循环结构中,使用break语句可以使流程跳出当前的循环层结构,转向执行该循环结构后面的语句。注意break只能跳出它所在的一层循环。 【例510】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。 分析: 素数是指只能被1和它本身整除的数,如5,7,11,17等。分别用2,3,…,m-1尝试能否整除整数m。如果m能被其中某个数整除,则m就不是素数。设除数为j,从2循环到m-1。 #include #include main( ) { int j,m; printf("Enter an integer number: "); scanf("%d",&m); for (j=2; j<=m-1; j++) if (m%j==0) break; printf("%d",m); if (j>=m) printf("YES\n"); else printf("NO\n"); } 运行结果: 输入:Enter an integer number: 10 输出:10NO 根据素数的定义,在for循环中,只要有一个j能满足m%j==0,即m能被j整除,则m肯定不是素数,不必再检查m能否被其他数整除,可提前结束循环; 但是,如果发现某个j满足m%j!=0,不能得出任何结论,必须继续循环检测。 在本例中,j的取值区间为[2,m-1],其实算法可以进一步优化,减少循环次数,数学上能证明,该区间可以优化成[2, m]。故该程序可以优化如下: #include #include main( ) { int j,m,k; printf("Enter an integer number: "); scanf("%d",&m); k=sqrt(m); for (j=2; j<=k; j++) if (m%j= =0) break; printf("%d",m); if (j>k) printf("YES\n"); else printf("NO\n"); } 2. continue语句 continue语句也被称为继续语句。continue语句作用为提前结束本次循环体语句,即跳过循环体中continue语句下方尚未执行的其他循环体语句,继续进行下一次循环的条件判断,并不终止整个循环。 说明: (1) continue语句只用于while、dowhile和for等循环语句中,常与if语句一起使用,起到加速循环的作用。 (2) continue语句与break语句的区别是: continue语句只结束本次循环,而不是终止整个循环的执行; 而break语句则是结束整个循环过程,不再判断循环条件是否成立。 【例511】把100~200能被5整除的数,以5个数为一行的形式输出,最后的输出结果中一共有多少个这样的数? #include main( ) { int n,j=0; for(n=100;n<=200;n++) { if(n%5!=0) continue; printf("%6d",n); j++;   /*j用来统计能被5整除的数的个数*/ if (j%5==0) printf("\n"); /*每输出5个数换行*/ } printf(" \n j=%d\n", j); } 运行结果: 100105110115120 125130135140145 150155160165170 175180185190195 200 j=21 本程序中,当该数不能被5整除时,就提前结束本次循环,继续进行下个数的判断; 如果该数能被5整除,就输出,并且通过判断计数器j的值,每隔5个数输出换行符进行换行。 5.6循环的嵌套 在循环体语句中如果又包含有另一个完整的循环结构语句的形式,称为循环的嵌套。嵌套在循环体内的循环语句称为内循环,外面的循环语句称为外循环。如果内循环体中又有嵌套的循环语句,称为多层循环嵌套。 while、dowhile、for 3种循环语句都可以进行自身嵌套或者互相嵌套。循环嵌套的过程中,要求内循环必须被包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。 例如,执行语句段: for(i=0;i<6;i++) { printf("%3d\n",i); for(j=0;j<6;j++) printf("%3d",j); putchar('\n'); } 输出结果: 0 012345 1 012345 2 012345 3 012345 4 012345 5 012345 从程序执行结果看到: 外层循环i循环控制循环次数并输出次数值,内层循环j循环则实现按格式输出0~5的数字序列。 【例512】输出如下九九加法表。 1+1=21+2=31+3=41+4=51+5=61+6=71+7=81+8=91+9=10 2+1=32+2=42+3=52+4=62+5=72+6=82+7=92+8=102+9=11 3+1=43+2=53+3=63+4=73+5=83+6=93+7=103+8=113+9=12 4+1=54+2=64+3=74+4=84+5=94+6=104+7=114+8=124+9=13 5+1=65+2=75+3=85+4=95+5=105+6=115+7=125+8=135+9=14 6+1=76+2=86+3=96+4=106+5=116+6=126+7=136+8=146+9=15 7+1=87+2=97+3=107+4=117+5=127+6=137+7=147+8=157+9=16 8+1=98+2=108+3=118+4=128+5=138+6=148+7=158+8=168+9=17 9+1=109+2=119+3=129+4=139+5=149+6=159+7=169+8=179+9=18 分析: 加法是由两个数进行的运算,设第一个数为x,第二个数为y。 x取值范围为1~9,当x每循环一次,y都要从1~9循环。 #include main() { int x,y; for(x=1;x<10;x++) /*x从1~9*/ { for(y=1;y<10;y++) /*对每一个x,y都要从1~9*/ printf("%2d+%2d=%2d",x,y,x+y); /*输出格式控制*/ printf("\n"); /*第x行输出完成,换行*/ } } 思考,如何输出三角式样的九九加法表(去掉冗余表达式)? 在循环嵌套过程中,还可以进行并列嵌套,即在一个循环体中包含多个独立的循环语句。 【例513】编程输出如下的图形。 * *** ***** ******* 分析: 一共4行,第i行先输出的空格数为4-i,再输出的'*'数为i×2-1。 #include main( ) { int i,j,k; for(i=1;i<=4;i++) /*外循环 i从1~4,共4行*/ { for(j=1;j<=4-i;j++) /*j控制前导空格的数量*/ putchar(' '); for(k=1;k<=i*2-1;k++) /*k控制星号的输出数量*/ putchar('*'); printf("\n"); /*一行结束,换行*/ } } 程序中j层循环和k层循环形成并列嵌套,共同完成一行'*'字符的输出。 5.7循环结构综合应用实例 【例514】求Fibonacci数列 1,1,2,3,5,8,13,…前20项。 说明: Fibonacci数列第1、2项为1,从第3项开始为前两项之和。即f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,按每行5个的形式输出前20项。 分析: 设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项; 产生了新数据后,两个变量需要更新。将f1←f2, f2←f3,再求f3=f1+f2得到第4项; 以此类推,求第5项、第6项…… 用变量f1、f2、f3作为数列相邻的三项,初值f1=1,f2=1。 循环变量n从3到20,表示当前是第几项。 题目要求输出20项,循环次数确定,可采用for语句。 #include main( ) { int f1=1, f2=1, f3, n; printf("\n%8d%8d",f1,f2); for( n=3;n<=20;n++) { f3=f1+f2; printf("%8d",f3); if(n%5= =0) printf("\n"); f1=f2; f2=f3; } } 运行结果: 11235 813213455 89144233377610 9871597258441816765 思考: 如何求10000之内的最大的f(n)? 【例515】求100~200的质数,每行输出4个。质数即只能被1和它本身整除的数,1不是质数,2是质数。 分析: 设变量n从100~200进行循环,每循环一次判断其是否质数,是则输出,不是则+1,判断下一个数。 质数算法,用n分别除以2到n-1,若有一个除尽则不是质数,若全部不能除尽则是质数。 #include main( ) { int n, j,i=0; /*i记录当前的质数的个数,用于控制输出格式*/ for( n=100;n<=200;n++) /*n表示100到200某个数*/ { for( j=2;j=n) /*n是质数*/ { printf("%8d",n); /*未除尽,是质数,输出该数*/ i++;   /*累加已经输出的质数的个数*/ if(i%4= =0) printf("\n"); /*如果i是4的倍数,换行*/ } } } 运行结果: 101103107109 113127131137 139149151157 163167173179 181191193197 199 【例516】输入一个正整数,将其逆序输出。例如,输入12345,输出54321。 分析: 为了实现逆序输出一个整数,需要把该数按逆序逐位拆开,然后逆序相加,输出。在循环中每次分离一位,分离方法是对10求余数。 设x=12345,从低位开始分离,12345%10=5,为了能继续使用求余运算分离下一位,需改变x的值,x为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; x最后为0,循环结束。 重复操作归纳为: x%10,分离一位 x=x/10,为下次分离做准备 直到x==0,循环结束。 #include main( ) { int x; int s; s=0; printf("请输入正整数x:"); scanf("%d",&x); while(x!=0) { s=s*10+x%10;  /*将已逆序的整数左移一位,再加上新分离出的一位整数*/ x=x/10; /*为下次分离做准备*/ } printf("逆序数为:%d\n",s); } 运行结果: 输入:请输入正整数x:12345 输出:逆序数为:54321 【例517】求两个正整数的最大公约数和最小公倍数。 分析: 求最大公约数的算法可以采用“辗转相除法”。对两个正整数a和b: 当a=b时,其最大公约数和最小公倍数就是a; 当a≠b时,若设大数为a,则按照以下步骤求解。 ① 用a除以b得到余数为r,若r=0,则b(小数)即为两个正整数的最大公约数。 ② 若r≠0,则令a=b,b=r,再转去执行(1)。 a与b的最小公倍数=(a×b)/(a与b的最大公约数) “辗转相除”过程是一个重复过程,循环继续的条件是余数r不为0。因此,可以用while循环控制,条件为r!=0。 #include main( ) { int a,b,r,sa,sb; printf("输入两个整数:\n"); scanf("%d%d",&a,&b); sa=a;sb=b;   /*保存原数*/ if(ab*/ { r=a; a=b; b=r; } r=a % b; while(r!=0)   /*辗转相除法求最大公约数*/ { a=b; b=r; r= a% b; } printf("最大公约数为:%d\n",b); printf("最小公倍数为:%d\n",sa*sb/b); } 运行结果: 输入两个整数: 5 25 最大公约数为:5 最小公倍数为:25 习题与思考 一、 选择题 1. 有程序段: int k=2; while (k=0) {printf("%d",k);k--;} 则下面描述中正确的是。 A. while循环执行10次 B. 循环是无限循环 C. 循环体语句一次也不执行 D. 循环体语句执行一次 2. 以下程序段的循环次数是。 for (i=2; i==0; ) printf("%d" , i--); A. 无限次 B. 0次 C. 1次 D. 2次 3. 下述程序段的运行结果是。 int a=1,b=2, c=3, t; while (a++y; x=i++) i=x; B. for (;;x++=i ); C. while (1) { x++;} D. for (i=10;;i--) sum+=i; 10. 对for(表达式1;;表达式3)可理解为。 A. for (表达式1;0;表达式3) B. for (表达式1;1;表达式3) C. for (表达式1;表达式1;表达式3) D. for (表达式1;表达式3;表达式3) 11. 下面程序段中,。 for(t=1;t<=100;t++) { scanf("%d",&x); if(x<0)continue; printf("%3d",t); } A. 当x<0时整个循环结束 B. x>=0时什么也不输出 C. printf函数永远也不执行 D. 最多允许输出100个非负整数 12. 以下for循环的执行次数是。 for(x=0,y=0; (y=123) && (x<4) ; x++); A. 无限循环 B. 循环次数不定 C. 4次 D. 3次 13. 有以下程序: main() { int number=0; while(number++<=1) printf("*%d",number); printf("**%d\n",number); } 程序运行后的输出结果是。 A. *1*2 B. *1*2**3 C. *1*2*3 D. 0*1*2 14. 有以下程序段: int a=6; do { a=a-2 ; printf ("%d",a); }while(--a); 则上面程序段。 A. 输出的是4 B. 输出的是5 C. 输出的是41 D. 是死循环 二、 读程序写结果 1. 下列程序段的输出是。 #include "stdio.h" main( ) {int k; for(k=1; k<5; k++) {if(k % 2) printf("*"); else continue; printf("#"); } } 2. 程序执行结果为。 #include main() { int x=9; for(;x>0;) {if(x%3==0) {printf("%d",--x); continue; } x--; } } 3. 程序运行后的输出结果是。 #include main() {inti; for(i=1;i<=3;i++) switch(i%3) {case 0:printf("*");break; default:printf("#"); case 1: printf("&"); } } 三、 编程题 1. 找出100~200的不能被3整除的数。 2. 已知四位数a2b3能被23整除,编程求出此数。 3. 求100以内最小的自然数n,使1*1+2*2+3*3+…+n*n>5500。 4. 求1/1!+1/2!+…+1/m!(结果保留10位小数)。 5. 求1000以内的完数。完数就是其真因子的和等于其本身的数。 6. 请编写程序,打印如下图案。 ***** ***** ***** ***** ***** 7. 已知小鸡0.5元钱一只,公鸡2元钱一只,母鸡3元钱一只,现要求100元钱正好买100只鸡,请给出所有的组合。 8. 猴子吃桃问题。猴子第1天摘下若干桃子,当即吃了一半,又多吃了1个。第2天早上又将剩下的桃子吃掉一半,又多吃了1个。以后每天早上都吃了前一天剩下的一半零1个。到第10天早上再想吃时,就只剩1个桃子了。求第1天共摘了多少个桃子。 9. 请编写程序,从键盘输入3名学生的5门成绩,分别找出每名学生的最高成绩。