}
return0;
}
2.下列程序的功能是:
计算一对兔子,从出生后第3个月起每个月都生一对兔子。
小兔子长到第3个月后每个月又生一对兔子,假设兔子不存在死亡问题,请问从第1个月到第20个月,每个月有多少对兔子?
要求输出时按行列方式每行显示5个数据。
如下图:
编译调试该程序看是否正确,不正确的话修改之直至完全满足要求。
并解释出错原因。
intmain()
{
intfib0=0,fib1=1,fib2;
intn;
cout<for(n=1;n<=20;n++)
{fib2=fib0+fib1;
cout<fib1=fib2;
fib0=fib1;
if(n%5==0)cout<}
return0;
}
语法错误:
1.缺少头文件(iostream以及iomanip)以及命名空间。
2.return0后的分号为中文分号。
逻辑错误:
1.cout<2.前面已经输出一个月所以n<=19。
而且后面的换行也需要改为n+1
3.复制顺序错误,应该为fib0=fib1;fib1=fib2;
改正后的程序:
#include
#include
usingnamespacestd;
intmain()
{
intfib0=0,fib1=1,fib2;
intn;
cout<for(n=1;n<=19;n++)
{fib2=fib0+fib1;
cout<fib0=fib1;
fib1=fib2;
if((n+1)%5==0)cout<}
return0;
}
3.编程任意输入一个三位数,判断其是否是水仙花数(水仙花数是指这个数等于个位,十位和百位的立方和。
例如:
153=13+53+33)
要求:
程序原代码,及运行结果截图。
(直接粘贴在此)
#include
usingnamespacestd;
intmain()
{
cout<<"请输入需要判断的正整数"<inta,g,s,b;
cin>>a;
g=a%10;
s=(a/10)%10;
b=a/100;
if(a==g*g*g+s*s*s+b*b*b)
cout<<"该整数为水仙花数"<else
cout<<"该整数不是水仙花数"<return0;
}
解决本题的算法思路描述。
首先要解决的是如何取得个十百三位的数字,然后用if语句进行判断。
调试过程的记载(包括出现的错误,以及修改过程)
对十位和百位的数字进行提取的时候出现错误。
开始时:
g=a%10;改正后:
g=a%10;
s=a%100;s=(a/10)%10;
b=a%1000;b=a/100;
4.输出3到100以内的所有素数。
(要求每行显示8个数)
提示:
该题需要用到多重循环,外循环代表需要判断的数,从3到100,内循环判断该数是否是素数,参考教材的例4.9(判断一个数是否为素数)。
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
#include
usingnamespacestd;
intmain()
{
inti,n,m=0,s=0,a;
for(i=3;i<=100;i++)
{
a=1;
for(n=2;n
{
if(i%n==0)
{
a=0;
break;
}
}
if(a==1)
{
cout<m=m+1;
if(m%8==0)
cout<}
else
;
}
return0;
}
解决本题的算法思路描述
运用双重循环语句进行,一个用来判断是否为素数,另外一个用来循环3-100.
调试过程的记载(包括出现的错误,以及修改过程)
a需要每次循环都赋值,最初放在循环外,导致只能输出3一个数字。
花括号位置错误,导致格式不正确。
5.连续输入n个整数(n由键盘输入)统计其中正数、负数和零的个数。
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
usingnamespacestd;
intmain()
{
cout<<"请输入所需统计的数字的个数"<inti=1,z=0,f=0,l=0,n,a;
cin>>n;
cout<<"请输入所需统计的数据"<for(;i<=n;i++)
{
cin>>a;
if(a==0)
l++;
elseif(a>0)
z++;
else
f++;
}
cout<<"统计的数据中正数、负数以及0的个数分别"<return0;
}
解决本题的算法思路描述
首先判断输入数据的个数,然后运用for循环和if-else语句进行统计出现次数。
调试过程的记载(包括出现的错误,以及修改过程)
未出现错误,但是最开始的程序未进行相关提示。
6.改写教材115例18,规则为5局3胜制规则,其余条件不变。
要求:
程序原代码,及运行结果截图。
(直接粘贴在此)
#include
#include
usingnamespacestd;
intmain()
{
intv1=0,v2=0,i,p1,p2;
while(v1<3&&v2<3)
{
cout<<"请输入两个小孩的划拳值,1代表石头,2代表剪刀,3代表布。
"<cin>>p1>>p2;
switch(p1)
{
case1:
cout<<"石头";break;
case2:
cout<<"剪刀";break;
case3:
cout<<"布";break;
}
cout<<'\t';
switch(p2)
{
case1:
cout<<"石头";break;
case2:
cout<<"剪刀";break;
case3:
cout<<"布";break;
}
cout<<'\n';
if(p1==p2)
continue;
if(p1==1&&p2==2||p1==2&&p2==3||p1==3&&p2==1)
v1++;
else
v2++;
}
if(v1==3)
cout<<"小孩1获胜"<else
cout<<"小孩2获胜"<return0;
}
解决本题的算法思路描述
通过修改while的循环条件即可实现五局三胜制
只需要统计两个孩子的胜利次数,谁先到达三次即获胜
调试过程的记载(包括出现的错误,以及修改过程)
由于为书中例题,只需简单修改即可完成,故未出现错误
7.改写教材龟兔赛跑程序,要求在指定距离的条件下比赛,其余规则不变。
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
usingnamespacestd;
intmain()
{
ints,sw=0,st=0,station=0,sleep=0,run=0;
cout<<"输入比赛距离:
";
cin>>s;
while(sw
{
if(station==0)
{
run++;
sw+=3;
st+=9;
if(run==10)
{
run=0;
if(st>sw)
station=1;
else
;
}
else
;
}
else
{
sleep++;
sw+=3;
if(sleep==30)
{
station=0;
sleep=0;
}
else
;
}
}
if(sw>st)
cout<<"乌龟胜"<elseif(swcout<<"兔子胜"<else
cout<<"平局"<return0;
}
解决本题的算法思路描述
1.以时间为循环的控制条件,计算两者走相同路程时谁的时间少,运用累计时间的算法,有一者到达指定路程就停止计时,然后比较两者的路程。
2.对乌龟和兔子的行程进行累计,通过速度和时间来完成。
3.判断兔子是否在进行休息,用station来表示,0为运动1为睡觉。
4.累计睡觉的时间,每到十分钟要重新从0开始计算。
调试过程的记载(包括出现的错误,以及修改过程)
赋值符号与判断相等的符号混淆。
8.小王拿了50元钱准备去菜场买菜,已知黄瓜3元1斤,韭菜5元1斤,西红柿4元1斤,如何买这3样菜(每种菜都必须买),并且将50元花完,列出所有可能的买法。
(只考虑整斤)
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
usingnamespacestd;
intmain()
{
inth,j,x,z;
for(h=1;h<17;h++)
{
for(j=1;j<=10;j++)
{
for(x=1;x<13;x++)
{
if(3*h+5*j+4*x==50)
cout<<"黄瓜,韭菜,西红柿的数量分别为"<"<}
}
}
return0;
}
解决本题的算法思路描述
利用多重循环,使用穷举法得出结果。
调试过程的记载(包括出现的错误,以及修改过程)
For语句中;错写为,
循环语句出错,更改了循环语句。
9.编程将一个10进制整数转换成2进制整数。
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
usingnamespacestd;
voidmain()
{
ints,i=0,j,a,b[100];
cout<<"请输入需要转化的十进制整数"<cin>>s;
while(s!
=0)
{
a=s/2;
b[i]=s%2;
s=a;
i++;
}
for(j=i-1;j>=0;j--)
cout<
cout<}
解决本题的算法思路描述
十进制转为二进制的各个位数的数字用对2取余获得
然后用数组储存数字
最后倒序输出
调试过程的记载(包括出现的错误,以及修改过程)
For语句中的j开始时定义错数值,应为i-1忘记减1
10.编程将一个10进制定点小数转换成2进制定点小数。
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
#include
usingnamespacestd;
doublemain()
{
intm=0;doubles,a;
cout<<"请输入需要转化的十进制定点小数"<cin>>s;
cout<<"结果为0.";
while(m<=8)
{
a=s*2;
if(a>=1)
s=a-1;
else
s=a;
m++;
cout<if(s==0)
break;
}
cout<}
解决本题的算法思路描述
小数点后的每一位数字用乘2循环求得,乘2后的小数用floor取整
调试过程的记载(包括出现的错误,以及修改过程)
输入数据的类型出错。
由int改为double
11.编程要求从文件in.txt中连续读入n个数(n由键盘输入),统计其中正数、负数和零的个数。
(in.txt是事先建好的一个文件存有若干数据,当输入的n值大于in.txt文件中的数据个数时给出相应的提示,判断文件中的数据是否读完使用eof()函数。
eof()函数是判断是否到文件结尾,如果到文件结尾函数返回1,否则返回0,具体参考教材115页例4.17)
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
#include
usingnamespacestd;
intmain()
{
doublex;
intz=0,f=0,l=0,n,i=1,m;
cout<<"请输入所需统计的数字的个数"<cin>>n;
ifstreamin;
in.open("d:
\\in.txt");
while(i<=n&&in.eof()==0)
{
in>>x;
i++;
if(x==0)
l++;
elseif(x>0)
z++;
else
f++;
}
m=l+z+f;
if(n>m)
{cout<<"数据数量小于所要统计的数量"<cout<<"统计的正数、负数和零数量分别为"<in.close();
return0;
}
解决本题的算法思路描述
运用读取文件的语句,用if语句累计三种数据的个数。
调试过程的记载(包括出现的错误,以及修改过程)
逗号用的中文用了''标志出现错误。
更改为英文的逗号正常了。
12.(选做)一位商人有一个40磅的砝码,由于跌落在地而碎成4块,后来称得每块碎片的重量都是整数,而且可以用这4块来称从1到40磅之间的任意整数磅的重物,问这4块砝码碎片各重多少?
提示:
此题需要两次用到穷举法,第一次穷举是4个砝码的重量,分别用四个循环变量i,j,k,l来表示。
第二次穷举是当i+j+k+l==40时,对重1磅到40磅共40种物品使用i,j,k,l四个称进行组合,设置一个计数器,组合出1个计数器加1,如果能组合出40个,就是我们要找的答案。
要求:
程序原代码,及运行结果截图。
。
(直接粘贴在此)
#include
usingnamespacestd;
intmain()
{
inti,j,k,l,d1,d2,d3,d4,x,flag,s=0;
cout<<"砝码分为";
for(i=1;i<41;i++)
{
for(j=i;j<41;j++)
{
for(k=j;k<41;k++)
{
if((l=40-i-j-k)>=k)
{s=0;
for(x=1;x<41;x++)
{flag=0;
for(d1=1;d1>-2&&flag==0;d1--)
{
for(d2=1;d2>-2&&flag==0;d2--)
{
for(d3=1;d3>-2&&flag==0;d3--)
{
for(d4=1;d4>-2&&flag==0;d4--)
{
if(x==i*d1+j*d2+k*d3+l*d4)
{
flag=1;
s++;
}
}
}
}
}
if(s==40)
{
cout<
}
}
}
}
}
}
return0;
}
解决本题的算法思路描述
首先找出所有组合,然后进行筛选。
调试过程的记载(包括出现的错误,以及修改过程)
最终的输出语句所在位置一直不正确,通过调试解决。
解决同一个x可能导致s多次累加的问题
解决存在重复的问题,即出现1.3.9.27和3.1.9.27等
三、对本次实验内容及方法、手段的改进建议,以及实验心得
实验心得包括:
1)哪些知识点已掌握
2)哪些知识点有困难
3)对讲课的建议
4)对没有掌握知识的补救建议
1)
For语句循环,while以及do-while语句已经掌握。
If-else语句、break、continue已经掌握。
文件的读取与写入也已经能够运用。
2)
对于龟兔赛跑等很复杂的问题掌握不够熟练
For语句很多次的叠加可能出错
3)
多进行程序上的演示,更容易理解。
4)
多进行相关习题的训练掌握原理
重新阅读课本。