1、华中科技大学c+第3次上机作业华中科技大学计算机基础与程序设计(C+)实验报告实验名称:第三次上机实验实验学时:4姓名:学号:班级:电气实验日期:2017/3/27 教师批阅签字:一、实验目的 掌握三种循环语句的使用。 学会使用continue 和break。 掌握多重循环的设计。 掌握常用算法的应用。二、 实验内容1在vc环境下编写下述程序代码,编译调试然后用不同的数据测试直至得到完全正确的结果。并解释出错原因。#include#includeusing namespace std;int main( ) float x0,x1,a; couta; if(a0) couta不能开平方!=1e
2、-5) x0=x1; x1=(x0+a/x0)/2; cout a的平方根为:x1endl; return 0;语法错误:1.最后缺少花括号。逻辑错误:1.else后面有分号,导致花括号中的语句不受else限制。2.abs所提供的精度为整数更改后的程序:#include#includeusing namespace std;int main( ) float x0,x1,a; couta; if(a0) couta不能开平方!=1e-5) x0=x1; x1=(x0+a/x0)/2; cout a的平方根为:x1endl; return 0;2 下列程序的功能是:计算一对兔子,从出生后第3个月
3、起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设兔子不存在死亡问题,请问从第1个月到第20个月,每个月有多少对兔子?要求输出时按行列方式每行显示5个数据。如下图:编译调试该程序看是否正确,不正确的话修改之直至完全满足要求。并解释出错原因。int main() int fib0=0,fib1=1,fib2; int n; coutsetw(5)fib0fib1endl; for(n=1;n=20;n+) fib2=fib0+fib1; coutsetw(5)fib2; fib1=fib2; fib0=fib1; if(n%5=0) coutendl; return 0;语法错误
4、:1.缺少头文件(iostream以及iomanip)以及命名空间。2.return0后的分号为中文分号。逻辑错误:1. coutsetw(5)fib1;最初只需要输出一个月而且无需换行2.前面已经输出一个月 所以n=19。而且后面的换行也需要改为n+13.复制顺序错误,应该为fib0=fib1;fib1=fib2;改正后的程序:#include #include using namespace std;int main() int fib0=0,fib1=1,fib2; int n; coutsetw(5)fib1; for(n=1;n=19;n+) fib2=fib0+fib1; cout
5、setw(5)fib2; fib0=fib1; fib1=fib2; if(n+1)%5=0) coutendl; return 0;3 编程任意输入一个三位数,判断其是否是水仙花数(水仙花数是指这个数等于个位,十位和百位的立方和。例如:153=13+53+33)要求:程序原代码,及运行结果截图。(直接粘贴在此)#include using namespace std;int main() cout请输入需要判断的正整数a; g=a%10; s=(a/10)%10; b=a/100; if (a=g*g*g+s*s*s+b*b*b) cout该整数为水仙花数endl; else cout该整数
6、不是水仙花数endl; return 0;解决本题的算法思路描述。首先要解决的是如何取得个十百三位的数字,然后用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(判断一个数是否为素数)。要求:程序原代码,及运行结果截图。(直接粘贴在此)#inclu
7、de #include using namespace std;int main() int i,n,m=0,s=0,a; for (i=3;i=100;i+) a=1; for (n=2;ni;n+) if (i%n=0) a=0; break; if (a=1) coutsetw(3)i; m=m+1; if (m%8=0) coutendl; else ; return 0;解决本题的算法思路描述运用双重循环语句进行,一个用来判断是否为素数,另外一个用来循环3-100.调试过程的记载(包括出现的错误,以及修改过程)a需要每次循环都赋值,最初放在循环外,导致只能输出3一个数字。花括号位置错
8、误,导致格式不正确。5 连续输入n 个整数(n由键盘输入)统计其中正数、负数和零的个数。要求:程序原代码,及运行结果截图。(直接粘贴在此)#include using namespace std;int main() cout请输入所需统计的数字的个数n; cout请输入所需统计的数据endl; for (;ia; if (a=0) l+; else if (a0) z+; else f+; cout统计的数据中正数、负数以及0的个数分别z,f,lendl; return 0;解决本题的算法思路描述首先判断输入数据的个数,然后运用for循环和if-else语句进行统计出现次数。调试过程的记载(
9、包括出现的错误,以及修改过程)未出现错误,但是最开始的程序未进行相关提示。6 改写教材115 例18 ,规则为5局3胜制规则,其余条件不变。要求:程序原代码,及运行结果截图。(直接粘贴在此)#include #include using namespace std;int main() int v1=0,v2=0,i,p1,p2; while (v13&v23) cout请输入两个小孩的划拳值,1代表石头,2代表剪刀,3代表布。p1p2; switch (p1) case 1:cout石头;break; case 2:cout剪刀;break; case 3:cout布;break; cout
10、t; switch (p2) case 1:cout石头;break; case 2:cout剪刀;break; case 3:cout布;break; coutn; 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获胜endl; else cout小孩2获胜endl; return 0;解决本题的算法思路描述通过修改while的循环条件即可实现五局三胜制只需要统计两个孩子的胜利次数,谁先到达三次即获胜调试过程的记载(包括出现的错误,以及修改过程)由于为书中例题,只需简单
11、修改即可完成,故未出现错误7 改写教材龟兔赛跑程序,要求在指定距离的条件下比赛,其余规则不变。要求:程序原代码,及运行结果截图。(直接粘贴在此)#includeusing namespace std;int main() int s,sw=0,st=0,station=0,sleep=0,run=0; couts; while(sws&stsw) station=1; else ; else ; else sleep+; sw+=3; if(sleep=30) station=0; sleep=0; else ; if(swst) cout乌龟胜endl; else if(swst) cout
12、兔子胜endl; else cout平局endl; return 0;解决本题的算法思路描述1.以时间为循环的控制条件,计算两者走相同路程时谁的时间少,运用累计时间的算法,有一者到达指定路程就停止计时,然后比较两者的路程。2.对乌龟和兔子的行程进行累计,通过速度和时间来完成。3.判断兔子是否在进行休息,用station来表示,0为运动1为睡觉。4.累计睡觉的时间,每到十分钟要重新从0开始计算。调试过程的记载(包括出现的错误,以及修改过程)赋值符号与判断相等的符号混淆。8 小王拿了50元钱准备去菜场买菜,已知黄瓜3元1斤,韭菜5元1斤,西红柿4元1斤,如何买这3样菜(每种菜都必须买),并且将50
13、元花完,列出所有可能的买法。(只考虑整斤)要求:程序原代码,及运行结果截图。(直接粘贴在此)#include using namespace std;int main() int h,j,x,z; for (h=1;h17;h+) for (j=1;j=10;j+) for(x=1;x13;x+) if (3*h+5*j+4*x=50) cout黄瓜,韭菜,西红柿的数量分别为h,j,x斤。endl; return 0;解决本题的算法思路描述利用多重循环,使用穷举法得出结果。调试过程的记载(包括出现的错误,以及修改过程)For语句中;错写为,循环语句出错,更改了循环语句。9 编程将一个10进制整
14、数转换成2进制整数。要求:程序原代码,及运行结果截图。(直接粘贴在此)#include using namespace std;void main() int s,i=0,j,a,b100; cout请输入需要转化的十进制整数s; while (s!=0) a=s/2; bi=s%2; s=a; i+; for (j=i-1;j=0;j-) coutbj; coutendl;解决本题的算法思路描述十进制转为二进制的各个位数的数字用对2取余获得然后用数组储存数字最后倒序输出调试过程的记载(包括出现的错误,以及修改过程)For语句中的j开始时定义错数值,应为i-1忘记减110 编程将一个10进制定
15、点小数转换成2进制定点小数。要求:程序原代码,及运行结果截图。(直接粘贴在此)#include #include using namespace std;double main() int m=0; double s,a; cout请输入需要转化的十进制定点小数s; cout结果为0.; while (m=1) s=a-1; else s=a; m+; coutfloor(a); if (s=0) break; coutendl;解决本题的算法思路描述小数点后的每一位数字用乘2循环求得,乘2后的小数用floor取整调试过程的记载(包括出现的错误,以及修改过程)输入数据的类型出错。由int改为d
16、ouble11 编程要求从文件in.txt 中连续读入n个数(n由键盘输入),统计其中正数、负数和零的个数。(in.txt 是事先建好的一个文件存有若干数据,当输入的n值大于in.txt文件中的数据个数时给出相应的提示,判断文件中的数据是否读完使用eof() 函数。eof() 函数是判断是否到文件结尾,如果到文件结尾函数返回1,否则返回0,具体参考教材115页例4.17 )要求:程序原代码,及运行结果截图。(直接粘贴在此)#include #include using namespace std;int main() double x; int z=0,f=0,l=0,n,i=1,m; cou
17、t请输入所需统计的数字的个数n; ifstream in; in.open(d:in.txt); while (ix; i+; if (x=0) l+; else if (x0) z+; else f+; m=l+z+f; if (nm) cout数据数量小于所要统计的数量endl; cout统计的正数、负数和零数量分别为z,f,lendl; in.close(); return 0;解决本题的算法思路描述运用读取文件的语句,用if语句累计三种数据的个数。调试过程的记载(包括出现的错误,以及修改过程)逗号用的中文用了标志出现错误。更改为英文的逗号正常了。12 (选做)一位商人有一个40磅的砝码
18、,由于跌落在地而碎成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 using namespace std;int main() int i,j,k,l,d1,d2,d3,
19、d4,x,flag,s=0; cout砝码分为; for(i = 1;i 41;i+) for(j = i;j 41;j+) for(k = j;k =k) s=0; for(x=1;x-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) couti,j,k,l四块endl; return 0; 解决本题的算法思路描述首先找出所有组合,然后进行筛选。调试过程的记载
20、(包括出现的错误,以及修改过程)最终的输出语句所在位置一直不正确,通过调试解决。解决同一个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