西安交大C++程序设计第六章作业2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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如果是整型请输入,实数型输入,

相关文档
最新文档