您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 上机实验五循环结构-参考答案
上机实验五循环结构程序设计学号:姓名:一.目的要求1.掌握用for、while、do-while语句实现循环的基本技巧;2.掌握循环次数不确定的解题技巧;3.掌握break语句、continue语句在循环语句中的作用以及不同之处;4.掌握多重循环的编程技巧。二.实验内容【实验题1】.程序填空:分别用for、while、do-while语句编程,输出菲波那契数列的前20项,要求每行输出10项。源程序1:用for语句实现#includestdio.hvoidmain(){inti,x1,x2,x;x1=x2=1;printf(%6d%6d,x1,x2);/*Line5:输出前2项*/for(i=3;i=20;i++){x=x1+x2;printf(%6d,x);/*Line8*/if(i%10==0)printf(\n);/*每行输出10项*/x1=x2;x2=x;}}编译、连接并运行该程序,则显示思考:line5和line8行中printf()函数的格式控制符均为”%6d”,假如均改为”%d”,输出结果有何不同?输出的数据无间隔源程序2:用while语句实现#includestdio.hvoidmain(){inti,x1,x2,x;x1=x2=1;printf(%6d%6d,x1,x2);/*输出前2项*/i=3;while(i=20){x=x1+x2;printf(%6d,x);if(!(i%10))printf(\n);/*每行输出10项*/x1=x2;x2=x;i++;}}源程序3:用do-while语句实现#includestdio.hvoidmain(){inti,x1,x2,x;x1=x2=1;printf(%6d%6d,x1,x2);/*输出前2项*/i=3;do{x=x1+x2;printf(%6d,x);if(!(i%10))printf(\n);/*每行输出10项*/x1=x2;x2=x;i++;}while(i=20);}【实验题2】程序填充:输入double型变量x的值,计算下列算式的值,直到最后一项的绝对值小于10-5。23456...2!3!4!5!6!xxxxxsx源程序如下:#includestdio.h#includemath.hdoublefact(intn);/*函数说明*/voidmain(){inti;doublex,item,s=0;printf(Inputx:);scanf(%lf,&x);/*输入实数x*/i=1;do{item=pow(x,i)/fact(i);/*用数学库函数pow()和自定义函数fact(),求加项item*/s=s+item;/*line11*/i++;}while(fabs(item)=0.00005);/*循环条件:加项item的绝对值不小于10-5*/printf(s=%.4f\n,s);/*输出算式的值,保留4位小数*/}/*自定义函数fact()*/doublefact(intn){inti;doublef=1;for(i=1;i=n;i++)f*=i;/*line21*/returnf;}编译、连接并运行程序,输入0.5,则显示:;输入1,则显示:;输入1.7,则显示:。略line21中的表达式“f*=i”,等同于表达式“f=f*i”;同理,line11中的表达式“s=s+item”也可替换为“s+=item”.【实验题3】程序填空:验证哥德巴赫猜想——任何一个大于6的偶数均可表示为两个素数之和。例如:6=3+3,8=3+5,10=5+5,…,18=7+11。要求将6-100之间的偶数均表示为素数之和,一行输出5组。【分析】1.本程序采用双层循环:外层循环负责对6~100之间的偶数逐个输出加法式子;内层循环负责为一个特定的偶数k,找出相应的素数a和b.2.对于偶数k(k=6),符合条件的两个素数a和b必然位于区间[3,k-1].(为什么不从2开始?)3.由于k=a+b,通过内层循环试探性地找出第一个加数a后,第二个加数b可用推算而得,再调用函数prime()来判断a、b是否是素数,如果两者均为素数,则停止寻找素数,并输出k=a+b.源程序如下:#includestdio.h#includemath.hintprime(intn);voidmain(){inta,b,k;for(k=6;k=100;k+=2){//逐个处理6~100之间的偶数kfor(a=3;ak;a++){//针对偶数k,寻找第一个素数加数项ab=k-a;if(prime(a)&&prime(b))break;//如果a,b同为素数,跳出内层循环}//内层循环printf(%d=%d+%d,k,a,b);//输出k=a+bif(k%5==0)printf(\n);//每行输出5组}//外层循环}//自定义函数prime(n),判断整数n是否是素数,是则返回1,不是则返回0intprime(intn){inti;for(i=2;i=sqrt(n);i++)if(n%i==0)break;if(isqrt(n))return1;//n是素数,返回1elsereturn0;//若为假,n不是素数返回0}【实验题4】程序填空:输入一个整数,从高位开始逐位分割各位数字,如输入7358,则输出7358(2007年春笔试真题)【分析】我们已经学习了如何用整除运算和求余运算求出一个整数number的位数、以及从低位到高位的各位数字。本题则是从高位向低位逐步分解各个数位,关键是先求出这个整数是几位数?如果已知number是k位数,那么该整数整除10k-1,就可得到最高位的数字;然后对剩余部分除以10k-2,得到下一个数位上的数字;再对剩余部分除以10k-3,…实例如下:被除数numberk最高位权重power=10k-1高位数字number/power余数735841000735835831003585821058811800-----------结束!源程序如下:#includestdio.hvoidmain(){inti,digit,k,power,t,number;printf(Enteraninteger:);scanf(%d,&number);//输入整数numberif(number0)number=-number;//如果number为负数,取其相反数//求number的位数:kt=number;/*line7:复制number到t*/k=0;do{k++;t/=10;}while(t!=0);//求最高位的权重:power=10k-1power=1;for(i=1;i=k-1;i++)power=power*10;//从最高开始,逐位分解并输出各位数字while(k--!=0){digit=number/power;//求当前被除数的最高位数字printf(%3d,digit);number=number%power;//抛弃最高位power=power/10;//缩小权重}printf(\n);}编译、连接并运行程序,输入-79,输出:;如果输入4,则输出;如果输入27354,则输出。问题1:为在Line7要复制number,而不直接使用number来求位数k?后面的程序中还需要用到number的值来求各个数位的数字问题2:为什么在该程序中,求最高位的权重power=10k-1时,不直接使用数学库函数pow(10,k),而是用for循环来解决幂运算?pow()函数的返回值为double型,不适合后面的while循环中的整除和求余运算【实验题5】程序设计:百文百鸡问题:已知公鸡每只5文钱,母鸡每只3文钱,小鸡1文钱3只,请输出用100文买100只鸡的全部解,即公鸡、母鸡、小鸡应各买几只?---请参照搬砖问题。源程序:源程序:#includestdio.hvoidmain(){intcock,hen,chick;for(cock=0;cock=20;cock++)for(hen=0;hen=55;hen++){chick=100-cock–hen;if(cock*5+hen*3+chick/3==100)printf(cock:%d,hen%d,chick:%d\n,cock,hen,chick);}}
本文标题:上机实验五循环结构-参考答案
链接地址:https://www.777doc.com/doc-2809252 .html