1、为什么要用函数?
函数使整体结构简化,分层清晰明了,使人看了通俗易懂;
它也避免了函数重复编入,函数可以重复使用。
代码如下:
#include<iostream> using namespace std; double Piao(double x, int n) { double sum = 1.0; while (n--) sum *= x; return sum; } int main() { int a, b, t; cin >> a >> b; t = Piao(a, b); cout << a << "的" << b << "次方等于" << t << endl; return 0; }
2、为什么要用函数重载?
函数重载:两个以上的函数,具有相同的函数名,但是形参的个数或类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用那个函数。
若没有函数重载机制,那么对不同类型的数据进行相同的操作时也需要定义名称完全不同的函数。这样在调用的时候会给我们带来极大的不便,而用函数重载会帮助我们解决这类问题。c++允许功能相近的函数在相同的作用下以相同的函数名定义,从而形成重载。反便使用,便与记忆。
代码如下:
#include<iostream> using namespace std; double Power(double x,int y) { double sum = 1.0; while (y--) sum *= x; return sum; } int Power(int x, int y) { int sum = 1; while (y--) sum *= x; return sum; } int main() { int a, b; cin >> a >> b; cout << "整数次方:" << Power(a,b) << endl; double n; int m; cin >> n >> m; cout <<"小数次方:"<< Power(n,m) << endl; return 0; }
运行结果如下:
3.什么是值传递?
值传递:指当发生函数调用使,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程使参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,无论形参发生什么变化都不能影响实参。
下列代码:
#include<iostream> using namespace std; void swap(int a,int b){ int t=a; a=b; b=t; } int main(){ int x=3,y=5; 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=3,y=5; cout<<"x"<<x<<" y="<<y<<endl; swap(x,y); cout<<"x"<<x<<" y="<<y<<endl; return 0; }
从运行结果可看出实参值被交换了,这也是传地址的作用。
5、递归。
递归:就是直接或间接地调用自身,称为递归调用
第一个阶段:递推。将原有的问题不断地分解为新的子问题,逐渐从未知向已知推进,最终达到已知条件,即递归的结束条件,这时递归阶段结束。
第二个阶段:回归。从已知条件出发,按照递归的过程,逐一求值回归,达到最终递归的开始处,结束递归阶段,完成递归调用。
代码如下:
#include<iostream> using namespace std; unsigned fac(unsigned n){ unsigned f; if(n==0) return 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; }