华中科技大学c++第3次上机作业.docx

上传人:b****8 文档编号:29828046 上传时间:2023-07-27 格式:DOCX 页数:24 大小:206.07KB
下载 相关 举报
华中科技大学c++第3次上机作业.docx_第1页
第1页 / 共24页
华中科技大学c++第3次上机作业.docx_第2页
第2页 / 共24页
华中科技大学c++第3次上机作业.docx_第3页
第3页 / 共24页
华中科技大学c++第3次上机作业.docx_第4页
第4页 / 共24页
华中科技大学c++第3次上机作业.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

华中科技大学c++第3次上机作业.docx

《华中科技大学c++第3次上机作业.docx》由会员分享,可在线阅读,更多相关《华中科技大学c++第3次上机作业.docx(24页珍藏版)》请在冰豆网上搜索。

华中科技大学c++第3次上机作业.docx

华中科技大学c++第3次上机作业

华中科技大学

《计算机基础与程序设计(C++)》

实验报告

实验名称:

第三次上机实验实验学时:

4

姓名:

学号:

班级:

电气

实验日期:

2017/3/27教师批阅签字:

一、实验目的

●掌握三种循环语句的使用。

●学会使用continue和break。

●掌握多重循环的设计。

●掌握常用算法的应用。

二、实验内容

1.在vc环境下编写下述程序代码,编译调试然后用不同的数据测试直至得到完全正确的结果。

并解释出错原因。

#include

#include

usingnamespacestd;

intmain()

{

floatx0,x1,a;

cout<<"输入一个正数:

";

cin>>a;

if(a<0)

cout<

"<

else;

{

x0=a/2;

x1=(x0+a/x0)/2;

while(abs(x1-x0)>=1e-5)

{

x0=x1;

x1=(x0+a/x0)/2;

}

cout<

"<

}

return0;

语法错误:

1.最后缺少花括号。

逻辑错误:

1.else后面有分号,导致花括号中的语句不受else限制。

2.abs所提供的精度为整数

更改后的程序:

#include

#include

usingnamespacestd;

intmain()

{

floatx0,x1,a;

cout<<"输入一个正数:

";

cin>>a;

if(a<0)

cout<

"<

else

{

x0=a/2;

x1=(x0+a/x0)/2;

while(fabs(x1-x0)>=1e-5)

{

x0=x1;

x1=(x0+a/x0)/2;

}

cout<

"<

}

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(sw

cout<<"兔子胜"<

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)

多进行相关习题的训练掌握原理

重新阅读课本。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1