一、函数
1.函数的调用形式
1)main函数可以有形参,其形参称之为命令行参数,由操作系统在启动程序时初始化。
2)return语句的作用:返回给主调函数的处理结果;结束当前函数的执行。
主调函数与被调函数的关系,如下:
函数申明与函数的关系
eg1.编写一个求x的n次方的函数
注意:由于被调函数的定义位于调用之前,所以无须再对函数原型加以申明
#include<siotream>
using namespace std;
double func(double x,int n)
{
double sum;
while(n--)
{
sum*=x;
}
return sum;
}
int main()
{
cout<<func(5,3)<<endl;
return 0;
}
eg2.输入一个8位的二进制数,将其转换为十进制数输出
由于被调函数的定义位于它的调用之后,因此要事先申明被调函数
#include<iostream>
#include<stdlib.h>
using namespace std;
//3_2.cpp
#include <iostream>
using namespace std;
int power (int x, int n);//函数申明要加➡;
void main(void)
{
int i;
int value = 0;
char ch;
cout << "Enter an 8 bit binary number ";
for (i = 7; i >= 0; i--)
{
cin >> ch;
if (ch == '1')
value += int(power(2,i));00
}
cout <<"Decimal value is "<<value<<endl;
system("pause");
}
int power (int x, int n)
{
int val = 1;
while (n--)
val *= x;
return(val);
}
结果输入判定:
2.嵌套调用
函数允许嵌套调用。如果函数1调用了函数2,函数2再调用函数3,便形成了函数的嵌套调用
3.递归调用
递归算法的实质是将原有的问题分解为新的问题,而解决新问题时,又用到了原有问题的解法。
eg1:求n!
//3_8.cpp
#include <iostream>
using namespace std;
long fac(int n)
{
long f;
if (n<0) {cout<<"n<0,data error!"<<endl;}
else if (n==0) f=1;
else f=fac(n-1)*n;
return(f);
}
void main()
{
long fac(int n);
int n;
long y;
cout<<"Enter a positive integer:";
cin>>n;
y=fac(n);
cout<<n<<"!="<<y<<endl;
}
eg2.用递归法计算从n个人中选择k个人组成一个委员会的不同组合数
//3_9.cpp
#include<iostream>
using namespace std;
void main()
{
int n,k;
int comm(int n, int k);
cin>>n>>k;
cout<<comm(n,k) <<endl;
}
int comm(int n, int k)
{
if ( k>n )
return 0;
else if( n==k||k==0 )
return 1;
else
return comm(n-1,k)+comm(n-1,k-1);
}
eg3.汉诺塔问题
分析:将n个盘子从A移到C可以分解为下面的3个步骤:
(1)将国歌盘子从一个地方,移动到另外一个地方,这是一个递归的过程
(2)将1个盘子从一个地方移到另一个盘子上
用hanoi函数实现(1)操作,用move实现(2)操作
//3_10.cpp
#include <iostream>
using namespace std;
void move(char getone,char putone)
{
cout<< getone <<"-->"<<putone<<endl;
}
void hanoi(int n,char one,char two,char three)
{
//void move(char getone,char putone);
if (n==1) move (one,three);
else
{
hanoi (n-1,one,three,two);//关键代码
move(one,three);
hanoi(n-1,two,one,three);//关键代码
}
}
void main()
{
//void hanoi(int n,char one,char two,char three);
int m;
cout<<"Enter the number of diskes:";
cin>>m;
cout<<"the steps to moving "<<m<<" diskes:"<<endl;
hanoi(m,'A','B','C');
}
4.函数的参数传递
1)值传递
//3_11.cpp
#include<iostream>
using namespace std;
void Swap(int a, int b);
void main()
{
int x(5), y(10);
cout<<"x="<<x<<" y="<<y<<endl;
Swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
}
void Swap(int a, int b)
{
int t;
t=a;
a=b;
b=t;
}
2)引用传递
//3_12.cpp
#include<iostream>
using namespace std;
void Swap(int& a, int& b);
void main()
{
int x(5), y(10);
cout<<"x="<<x<<" y="<<y<<endl;
Swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
}
void Swap(int& a, int& b)
{
int t;
t=a;
a=b;
b=t;
}
5.内联函数
对于一些功能简单,规模较小又使用频繁的函数,可以设计为内联函数。
内联函数不是在调用的时候发生控制转移,而是在编译的时候将函数体嵌入在每个调用处
//3_14.cpp
#include<iostream>
using namespace std;
inline double CalArea(double radius) //内联函数,计算圆的面积
{
return 3.14*radius*radius;
}
void main()
{
double r(3.0); //r是圆的半径
double area;
area=CalArea(r);
//调用内联函数求圆的面积,编译时此处被替换为CalArea函数体语句
cout<<area<<endl;
}
6.函数重载
C++语言中提供了对函数重载的支持,使我们在编程时可以对不同的功能赋予相同的函数名,编译的时候会根据上下文(实参的类型个数)来确定使用哪一具体功能。
定义:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配方式,自动确定调用哪一个函数
重载函数的要求:个数不同或者类型不同
下面的是比较典型的eg:
eg1:编写两个名字为sumOfSquare的重载函数,分别求两整数的平方和及两实数的平方和
//3_16.cpp
#include<iostream>
using namespace std;
struct complex
{
double real;
double imaginary;
};
void main(void)
{
int m, n;
double x, y;
complex c1, c2, c3;
int add(int m, int n);
double add(double x, double y);
complex add(complex c1, complex c2);
cout<<"Enter two integer: ";
cin>>m>>n;
cout<<"integer "<<m<<'+'<<n<<"="<<add(m,n)<<endl;
cout<<"Enter two real number: ";
cin>>x>>y;
cout<<"real number "<<x<<'+'<<y<<"= "<<add(x,y)<<endl;
cout<<"Enter the first complex number: ";
cin>>c1.real>>c1.imaginary;
cout<<"Enter the second complex number: ";
cin>>c2.real>>c2.imaginary;
c3=add(c1,c2);
cout<<"complex number ("<<c1.real<<','<<c1.imaginary<<")+("
<<c2.real<<','<<c2.imaginary<<")= ("<<c3.real<<','<<c3.imaginary<<")\n";
}
int add(int m, int n)
{ return m+n; }
double add(double x, double y)
{ return x+y; }
complex add(complex c1, complex c2)
{
complex c;
c.real=c1.real+c2.real;
c.imaginary=c1.imaginary+c2.imaginary;
return c;
}
7.C++系统函数
8.运行栈
全局变量:变量的定义全都写在函数之外;
局部变量:所有变量的定义都放在一个函数之内;
函数形参及局部变量需要存储在栈中;函数调用中的形参和局部变量,当调用开始时生效,当函数返回后失效,他们有效的器间与函数调用的器间是重合的。