华中科技大学《计算机基础与程序设计(C++)》实验报告实验名称:第三次上机实验实验学时:4姓名:学号:班级:电气实验日期:2017/3/27 教师批阅签字:一、实验目的●掌握三种循环语句的使用。
●学会使用continue 和break。
●掌握多重循环的设计。
●掌握常用算法的应用。
二、实验内容1.在vc环境下编写下述程序代码,编译调试然后用不同的数据测试直至得到完全正确的结果。
并解释出错原因。
#include<iostream>#include<cmath>using namespace std;int main( ){float x0,x1,a;cout<<"输入一个正数:";cin>>a;if(a<0)cout<<a<<"不能开平方!"<<endl;else ;{x0=a/2;x1=(x0+a/x0)/2;while (abs(x1-x0)>=1e-5){x0=x1;x1=(x0+a/x0)/2;}cout<< a<<"的平方根为:"<<x1<<endl;}return 0;语法错误:1.最后缺少花括号。
逻辑错误:1.else后面有分号,导致花括号中的语句不受else限制。
2.abs所提供的精度为整数更改后的程序:#include<iostream>#include<cmath>using namespace std;int main( ){float x0,x1,a;cout<<"输入一个正数:";cin>>a;if(a<0)cout<<a<<"不能开平方!"<<endl;else{x0=a/2;x1=(x0+a/x0)/2;while (fabs(x1-x0)>=1e-5){x0=x1;x1=(x0+a/x0)/2;}cout<< a<<"的平方根为:"<<x1<<endl;}return 0;}2.下列程序的功能是:计算一对兔子,从出生后第3个月起每个月都生一对兔子。
小兔子长到第3个月后每个月又生一对兔子,假设兔子不存在死亡问题,请问从第1个月到第20个月,每个月有多少对兔子?要求输出时按行列方式每行显示5个数据。
如下图:编译调试该程序看是否正确,不正确的话修改之直至完全满足要求。
并解释出错原因。
int main(){int fib0=0,fib1=1,fib2;int n;cout<<setw(5)<<fib0<<fib1<<endl;for(n=1;n<=20;n++){ fib2=fib0+fib1;cout<<setw(5)<<fib2;fib1=fib2;fib0=fib1;if(n%5==0) cout<<endl;}return 0;}语法错误:1.缺少头文件(iostream以及iomanip)以及命名空间。
2.return 0后的分号为中文分号。
逻辑错误:1. cout<<setw(5)<<fib1;最初只需要输出一个月而且无需换行2.前面已经输出一个月所以n<=19。
而且后面的换行也需要改为n+13.复制顺序错误,应该为fib0=fib1;fib1=fib2;改正后的程序:#include <iostream>#include <iomanip>using namespace std;int main(){int fib0=0,fib1=1,fib2;int n;cout<<setw(5)<<fib1;for(n=1;n<=19;n++){ fib2=fib0+fib1;cout<<setw(5)<<fib2;fib0=fib1;fib1=fib2;if((n+1)%5==0) cout<<endl;}return 0;}3.编程任意输入一个三位数,判断其是否是水仙花数(水仙花数是指这个数等于个位,十位和百位的立方和。
例如:153=13+53+33)要求:程序原代码,及运行结果截图。
(直接粘贴在此)#include <iostream>using namespace std;{cout<<"请输入需要判断的正整数"<<endl;int a,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<<"该整数为水仙花数"<<endl;elsecout<<"该整数不是水仙花数"<<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(判断一个数是否为素数)。
要求:程序原代码,及运行结果截图。
(直接粘贴在此)#include <iostream>#include <iomanip>using namespace std;int main(){int i,n,m=0,s=0,a;for (i=3;i<=100;i++){a=1;for (n=2;n<i;n++)if (i%n==0){a=0;break;}}if (a==1){cout<<setw(3)<<i;m=m+1;if (m%8==0)cout<<endl;}else;}return 0;}解决本题的算法思路描述运用双重循环语句进行,一个用来判断是否为素数,另外一个用来循环3-100.调试过程的记载(包括出现的错误,以及修改过程)a需要每次循环都赋值,最初放在循环外,导致只能输出3一个数字。
花括号位置错误,导致格式不正确。
5.连续输入n 个整数(n由键盘输入)统计其中正数、负数和零的个数。
要求:程序原代码,及运行结果截图。
(直接粘贴在此)#include <iostream>using namespace std;int main(){cout<<"请输入所需统计的数字的个数"<<endl;int i=1,z=0,f=0,l=0,n,a;cin>>n;cout<<"请输入所需统计的数据"<<endl;for (;i<=n;i++){cin>>a;if (a==0)l++;else if (a>0)z++;elsef++;}cout<<"统计的数据中正数、负数以及0的个数分别"<<z<<','<<f<<','<<l<<endl;return 0;}解决本题的算法思路描述首先判断输入数据的个数,然后运用for循环和if-else语句进行统计出现次数。
调试过程的记载(包括出现的错误,以及修改过程)未出现错误,但是最开始的程序未进行相关提示。
6.改写教材115 例18 ,规则为5局3胜制规则,其余条件不变。
要求:程序原代码,及运行结果截图。
(直接粘贴在此)#include <iostream>#include <cmath>using namespace std;int main(){int v1=0,v2=0,i,p1,p2;while (v1<3&&v2<3){cout<<"请输入两个小孩的划拳值,1代表石头,2代表剪刀,3代表布。
"<<endl;cin>>p1>>p2;switch (p1){case 1:cout<<"石头";break;case 2:cout<<"剪刀";break;case 3:cout<<"布";break;}cout<<'\t';switch (p2){case 1:cout<<"石头";break;case 2:cout<<"剪刀";break;case 3:cout<<"布";break;}cout<<'\n';if(p1==p2)continue;if(p1==1&&p2==2||p1==2&&p2==3||p1==3&&p2==1) v1++;elsev2++;}if (v1==3)cout<<"小孩1获胜"<<endl;elsecout<<"小孩2获胜"<<endl;return 0;}解决本题的算法思路描述通过修改while的循环条件即可实现五局三胜制只需要统计两个孩子的胜利次数,谁先到达三次即获胜调试过程的记载(包括出现的错误,以及修改过程)由于为书中例题,只需简单修改即可完成,故未出现错误7.改写教材龟兔赛跑程序,要求在指定距离的条件下比赛,其余规则不变。
要求:程序原代码,及运行结果截图。
(直接粘贴在此)#include<iostream>using namespace std;int main(){int s,sw=0,st=0,station=0,sleep=0,run=0;cout<<"输入比赛距离:";cin>>s;while(sw<s&&st<s){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<<"乌龟胜"<<endl;else if(sw<st)cout<<"兔子胜"<<endl;elsecout<<"平局"<<endl;return 0;}解决本题的算法思路描述1.以时间为循环的控制条件,计算两者走相同路程时谁的时间少,运用累计时间的算法,有一者到达指定路程就停止计时,然后比较两者的路程。