【项目任务】
学习如何对二维数组进行定义、初始化和引用。
【设计思路】
定义一个二维整数数组,对它进行初始化,然后逐个输出。
【程序代码】
#include <stdio.h>
main()
{
int i,j;
int a[2][4]={{1,2,3,4},{5,6,7,8}};
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
【运行结果】
1 2 3 4
5 6 7 8
【知识拓展】
1.二维数组可以在定义的同时,对它进行初始化;也可以先定义,再对它进行初始化。
2.数组a[2][4]有8个元素,两个纬度的下标均从0开始,分别是a[0][0]、a[0][1]、a[0][2]、a[0][3]和a[1][0]、a[1][1]、a[1][2]、a[1][3]。
3.定义二维数组时,[][]内只能是常量,不能出现a[m][n](m,n为变量)。
4.二维数组除了可以存储整型数字,还可以存储别的数据类型,如浮点型、字符型等。
【项目任务】
学习如何利用二维数组进行矩阵的行列互换。
【设计思路】
定义一个二维整数数组a[m][n](m,n为常数),对它进行初始化,然后定义一个新数组b[n][m],将a中的元素a[i][j]赋值给b[j][i],实现b=a’(a’为a的转置矩阵)。
【程序代码】
#include <stdio.h>
main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int b[4][3],i,j;
printf("Print array A:\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%4d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("Print array B:\n");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
printf("%4d",b[i][j]);
printf("\n");
}
}
【运行结果】
Print array A:
1 2 3 4
5 6 7 8
9 10 11 12
Print array B:
1 5 9
2 6 10
3 7 11
4 8 12
【知识拓展】
本题是通过对二维数组下标的灵活运用,求矩阵的转置。
【项目任务】
学习如何利用二维数组进行矩阵的乘法运算。
【设计思路】
定义一个二维整数数组a[m][n](m,n为常数),对它进行初始化,然后定义一个新二维数组b[n][p]并赋值,接着再定义一个新二维数组c[m][p],根据矩阵乘法的定义求出矩阵c。
【程序代码】
#include <stdio.h>
#define m 2
#define n 3
#define p 2
main()
{
int a[m][n]={{2,0,0},{0,1,3}};
int b[n][p]={{2,0},{0,2},{1,1}};
int c[m][p];
int i,j,k;
printf("Print array A:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
printf("Print array B:\n");
for(i=0;i<n;i++)
{
for(j=0;j<p;j++)
printf("%4d",b[i][j]);
printf("\n");
}
printf("Print array C:\n");
for(i=0;i<m;i++)
{
for(j=0;j<p;j++)
{
c[i][j]=0;
for(k=0;k<n;k++)
c[i][j]+=a[i][k]*b[k][j];
printf("%4d",c[i][j]);
}
printf("\n");
}
}
【运行结果】
Print array A:
2 0 0
0 1 3
Print array B:
2 0
0 2
1 1
Print array C:
4 0
3 5
【知识拓展】
如果矩阵乘法由矩阵a、b相乘,则a的列数和b的行数相同,并且结果矩阵c的行数和a的行数相同,c的列数和b的列数相同,即a[m][n]×b[n][p]=c[m][p];并且c[i][j]= a[i][0]×b[0][j]+a[i][1]×b[1][j]+…+a[i][n]×b[n][j],其中n是a的列数也是b的行数。
【项目任务】
输出魔方阵。所谓魔方阵是指每一行、每一列和对角线之和均相等的方阵。例如,三阶魔方阵为:
8 1 6
3 5 7
4 9 2
要求输出1~n2的自然数构成的魔方阵。
【设计思路】
魔方阵中各数的排列规则如下:
(1)1将1放在第一行中间一列。
(2)将2~n×n范围内的止各数依次按如下规则存放:每一个数存放的行数为前一个数后放的行数减1,列数为前一个数存放的列数加1(如上面的三阶魔方阵,5在4的上一行后一列)。
(3)如果上一个数的行数为1,则下一个数的行数为n(如1在第一行,则2应放在最后一行,列数同样加1)。
(4)当上一个数的行数为n时,下一个数的行数应为1,列数减1。
如果按照上面的规则确定的位置上已有数,或上一个数在第一行第n列时,则把下一个数放在上一个数的下面。按照上面的规则,4应该放在第一行第二列,但该位置已经被1占据,所以4就放在3的下面。
【程序代码】
#include <stdio.h>
main()
{
int a[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{
printf("Enter n(1~15):"); /*要求阶数为1~15范围内的奇数*/
scanf("%d",&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
【运行结果】
Enter n(1~15):5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
【知识拓展】
1.本程序中,为了直观起见,二维数组的下标都是从1开始使用,下标0未使用。
2.为了实现算法设计中提到的位置摆放的多种可能性,本程序使用了多个条件控制语句。在处理类似问题时,思维清晰很重要。