上机实验五-循环结构程序设计-答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上机实验五-循环结构程序设计-答案
上机实验五循环结构程序设计
姓名:学号: 姓名:
本次实验一共5个题目,4个必做,一个选做
我建的浙师大c程序设计群,群号为:185106065,大家加入下,验证信息请写为班级+姓名。

我打算以后把每次实验的答案(我写的代码)都放到群共享里面,大家可以在群里讨论下不会的地方或者不同的实现方法。

重要提醒:邮件主题和本word文件名统一用班级+学号+姓名+实验几命名(学号和姓名记得不能少),不然我在检查作业提交情况时可能会漏掉
一.目的要求
1.掌握用for、while、do-while语句实现循环的基本技巧;
2.掌握循环次数不确定的解题技巧;
3.掌握break语句、continue语句在循环语句中的作用以及不同之处;
4.掌握多重循环的编程技巧。

二.实验内容
【实验题1】. 程序填空:分别用for、while、do-while语句编程,输出菲波那契数列的前20项,要求每行输出10项。

思考:line 5和line 8行中printf()函数的格式控制符均
为”%6d”, 假如均改为”%d”, 输出结果有何不同?
源程序2:用while语句实现
#include
void main()
{ int i,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 == 0 ) printf("\n"); /*每行输出10项*/
x1= x2 ; x2=x ;
i++ ;
}
}
【实验题2】(课本p141第10题)有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,…
求出这个分数序列的前20项之和。

源代码粘贴处
#include
void main()
{
int i;
double x1,x2,x,sum = 0;
x1=x2=1.0;
//直接在上一题的程序上做简单修改
for(i=1 ; i<=20; i++)
{
x=x1+x2;
sum = sum +x/x2;
x1= x2 ; x2= x ;
}
printf("%f", sum);
}
【实验题3】(课本p141第11题)一个球从100米高度自由落下,每次落地后反跳回原来高度的一般,再落下,再反弹。

求它在第10次落地时,共经过多少米,第10次反弹多高。

源代码粘贴处
#include
void main()
{
int i;
double h = 100,sum = 100;//第一次落地为100,所以令sum = 100
for(i= 1 ; i<=10; i++)
{
h = h/2;//反弹一次减半,一共要反弹十次
if( i < 10)//第一次落地已加,所以只执行9次,跳过最后一次
sum = sum + 2*h/2;
}
printf("sum = %f,h = %f", sum,h);
}
【实验题4】程序填空:输入一个整数,从高位开始逐位分割各位数字,如输入7358,则输出7 3 5 8(2007年春笔试真题)【分析】此题可能有些难度,请仔细按代码行对应的注释思考
我们已经学习了如何用整除运算和求余运算求出一个整数number的位数、以及从低位到高位的各位数字。

本题则是从高位向低位逐步分解各个数位,关键是先求出这个整数是几位数?
如果已知number是k位数,那么该整数整除10k-1,就可得到最高位的数字;然后对剩余部分除以10k-2,得到下一个数位上的数字;再对剩余部分除以10k-3,…实例如下:
被除数number k 最高位权重power=10k-1高位数字number/power 余数7358 4 1000 7 358
358 3 100 3 58
58 2 10 5 8
8 1 1 8 0
0 -----------结束!
源程序如下:
#include
void main( )
{ int i,digit, k,power, t ,number;
p rintf("Enter an integer:"); scanf("%d", &number); //输入整数number
i f (number<0) number = -number; //如果number为负数,取其相反数
//求number的位数:k
t=number; /*line 7: 复制number到t */
k =0;
do{
k++;
t = t/10 ;
}while(t!=0);
//求最高位的权重:power=10k-1
p ower=1;
f or(i=1; i<="" p="">
power=power*10;
//从最高开始,逐位分解并输出各位数字
while( k--!=0 ){
digit = number/power ; //求当前被除数的最高位数字
printf("%3d" , digit);
number =number%power ; //抛弃最高位
power = power/10 ; //缩小权重
}
printf("\n");
}
编译、连接并运行程序,
输入-79,输出:7 9 ;如果输入4,则输出 4 ;如果输入27354,则输出 2 7 3 5 4 。

问题1:为什么在Line 7要复制number,而不直接使用number来求位数k?
因为求位数需要t=t/10,如果不复制,直接使用numbe=number/10则会改变number的值。

后续程序还会用到number,所以需要复制number给t。

(选做题)【实验题5】程序设计:百文百鸡问题:已知公鸡每只5文钱,母鸡每只3文钱,小鸡1文钱3只,请输出用100文买100只鸡的全部解,即公鸡、母鸡、小鸡应各买几只?
源程序:
源程序:
#include
#define T 100//此处为了方便修改,比如200文买200只鸡,此处改为#define T 200即可
void main( )
{
int cock, hen,chick;
for( cock = 0; cock <= T; cock++)
for( hen = 0; hen <= T; hen++)
{
chick = T - cock - hen;//小鸡数
if(chick >= 0 && (chick%3 == 0))//小鸡数要大于等于0,小鸡数必须为3的倍数if(5*cock+3*hen+chick/3 == T)//判断钱数是否为100
printf("%d %d %d\n",cock,hen,chick);//输出结果
}
}
提示:
本题可能需要考虑:
1)遍历可能出现的所有情况,需要用到双重循环,也可以用三重循环;
2)需要判断对于给定的一种情况,是否满足其总价为100文,鸡的个数为100个。

本题答案为4种情况。

相关文档
最新文档