6-1.比较while语句、do–while语句和for语句的异同。答:(1)while语句、do-while语句用于条件循环,for语句用于计数循环。(2)while语句、for语句是先判断循环条件,后执行循环体,如果循环条件一开始就不成立,则循环体一次也不被执行;而do-while语句是是先执行循环体,后判断循环条件,所以循环体至少被执行一次。(3)知道循环的次数可选用for语句实现循环,不知道循环的次数可选用while语句或do-while语句实现循环.(4)一般而言,三种循环语句可等价实现.6-2仔细阅读下面的程序,指出程序的运行结果.#includestdio.hvoidmain(){inti;for(i=0;++i;i5){if(i==3){printf(%d\n,++i);break;}printf(%d\n,++i);}}答:24思考:语句“for(“i=0;++i;i5”)在编译时为何会给出语法警告错误?当将其改为“for(i=0;i5;++i)”时,运行结果又将如何?6-3仔细阅读下面的语的程序,指出程序的运行结果。#includestdio.hvoidmain(){inti,a=0;for(i=1;i=5;i++){do{i++;a++;}while(i3);}i++;printf(a=%d,i=%d,a,i);}答:a=3,i=7思考:在for循环中嵌套着do-while循环,那么do-while循环中对i的修改会对for循环产生影响吗?6-4编写程序,用1000个单词”computer”填充屏幕,每行60个.解:#includestdio.hvoidmain(){inti;for(i=1;i=1000;i++){printf(computer.);if(i%60==0)printf(\n);}}思考:在for循环中,”if(i%60==0)printf(“\n”);”语句的作用是什么?没有此语句将会是什么状况?6-5输入一行字符(以$结束),统计其中的数字字符、空格字符出现的次数。解:#includestdio.hvoidmain(){charc;intd=0,s=0;printf(请输入字符(当输入时结束):);while((c=getchar())!='$'){if(c='0'&&c='9')s++;if(c=='')d++;}printf(数字字符出现的次数为%d\n,d);printf(空格字符出现的次数为%d\n,s);}若输入字符:12345abcd678xyz$则运行结果为:数字字符出现的次数为8空格字符出现的次数为4思考:此题中的循环次数是如何控制的?有何特点?6-6编写程序,求1000以内的奇数之和及偶数之和。解:#includestdio.hvoidmain(){longn=0,m=0;inti;for(i=1;i1000;i++){if(i%2==0)n=n+i;elsem=m+i;}printf(奇数之和为%ld\n,m);printf(偶数之和为%ld\n,n);}运行结果:奇数之和为250000偶数之和为249500思考:在此题中为何选用for循环进行控制?用while循环或do-while循环是否也可以?6-7计算π,计算公式π/4=1-1/3+1/5-1/7+…直到最后一项的绝对值小于610为止。解:#includestdio.h#includemath.hvoidmain(){ints=1;floatn=1.0,t=1,pi=0;while(t1e-6){pi=pi+t*s;n=n+2;s=-s;t=1/n;}pi=pi*4;printf(pi=%f\n,pi);}运行结果:pi=3.141594思考:在此题中为何不选用for循环进行控制,而选用while循环呢?6-8编写程序,求任意两个整数之间的所有素数。解:#includestdio.h#includemath.hvoidmain(){intn,m,i,j,k,p=0;printf(请输入两个整数m,n(mn):);scanf(%d,%d,&m,&n);for(i=m;i=n;i++);{k=sqrt(n);for(j=2;j=k;j++)if(i%j==0)break;if(j=k+1){printf(%d,i);p=p+1;}if(p%10==0)printf(\n);}printf(\n);}思考:此题中若输入的两个整数m,n分别为13,100时,13这个素数是否被输出,为什么?6-9编写程序,求任意两个整数之间的所有能被3、4、5同时整除的数。解:#includestdio.hvoidmain(){intn,m,i;printf(请输入两个整数m,n(mn):);scanf(%d,%d,&m,&n);for(i=m;in;i++)if((i%3==0)&&(i%4==0)&&(i%5==0))//或写为if(i%60==0)printf(%d\n,i);思考:如果要分析输出,每行输出5个数,应该怎么修改程序?6-10编写程序,求1000至9999之间的回文数.回文数是指正读与反读都一样的数,如1221.解:#includestdio.hvoidmain(){intn,i,j;for(i=1000;i=9999;i=i+1000){for(j=0;j=9;j++){n=i+j*100+j*10+i/1000;printf(%d,n);}printf(\n);}}运行结果:100111111221133114411551166117711881199120022112222223322442255226622772288229923003311332233333344335533663377338833993400441144224433444444554466447744884499450055115522553355445555556655775588559956006611662266336644665566666677668866996700771177227733774477557766777777887799780088118822883388448855886688888888889989009911992299339944995599669999999999999思考:在此题中,内、外循环各起什么作用?是否可以交换?如果用if语句设计程序,数据的各位数(个位、十位、百位、千位)应该如何分离?6-11编写程序,判断某一个整数是否为完数。完数是指其因子之和等于自身的整数,如6=1+2+3请进一步考虑,求任意两个整数之间的所有完数。解:#includestdio.hvoidmain(){intn,i,k=0;printf(请输入整数:);scanf(%d,&n);for(i=1;i=n;i++)if(n%i==0)k=k+i;if(n==k)printf(%d是完数\n,n);elseprintf(%d不是完数\n,n);}运行结果:请输入整数:2828是完数思考:变量k在此题中起什么作用?初值为何要被赋0?循环语句for”(i=1;i=n;i++)”中的判断式”in”可否改为”i=n/2”?注:1000以内的完数有6=1+2+3,28=1+2+4+7+14,496=1+2+4+8+16+31+62+124+248.6-12编写程序,以上三角形式输出九九乘法表。解:#includestdio.hvoidmain(){intj,i;printf(%4c,'*');for(i=1;i=9;i++){for(j=1;j=9;j++)printf(%4d,i*j);printf(\n);}}运行结果:*12345678911234567892468101214161839121518212427416202428323652530354045636424854749566386472981思考:如果希望输出下三角形式的九九乘法表,程序应如何改动?*123456789112243369448121655101520256612182430367714212835424988162432404856649918273645546372816-13编写程序,计算1!+2!+3!+…+n!的值,n从键盘输入。解:#includestdio.hvoidmain(){longsum=0,t=1;intn,i;printf(请输入整数n:);scanf(%d,&n);for(i=1;i=n;i++){t=t*i;sum=sum+t;}printf(总和=%ld\n,sum);}6-14编写程序,求1!+2!+…+n!小于1000的项数n。解:#includestdio.hvoidmain(){intsum=0,t=1;intn=0;do{n=n+1;t=t*n;sum=sum+t;}while(sum1000);printf(“项数为%d\n”,n-1);}运行结果:项数为6思考:此题为何要选用do-while循环结构?最后输出变量的值为何要减1?另请改为while循环实现。6-15某门课程有n个同学参加考试,编写程序计算这门课程的最高分、最低分及平均分。解:#includestdio.hvoidmain(){floataver,max,min,a;intn,i;printf(请输入学生的人数n的值:);scanf(%d,&n);aver=max=0;min=100;for(i=0;in;i++){printf(请输入第%d位同学的成绩:,i+1);scanf(%f,&a);aver+=a;//累加成绩if(maxa)max=a;if(mina)min=a;}aver/=n;//计算平均成绩printf(aver=%f,max=%f,min=%f\n,aver,max,min);}思考:变量max为何赋初值为0?而变量min为何赋初值为100?6-16编写程序,求分数序列2/1,2/3,3/5,8/5,8/13,…的前二十项及它们之和。解:#includestdio.hvoidmain(){inti,t;floatsum=0,a=2,b=1;for(i=1;i=20;i++){sum=sum+a/b;t=a;a=a+b;b=t;}printf(sum=%f\n,sum);}运行结果:sum=32.660259思考:此题中没有输出各项的值,请问如何实现这一要求?6-17编写程序,求满足下式的数字A,B,C的值。ABC+BCC ̄ ̄ ̄ ̄ ̄234解:#includestdio.hvoidmain(){inta,b,c,e,i,j,k,t,bw,jw,jw1,jw2;printf(请输入计算式的期望结果值(1xxx):);scanf(%d,&e);c=e%10;e/=10;b=e%10;e/=10;a=e%10;e/=10;for(i=0;i10;i++){t=i+i;bw=t%10;jw1=t/10;if(bw==c){for(j=0;j10;j++){t=j+i+jw1;bw=t%10;jw2=t/10;if(bw==b){for(k=0;k10;k++){t=k+j+jw2;bw=t%10;jw=t/10;if(bw==a&&e==jw)printf(所求的A,B,C可以是:%d,%d,%d\n,k,j,i);}}}}}}方法二:#includestdio.hvoidmain(){inti,j,k,a,b,c;inte;printf(请输入计算式的期望结果值(1xxx):);scanf(%d,&e);c=e%10;e=e/10;//各位b=e%10;e=e/10;//十位a=e%10;e=e/10;//百位for(i=0;i=5;i++)for(j=0;j=9;j++)fo