C++蓝桥杯等级考试真题--第11级
答案:D
解析:
A. a = b; b = a;
这种方式会导致a和b最终都等于b原来的值,因为a的原始值在被b覆盖前没有保存。
B. swap(a
,
b);
如果没有自定义swap函数或者没有包含相应的库,这个选项会编译错误。
C. a,b= b,a;
这种语法在C++中是错误的,不过在Python中可以用来交换变量。
D. 正确地使用了临时变量tmp来保存b的值,然后把a的值赋予b,最后把tmp的值(原本的b)赋予a,完成了交换,故答案为D。
答案:C
解析:
A. 错误,二维数组 int a[3][7]
的最后一个元素是 a[2][6]
,数组索引是从0开始的。
B. 错误,C++中数组的维度没有限制,不仅仅限于三维,可以通过指针或动态分配内存等方式实现更高维度的数组表示。
C. 正确,数组在内存中分配是一段连续的内存空间,无论是一维、二维(以行优先或列优先方式连续存储)还是更高维度(通过嵌套数组实现)的数组,其元素都是连续存储的。
D. 错误,二维数组 int a[3][7]
的第一个元素是 a[0][0]
,故答案为C。
答案:B
解析:
A. 选项在每个元素输入后都有一个 endl
,这会导致不必要的换行,虽然程序依然能正确运行,但这不是输入数组的标准做法。
B. 正确遍历了数组的每一个元素,从 a[0][0]
到 a[4][9]
,没有额外的 endl
输出,是最合适的输入方式。
C. 错误地使用了 i<=5
和 j<=10
,这将访问数组的越界位置,因为数组的有效索引范围是0到n-1。
D. 错误地交换了循环变量i和j的边界,导致尝试按照列优先的顺序访问数组,而数组定义为5行10列,正确的遍历应遵循行优先的原则,故答案为B。
【参考程序】
#include <iostream>
using namespace std;int main() {int m, n, x, y;cin >> m >> n >> x >> y;// 确保x和y在有效范围内x--; // 将行号转换为0-based索引y--;int matrix[m][n]; // 定义一个m*n的二维数组// 输入矩阵for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {cin >> matrix[i][j];}}// 输出指定行for(int i = x; i <= y; i++) {for(int j = 0; j < n; j++) {cout << matrix[i][j] << " ";}cout << endl; // 换行}return 0;
}
解析:首先读取矩阵的大小(行数m和列数n)、起始行号x和结束行号y,然后通过两层循环输入矩阵中的每个元素。之后,程序再次使用循环结构,仅输出从第x行到第y行的内容,每行元素之间用空格分隔,行与行之间自动换行。注意,由于题目中行号是基于1的,而在C++数组索引中我们通常从0开始,因此在读取x和y后立即将它们减1,以便正确地访问数组。
【参考程序】
#include <iostream>
#include <vector>
using namespace std;int main() {int m, n;cin >> m >> n;vector<vector<int>> matrix(m, vector<int>(n)); // 使用vector来创建动态矩阵// 输入矩阵for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {cin >> matrix[i][j];}}// 初始化一个n大小的向量,用于存放每列的最大值vector<int> maxValues(n, 0);// 遍历矩阵找到每列的最大值for(int j = 0; j < n; j++) {for(int i = 0; i < m; i++) {if(matrix[i][j] > maxValues[j]) {maxValues[j] = matrix[i][j];}}}// 输出每列的最大值for(int i = 0; i < n; i++) {cout << maxValues[i];if(i < n - 1) cout << " "; // 除了最后一个数字外,每个数字后面加空格}cout << endl;return 0;
}
解析:首先读取矩阵的行数m和列数n,接着使用vector<vector<int>>
来动态存储矩阵数据。通过两层循环读入矩阵的每个元素。然后,它初始化一个vector<int>
来保存每列的最大值,并通过双重循环遍历矩阵,比较并更新每列的最大值。最后,程序输出所有列的最大值,每两个数字之间用空格隔开。