C/C++ L6

2018/07/07 C/C++

C/C++程序语言设计 Level6。

MAC

函数

当程序的功能比较多,规模比较大的时候,把所有的程序代码都写在一个主函数中,就会使得主函数变得复杂、头绪不清,使得阅读和维护程序变得困难。此外,有的时候程序需要多次实现某一功能,就需要多次重复编写实现此功能的程序代码,使得程序冗长、不精炼。

模块化程序设计的思路,要求使用实现编好常用的函数来实现不同的功能。事实上,类似printfscanfsqrt等函数都是已经编写好的功能函数。

有一些书本将函数称为方法,含义是一样的。

#include <iostream>
using namespace std;

void print_star(){
    cout << "***************" << endl;
}

void print_message(){
    cout << "Hello world" << endl;
}

int main(){
    print_star();
    print_message();
    print_star();
    return 0;
}

定义函数

定义函数的形式为:

返回值类型名 函数名(参数类型名 参数名, ...){
    函数体
}
  1. 返回值类型名是指调用该函数后返回的值的类型,如果函数不返回任何东西,则为void。
  2. 参数类型名是调用该函数时填入的参数的类型,如果函数不使用任何参数,则留空。

调用函数

调用函数的方法就是使用函数名并添加对应的参数,如果函数具备返回值,还需要设置变量接收函数的返回值。函数的返回值可以当作函数的参数进行嵌套调用。例如:

int c = max(a, b);
int d = max(c, max(a, b));

形式参数与实际参数

在调用函数的时候,主调函数和被调用函数之间含有数据传递过程。其中,定义函数时的参数是形式参数,调用函数时的参数是实际参数

调用函数的时候,实际参数的值传递到形式参数中。函数修改形式参数并不会改变实际参数的值,并且形式参数会在函数执行完毕后销毁。

函数的嵌套使用

C语言对函数的定义是相互平行、独立的,因此函数内部不能再定义函数,但是可以调用函数。函数中调用函数称为函数的嵌套使用。

#include <iostream>
using namespace std;

void printa(){
    cout << "第1句内容" << endl;
}

void printb(){
    cout << "第2句内容" << endl;
}

void printall(){
    printa();
    printb();
    cout << "第3句内容" << endl;
}

int main(){
    printall();
    return 0;
}

函数的递归使用

递归的定义是:自己调用自己。在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。例如:

int f(int x){
    int y,z;
    z=f(y);
    return 2*z;
}

注意到,上面调用函数f的过程中,又需要调用f函数,这是直接调用函数本身。

下面是用递归的方式求阶乘的代码:

#include <iostream>
using namespace std;

int fac(int n){
    int f;
    if(n < 0){
        cout << "n<0, 数据错误" << endl;
    }
    else if(n==0 || n==1){
        f=1;
    }
    else{
        f = fac(n-1)*n;
    }
    return f;
}

int main(){
    int n, y;
    cout << "请输入一个整数" << endl;
    cin >> n;
    y = fac(n);
    cout << n << "!=" << y << endl;
    return 0;
}

Hanoi问题

汉诺塔问题,是一个古典的数学问题。古代有一个梵塔,塔内有3个座A、B、C,开始的时候A上面有64个盘子,盘子大小不相等,大的在下面,小的在上面。有一个老和尚想将这64个盘子从A座搬到C座,但是规定每次移动1个盘子,并且移动过程中任何时候都要保持大盘子在下面,小盘子在上面。移动的过程中可以使用B座,要求写出程序输出移动的步骤。

下面的代码将问题缩减为5个盘子。

#include <iostream>
using namespace std;

void move(char x, char y){
    cout << x << "->" << y << endl;
}

void hanoi(int n, char A, char B, char C){
    if(n == 1){
        move(A, C);
    }
    else{
        hanoi(n-1, A, C, B);
        move(A, C);
        hanoi(n-1, B, A, C);
    }
}

int main(){
    int m;
    cout << "请输入盘子的数量:" << endl;
    cin >> m;
    cout << "移动盘子的步骤是:" << endl;
    hanoi(m, 'A', 'B', 'C');
    return 0;
}

习题

  1. 写两个函数,分别求解两个整数的最大公约数、最小公倍数。然后在main函数中调用这两个函数。
  2. 写一个函数,输入一个十六进制数,输出对应的十进制数。

Search

    Table of Contents