📜  门| GATE-CS-2017(Set 2)|问题7(1)

📅  最后修改于: 2023-12-03 15:28:45.405000             🧑  作者: Mango

题目概述

这是2017年GATE计算机科学与信息技术考试的第二份试卷的第七个问题。该问题要求编写一个C++程序,以实现一些特定的功能。

题目要求

编写一个C++程序,要求实现三个函数:

  1. int** allocate2D(int r, int c);

    这个函数应该接收两个整数参数:行数 r 和列数 c,并返回一个二维整数数组(int** 类型)。要求在堆上分配这个二维数组,使得这个二维数组可以保存 r 行和 c 列的整数。注意此题目并没有要求初始化此二维数组。

  2. int* getcolumn(int **p, int r, int c);

    这个函数应该接收三个参数:一个二维整数数组 p、行数 r 和列数 c,并返回一个一维整数数组(int* 类型)。函数应该从 p 中取出第 c 列,将其保存为一个一维整数数组,并返回该数组的首地址。注意此题目并没有要求检查输入的参数是否合法。

  3. void free2D(int **p, int r, int c);

    这个函数应该接收三个参数:一个二维整数数组 p、行数 r 和列数 c,并释放这个二维数组所占用的内存。

实现思路

allocate2D函数

这个函数需要在堆上分配一个二维整数数组。由于一维整数数组在内存中是连续存储的,因此我们可以先分配一个一维整数数组,然后再将每一行的指针指向这个一维数组中对应的区域。

int** allocate2D(int r, int c) {
    int** p = new int*[r]; // 分配指针的数组,共r个指针
    int* t = new int[r * c]; // 分配一维数组,共r*c个整数
    for (int i = 0; i < r; i++) {
        p[i] = t + i * c; // 将第i行的指针指向一维数组中的第i*c个整数
    }
    return p;
}

这个函数首先分配了一个指针的数组 p,长度为 r,每个指针指向一个一维数组对应的位置。

然后分配了一个一维数组 t,长度为 r * c,其中 r 表示行数,c 表示列数。

最后,遍历 p 数组,将每个指针指向一维数组中对应的区域。

getcolumn函数

这个函数需要从一个二维整数数组中取出第 c 列,将其保存为一个一维整数数组,并返回该数组的首地址。可以将其实现为一个简单的循环。

int* getcolumn(int **p, int r, int c) {
    int* ret = new int[r]; // 分配一维数组,共r个整数
    for (int i = 0; i < r; i++) {
        ret[i] = p[i][c]; // 将第i行第j列的整数存入一维数组
    }
    return ret;
}

这个函数首先分配了一个一维数组 ret,长度为 r

然后遍历二维数组 p 的每一行,将该行第 c 列的整数存到 ret 数组中。

free2D函数

这个函数需要释放一个二维整数数组所占用的内存。注意这里需要先释放每一行所占用的内存,然后再释放指针的数组 p 所占用的内存。

void free2D(int **p, int r, int c) {
    for (int i = 0; i < r; i++) {
        delete[] p[i]; // 释放一维数组
    }
    delete[] p; // 释放指针的数组
}

这个函数遍历每一行,释放每一行所占用的内存。

然后释放指针的数组 p 所占用的内存。

结语

这个题目考察了对指针、内存分配和释放的基本知识。同时,这个题目也有一些值得注意的细节,如何利用一维数组来存储二维数组、如何遍历二维数组等等。