1中南大学实验报告课程名称c++程序设计实验项目名称实验4实验5实验6指导老师向瑶实验学生班级电子信息工程1503实验学生姓名陶韬学号0903130309实验时间2016.4.1至4.10实验地点校本部科技楼4楼实验成绩评定2实验三c++程序设计初步班级:电信1503姓名:陶韬实验3.1题目:有一函数X(X1)Y=2X-1(1=x10)3X-11(x=10)编程输入x,求y代码#includeiostreamusingnamespacestd;main(){intx,y;coutenterx:;cinx;if(x1){y=x;coutx=x,y=x=y;}elseif(x10){y=2*x-1;coutx=x,y=2*x-1=y;}else{y=3*x-11;coutx=x,y=3*x-11=y;}coutendl;return0;}3运行结果enterx:-1x=-1,y=x=-1enterx:4X=4,y=2*x-1=7enterx:20x=20,y=3*x-11=49实验3.2题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数,并按照下面格式输出其因子6,itsfactorsare1,2,3;我的分析思路首先算法应该分为2大部分第一部分把输入的数的所有因子找出来可以定义一个整型数组来存放因子第二部分判断这个数的所有因子之和和这个数是否相等相当就输出不等就继续循环代码方法一:#includeiostreamusingnamespacestd;main(){inti=1,j=1,sum=0;//定义变量i是表示1到1000的数//j是因子,sum是因子的和intk=0,m=0,factor[1000];//facetor[]是存放因子数值的数组k表示数组的下标for(i=1;i=1000;i++,sum=0,k=0)//通过循环找出i的所有因子然后求和//注意每次循环前sum和k的值一定要重置{for(j=1;ji;j++)if(i%j==0){sum+=j;factor[k]=j;k++;4}if(i==sum)//判断i是否等于sum如果是就输出结果否则继续外圈循环(i循环){couti,itsfactorsare;for(m=0;m=k-1;m++)coutfactor[m],;coutendl;}}}输出结果6,itsfactorsare1,2,3,28,itsfactorsare1,2,4,7,14,496,itsfactorsare1,2,4,8,16,31,62,124,248,方法二:#includeiostreamusingnamespacestd;main(){inti=0,j=0,sum=0;for(i=2;i=1000;i++,sum=0)//这里每次循环前对sum进行重新赋值很重要{for(j=1;ji;j++)//循环找出i的因子并求和if(i%j==0)sum+=j;if(sum==i)//如果满足条件就通过循环结构输出因子的值{couti,itsfactorsare;for(j=1;ji;j++)if(i%j==0)coutj;coutendl;}5}return0;}输出结果6,itsfactorsare1,2,3,28,itsfactorsare1,2,4,7,14,496,itsfactorsare1,2,4,8,16,31,62,124,248,实验3.3.1题目:用迭代法求x=√a求平方根的迭代公式为Xn+1=1/2(Xn+1/(Xn))要求前后两次求出的x的差的绝对值小于1e-5,在运行时输入不同的数值赋给变量a,分析所得结果是否正确。如果输入的值为一个负数,在运行时会出现什么情况?修改程序使之能处理任何的a值前后两次求出的x的差的绝对值能否该为小于1e-10或者更小?为什么?请试一下。分析:求平方根的算法为设定一个x的初值x0用上述公式求出x的下一个值x1再将x1带入上述公式右侧,求出x的下一个值x2④如此继续下去,直到前后2次求出x的值代码1#includeiostream#includecmathusingnamespacestd;main(){floatx0,x1,a;cout请输入一个正数endl;cina;x0=a/2;6x1=0.5*(x0+a/x0);for(;fabs(x1-x0)1e-5;){x0=x1;x1=0.5*(x0+a/x0);}couta的平方根为x1endl;}输出结果请输入一个正数2a的平方根为1.41422Pressanykeytocontinue实验3.3.2如果输入一个负值会一直循环下去也就是形成死循环解决方法在a的输入语句后面加一个判断语句判断所给的a是否是正值如果不是就需要再输入代码#includeiostream#includecmathusingnamespacestd;main(){floatx0,x1,a;cout请输入一个正数endl;cina;for(;a0;){cout你输入的不是一个符合要求的正数,请重新输入endl;cina;}x0=a/2;x1=0.5*(x0+a/x0);for(;fabs(x1-x0)1e-5;){7x0=x1;x1=0.5*(x0+a/x0);}couta的平方根为x1endl;}输出结果请输入一个正数-1你输入的不是一个符合要求的正数,请重新输入2a的平方根为1.41421Pressanykeytocontinue实验3.3.3前后2次x的差的绝对值能否改为小于1e-10或者更小?为什么?请试一下可以修改,但是实际作用和1e-5等效,因为float类型的有效数字只有6位显然后面位数无法进行精确比较,为了满足题设应该把变量定义为double类型float精度是2^23,能保证6位。double精度是2^52,能保证15位。但是默认float和double都只能显示6位,再多需要#includeiomanip,然后在输出语句之前插入coutsetprecision(20);强制输出小数位。代码#includeiostream#includecmath#includeiomanipusingnamespacestd;main(){longdoublex0,x1,a;cout请输入一个正数endl;cina;for(;a=0;)8{cout你输入的不是一个符合要求的正数,请重新输入endl;cina;}x0=a/2;x1=0.5*(x0+a/x0);for(;fabs(x1-x0)1e-10;){x0=x1;x1=0.5*(x0+a/x0);}couta的平方根为setprecision(20)x1endl;}输出结果请输入一个正数2a的平方根为1.4142135623730949Pressanykeytocontinue实验3.4要求输入以下图案************************9*分析:分成2部分解决第一部分输出第1到4行每一行‘*’的个数为2*n-1第二部分输出第4到7行,相当于重新输入1到3行每一行‘*’的个数为7-(2*n)代码#includeiostream#includecmath#includeiomanipusingnamespacestd;main(){inti=1,j=1;for(i=1;i=4;i++)//输出第1到4行的图标{for(j=1;j=2*i-1;j++)cout'*';coutendl;}for(i=1;i=3;i++)//输出第5到7行的图标{for(j=1;j=7-2*i;j++)cout'*';coutendl;}return0;}输出结果*************************Pressanykeytocontinue实验3.4.2在运行得到正确结果后,请修改程序,以输出以下的图案*10************************分析还是分成2个小部分来解决第一部分输出上半部分第二部分输出下半部分行数空格数*空格与行数的关系*与行数的关系1314-i2*i-1223315407代码#includeiostream#includecmath#includeiomanipusingnamespacestd;main(){inti=1,j=1;for(i=1;i=4;i++)//输出第一部分{for(j=1;j=4-i;j++)//第一部分的空格cout'';for(j=1;j=2*i-1;j++)//第一部分的*cout'*';coutendl;}for(i=1;i=3;i++)//输出第二部分{for(j=1;j=i;j++)//第二部分的空格cout'';for(j=1;j=7-2*i;j++)//第二部分的*cout'*';coutendl;}}11结果*************************Pressanykeytocontinue