面对对象程序设计-作业二
关于函数
1.为什么要用函数)
前面写的程序都是规模相对较小的程序,实际应用中,典型的商业软件通常有数十万、数百万、数千万行代码甚至更多。为了降低开发大规模软件的复杂度,程序员必须将大的问题分解为若干个小问题,小问题在分解为更小的问题。高级语言中的子程序就是用来实现这种模块划分的。C和C++语言中的子程序体现为函数。通常将相对独立的、经常使用的功能抽象为函数。函数编写好以后,可以被重复使用,使用时可以只关心函数得功能和使用方法而不必关心函数功能的具体实现。这样有利于代码重用,可以提高开发效率、增强程序的可靠性,也便于分工合作和修改维护。
总的来说:函数的使用方便了程序的写作,清晰思路,非常实用
下面来举个例子:写一个程序计算整数n的阶乘n!。
如果不用函数来完成,就会这样:
#include<iostream>
using namespace std;
int main()
{
int i,m;
long ret=1;
cout<<"Input m:"<<endl;
cin>>m;
for(i=2;i<=n;i++)
{
ret*=i;
}
cout<<m<<"!="<<ret<<endl;
return 0;
}
如果用函数的话:
#include<iostream>
using namespace std;
int main()
{
int m;
long ret;
cout<<"Input m:"<<endl;
cin>>m;
ret=Fact(m);
cout<<m<<"!="<<ret<<endl;
return 0;
}
long Fact(int n)
{
int i;
long result;
for(i=2;i<=n;i++)
{
result*=i;
}
return result;
}
相比较而言,使用了函数的程序更能够明白程序的意图,划分明了
2.为什么要用函数重载
用C语言编程的时,有时会发现有几个不同名的函数实现的是同一类的操作。例如要求从3个数中找出其中最大者,而这3个数的类型事先不确定,可以是整型的、实型或长整数型。在编写C语言程序时,需要分别设计出3个函数,其原型为:
int max1(int a,int b,int c);
float max2(float a,float b,float c);
double max3(double a,double b,double c);
C语言规定在同一作用域中不能有同名的函数,因此3个函数的名字不相同。C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能。这样的话,对于同一类操作的函数我们就不用定义名称完全不同的函数,而且使用起来也方便
例如:求3个数中最大的数(分别考虑整数、实数、长整数的情况)。
#include<iostream>
using namespace std;
int max(int a,int b,int c)
{ if(b>a)a=b;
if(c>a)a=c;
return a;
}
float max(float a,float b,float c)
{
if(b>a)a=b;
if(c>a)a=c;
return a;
}
long max(long a,long b,long c)
{
if(b>a)a=b;
if(c>a)a=c;
return a;
}
int main()
{
int a,b,c;
float d,e,f;
long g,h,i;
cin>>a>>b>>c;
cin>>d>>e>>f;
cin>>g>>h>>i;
int m;
m=max(a,b,c);
cout<<"max_i="<<m<<endl;
float n;
n=max(d,e,f);
cout<<"max_f="<<n<<endl;
long int p;
p=max(g,h,i);
cout<<"max_l="<<p<<endl;
}
运行结果:
如此方便了函数的调用,不用定义好几个不同的函数名
3、什么是值传递
函数的参数分为实参和形参,实参是main函数中存在的变量,调用函数的时候,实参给函数体传递信息。在值传递中,实参传向函数体的只是实参的数值,而与实参变量的地址无关。
例如:在实现两个整数的交换中
#include<iostream>
using namespace std;
void swap(int a,int b){
int t=a;
a=b;
b=t;
}
int main(){
int x=5,y=10;
cout<<"x="<<x<<" y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}
运行结果:
从运行结果中可以看出参数的值并未发生变化,可知传值法不能改变值
4、什么是地址传递
顾名思义,就是把变量的地址传到函数体去,获得变量的地址就能对变量进行改动
如果把上面的代码改为:
#include<iostream>
using namespace std;
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
int main(){
int x=5,y=10;
cout<<"x="<<x<<" y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
return 0;
}
运行结果:
通过对传地址的改动,实现了对参数的改动,这就是传地址的作用
5、设计实验和教案,分析如何编写递归函数
递归调用就是指函数可以直接或间接地调用函数本身,以达到解决复杂问题,一个正确的递归函数应该有递归方程和结束条件
例如:求n!。
分析该题可得公式:
n!= 1(n=0)或者n!=n(n-1)(n>0)
根据该公式可写出如下代码:
#include<iostream>
using namespace std;
//计算n的阶乘
unsigned fac(unsigned n){
unsigned f;
if(n==0)
f=1;
else
f=fac(n-1)*n;
return f;
}
int main()
{
unsigned n;
cout<<"Enter a positive integer:";
cin>>n;
unsigned y=fac(n);
cout<<n<<"!="<<y<<endl;
return 0;
}
运行结果:
fac函数中,if(n==0) f=1这部分就是结束条件;else部分就是递归方程,从而完成了计算n的阶乘的运算。