一、为什么要用函数
函数是功能的抽象具体形式,在编程中使用函数不仅可以减少模块之间的耦合度,程序的主体看的不那么臃肿,还方便修改功能与代码重用,大大提升效率。
例如:
求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;
}
学习数据结构时书上便有汉诺塔问题的解析,由分析可知不管该移到哪个盘子,它都可以借助第三根针完成两针之间位置的转化,因此汉诺塔问题就可以通过简单的递归代码求解。