zoukankan      html  css  js  c++  java
  • 二维数组相关问题

    2019-06-02   20:15:54  

    1.创建二维数组

    以矩阵的形式显示它的数据元素。一个矩阵代表若干行的数据元素,每行有相同的列数。如果一个矩阵只有一行,则被称为行矩阵。(若只有一列,则被称为列矩阵)。一个行矩阵或者一个列矩阵实际上是一个一维数组。如果一个矩阵有m行n列,则被称为m*n矩阵。这种矩阵可以被想象成二维数组,按照键盘输入的数据存入数组。

    #include<stdio.h>
    int main(){
        int i,j;
        int a[][5]={{1,2,3,4,5},   //数组的声明可以不写行号,int a[][5]或者int a[3][5], 若int a[2][5]分配的内存小则会报错 
               {6,7,8,9,0},
               {11,12,13,14,15}};
        /*以矩阵形式输出二维数组,外层for循环表示行,内层表示列*/ 
        for(i=0;i<3;i++)   
        {
            for(j=0;j<5;j++)
            {
                printf("%3d",a[i][j]);
            }
            printf("
    ");    //将数据按行分开,需要输出换行符 
        }
        
    }

    当从键盘中任意输入数据时,能够显示它的数据以二维矩阵的形式。

    #include<stdio.h>
    int main(){
        int i,j,a[2][2]; 
        printf("please input elements:");
        for(i=0;i<2;i++)   
        {
            for(j=0;j<2;j++)
            {
            scanf("%d",&a[i][j]);  //输入数据时,按照空格方式,中间不要有逗号
            }
        }
            for(i=0;i<2;i++)   
           {
               for(j=0;j<2;j++)
                 {
                 printf("%4d",a[i][j]);
                }
                printf("
    ");
           }
            
    }

    2.两个矩阵求和并显示结果

    要使得两个矩阵求和有意义,必须有相同的行数与列数。分别用r1、r2表示两个矩阵的行数,c1、c2分别表示两个矩阵的列数。两个矩阵是否可以相加的条件:

     r1==r2 && c1=c2

    如果上面的条件不满足,则不可以相加。

    if( r1!=r2  ||  c1!=c2)

    {

    printf("addition cannot be done .");

    exit 0;     //若要加入exit(0)当输入错误时终结程序,则需要加入库函数 <stdlib.h>

    }

    #include<stdio.h>
    int main(){
        int i,j,r1,r2,c1,c2,a[10][10],b[10][10],c[10][10];
        printf("please input r1 and c1 of a:");
        scanf("%d%d",&r1,&c1);
        printf("please input r2 and c2 of b:");
        scanf("%d%d",&r2,&c2);
        
        if((r1!=r2) || (c1!=c2))
        {
            printf("addition cannot be done");
        
        }
        /*从键盘输入a数组的数据*/ 
        printf("input elements of a: 
    ");
        for(i=0;i<r1;i++)   
            for(j=0;j<c1;j++)
            scanf("%d",&a[i][j]);
    /*从键盘输入b的数据*/ printf(
    "input elements of b: "); for(i=0;i<r2;i++) for(j=0;j<c2;j++) scanf("%d",&b[i][j]); /*对两个矩阵求和*/ for(i=0;i<r1;i++) for(j=0;j<c1;j++) c[i][j]=a[i][j]+b[i][j];
    /*显示求和结果*/ printf(
    "the sum c is : "); for(i=0;i<r1;i++) { for(j=0;j<c1;j++) { printf("%3d",c[i][j]); } printf(" "); } }

     3.求两个矩阵相乘的结果

    a={1 4  2                b={4 5                      第一个矩阵为2行3列,第二个矩阵为3行2列。结果为一个2*2 矩阵。

          5 2 7}                    3 1                       两个矩阵相乘的条件是matrix1 的列数等于matrix2的行数,对于左边矩阵,a的第一行成b的第一列为相乘矩阵的第一个数。

                                       6  4}  

    c={1*4+4*3+2*6      1*5+4*1+2*4                 ={28 17

         5*4+2*3+7*6     5*5+2*1+7*4}                    68  55}

    由此可知,两个矩阵相乘的条件:c1==r2

    为了计算矩阵的乘积,需要将两矩阵中的元素相乘。a[r1][c1]*[r2][c2]

    因为  c1==r2,可改为a[r1][c1]*[c1][c2]  ,这个式子表达的是一个数,我们所要计算的是元素乘积之和。

    这条语句可以用数组下标来表示:sum =sum+a[i][j] *b[j][k]

    此时,下标i可从0~r1 取值,j可以从0~c1 取值,k可以从0~c2取值。上面语句中sum的值实际上是矩阵c[][]中第i行k列元素。

    在c语言中,完整的程序逻辑如下:

    for(i=0;i<r1;i++0

    {  

        for(k=0;k<c2;k++)

        {    

           for(j=0;j<c1;j++)

             {

               sum+=a[i][j]+b[j][k];

             }

           c[i][k]=sum;

        }

    }

    问:为什么循环按变量i,k,j执行而不是i,j,k顺序执行。我们想到元素c[i][k],此时数组下标为i和k。当两个矩阵[i][j]、[j][k]位置元素相乘时,得到了位置[i][k]的新元素。

    代码实现:

    #include<stdio.h>
    int main(){
        int i,j,k,r1,r2,c1,c2;
        int a[10][10],b[10][10],c[10][10];
        int sum=0;
        printf("please input r1 and c1 of a:");
        scanf("%d%d",&r1,&c1);
        printf("please input r2 and c2 of b:");
        scanf("%d%d",&r2,&c2);
        
        if(c1!=r2)
        {
            printf("multiplication cannot be done");
           
        
        }
         
        printf("input elements of a: 
    ");
        for(i=0;i<r1;i++){  
            for(j=0;j<c1;j++){
            scanf("%d",&a[i][j]);
           }
        } 
            
        printf("input elements of b: 
    ");
        for(i=0;i<r2;i++){   
            for(j=0;j<c2;j++){ 
            scanf("%d",&b[i][j]);
            }
        } 
            
        printf("the result of c is: 
     ");
        for(i=0;i<r1;i++)              
        { 
    
            for(k=0;k<c2;k++)
              {
                  for(j=0;j<c1;j++)
                  {
                      sum += a[i][j] * b[j][k];
                 }
                  c[i][k]=sum;
                  printf("%d	",c[i][k]);
                
              }
              printf("
    ");
        }
        
        
    }
        

    核心算法代码的执行过程(3个for循环)

    (1)i=0,k=0,j=0(j=0,1,2)   sum= a[0][0]*b[0][0]=1*4=4   (j=1)    a[0][1]*[1]*[0]=4*3=12        (j=2)   a[0][2]*b[2][0]=2*6=12    sum=4+12+12=28   内层j变量循环完(实现第一行乘第一列),到第二层k循环

    (2)i=0,k=1,j=0     sum=a[0][0]*b[0][1]=1*5=5    a[0][1]*b[1][1]=4*1=4      a[0][2]*b[2][1]=2*4=8   sum=5+4+8=17

      k循环执行完成,到达外层i循环,开始第二行分别乘b矩阵的1 ,2列

    .......

    实现:

     

  • 相关阅读:
    几道php基础面试题
    【转载】VMware下LINUX的虚拟机增加磁盘空间
    【转载】给VM虚拟机增加硬盘容量
    虚拟机扩大硬盘的方法
    【转载】Linux i386+源码中常见宏标识tag的定义
    【转载】Linux下编辑生成.mo文件
    【转载】解决 Subversion 的 “svn: Can't convert string from 'UTF-8' to native encoding” 错误
    【转载】Ubuntu下SVN安装和配置
    【转载】关于shell中的basename
    tar的-t参数使用
  • 原文地址:https://www.cnblogs.com/laurarararararara/p/10964866.html
Copyright © 2011-2022 走看看