实验3 c++程序设计初步.docx
《实验3 c++程序设计初步.docx》由会员分享,可在线阅读,更多相关《实验3 c++程序设计初步.docx(14页珍藏版)》请在冰豆网上搜索。
实验3c++程序设计初步
中南大学
实验报告
课程名称c++程序设计
实验项目名称实验4实验5实验6
指导老师向瑶
实验学生班级电子信息工程1503
实验学生姓名陶韬
学 号0903130309
实验时间2016.4.1至4.10
实验地点校本部科技楼4楼
实验成绩评定
实验三c++程序设计初步
班级:
电信1503姓名:
陶韬
实验3.1
题目:
有一函数
X(X<1)
Y=2X-1(1=3X-11(x>=10)
编程输入x,求y
代码
#include
usingnamespacestd;
main()
{
intx,y;
cout<<"enterx:
";
cin>>x;
if(x<1)
{
y=x;
cout<<"x="<}
elseif(x<10)
{
y=2*x-1;
cout<<"x="<}
else
{
y=3*x-11;
cout<<"x="<}
cout<return0;
}
运行结果
enterx:
-1
x=-1,y=x=-1
enterx:
4
X=4,y=2*x-1=7
enterx:
20
x=20,y=3*x-11=49
实验3.2
题目:
一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。
编程找出1000之内的所有完数,并按照下面格式输出其因子
6,itsfactorsare1,2,3;
我的分析思路
首先算法应该分为2大部分
第一部分把输入的数的所有因子找出来可以定义一个整型数组来存放因子
第二部分判断这个数的所有因子之和和这个数是否相等相当就输出不等就继续循环
代码
方法一:
#include
usingnamespacestd;
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;j
if(i%j==0)
{
sum+=j;
factor[k]=j;
k++;
}
if(i==sum)//判断i是否等于sum如果是就输出结果否则继续外圈循环(i循环)
{
cout<
for(m=0;m<=k-1;m++)
cout<cout<}
}
}
输出结果
6,itsfactorsare1,2,3,
28,itsfactorsare1,2,4,7,14,
496,itsfactorsare1,2,4,8,16,31,62,124,248,
方法二:
#include
usingnamespacestd;
main()
{
inti=0,j=0,sum=0;
for(i=2;i<=1000;i++,sum=0)//这里每次循环前对sum进行重新赋值很重要
{
for(j=1;j
if(i%j==0)
sum+=j;
if(sum==i)//如果满足条件就通过循环结构输出因子的值
{
cout<
for(j=1;j
if(i%j==0)
cout<cout<}
}
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
#include
#include
usingnamespacestd;
main()
{
floatx0,x1,a;
cout<<"请输入一个正数"<cin>>a;
x0=a/2;
x1=0.5*(x0+a/x0);
for(;fabs(x1-x0)>1e-5;)
{
x0=x1;
x1=0.5*(x0+a/x0);
}
cout<<"a的平方根为"<}
输出结果
请输入一个正数
2
a的平方根为1.41422
Pressanykeytocontinue
实验3.3.2
如果输入一个负值会一直循环下去也就是形成死循环
解决方法在a的输入语句后面加一个判断语句判断所给的a是否是正值如果不是就需要再输入
代码
#include
#include
usingnamespacestd;
main()
{
floatx0,x1,a;
cout<<"请输入一个正数"<cin>>a;
for(;a>0;)
{
cout<<"你输入的不是一个符合要求的正数,请重新输入"<cin>>a;
}
x0=a/2;
x1=0.5*(x0+a/x0);
for(;fabs(x1-x0)>1e-5;)
{
x0=x1;
x1=0.5*(x0+a/x0);
}
cout<<"a的平方根为"<}
输出结果
请输入一个正数
-1
你输入的不是一个符合要求的正数,请重新输入
2
a的平方根为1.41421
Pressanykeytocontinue
实验3.3.3前后2次x的差的绝对值能否改为小于1e-10或者更小?
为什么?
请试一下
可以修改,但是实际作用和1e-5等效,因为float类型的有效数字只有6位显然后面位数无法进行精确比较,为了满足题设应该把变量定义为double类型
float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
但是默认float和double都只能显示6位,再多需要#include,然后在输出语句之前插入cout<代码
#include
#include
#include
usingnamespacestd;
main()
{
longdoublex0,x1,a;
cout<<"请输入一个正数"<cin>>a;
for(;a<=0;)
{
cout<<"你输入的不是一个符合要求的正数,请重新输入"<cin>>a;
}
x0=a/2;
x1=0.5*(x0+a/x0);
for(;fabs(x1-x0)>1e-10;)
{
x0=x1;
x1=0.5*(x0+a/x0);
}
cout<<"a的平方根为"<
}
输出结果
请输入一个正数
2
a的平方根为1.4142135623730949
Pressanykeytocontinue
实验3.4
要求输入以下图案
*
***
*****
*******
*****
***
*
分析:
分成2部分解决第一部分输出第1到4行每一行‘*’的个数为2*n-1
第二部分输出第4到7行,相当于重新输入1到3行每一行‘*’的个数为7-(2*n)
代码
#include
#include
#include
usingnamespacestd;
main()
{
inti=1,j=1;
for(i=1;i<=4;i++)//输出第1到4行的图标
{
for(j=1;j<=2*i-1;j++)
cout<<'*';
cout<}
for(i=1;i<=3;i++)//输出第5到7行的图标
{for(j=1;j<=7-2*i;j++)
cout<<'*';
cout<}
return0;
}
输出结果
*
***
*****
*******
*****
***
*
Pressanykeytocontinue
实验3.4.2
在运行得到正确结果后,请修改程序,以输出以下的图案
*
***
*****
*******
*****
***
*
分析还是分成2个小部分来解决第一部分输出上半部分第二部分输出下半部分
行数
空格数
*
空格与行数的关系
*与行数的关系
1
3
1
4-i
2*i-1
2
2
3
3
1
5
4
0
7
代码
#include
#include
#include
usingnamespacestd;
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<<'*';
cout<}
for(i=1;i<=3;i++)//输出第二部分
{
for(j=1;j<=i;j++)//第二部分的空格
cout<<'';
for(j=1;j<=7-2*i;j++)//第二部分的*
cout<<'*';
cout<}
}
结果
*
***
*****
*******
*****
***
*
Pressanykeytocontinue