分享一下我做二级C语言时经验的总结,说法仅限于N×N型二维数组,冥冥中感觉这两个似乎有什么关联,但又说不上来,就觉得这俩题型很相似,我将这两种题型都放到下面,请读者们自行食用,如果有什么特别独到见解之处,还请不要吝啬
1.N×N型二维数组中矩阵三角形的变化
首先我们来看一道题:
C语言中给出一个N×N二维矩阵,通过键盘输入n,将它的右上三角形或者左下三角形变为原来的n倍
我们可以用如下代码实现(这里以右上三角形为例):
#include <stdio.h>
#include <stdlib.h>
#define N 3
void fun (int array[N][N], int n)
{
int i,j,t;
for(i=0;i<N;i++)
{
for(j=i;j<N;j++)
{
array[i][j]*=n;
}
}
}
void main()
{
int i,j,n;
int array [N][N]={{100,200,300},{400,500,600},{700,800,900}};
printf("n=");
scanf("%d",&n);
printf("Original array:\n ");
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
fun(array,n);
printf("Result array:\n ");
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
}
运行结果如下:
我们发现包括对角线在内的右上三角形区域的值都比原数值扩大了n倍,因为要保证是对角线以上区域的数值改变,所以在第二层循环的时候要确保j的下标始终从i的下标开始一直遍历到最后(如果是左下三角形j则从0开始但有不能超过i的限制)
2.N×N型二维数组中转置矩阵的实现
接着再看另一道题:
C语言中给出一个N×N二维矩阵,编写一个函数,实现返回这个二维矩阵的转置矩阵
我们可以用如下代码实现:
#include <stdio.h>
#include <stdlib.h>
#define N 3
void fun (int array[N][N])
{
int i,j,t;
for(i=0;i<N;i++)
{
for(j=i+1;j<N;j++)
{
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
}
void main()
{
int i,j;
int array [N][N]={{100,200,300},{400,500,600},{700,800,900}};
printf("Original array:\n ");
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
fun(array);
printf("Converted array:\n ");
for (i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%7d ",array[i][j]);
printf("\n ");
}
}
运行结果如下:
矩阵转置的思想简单的来说就是二维数组的行列互换,但是对于N×N型矩阵来说就是对角线元素不改变,其他元素按对角线对称互换
因为这里对角线元素的值我们不需要进行改变,所以N×N型二维数组我们进行转置的编写时第二层循环j就要从比i大一位的位置进行遍历
因为免除了对角线元素的参与,所以该循环的i和j值在整个循环过程中始终不存在相等的情况,所以只需要改变i和j值的先后顺序就可以实现其余元素沿对角线对称互换