方阵(用一维数组代替二维数组实现问题的求解)

请编写一个程序,读取一个N(0 \lt N \le 50)N(0<N≤50)维方阵,并完成如下下操作:

  • 按列序输出方阵;
  • 计算方阵的主对角线元素的均值。结果保留小数点后2位数字。

输入

输入的第一行为方阵的阶数NN,随后的NN行中,每行包含NN个整数(每个整数的绝对值不超过100),为方阵的各行的元素。

输出

先按列序输出方阵各列的元素,随后在单独的行中输出对角线元素的均值,结果保留两位小数。

输入示例

5
5  2  3  4  5
5  6  7  8  9
5  1  3  5  7
8  2  4  6  8
2  4  8  12 16

输出

5 5 5 8 2
2 6 1 2 4
3 7 3 4 8
4 8 5 6 12
5 9 7 8 16
5.47

[程序代码]

#include<stdio.h>
void InitMatrix(long int *, short);
void Traversal(long int *, short);
void Traversal2(long int *, short);
void Traversal3(long int *, short);
double GetAverage(long int *, short);
double GetAverage2(long int *, short);
int main()
{
    /* 方阵阶数 */
    short N;
    while(scanf("%hd", &N) != 1 || N < 1 || N > 50)
    {
        while(getchar() != '\n') ;
        printf("请输入合法数据.\n");
    }
    /* 方阵matrix */
    long int matrix[N * N];
    /* 初始化N阶方阵 */
    InitMatrix(matrix, N);
    /* 按列序遍历N阶方阵并输出 */
    Traversal3(matrix, N);
    /* 计算方阵对角线元素的平均值并输出 */
    printf("\n%.2lf\n", GetAverage(matrix, N));
    /* */
    return 0;
}
/* 计算副对角线元素的均值 */
double GetAverage2(long int *p, short N)
{
    double sum = 0;
    short i;
    for(i = 0; i < N; i ++)
    {
        sum = sum + *(p + i * N + (N - 1 - i));
    }
    return sum / N;
}
/* 计算主对角线元素的均值 */
double GetAverage(long int *p, short N)
{
    double sum = 0;
    short i;
    for(i = 0; i < N; i ++)
    {
        sum = sum + *(p + i * N + i);
    }
    return sum / N;
}
/* 遍历N阶方阵并输出(按列序) */
void Traversal3(long int *p, short N)
{
    short i, j;
    for(i = 0; i < N; i ++)
    {
        for(j = 0; j < N; j ++)
        {
            printf("%ld", *(p + j * N + i));
            if(j != N - 1)
            {
                /* 在输出时不是行尾元素 */
                /* 输出空格 */
                putchar(' ');
            }
        }
        if(i != N - 1)
        {
            putchar('\n');
        }
    }
}
/* 遍历N阶方阵并输出(按行序的另一种算法) */
void Traversal2(long int *p, short N)
{
    short i, j;
    for(i = 0; i < N; i ++)
    {
        for(j = 0; j < N; j ++)
        {
            printf("%ld ", *(p + i * N + j));
        }
        putchar('\n');
    }
}
/* 初始化N阶方阵 */
void InitMatrix(long int *p, short N)
{
    short i = 0;
    short length = N * N;
    while(i < length)
    {
        scanf("%ld", p + i);
        i ++;
    }
}
/* 遍历N阶方阵并输出(按行序输出) */
void Traversal(long int *p, short N)
{
    short i = 0;
    short length = N * N;
    while(i < length)
    {
        printf("%ld ", *(p + i));
        i ++;
        if(i % N == 0)
        {
            putchar('\n');
        }
    }
}

[运行结果]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值