《2022年西安交大C++程序设计第五章作业 .pdf》由会员分享,可在线阅读,更多相关《2022年西安交大C++程序设计第五章作业 .pdf(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、西安交通大学实验报告课程_计算机程序设计 _实验名称 _函数_第 1 页共 18 页系别_ _ 实验日期 2014 年 3 月 28 日专业班级 _组别 _ 实 验 报 告 日 期 2014 年 3 月 29 日姓名_ _学号 _ _报告退发 ( 订正 、重做 ) 同 组 人_ 教 师 审 批 签 字一、实验目的掌握函数的概念, 使用函数的优越性, 定义函数的方法以及调用函数的方法。二、实验内容(一)第一题:编写字符串反转函数mystrrev(),该函数的功能是将指定字符串中的字符顺序颠倒排列。然后再编写主函数验证之。1. 源程序代码:#include #include usingnamesp
2、ace std; void mystrrev(char string);/ 自定义函数,反转字符串int main() cout 请输入字符串(不多于个字符): endl; char in81; cin.get(in,81);/ 输入字符串,允许输入空格mystrrev(in);/ 对字符串 “ in ” 执行反转函数coutendl; return 0; void mystrrev(char string) int m=strlen(string); int mid; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整
3、理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - for ( int i=0;im/2;i+)/ 将字符串的前一半字符与后一半字符对应交换,因而只执行m/2 mid=stringi; stringi=stringm-i-1; stringm-i-1=mid; stringm=0; / 字符串结束cout 反转结果为:n string; 2. 实验结果: 由于函数中有“for ( inti=0;im/2;i+)”的语句,为避免该循环条件不准确, 对奇数和偶数个的字符均进行了检测,并有对含空格和符号的字符串的检测:(1)奇数:(2)偶数:(3)含空格字符
4、串:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 3.问题分析:(1)起初没有用“ .get” ,不够全面;(2)如果一直执行到i=m 的话,就等于反转两次又回到了原来的字符串顺序,因而要考虑只执行一半, 而由于字符串长度有奇偶的问题,所以容易错误;(3)第一次编写时,没有写stringm=0;这使得输出结果混乱。(二)第二题: 编写一组求数组中最大元素和最小元素的函数。其函数原型为:int imax(int array,i
5、nt count); int imin(int array,int count); 1. 源程序代码:#include usingnamespace std; int imax( intarray ,int count);/ 求整型数组的最大元素int imin(intarray ,int count);/ 求整型数组的最小元素int main() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - int num40,n; co
6、utn; cout 请输入每个整数:n ; int i; for (i=0;inumi; cout 最大值为: imax(num,n)endl; cout 最小值为: imin(num,n)endl; return 0; int imax( intarray ,int count) int m=array 0;/ 将最大值的初始值定义为array0 for ( int i=1;im) m= array i; return m; / 返回最大值 int imin(intarray ,int count) int l= array 0; for ( int i=1;icount;i+) if (
7、array il) l= array i; return l; 2. 实验结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 3.问题分析:(1)起初误将:cout 最大值为: imax(num,n)endl; cout 最小值为: imin(num,n)m) if ( array i arrayi-1) if ( array i arrayi-1) 导致输出不正确。(3)虽然理论上应该加上判断输入的数字是否为整数的程序,但
8、考虑到这个不是重点,只是徒劳的增加麻烦,因而就没有加。(三)第三题 :编写函数 isprime(int a) 用来判断变量 a 是否为素数,若是素数,函数返回1,否则返回 0。调用该函数找出任意给定的n个整数中的素数。1. 源程序代码:#include usingnamespace std; int isprime(int a); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - int main() coutn; cout 请
9、输入要判断的各个数:n ; int a50; int i; for (i=0;iai; cout 其中的素数为:n ; for (i=0;in;i+) if (isprime(ai)!=0)/ 若经自定义函数判断是素数,输出该数coutai1&m!=0;i-)/ 循环判断直至能够整除或者对全部正整数判断完毕 m=a%i; return(m!=0?1:0);/ 若为素数输出是,若不是输出非 2. 实验结果:3. 问题分析:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17
10、 页 - - - - - - - - - (1)对于“if (isprime(ai)!=0)” ,起初写为 “if (isprime(ai)=1)” ,没有认识到只有零和非零的区别,导致程序始终判断得到错误结果;(2)对“int m=a-1,i” :原来写作 “int m=a,i;” ,这样的时候会将 1也作为素数输出。为了避免如此,故将m 的初始值设为 a-1,这样的话,输入1时m=0 ,正好能够使 1不经过循环而判断为合数,同时,输入2及以上的数字时,由于初始值 m0,也不会被影响。(四)第四题:( 必做题)(注意必须用自定义函数,并和系统库函数asin()进行比较测试检验)1.源程序代码
11、:/ 用自定义函数求arcsin(x),并和系统库函数asin()进行比较测试检验#include #include usingnamespace std; double jc(int n);/ 阶乘函数double cf(double x, int n);/ 乘方函数double myasin( double x, double last);/ 开方的函数int main() double x,u; coutx; while (x=1) coutx; coutu; cout 自定义函数计算结果是: myasin(x,u)endl; cout 库函数执行计算结果是: asin(x); cout
12、endl; return 0; double jc(int n) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - int S=1,m=1; while (m=n) S=S*m; m=m+1; return S; / 返回 S值作为阶乘的结果 double cf(double x, int n) double v=1; int m=1; do v=v*x; m=m+1; while (m=n); return v; / 返回 v
13、为x的n次方 double myasin( double x, double last) double sum; int n=1; double in; 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);/ 未达到精度时循环return sum; 2. 实验结果:(1)特别检测了输入的自变量不符合范围要求的情况的鉴别:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
14、- - - - 第 8 页,共 17 页 - - - - - - - - - (2)正常运行:3. 问题分析 :(1)题目中用到了三个自定义函数,分别的作用是:乘方、阶乘和求反正弦函数的自定义函数主体, 前两个函数的出现主要是为了简化运算过程。由于不知道标准的乘方、阶乘库函数,所以就自定义了。(2)不足:精确性不太好,如输入0.5 时差距较大,但一直找不到问题所在。(3)说明:在此题中将精度设置成了可调整的,而在下题中则设置为不可调整。 貌似应该都设为不可调整的,但个人觉得可调整的虽然麻烦且不一定精确,但也人性化。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
15、 - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - 五、第五题:(必做题)编写计算平方根函数,并和库函数进行比较测试检验。提示: 采用牛顿迭代法,计算精度 10-7。 函数原型:doublen mysqrt ( double x ) #include #include usingnamespace std; double mysqrt(double x); int main() double x; coutx; cout 自定义函数计算结果是: mysqrt(x)endl; cout 库函数计算结果是: sq
16、rt(x)0.000000001|f_-f0.000000001);/ 未达到精度时循环return f;/ 返回最终结果到mysqrt 2. 实验结果:(1)结果为整数的:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 17 页 - - - - - - - - - (2)结果为非整数的:很准确! ! !六、第六题:编写函数判定一个正整数是否是递增数,即该数各位数字从左至右递增排列,例如:1122334、123456、5599、22222222等都是递增数。例如: 32
17、768、43987、123498 都不是递增数。显示输出 0 至 9999999之间所有递增数。1源程序代码:#include usingnamespace std; int my( int n);/ 自定义函数,判断是不是递增数的主体函数int ws( int n);/ 自定义函数,求n的位数的函数,使用到自定义函数my中int main() int n=9999999,m; cout 0 到之间的递增数有:n ; for (m=0;m=n;m+) if (my(m)!=0) coutm 、 ; return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
18、 - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 17 页 - - - - - - - - - int my( int n) int gwsz10; int i,k=1; int m=ws(n); for (i=0;im;i+) gwszi=(n/k)%10;/ 至此,已得到各位数k=k*10; int u; for (i=0,u=0;i=gwszi+1) u+; return (u=m-1?1:0);/ 通过 u的最终大小来判断是否递增,只有都是递增才能使得u=m-1 int ws( int n) / 判断位数,输出的ws(n) 为位数 int
19、 i; for (i=0;n=1;i+) n=n/10; return i; 2实验结果:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 17 页 - - - - - - - - - ,3. 问题分析:(1)一,要设计一个识别是否为递增数的函数,这个函数作为分离出主函数的函数;二,在输出 0 到 999999 之间递增数时,主函数中用到循环体,从0逐一循环到 9999999 每次都用函数进行判断是否递增;三,在分离出的函数中,返回值应该为是或否,1 或 0,然后在主函数
20、中判断是否输出;或者不返回,直接输出也可以。四,需要有一个识别整数位数的系统以及一个分离各个位上的数字的程序。(2)对于:if (gwszi=gwszi+1) u+; return (u=m-1?1:0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 17 页 - - - - - - - - - 只有在该 m 位数的每两个相邻位数字均为递增的时候,才能使得u 每次都增加 1,从而最终得到 u=m-1 ;只要有一个地方不满足,就可以说明不是递增的。故可以用该条件判断是
21、否递增。(七)第七题: (选作题)假设有如下一元多项式: anXn+an-1Xn-1+.+a1X1+a0编写程序求该多项式的值和多项式导数的值,这两个结果值的计算都必须采用函数求得,具体函数原型如下: double dxs(double a,double x,int n) double dxsds(double a,double x,int n) 形式参数 a 用来存放多项式n+1 个系数, x 为多项式的变量, n 为次方数。(提示:先输入某个多项式系数,然后输出该多项式及其导数多项式,再输入某个x 的值,再输出多项式和导数的计算结果值)1.源程序代码:#include usingnames
22、pace 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; cout 请按照从低次到高次的顺序依次输入系数:n ; int i=0; double a30;/ 在假设最高项次数不超过的前提下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 17 页
23、- - - - - - - - - do cout a iai; i+; while (i=n); cout0;i-)/ 输出多项式表达式 coutai*x i + ; couta0endl; cout1;i-)/ 输出多项式导函数表达式 coutai*i*x i-1 + ; couta1endl; int x; coutx; cout 在自变量 x= x 下,该多项式的值为: dxs(a,x,n)endl; cout 其导数值为: dxsds(a,x,n)=0;i-) s=s+ai*cf(x,i); return s; double dxsds( double a,double x, int
24、 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) / 计算乘方函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - double v=1; int m=1; while (m主函数:输入 n循环输入系数,将系数作为数组储存下来,这是后边的自定义函数的处理目标利用循环将循环每次输出结果贴到一名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - 块得到多项式 输入 x调用函数计算函数值、导数值;需要以下自定义函数:多项式 计算函数:乘方函数:多项式导数 计算函数:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -