《C++语言程序设计(第四版)》——函数的学习笔记

版权声明:共同提高:) https://blog.csdn.net/u011436427/article/details/82691076

一、函数

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.运行栈

全局变量:变量的定义全都写在函数之外;
局部变量:所有变量的定义都放在一个函数之内;

函数形参及局部变量需要存储在栈中;函数调用中的形参和局部变量,当调用开始时生效,当函数返回后失效,他们有效的器间与函数调用的器间是重合的。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/82691076