C++中二维数组函数传参及n×n矩阵填充问题求助
解决你的n×n矩阵填充问题
咱们先拆解你遇到的两个问题,然后给出修正后的代码:
问题1:二维数组的传递与函数调用错误
你在main()里调用fillMatrix时写了fillMatrix(a[][n], n);,这是不符合C++语法的。在传递二维数组时,直接传递数组名a即可——数组名会隐式转换为指向其首元素的指针,而函数参数里的unsigned a[][MAX]写法是正确的(因为二维数组传递必须指定第二维的大小,你已经用MAX宏定义了这个值)。
问题2:矩阵填充逻辑错误
你的填充循环里,判断i==j时把元素设为0,但紧接着又执行了a[i][j]=1;,这会直接覆盖刚才设置的0,导致主对角线也变成1,最终整个矩阵全是1。解决方法很简单:要么把a[i][j]=1;放到else分支里,要么先把整个矩阵填充为1,再单独把主对角线设为0(后者逻辑更清晰)。
修正后的完整代码
#include <iostream> #define MAX 100 using namespace std; // 全局数组,或者你也可以改成局部数组(需要注意大小) int a[MAX][MAX]; void fillMatrix(unsigned a[][MAX], unsigned n) { // 方法1:先全部填1,再把主对角线设为0(逻辑更直观) for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { a[i][j] = 1; } // 主对角线元素单独设为0 a[i][i] = 0; } // 或者用原逻辑改else分支的写法: // for(int i=0; i<n; i++) { // for(int j=0; j<n; j++) { // if(i == j) { // a[i][j] = 0; // } else { // a[i][j] = 1; // } // } // } } int n; int main() { cin >> n; // 修正调用方式:直接传数组名a fillMatrix(a, n); // 打印矩阵 for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { cout << a[i][j] << ' '; } cout << endl; } return 0; }
额外小提示(现代C++风格优化)
如果不想用全局数组,也可以用vector来实现动态二维数组,避免宏定义的固定大小限制,更符合现代C++的写法:
#include <iostream> #include <vector> #include <algorithm> // 用于fill函数 using namespace std; void fillMatrix(vector<vector<int>>& mat) { int n = mat.size(); for(int i=0; i<n; i++) { fill(mat[i].begin(), mat[i].end(), 1); mat[i][i] = 0; } } int main() { int n; cin >> n; // 创建n×n的vector,默认值可忽略 vector<vector<int>> mat(n, vector<int>(n)); fillMatrix(mat); // 范围for循环打印,更简洁 for(auto& row : mat) { for(int num : row) { cout << num << ' '; } cout << endl; } return 0; }
内容的提问来源于stack exchange,提问作者A.Petrov
相关产品推荐
相关产品推荐

