西安交大C程序设计作业汇总Word文档下载推荐.docx
《西安交大C程序设计作业汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《西安交大C程序设计作业汇总Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
"
请输入字符串(不多于个字符):
endl;
charin[81];
cin.get(in,81);
//输入字符串,允许输入空格
mystrrev(in);
//对字符串“in”执行反转函数
return0;
}
voidmystrrev(charstring[])
intm=strlen(string);
intmid;
for(inti=0;
i<
m/2;
i++)//将字符串的前一半字符与后一半字符对应交换,因而只执行m/2
{
mid=string[i];
string[i]=string[m-i-1];
string[m-i-1]=mid;
}
string[m]='
\0'
;
//字符串结束
反转结果为:
\n"
string;
2.实验结果:
由于函数中有“for(inti=0;
i++)”的语句,为避免该循环条件不准确,对奇数和偶数个的字符均进行了检测,并有对含空格和符号的字符串的检测:
(1)奇数:
(2)偶数:
(3)含空格字符串:
3.问题分析:
(1)起初没有用“.get”,不够全面;
(2)如果一直执行到i=m的话,就等于反转两次又回到了原来的字符串顺序,因而要考虑只执行一半,而由于字符串长度有奇偶的问题,所以容易错误;
(3)第一次编写时,没有写string[m]='
这使得输出结果混乱。
(二)第二题:
编写一组求数组中最大元素和最小元素的函数。
其函数原型为:
intimax(intarray[],intcount);
intimin(intarray[],intcount);
//求整型数组的最大元素
intimin(intarray[],intcount);
//求整型数组的最小元素
intnum[40],n;
请输入您要输入的整数个数,不超过个:
cin>
>
n;
请输入每个整数:
inti;
for(i=0;
i++)//循环输入参与判断的整数
cin>
num[i];
最大值为:
imax(num,n)<
最小值为:
imin(num,n)<
intimax(intarray[],intcount)
intm=array[0];
//将最大值的初始值定义为array[0]
for(inti=1;
count;
i++)//循环比较m与array[i]的大小
if(array[i]>
m)
m=array[i];
returnm;
//返回最大值
intimin(intarray[],intcount)
intl=array[0];
i++)
if(array[i]<
l)
l=array[i];
returnl;
(1)起初误将:
cout<
写成imin、imax,不能执行。
(2)误将:
if(array[i]>
if(array[i]<
写为:
array[i-1])
导致输出不正确。
(3)虽然理论上应该加上判断输入的数字是否为整数的程序,但考虑到这个不是重点,只是徒劳的增加麻烦,因而就没有加。
(三)第三题:
编写函数isprime(inta)用来判断变量a是否为素数,若是素数,函数返回1,否则返回0。
调用该函数找出任意给定的n个整数中的素数。
intisprime(inta);
请输入要进行判断的数字的个数:
intn;
请输入要判断的各个数:
inta[50];
a[i];
其中的素数为:
if(isprime(a[i])!
=0)//若经自定义函数判断是素数,输出该数
cout<
a[i]<
"
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);
//若为素数输出是,若不是输出非
(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()进行比较测试检验)
//用自定义函数求arcsin(x),并和系统库函数asin()进行比较测试检验
cmath>
doublejc(intn);
//阶乘函数
doublecf(doublex,intn);
//乘方函数
doublemyasin(doublex,doublelast);
//开方的函数
doublex,u;
请输入需要计算的自变量x:
x;
while(x<
=-1||x>
=1)
cout<
您输入的自变量不在范围内,请输入(-1,1)之间的x:
请输入在自定义函数下的精度u:
u;
自定义函数计算结果是:
myasin(x,u)<
库函数执行计算结果是:
asin(x);
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;
}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;
(1)特别检测了输入的自变量不符合范围要求的情况的鉴别:
(2)正常运行:
(1)题目中用到了三个自定义函数,分别的作用是:
乘方、阶乘和求反正弦函数的自定义函数主体,前两个函数的出现主要是为了简化运算过程。
由于不知道标准的乘方、阶乘库函数,所以就自定义了。
(2)不足:
精确性不太好,如输入0.5时差距较大,但一直找不到问题所在。
(3)说明:
在此题中将精度设置成了可调整的,而在下题中则设置为不可调整。
貌似应该都设为不可调整的,但个人觉得可调整的虽然麻烦且不一定精确,但也人性化。
五、第五题:
(必做题)编写计算平方根函数,并和库函数进行比较测试检验。
提示:
采用牛顿迭代法,计算精度10-7。
函数原型:
doublenmysqrt(double
x)
doublemysqrt(doublex);
doublex;
请输入自变量x:
mysqrt(x)<
库函数计算结果是:
sqrt(x)<
doublemysqrt(doublex)
doublef=1,f_;
do{
f_=f;
f=(f+x/f)/2;
}while(f-f_>
0.000000001||f_-f>
0.000000001);
returnf;
//返回最终结果到mysqrt
(1)结果为整数的:
(2)结果为非整数的:
很准确!
!
六、第六题:
编写函数判定一个正整数是否是递增数,即该数各位数字从左至右递增排列,例如:
1122334、123456、5599、22222222等都是递增数。
例如:
32768、43987、123