一、为什么要用函数

  函数是功能的抽象具体形式,在编程中使用函数不仅可以减少模块之间的耦合度,程序的主体看的不那么臃肿,还方便修改功能与代码重用,大大提升效率。

例如:

  求x的n次方可以用以下函数:并且在复杂程序中可反复调用

  

#include <iostream>

using namespace std;/*放主函数里边只主函数能用*/

double power(double x,int n){  /* x、n为局部变量*/

double val=1.0;

while (n--)

val*=x;

return val;}

int main (){ 执行函数时xn被分配空间,初始化形参

cout <<”5 to the power 2 is ”<<power(5,2)<<endl;

/*执行到此处,再按f10则直接出结果  step into/f11再次进入函数 传值 计算 循环 返回主调函数  调用栈*/

Return 0;}

/*函数原型声明出现在调用点之前即可。*/

 

二、函数重载

  C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形参必须不同。用同一个函数完成不同的功能就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

  注:函数的重载不能只有函数返回值类型不同,能不能重载主要看形参而返回值不是主要的方面。

#include<iostream>

using namespace std;

int Add(int a, int b)

{

`  return a + b;

}

double Add(float a, float b)
{   return a + b; }
int main() {   cout<<Add(1,2)<<endl;
  cout<<Add(3.5, 4.5)<<endl;   return 0; }

  

三、值传递与地址传递

  形参是实现算法必须要用的数据,而用的时候必须要由实参给出来,被调用时才分配形参的内存单元。

  值传递即将实参的值传给形参,为单向。地址传递是将实参的访问权限传给形参为双向的。

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

count <<”x=”<<x<<”y=”<<y<<endl;

swap(x,y);

count<<”x=”<<x<<”y=”<<y<<endl;

return 0;

}

 

  若输入x=5,y=10我们期望通过这个函数令x=10,y=5但结果却没有变化

  因为:在swap子函数中交换的一直是ab,主函数中的xy值传给ab进行交换,xy的值没有受到影响,这就是值传递,也就是形参值的改变没有影响到实参值。

 

  c++中的引用类型语法形式:类型标识符&引用变量名

  例如int i,j    int  &ri=i(int型的引用ri,相当于被初始化为了变量的一个别名)      与指针类似声明一个引用时,必须对他初始化

 

  上个swap函数形参用引用类型时:

 

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

count <<”x=”<<x<<”y=”<<y<<endl;

swap(x,y);   /*将实参变量与引用名进行关联,a的地址和x地址便相同了

count<<”x=”<<x<<”y=”<<y<<endl;

return 0;

 

  

 

 

四、递归函数

  直接或间接地调用函数本身则该函数称为递归函数 写递归函数要明确边界条件与递归公式。相比于迭代他程序要简单但占用的内存空间多。

课上讲的汉诺塔问题:

#include <iostream>

using namespace std;

void move(char src, char dest)

{

    cout << src << "-->" << dest << endl;

}

void hanoi(int n, char src, char medium, char dest) {

    if (n == 1)

        move(src, dest);

    else

    {

        hanoi(n - 1, src, dest, medium);

        move(src, dest);

        hanoi(n - 1, medium, src, dest);

    }

}

int main()

{

    int m;

    cout << "Enter the number of diskes :";

cin >> m;

cout<<”the steps to moving “<<m<<”diskes:”<<endl;

    hanoi(m, 'A', 'B', 'C');

    return 0;

}

  学习数据结构时书上便有汉诺塔问题的解析,由分析可知不管该移到哪个盘子,它都可以借助第三根针完成两针之间位置的转化,因此汉诺塔问题就可以通过简单的递归代码求解。