You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何封装矩阵循环为函数?用1D数组实现方阵对角线下方求和

解决方案:基于1D数组封装方阵操作函数

针对你的需求,我们可以直接用1D数组模拟方阵,通过index = row * N + col的映射关系完成所有操作,完全不需要先构建2D数组再转换。下面是拆解后的实现方案:

核心思路

方阵的每个元素array[row][col]可以直接对应到1D数组的line[row * N + col](N为方阵边长),所有对2D数组的操作都可以通过这个映射在1D数组上完成,既满足禁止传递2D数组的要求,又简化了逻辑。

分步实现

1. 封装输入方阵大小的函数

确保用户输入的是方阵(行和列相等),避免后续逻辑出错:

void get_square_size(int *n) {
    int rows, cols;
    printf("请输入方阵的行数:");
    scanf("%d", &rows);
    printf("请输入方阵的列数:");
    scanf("%d", &cols);
    while (rows != cols) {
        printf("错误!方阵的行和列必须相等,请重新输入:\n");
        printf("行数:");
        scanf("%d", &rows);
        printf("列数:");
        scanf("%d", &cols);
    }
    *n = rows;
}

2. 封装生成随机1D方阵的函数

动态分配内存(避免栈溢出),并填充指定范围的随机数:

int* generate_square_array(int n, int lbound, int ubound) {
    int* arr = (int*)malloc(n * n * sizeof(int));
    if (!arr) {
        printf("内存分配失败!");
        exit(1);
    }
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            int index = row * n + col;
            arr[index] = mrand48() % (ubound - lbound + 1) + lbound;
        }
    }
    return arr;
}

3. 封装计算主对角线下方元素和的函数

遍历1D数组,通过映射关系判断元素是否在主对角线下方(row > col),并求和:

int calculate_below_diagonal_sum(int* arr, int n) {
    int sum = 0;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (row > col) {
                int index = row * n + col;
                sum += arr[index];
            }
        }
    }
    return sum;
}

4. 辅助函数:打印1D方阵(可选,用于验证)

把1D数组按方阵格式打印,方便查看:

void print_square_array(int* arr, int n) {
    printf("方阵内容:\n");
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            int index = row * n + col;
            printf("%d ", arr[index]);
        }
        printf("\n");
    }
}

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LBOUND -10
#define UBOUND 10

void get_square_size(int *n);
int* generate_square_array(int n, int lbound, int ubound);
int calculate_below_diagonal_sum(int* arr, int n);
void print_square_array(int* arr, int n);

int main() {
    int n;
    get_square_size(&n);
    
    srand48(time(NULL)); // 初始化随机数生成器
    int* square_arr = generate_square_array(n, LBOUND, UBOUND);
    
    print_square_array(square_arr, n);
    
    int sum = calculate_below_diagonal_sum(square_arr, n);
    printf("主对角线下方元素的和:%d\n", sum);
    
    // 打印1D数组原始内容(可选)
    printf("1D数组原始内容:");
    for (int i = 0; i < n*n; i++) {
        printf("%d ", square_arr[i]);
    }
    printf("\n");
    
    free(square_arr); // 释放动态分配的内存
    return 0;
}

void get_square_size(int *n) {
    int rows, cols;
    printf("请输入方阵的行数:");
    scanf("%d", &rows);
    printf("请输入方阵的列数:");
    scanf("%d", &cols);
    while (rows != cols) {
        printf("错误!方阵的行和列必须相等,请重新输入:\n");
        printf("行数:");
        scanf("%d", &rows);
        printf("列数:");
        scanf("%d", &cols);
    }
    *n = rows;
}

int* generate_square_array(int n, int lbound, int ubound) {
    int* arr = (int*)malloc(n * n * sizeof(int));
    if (!arr) {
        printf("内存分配失败!");
        exit(1);
    }
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            int index = row * n + col;
            arr[index] = mrand48() % (ubound - lbound + 1) + lbound;
        }
    }
    return arr;
}

int calculate_below_diagonal_sum(int* arr, int n) {
    int sum = 0;
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if (row > col) {
                int index = row * n + col;
                sum += arr[index];
            }
        }
    }
    return sum;
}

void print_square_array(int* arr, int n) {
    printf("方阵内容:\n");
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            int index = row * n + col;
            printf("%d ", arr[index]);
        }
        printf("\n");
    }
}

关键修正说明

  • 修正了原代码中随机数生成的参数顺序错误,避免逻辑异常
  • 使用动态内存分配malloc替代变长数组(VLA),提升代码兼容性和安全性
  • 完全抛弃2D数组,所有操作直接在1D数组上完成,满足禁止传递2D数组的要求
  • 增加输入校验,确保用户输入的是合法方阵

内容的提问来源于stack exchange,提问作者clubmix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:35:42