方阵转置 163 PEX7-9 与求和P166 EXE7-7

输入一个正整数n(1<=n<=6),根据下式生成n阶方阵,将该方阵转置(行列互换)后输出。

a[i][j] = i*n+j+1

 

#include <stdio.h>
int main()
{
    int n;
    printf("输入方阵维数: \n");
    scanf("%d", &n);
    int a[n][n];
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            a[i][j] = i*n+j+1;
        }
    }
    //以上是二维数组初始化


    printf("initiation:\n");
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            printf("%3d", a[i][j]);
        }
        printf("\n");
    }
    //以上是输出初始化的结果


    int temp;
    for (int i=0; i<n; i++) {
        for (int j=0; j<i; j++) {
            temp = a[i][j];
            a[i][j] = a[j][i];
            a[j][i] = temp;
        }
    }
    //以上是转置的思路与代码


    printf("\nafter transposition:\n");
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            printf("%3d", a[i][j]);
        }
        printf("\n");
    }
    //以上是转置后的矩阵转出

    return 0;
}

 

运行结果:

输入方阵维数: 
5
initiation:
  1  2  3  4  5
  6  7  8  9 10
 11 12 13 14 15
 16 17 18 19 20
 21 22 23 24 25

after transposition:
  1  6 11 16 21
  2  7 12 17 22
  3  8 13 18 23
  4  9 14 19 24
  5 10 15 20 25

 

 

在本题的基础上,如果需要求该矩阵除副对角线,最后一列和最后一行以外的所有元素之和:

代码可以这样写:

#include <stdio.h>
int main()
{
    int n;
    printf("输入方阵维数: \n");
    scanf("%d", &n);
    int a[n][n];
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            a[i][j] = i*n+j+1;
        }
    }
    //以上是二维数组初始化


    printf("initiation:\n");
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            printf("%3d", a[i][j]);
        }
        printf("\n");
    }
    //以上是输出初始化的结果

    int sum = 0;
    for (int i=0; i<n-1; i++) { //让i<n-1,而非i<n,可以直接不循环最后一行;
        for (int j=0; j<n-1; j++) { //同理,让j<n-1,而非j<n,可以直接不循环最后一列;
            if (i+j != (n-1)) { //副对角线元素特点是i+j=n-1,这里的条件刚好排除副对角元素
                sum += a[i][j];
            }
        }
    }
    printf("sum = %d\n", sum);

 

posted @ 2020-05-04 17:36  profesor  阅读(227)  评论(0编辑  收藏  举报