西安交大C++程序设计第六章作业2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安交通大学实验报告
课程__计算机程序设计__实验名称__指针与函数__第 1 页共 25 页
系别____ _______ 实验日期 2014 年 4月 18日
专业班级__ ____组别_____________ 实验报告日期 2014 年 4 月 19日
姓名___ _______学号_ _报告退发 ( 订正、重做 )
同组人_________________________________ 教师审批签字
一、实验目的
学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。
二、实验内容
(一)第一题:1、(必做题)使用递归算法编写如下程序:对于任意给定的实数 X 和整数k( k>0) ,计算 Xk 。
1.源程序代码:
#include
using namespace std;
double yunsuan(double x,int k);//递归函数用于计算x^k
int main()
{
double x;
int k;
cout<<"请输入实数x:";
cin>>x;
cout<<"请输入正整数k:";
cin>>k;
while(k<=0)//判断输入的k是否满足要求,若否则提示输入错误并重新输入{
cout<<"您的输入有误!请输入正整数:";
cin>>k;
}
cout<<"计算结果是:"< 算结果 return 0; } double yunsuan(double x,int k) { if(k==1)//k=1时不再进行循环,输出值为x return x; else { double s=x*yunsuan(x,k-1);//对于k大于1的情况,进入下一循环 return s; } } 2.实验结果: (1)输入X正实数: (2)输入X正整数: (3)输入x为负数: (4)输入k为负数: 3.问题分析: 该函数的循环方式是:x^k=x*x^(k-1).设f(x,k)=x^k,那么就有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不再进行递归,返回值0 return 0; else { if(n==1) return 1;//对于n=1不再进行递归,返回值1 else { int s=fib(n-1)+fib(n-2);//将计算第n项归为计算第n-1和n-2项 return s; } } } int main() { int n; cout<<"请输入要计算的项数(非负整数):";//提示输入项数,首项为第0项cin>>n; while(n<0)//对于不符合要求的输入值重新输入 { cout<<"输入有误,请输入非负整数:"; cin>>n; } cout<<"计算结果是:fib["< return 0; } 2.实验结果: (1)输入项数正确(0或正整数): (2)输入项数有误(负数): 3.问题分析: 该题的递归方式:第n项为之前两项之和,即: fib(n)=fib(n-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(c[0]=='-'||c[0]=='+')//若首字符为…-‟或者…+‟则跳过 i++; while(c[i]!='\0'&&c[i]!='.')//对于整数部分逐位累加,直至遇到小数点或者数字结束 { x=x*10+(c[i]-'0'); i++; } if(c[i]=='.')//对于小数部分进行累加 { double s;//s用来反映数字所在位置是小数点后第几位,就用该数乘以的负几次方(s) i++;//从小数点后的一位开始循环 for(s=0.1;c[i]!='\0';i++) { x=x+s*(c[i]-'0'); s=s/10; } } if(c[0]=='-')//若为负数,则在上述计算基础上乘以-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 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; cout<<"请选择您要输入的数的类型,\n如果是整型请输入,实数型输入,