c++第二次作业

一.为什么要用函数

一个较为复杂的系统往往需要划分为若干子程序,然后对这些子程序分别进行开发和调试。在c++语言中这些子程序体现为函数。通常将相对独立的、经常使用的功能抽象为函数。函数编写好后,可以被重复使用。

使用函数的好处:

(1)有利于代码重用。

(2)可以提高开发效率、增强程序的可靠性。

(3)便于分工合作和修改维护。

例:计算阶乘m!/((m-n)!*n!)

在下面的程序中反复调用函数fun,增加代码的可读性。

 

#include<iostream>
using namespace std;

int fun(int a)
{
	int i,sum=1;
	for (i = 1; i <= a; i++)
	{
		sum = sum * i;
	}
	return sum;
}

int main()
{
	int m, n;
	cin >> m >> n;
	cout << "m!/((m-n)!*n!)=" << fun(m) / (fun(m - n) * fun(n));
	cout << endl;
	return 0;
}

二.为什么要使用函数重载

函数重载的定义:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。

例:求两整数的平方和及两实数的平方和

#include<iostream>
using namespace std;

int sumfsquare(int a, int b)
{
	return a * a + b * b;
}
double sumfsquare(double a, double b)
{
	return a * a + b * b;
}

int main()
{
	int m, n;
	cout << "input two numbers:";
	cin >> m >> n;
	cout << "their sum of square:" << sumfsquare(m, n) << endl;

	double x, y;
	cout << "input other two numbers:";
	cin >> x >> y;
	cout << "their sum of square:" << sumfsquare(x, y) << endl;

	return 0;
}

  上面的两个函数有一样的名字sumfsquare,他们的作用也是相似的,所以形成重载。

注:1.重载函数的形参个数或者类型中必须不不同。

       2.编译器不以形参名和返回值来区分函数。

       3.当使用具有默认形参值的函数重载形式时,要注意防止二义性。

三.什么是值传递

值传递是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。

例:交换两个数的值后输出

 

#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; }

 

运行结果:

x=5 y=10

x=5 y=10

上面的代码因为采用值传递,在函数调用时传递的是实参的值,函数在运行过程中将形参的值交换,但此过程是单项传递,形参值的改变对实参不起任何作用,所以输出的结果和原来一模一样。

四.什么是地址传递

引用是一种特殊类型的变量,可以被认为是另一个变量的别名,通过引用名与通过被引用的变量名访问变量的效果是一样的。

引用传递:用引用作为形参,在函数调用时发生的参数传递。

例:用引用传递来交换两个数后输出

#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;
}

运行结果:

x=5  y=10

x=10  y=5

五.如何编写递归函数

当函数直接或者间接调用自己时,则发生了递归。

 

递归的过程有两个阶段:

第一阶段:递推。将原问题不断分解为新的子问题,逐渐从未知向已知推进,最终达到已知的条件,即递归结束的条件,此时递推阶段结束。

第二阶段:回归。从已知的条件出发,按照递推的逆过程,逐一求值回归,最后达到递推的开始处,结束回归阶段,完成递归调用。

例:计算n!

 

#include<iostream>
using namespace std;

int Fac(int n)
{
	if (n == 0)
		return 1;
	else
		return n * Fac(n - 1);
}

int main()
{
	int n;
	cin >> n;
	cout << Fac(n) << endl;
	return 0;
}

 

运用递归函数可以使编写函数变得简单,增强代码的可读性,但会增大内存的占用量。

 

posted @ 2019-09-15 23:55  zlx111  阅读(233)  评论(0编辑  收藏  举报