}
}
intisprime(inta)
{
intm=a-1,i;//定义初始值m=a-1实现对的排除
for(i=a-1;i>1&&m!
=0;i--)//循环判断直至能够整除或者对全部正整数判断完毕
{
m=a%i;
}
return(m!
=0?
1:
0);//若为素数输出是,若不是输出非
}
2.实验结果:
3.问题分析:
(1)对于“if(isprime(a[i])!
=0)”,起初写为“if(isprime(a[i])=1)”,没有认识到只有零和非零的区别,导致程序始终判断得到错误结果;
(2)对“intm=a-1,i”:
原来写作“intm=a,i;”,这样的时候会将1也作为素数输出。
为了避免如此,故将m的初始值设为a-1,这样的话,输入1时m=0,正好能够使1不经过循环而判断为合数,同时,输入2及以上的数字时,由于初始值m>0,也不会被影响。
(四)第四题:
(必做题)(注意必须用自定义函数,并和系统库函数asin()进行比较测试检验)
1.源程序代码:
//用自定义函数求arcsin(x),并和系统库函数asin()进行比较测试检验
#include
#include
usingnamespacestd;
doublejc(intn);//阶乘函数
doublecf(doublex,intn);//乘方函数
doublemyasin(doublex,doublelast);//开方的函数
intmain()
{
doublex,u;
cout<<"请输入需要计算的自变量x:
";
cin>>x;
while(x<=-1||x>=1)
{
cout<<"您输入的自变量不在范围内,请输入(-1,1)之间的x:
";
cin>>x;
}
cout<<"请输入在自定义函数下的精度u:
";
cin>>u;
cout<<"自定义函数计算结果是:
"<cout<<"库函数执行计算结果是:
"<cout<return0;
}
doublejc(intn)
{
intS=1,m=1;
while(m<=n)
{
S=S*m;
m=m+1;
}
returnS;//返回S值作为阶乘的结果
}
doublecf(doublex,intn)
{
doublev=1;
intm=1;
do
{
v=v*x;
m=m+1;
}while(m<=n);
returnv;//返回v为x的n次方
}
doublemyasin(doublex,doublelast)
{
doublesum;
intn=1;
doublein;
sum=x;
{
in=jc(2*n)*cf(x,2*n+1)/(cf(2,2*n)*jc(n)*jc(n)*(2*n+1));
sum=sum+in;
n++;
}while(in<=last&&in>=-last);//未达到精度时循环
returnsum;
}
2.实验结果:
(1)特别检测了输入的自变量不符合范围要求的情况的鉴别:
(2)正常运行:
3.问题分析:
(1)题目中用到了三个自定义函数,分别的作用是:
乘方、阶乘和求反正弦函数的自定义函数主体,前两个函数的出现主要是为了简化运算过程。
由于不知道标准的乘方、阶乘库函数,所以就自定义了。
(2)不足:
精确性不太好,如输入0.5时差距较大,但一直找不到问题所在。
(3)说明:
在此题中将精度设置成了可调整的,而在下题中则设置为不可调整。
貌似应该都设为不可调整的,但个人觉得可调整的虽然麻烦且不一定精确,但也人性化。
五、第五题:
(必做题)编写计算平方根函数,并和库函数进行比较测试检验。
提示:
采用牛顿迭代法,计算精度10-7。
函数原型:
doublenmysqrt(double
x)
#include
#include
usingnamespacestd;
doublemysqrt(doublex);
intmain()
{
doublex;
cout<<"请输入自变量x:
";
cin>>x;
cout<<"自定义函数计算结果是:
"<cout<<"库函数计算结果是:
"<return0;
}
doublemysqrt(doublex)
{
doublef=1,f_;
do{
f_=f;
f=(f+x/f)/2;
}while(f-f_>0.000000001||f_-f>0.000000001);//未达到精度时循环
returnf;//返回最终结果到mysqrt
}
2.实验结果:
(1)结果为整数的:
(2)结果为非整数的:
很准确!
!
!
六、第六题:
1.源程序代码:
#include
usingnamespacestd;
intmy(intn);//自定义函数,判断是不是递增数的主体函数
intws(intn);//自定义函数,求n的位数的函数,使用到自定义函数my中
intmain()
{
intn=9999999,m;
cout<<"0到之间的递增数有:
\n";
for(m=0;m<=n;m++)
{
if(my(m)!
=0)
{
cout<}
}
return0;
}
intmy(intn)
{
intgwsz[10];
inti,k=1;
intm=ws(n);
for(i=0;i{
gwsz[i]=(n/k)%10;//至此,已得到各位数
k=k*10;
}
intu;
for(i=0,u=0;i{
if(gwsz[i]>=gwsz[i+1])
u++;
}
return(u==m-1?
1:
0);//通过u的最终大小来判断是否递增,只有都是递增才能使得u=m-1
}
intws(intn)//判断位数,输出的ws(n)为位数
{
inti;
for(i=0;n>=1;i++)
{
n=n/10;
}
returni;
}
2.实验结果:
……
3.问题分析:
(1)一,要设计一个识别是否为递增数的函数,这个函数作为分离出主函数的函数;
二,在输出0到999999之间递增数时,主函数中用到循环体,从0逐一循环到9999999每次都用函数进行判断是否递增;
三,在分离出的函数中,返回值应该为是或否,1或0,然后在主函数中判断是否输出;或者不返回,直接输出也可以。
四,需要有一个识别整数位数的系统以及一个分离各个位上的数字的程序。
(2)对于:
if(gwsz[i]>=gwsz[i+1])
u++;
return(u==m-1?
1:
0);
只有在该m位数的每两个相邻位数字均为递增的时候,才能使得u每次都增加1,从而最终得到u=m-1;只要有一个地方不满足,就可以说明不是递增的。
故可以用该条件判断是否递增。
(七)第七题:
(选作题)假设有如下一元多项式:
anXn+an-1Xn-1+......+a1X1+a0
编写程序求该多项式的值和多项式导数的值,这两个结果值的计算都必须采用函数求得,具体函数原型如下:
doubledxs(doublea[],doublex,intn)
doubledxsds(doublea[],doublex,intn)
形式参数a[]用来存放多项式n+1个系数,x为多项式的变量,n为次方数。
(提示:
先输入某个多项式系数,然后输出该多项式及其导数多项式,再输入某个x的值,再输出多项式和导数的计算结果值)
1.源程序代码:
#include
usingnamespacestd;
doubledxs(doublea[],doublex,intn);
doubledxsds(doublea[],doublex,intn);
doublecf(doublex,intn);
intmain()
{
intn;
cout<<"请输入多项式最高次项的次数n:
";
cin>>n;
cout<<"请按照从低次到高次的顺序依次输入系数:
\n";
inti=0;
doublea[30];//在假设最高项次数不超过的前提下
do
{
cout<<"a["<
cin>>a[i];
i++;
}while(i<=n);
cout<<"该多项式的表达式为:
\n";
for(i=n;i>0;i--)//输出多项式表达式
{
cout<}
cout<cout<<"多项式的导函数的表达式为:
\n";
for(i=n;i>1;i--)//输出多项式导函数表达式
{
cout<}
cout<intx;
cout<<"请输入自变量x:
";
cin>>x;
cout<<"在自变量x="<"<cout<<"其导数值为:
"<return0;
}
doubledxs(doublea[],doublex,intn)//计算多项式值函数
{
doubles=0;
for(inti=n;i>=0;i--)
{
s=s+a[i]*cf(x,i);
}
returns;
}
doubledxsds(doublea[],doublex,intn)//计算多项式导数值的函数
{
doubleS=0;
for(inti=n;i>=1;i--)
{
S=S+a[i]*i*cf(x,i-1);
}
returnS;
}
doublecf(doublex,intn)//计算乘方函数
{
doublev=1;
intm=1;
while(m<=n)
{
v=v*x;
m=m+1;
}
returnv;
}
2.实验结果:
经过验算,确实正确。
3.问题分析:
过程简述:
>主函数:
输入n——循环输入系数,将系数作为数组储存下来,这是后边的自定义函数的处理目标——利用循环将循环每次输出结果贴到一块得到多项式——输入x——调用函数计算函数值、导数值;
需要以下自定义函数:
>多项式计算函数:
>乘方函数:
>多项式导数计算函数: