




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西安交通大学实验报告 课程_计算机程序设计_实验名称_指针与函数_第 1 页 共 25 页 系 别_ _ 实 验 日 期 2014 年 4月 18日 专业班级_ _组别_ 实 验 报 告 日 期 2014 年 4 月 19日 姓 名_ _学号_ _ 报 告 退 发 ( 订正 、 重做 ) 同 组 人_ 教 师 审 批 签 字 一、实验目的 学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。 二、实验内容 (一)第一题:1、(必做题) 使用递归算法编写如下程序:对于任意给定的实数 X 和整数k( k0) ,计算 Xk 。 1.源程序代码: #include using namespa
2、ce std; double yunsuan(double x,int k);/递归函数用于计算xk int main() double x; int k; coutx; coutk; while(k=0)/判断输入的k是否满足要求,若否则提示输入错误并重新输入 coutk; cout计算结果是:x幜k?yunsuan(x,k)endl;/输出运算结果 return 0; k) int x,double yunsuan(double if(k=1)/k=1时不再进行循环,输出值为x return x; else double s=x*yunsuan(x,k-1);/对于k大于1 的情况,进入下
3、一循环 return s; 2.实验结果: (1)输入X正实数: (2)输入X正整数: (3)输入x为负数: (4)输入k为负数: 3.问题分析: 该函数的循环方式是:xk=x*x(k-1).设f(x,k)=xk,那么就有f(x,k)=f(x,k-1)*x.而其结束递归的条件是k=1,此时有f(x,1)=x,由此给出初值。 (二)第二题:使用递归算法编写求斐波那契数列的第 n 项的函数,并编出主函数进行验证。 1.源程序代码: #include using namespace std; int fib(int n) /递归函数,计算斐波那契数列的第n项 if(n=0)/对于n=0不再进行递归,
4、返回值0 return 0; else if(n=1) return 1;/对于n=1不再进行递归,返回值1 else 项n-2和n-1项归为计算第n将计算第/ s=fib(n-1)+fib(n-2);int return s; int main() int n; coutn; while(n0)/对于不符合要求的输入值重新输入 coutn; cout计算结果是:楦孢n嵜尽fib(n)endl;/输出计算结果 return 0; 2.实验结果: (1)输入项数正确(0或正整数): (2)输入项数有误(负数): 3.问题分析: 该题的递归方式:第n项为之前两项之和,即:fib(n)=fib(n-
5、1)+fib(n-2),由此递归至fib(1)和fib(2)时结束递归,而fib(1)和fib(2)已知。 (三)第三题:重载判断两个数值大小的函数 max ,这些数值可能是整型数、实型数和字符型,函数的返回值为两个数值中的最大值。 1.源程序代码: #include using namespace std; double zhuanhuan(char *c)/为了避免语句的重复,将字符与数值转换部分作为函数 int i=0; double x=0; if(c0=-|c0=+)/若首字符为-或者+则跳过 i+; while(ci!=0&ci!=.)/对于整数部分逐位累加,直至遇到小数点或者数字
6、结束 x=x*10+(ci-0); i+; if(ci=.)/对于小数部分进行累加 double s;/s用来反映数字所在位置是小数点后第几位,就用该数乘以的负几次方(s) i+;/从小数点后的一位开始循环 for(s=0.1;ci!=0;i+) x=x+s*(ci-0); s=s/10; if(c0=-)/若为负数,则在上述计算基础上乘以-1得到最终值 x=-x; return x;/返回x作为char c的对应的数值 int imax(int a,int b)/对整型数进行处理 if(a=b) return a; return b; double imax(double a,double
7、b)/对实数进行处理 if(a=b) return a; return b; double imax(char *c,char *d)/对字符型进行处理 double x=zhuanhuan(c); double y=zhuanhuan(d); return (x=y?x:y); int main() int n; coutn; while(n!=1&n!=2&n!=3) coutn; int a2; b2; double char c12,d12; if(n=1)/ 处理整型数 couta0a1; cout最大值为尺imax(a0,a1); else if(n=2)/ 处理实数 coutb0
8、b1; cout最大值为 尺imax(b0,b1); else/ 处理字符型 coutc; coutd; cout 最大值为:imax(c,d); coutendl; return 0; 2.实验结果: (1)输入整数型: (2)输入为实数: (3)输入为字符: 正数: (带正号): :(不带正号)整数: 负数: 3.问题分析: 该题的重点在于字符型的处理。在实验报告中,采取了两个数字逐个分开输入的方法,因而主要只需要判断开头是否为负号、中间是否有小数点并区别小数点前后处理方法的不同这几个问题。如果能够一次性输入两个数中间用空格隔开的话,就需要判断空格的位置,然后对空格之后的部分再进行与前半部
9、分相同的判断方法,显得更加麻烦。 对字符型的处理思路: 首先判断首字符是不是“-”或者 “+”,如果是的话,先跳过从第二个字符开始处理,在最终的结果中再乘以-1即可;然后对于接下来的整数部分进行累加,直到遇见小数点,若没有小数点则一直执行到字符结束;如果有小数点的话,对于小数点后的部分再进行累加得到结果。 四、第四题:编写一个函数,用于去掉字符串前面的空格,其原型为 : char *myltrim(char *string); 其中参数 string 为字符串,返回值为指向 string 的指针。 1.源程序代码: #include using namespace std; char *myl
10、trim(char *string) i=0,j=0; int while(*(string+i)= ) i+; do *(string+j)=*(string+i); i+; j+; while(*(string+i-1)!=0); return string; int main() char string41; cout请输入字符串:; cin.get(string,40); cout去掉开头的空格之后为尺湜myltrim(string)endl; return 0; 2.实验结果:为验证处理空格时仅是将开头处理而不处理中间空格: (1)中间无空格: (2)中间有空格: 3.问题分析: 曾
11、经出现的问题:起初运行时发现,即使没有判断开头空格的程序,输出结果也是没有空格的,后来检查发现是输入语句没有写为cin.get导致空格不被录入。 五、第五题:用牛顿迭代法求任意一元方程: anXn+an-1Xn-1+.+a1X1+a0 0 的根。 提示:迭代公式:Xn+1 = Xn + f(Xn) / f(Xn) 结束迭代过程的条件为(|f(Xn+1)| )与(|Xn+1 - Xn| )同时成立,其中 为预先给定的精度要求。1.源程序代码: #include using namespace std; double cf(double x,int k)/乘方函数,输出结果为x的k次方 doubl
12、e s=1; while(k0) s=s*x; k-; return s; double f(int n,double *a,double x)/计算函数值f(x)的函数 double sum=0; for(int i=0;in;i+) sum=sum+(*(a+i)*cf(x,i); return sum; double f_(int n,double *a,double x)/求导f_(x)函数 double sum=0; for(int i=1;i=u|f(n,a,x)=u|x-m=-u);/循环直到达到精度 return x;/返回最终计算结果 int main() int n,i;
13、; 尺请输入最高项次数coutn; double *a=new doublen+1;/申请数组空间 cout请从低到高输入系数: ; for (i=0;i*(a+i); double x=0; cout计算结果为: result(n+1,a,x)endl; delete a;/释放数组空间 return 0; 2.实验结果: 3.问题分析: 思路分析:程序中用到的多个函数:乘方函数、计算f(x)、f_(x)的函数、自定义的求根的主体的函数、主函数。乘方函数用于计算f(x)、f_(x),f(x)、f_(x) 函数的使用简化求根的函数。 六、第六题:将数字、小数点、正负号组成的字符串转换成相应的实
14、数,例如:?尹变成-3.14159。函数原型如下: double myatof(char *num);要求编写主函数加以测试。 1.源程序代码: #include double myatof(char *num); using namespace std; int main() char num20; coutnum; cout转换结果为:myatof(num)endl; cout检验:myatof(num)?myatof(num)+1endl; return 0; double myatof(char *a) int i=0; x=0; double if(*(a+0)=-|*(a+0)=+
15、)/若首字符为-或+则跳过 i+; while(*(a+i)!=0&*(a+i)!=.)/对于整数部分逐位累加,直至遇到小数点或者数字结束 x=x*10+(*(a+i)-0); i+; if (ai=.)/对于小数部分进行累加 double s;/s用来反映数字所在位置是小数点后第几位,就用该数乘以的负几次方(s) i+; /从小数点后的一位开始循环 for(s=0.1;ai!=0;i+) x=x+s*(ai- 0); s=s/10; if(a0=- )/若为负数,则在上述计算基础上乘以-1得到最终值 x=-x; return x;/返回x作为char c的对应的数值 2.实验结果:对整数、负
16、数、小数等均进行检测: (1)小数、负数: (2)整数: (正): (负): (3)0: 3.问题分析: 此题与第二题处理字符类似,需要处理开头正负号、小数点。 (七)第七题:在字符串T中查找子串S,若找到,返回子串的个数,若找不到返回0。要求编写主函数加以测试。 1.源程序代码: #includeusing namespace std; int find(char *a,char *b) int i,s=0,x=strlen(a),y=strlen(b); for(i=0;i=x-y;i+) if(b0=ai)/找到首字符相同的位置 int j=0; while(bj=ai+j&i+jx)/
17、由该处开始逐次判断是否相同 j+; if(j=y) s+; return s; int main() char a101; cout请输入字符串:; cin.get(a,100); char b31; coutb; cout字符串n“a”n中子串“b”的个数为:find(a,b)endl; return 0; 2.实验结果: 注:由于题目中没有说明,所以在这里当做可以共用来数,即:aaaa中查找aa时,第一二个a、第二三个a、第三四个a都认为是满足条件的,因而查出有三个而非两个。若要求不可重叠,只需循环完毕后从i=i+y+1再判断即可. (1)其他符号: (2)字母: 此例说明可重叠:3()(
18、4)含空格: 3.问题分析: 但发现此时无法实现,当输入”cin.get“不足之处:曾经尝试过让子串也输入 第一个字符串并回车后程序会跳过子串输入语句直接输出结果。不懂为何,如下: 八、第八题:编写一个程序,当输入一个整型数字以后,可以转换成相应的大写英文单词输出。如: 123 转换成 one hundred twenty three。 /第八题:编写一个程序,当输入一个整型数字以后,可以转换成相应的大写英文单词输出。如:转换成one hundred twenty three。 #include #include using namespace std; int main() int n; coutn; if(n0) cout敜牲牯尡;/对于输入小于,输出“error” else cout转换结果是:屜屮; if(n=0)/对于输入,输出zero cout=1;m+)/求得所输入数n的位数m x=x/10; int a=m/3,b=m%3; int *num=new int3*(a+1);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地理信息系统专业知识测试卷
- 在线支付平台安全与风险管理方案设计
- 2025年信阳道路客货运输从业资格证b2考试题库
- 2025年荷泽资格证模拟考试
- 供应链管理效果评估实战指南
- IT系统集成技术服务合同协议签订指南
- 创新咨询服务合同
- 矿山边坡稳定性监测系统
- 三农安全用药培训指南
- 林业生态工程与保护作业指导书
- CJJ2-2008城市桥梁工程施工与质量验收规范
- 新媒体营销:营销方式+推广技巧+案例实训 微课版 第2版 教学大纲
- 基于街区尺度的精细化大气污染溯源模型建设需求
- 德育教育研究课题申报书
- 2024年岳阳职业技术学院单招职业适应性测试题库汇编
- (高清版)JTG 3810-2017 公路工程建设项目造价文件管理导则
- 《ISO31000:2024风险管理指南》指导手册(雷泽佳译2024-04)
- 2024年甘肃省公务员公共基础知识重点考试题库(含答案)
- 《拒绝校园欺凌 防霸凌主题班会》课件
- 高血压脑出血相关的课件
- 2024年云南呈贡区城市投资集团有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论