C语言二维数组作为形参传值问题

题目:编写函数void exchange(int a[M][N]),将MxN维的矩阵中最大元素和最小元素所在的列进行互换,如果最大元素与最小元素在同一列,则不要求互换。

要求:在主函数中初始化原始矩阵并输出原始矩阵,输出最大元素和最小元素的值以及各自所在的行号和列号,输出处理之后的矩阵。

解决:这题难度适中,输出最大最小元素和使用for循环比较,行号列号可以在循环时记录。列互换可以定义一个Temp[M][1]数组。唯一需要注意的一点是:exchange函数申明为void exchange(int a[M][N]),在main函数中调用exchange时,只需写为exchange(a)即可,写成exchange(a[M][N])会报错,这一点要切记!!!

参考网址:

http://bbs.csdn.net/topics/390428483

代码:

#define M 3
#define N 3
#include <stdio.h>

void exchange(int a[M][N]){
    int max = a[0][0];
    int min = a[0][0];
    int i, j;
    int b[M][1];
    int max_c, max_r, min_c, min_r;
    for(i = 0; i < M; i++){
        for(j = 0; j < N; j++){
            if(a[i][j] > max){
                max = a[i][j]; max_r = i; max_c = j;
            }
            if(a[i][j] < min){
                min = a[i][j]; min_r = i; min_c = j;
            }
        }
    }
    printf("max = %d, min = %d\n", max, min);
    printf("max_r = %d, max_c = %d\n", max_r + 1, max_c + 1);
    printf("min_r = %d, min_c = %d\n", min_r + 1, min_c + 1);
    if(max_c == min_c){
        printf("no change!!\n");
    }
    else{
        for(i = 0; i < M; i++){
            b[i][1] = a[i][max_c];
        }
        for(i = 0; i < M; i++){
            a[i][max_c] = a[i][min_c];
        }
        for(i = 0; i < M; i++){
            a[i][min_c] = b[i][1];
        }
        printf("the change matrix is:\n");
        for(i = 0; i < M; i++){
            for(j = 0; j < N; j++){
                printf("%d ", a[i][j]);
            }
            printf("\n");
        }
    }
}


int main(){
    int a[M][N], i, j;
    printf("please input the matrix:\n");
    for(i = 0; i < M; i++){
        for(j = 0; j < N; j++){
            scanf("%d", &a[i][j]);
        }
    }
    printf("the matrix is:\n");
    for(i = 0; i < M; i++){
        for(j = 0; j < N; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    exchange(a);
    return 0;
}

运行结果:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值