1、西安交通大学实验报告课程_计算机程序设计_实验名称_函数_第 1 页 共 18 页系 别_ _ 实 验 日 期 2014 年 3 月 28 日专业班级_ _组别_ 实 验 报 告 日 期 2014 年 3 月 29 日姓 名_ _学号_ _ 报 告 退 发 ( 订正 、 重做 )同 组 人_ 教 师 审 批 签 字一、实验目的掌握函数的概念,使用函数的优越性,定义函数的方法以及调用函数的方法。二、实验内容 (一)第一题:编写字符串反转函数 mystrrev(),该函数的功能是将指定字符串中的字符顺序颠倒排列。然后再编写主函数验证之。1.源程序代码: #include#includeusing
2、namespace std;void mystrrev(char string);/自定义函数,反转字符串int main()coutusing namespace std;int imax(int array,int count);/求整型数组的最大元素int imin(int array,int count);/求整型数组的最小元素int main()int num40,n;coutn;coutnumi;coutm)m=arrayi;return m;/返回最大值int imin(int array,int count)int l=array0;for(int i=1;im)if(arra
3、yi arrayi-1)if(arrayiusing namespace std;int isprime(int a);int main()coutn;coutai;cout1i-)/循环判断直至能够整除或者对全部正整数判断完毕m=a%i;return(m!=0?1:0);/若为素数输出是,若不是输出非2.实验结果:3.问题分析:(1)对于“if(isprime(ai)!=0)”,起初写为“if(isprime(ai)=1)”,没有认识到只有零和非零的区别,导致程序始终判断得到错误结果;(2)对“int m=a-1,i”:原来写作 “int m=a,i;”,这样的时候会将1也作为素数输出。为了
4、避免如此,故将m的初始值设为a-1,这样的话,输入1时m=0,正好能够使1不经过循环而判断为合数,同时,输入2及以上的数字时,由于初始值m0,也不会被影响。(四)第四题:(必做题)(注意必须用自定义函数,并和系统库函数asin()进行比较测试检验)1.源程序代码:/用自定义函数求arcsin(x),并和系统库函数asin()进行比较测试检验#include#includeusing namespace std;double jc(int n);/阶乘函数double cf(double x,int n);/乘方函数double myasin(double x,double last);/开方的
5、函数int main()double x,u;coutx;while(x=1)coutx;coutu;cout=-last);/未达到精度时循环return sum;2.实验结果:(1)特别检测了输入的自变量不符合范围要求的情况的鉴别:(2)正常运行:3.问题分析:(1)题目中用到了三个自定义函数,分别的作用是:乘方、阶乘和求反正弦函数的自定义函数主体,前两个函数的出现主要是为了简化运算过程。由于不知道标准的乘方、阶乘库函数,所以就自定义了。(2)不足:精确性不太好,如输入 0.5 时差距较大,但一直找不到问题所在。(3)说明:在此题中将精度设置成了可调整的,而在下题中则设置为不可调整。貌似应
6、该都设为不可调整的,但个人觉得可调整的虽然麻烦且不一定精确,但也人性化。五、第五题:(必做题)编写计算平方根函数,并和库函数进行比较测试检验。提示:采用牛顿迭代法,计算精度 10-7。函数原型:doublen mysqrt ( double x )#include#includeusing namespace std;double mysqrt(double x);int main()double x;coutx;cout0.000000001|f_-f0.000000001);/未达到精度时循环return f;/返回最终结果到mysqrt2.实验结果:(1)结果为整数的:(2)结果为非整数
7、的:很准确! 六、第六题:编写函数判定一个正整数是否是递增数,即该数各位数字从左至右递增排列,例如:1122334、123456、5599、22222222等都是递增数。例如:32768、43987、123498 都不是递增数。显示输出 0 至 9999999 之间所有递增数。1源程序代码:#includeusing namespace std;int my(int n);/自定义函数,判断是不是递增数的主体函数int ws(int n);/自定义函数,求n的位数的函数,使用到自定义函数my中int main()int n=9999999,m;cout=gwszi+1)u+;return (u
8、=m-1?1:0);/通过u的最终大小来判断是否递增,只有都是递增才能使得u=m-1int ws(int n)/判断位数,输出的ws(n)为位数int i;for(i=0;n=1;i+)n=n/10;return i;2实验结果:3.问题分析:(1)一,要设计一个识别是否为递增数的函数,这个函数作为分离出主函数的函数;二,在输出 0 到 999999 之间递增数时,主函数中用到循环体,从0 逐一循环到 9999999 每次都用函数进行判断是否递增;三,在分离出的函数中,返回值应该为是或否,1 或 0,然后在主函数中判断是否输出;或者不返回,直接输出也可以。四,需要有一个识别整数位数的系统以及一
9、个分离各个位上的数字的程序。(2)对于:if(gwszi=gwszi+1)u+;return (u=m-1?1:0);只有在该 m 位数的每两个相邻位数字均为递增的时候,才能使得 u 每次都增加 1,从而最终得到 u=m-1;只要有一个地方不满足,就可以说明不是递增的。故可以用该条件判断是否递增。(七)第七题:(选作题)假设有如下一元多项式:anXn+an-1Xn-1+a1X1+a0编写程序求该多项式的值和多项式导数的值,这两个结果值的计算都必须采用函数求得,具体函数原型如下:double dxs(double a,double x,int n)double dxsds(double a,do
10、uble x,int n)形式参数 a用来存放多项式 n+1 个系数,x 为多项式的变量,n 为次方数。(提示:先输入某个多项式系数,然后输出该多项式及其导数多项式,再输入某个 x 的值,再输出多项式和导数的计算结果值)1.源程序代码:#includeusing namespace std;double dxs(double a,double x,int n);double dxsds(double a,double x,int n);double cf(double x,int n);int main()int n;coutn;coutai;i+;while(i0;i-)/输出多项式表达式c
11、out1;i-)/输出多项式导函数表达式coutx;cout=0;i-)s=s+ai*cf(x,i);return s;double dxsds(double a,double x,int n)/计算多项式导数值的函数double S=0;for(int i=n;i=1;i-)S=S+ai*i*cf(x,i-1);return S;double cf(double x,int n)/计算乘方函数double v=1;int m=1;while(m主函数:输入 n循环输入系数,将系数作为数组储存下来,这是后边的自定义函数的处理目标利用循环将循环每次输出结果贴到一块得到多项式输入 x调用函数计算函数值、导数值;需要以下自定义函数:多项式计算 函数:乘方函数:多项式导数计算函数: