c++第二次作业
课题
函数与函数重载、递归函数
一.教学目的
掌握函数重载的应用,区别值传递与地址传递
二.教学重点
函数重载,值传递、地址传递、递归函数
三.教学难点
函数重载,值传递、地址传递、递归函数的应用
四.教学过程
1.为什么要用函数
在面向过程的结构化程序设计中,函数是模块划分的基本单位,是对处理问题过程的一种抽象。在面向对象的程序设计中,它是面向对象程序设计中对功能的抽象。通常将相对独立的、经常使用的功能抽象为函数。函数编写好以后,可以被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数功能的具体实现,这样有利于代码重用,可以提高开发效率、增强程序的可靠性,也便于分工合作和修改维护。
2.为什么要用函数重载
函数重载:两个以上的函数,具有相同的函数名但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数重载。如果没有重载机制,那么对不同类型的数据进行相同的操作也需要定义名称完全不同的函数。如果有多个函数,使用者不好区分哪个函数对应哪个功能,使用起来实在不方便,也不利于代码重用,效率低,不利于修改维护。如果使用函数重载,在编程时可以对不同的功能赋予相同的函数名,编译时会根据上下文(实参的类型和个数)来确定使用哪一具体功能。
例1:
#include<iostream>
using namespace std;
int add(int a,int b);
double add(double c,double d);
int main()
{
int a,b;
double c,d;
cout<<"input a b"<<endl;
cin>>a>>b;
cout<<"input c d"<<endl;
cin>>c>>d;
cout<<"a+b="<<add(a,b)<<endl;
cout<<"c+d="<<add(c,d)<<endl;
return 0;
}
int add(int a,int b)
{
return a+b;
}
double add(double c,double d)
{
return c+d;
}
效果:
3.什么是值传递
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
4.什么是地址传递
就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。
例2(值传递交换两个数的值):
#include<iostream>
using namespace std;
void exchange(int a,int b);
int main()
{
int a,b;
cout<<"input a,b"<<endl;
cin>>a>>b;
cout<<"before exchange "<<"a="<<a<<",b="<<b<<endl;
exchange(a,b);
cout<<"after exchange "<<"a="<<a<<",b="<<b<<endl;
return 0;
}
void exchange(int a,int b)
{
int c;
c=a;
a=b;
b=c;
}
传值效果:
例3(地址传递交换两个数的值)
#include<iostream>
using namespace std;
void exchange(int *pa,int *pb);
int main()
{
int a,b;
cout<<"input a,b"<<endl;
cin>>a>>b;
cout<<"before exchange "<<"a="<<a<<",b="<<b<<endl;
exchange(&a,&b);
cout<<"after exchange "<<"a="<<a<<",b="<<b<<endl;
return 0;
}
void exchange(int *pa,int *pb)
{
int c;
c=*pa;
*pa=*pb;
*pb=c;
}
传地址效果:
5.设计实验和教案,分析如何编写递归函数
函数可以直接或间接地调用自身,称为递归函数。
递归过程:
1.递推。将原问题不断分解为新的子问题,逐渐从未知向已知推进,最终达到已知的条件,即递归结束的条件,这时递推阶段结束。
2.回归。从已知条件出发,按照递推的逆过程,逐一求值回归,最终达递归的开始处,结束回归阶段,完成递归调用。
例4(用递归方法编写Fibonacci级数)
#include<iostream>
#include<cstdlib>
using namespace std;
int Fibonacci(int a);
int main()
{
int n,m;
cout<<"input n:"<<endl;
cin>>n;
m=Fibonacci(n);
cout<<m<<endl;
return 0;
}
int Fibonacci(int a)
{
if(a==1)
return 1;
else if(a==2)
return 1;
else
return Fibonacci(a-1)+Fibonacci(a-2);
}
效果:
五.总结与反思
函数编写好以后,可以被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数功能的具体实现,这样有利于代码重用,可以提高开发效率、增强程序的可靠性,也便于分工合作和修改维护。不同情况下要正确选择传值传递或穿地址传递。正确使用递归函数也很重要。