您的位置: 网站首页 > 程序开发 > C语言程序设计案例教程 > 第六章 数组程序设计 > 【6.2 二维数组案例】

6.2 二维数组案例

 

6.2  二维数组案例

案例6.4  输出一个矩阵

【项目任务】

学习如何对二维数组进行定义、初始化和引用。

【设计思路】

定义一个二维整数数组,对它进行初始化,然后逐个输出。

【程序代码】

#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]mn为变量)。

4.二维数组除了可以存储整型数字,还可以存储别的数据类型,如浮点型、字符型等。

案例6.5  将矩阵的行列互换

【项目任务】

学习如何利用二维数组进行矩阵的行列互换。

【设计思路】

定义一个二维整数数组a[m][n]mn为常数),对它进行初始化,然后定义一个新数组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

【知识拓展】

本题是通过对二维数组下标的灵活运用,求矩阵的转置。

案例6.6  求两个矩阵的乘积

【项目任务】

学习如何利用二维数组进行矩阵的乘法运算。

【设计思路】

定义一个二维整数数组a[m][n]mn为常数),对它进行初始化,然后定义一个新二维数组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

【知识拓展】

如果矩阵乘法由矩阵ab相乘,则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],其中na的列数也是b的行数。

案例6.7  魔方阵

【项目任务】

输出魔方阵。所谓魔方阵是指每一行、每一列和对角线之和均相等的方阵。例如,三阶魔方阵为:

                                                        8  1  6

                                                        3  5  7

                                                        4  9  2

要求输出1n2的自然数构成的魔方阵。

【设计思路】

魔方阵中各数的排列规则如下:

111放在第一行中间一列。

2)将2n×n范围内的止各数依次按如下规则存放:每一个数存放的行数为前一个数后放的行数减1,列数为前一个数存放的列数加1(如上面的三阶魔方阵,54的上一行后一列)。

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(115):");   /*要求阶数为115范围内的奇数*/

        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(115):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.为了实现算法设计中提到的位置摆放的多种可能性,本程序使用了多个条件控制语句。在处理类似问题时,思维清晰很重要。