请编写一个程序,读取一个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');
}
}
}
[运行结果]