西安交大C++程序设计第五章作业.docx
- 文档编号:30217157
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:20
- 大小:181KB
西安交大C++程序设计第五章作业.docx
《西安交大C++程序设计第五章作业.docx》由会员分享,可在线阅读,更多相关《西安交大C++程序设计第五章作业.docx(20页珍藏版)》请在冰豆网上搜索。
西安交大C++程序设计第五章作业
西安交通大学实验报告
课程__计算机程序设计__实验名称_____函数______第1页共18页
系别___________实验日期2014年3月28日
专业班级____组别_____________实验报告日期2014年3月29日
姓名__________学号__报告退发(订正、重做)
同组人_________________________________教师审批签字
一、实验目的
掌握函数的概念,使用函数的优越性,定义函数的方法以及调用函数的方法。
二、实验内容
(一)第一题:
编写字符串反转函数mystrrev(),该函数的功能是将指定字符串中的字符顺序颠倒排列。
然后再编写主函数验证之。
1.源程序代码:
#include
#include
usingnamespacestd;
voidmystrrev(charstring[]);//自定义函数,反转字符串
intmain()
{
cout<<"请输入字符串(不多于个字符):
"< charin[81]; cin.get(in,81);//输入字符串,允许输入空格 mystrrev(in);//对字符串“in”执行反转函数 cout< return0; } voidmystrrev(charstring[]) { intm=strlen(string); intmid; for(inti=0;i { mid=string[i]; string[i]=string[m-i-1]; string[m-i-1]=mid; } string[m]='\0';//字符串结束 cout<<"反转结果为: \n"< } 2.实验结果: 由于函数中有“for(inti=0;i (1)奇数: (2)偶数: (3)含空格字符串: 3.问题分析: (1)起初没有用“.get”,不够全面; (2)如果一直执行到i=m的话,就等于反转两次又回到了原来的字符串顺序,因而要考虑只执行一半,而由于字符串长度有奇偶的问题,所以容易错误; (3)第一次编写时,没有写string[m]='\0';这使得输出结果混乱。 (二)第二题: 编写一组求数组中最大元素和最小元素的函数。 其函数原型为: intimax(intarray[],intcount); intimin(intarray[],intcount); 1.源程序代码: #include usingnamespacestd; intimax(intarray[],intcount);//求整型数组的最大元素 intimin(intarray[],intcount);//求整型数组的最小元素 intmain() { intnum[40],n; cout<<"请输入您要输入的整数个数,不超过个: "; cin>>n; cout<<"请输入每个整数: \n"; inti; for(i=0;i cin>>num[i]; cout<<"最大值为: "< cout<<"最小值为: "< return0; } intimax(intarray[],intcount) { intm=array[0];//将最大值的初始值定义为array[0] for(inti=1;i { if(array[i]>m) m=array[i]; } returnm;//返回最大值 } intimin(intarray[],intcount) { intl=array[0]; for(inti=1;i { if(array[i] l=array[i]; } returnl; } 2.实验结果: 3.问题分析: (1)起初误将: cout<<"最大值为: "< cout<<"最小值为: "< 写成imin、imax,不能执行。 (2)误将: if(array[i]>m) if(array[i] 写为: if(array[i]>array[i-1]) if(array[i] 导致输出不正确。 (3)虽然理论上应该加上判断输入的数字是否为整数的程序,但考虑到这个不是重点,只是徒劳的增加麻烦,因而就没有加。 (三)第三题: 编写函数isprime(inta)用来判断变量a是否为素数,若是素数,函数返回1,否则返回0。 调用该函数找出任意给定的n个整数中的素数。 1.源程序代码: #include usingnamespacestd; intisprime(inta); intmain() { cout<<"请输入要进行判断的数字的个数: "; intn; cin>>n; cout<<"请输入要判断的各个数: \n"; inta[50]; inti; for(i=0;i { cin>>a[i]; } cout<<"其中的素数为: \n"; for(i=0;i { if(isprime(a[i])! =0)//若经自定义函数判断是素数,输出该数 cout< } } 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)结果为非整数的: 很准确! ! ! 六、第六题: 编写函数判定一个正整数是否是递增数,即该数各位数字从左至右递增排列,例如: 1122334、123456、5599、22222222等都是递增数。 例如: 32768、43987、123498都不是递增数。 显示输出0至9999999之间所有递增数。 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< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 交大 C+ 程序设计 第五 作业