二维数组转置以及矩阵乘法运算问题

C编程练习 专栏收录该内容
26 篇文章 0 订阅

问题一:二维数组转置问题;
代码如下:

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void shift(int (*a)[4],int ,int );
int main(int argc, char *argv[]) {
/*矩阵的转置,实现将m行n列的矩阵实现转置(通俗点来说就是行列互换)
 1,本题感觉用二维数组更为简便;
 2,设置指针数组,指针数组每一个成员分别直线每一行的起始位置,然后依次累加;
*/ 
 int i,j,m;
 int n=4;
 printf("注意:该转置函数仅适用于4列的二维数组,若要改变列数,可改变以上n的值,以及方法传参中行指针中数组的值;\n");
 printf("请输入二维数组的行数:");
 scanf("%d",&m);
 printf("\n");
 int a[m][n];
 for(j=0;j<m;j++){
  for(i=0;i<n;i++){
   scanf("%d",&a[j][i]);
  }
 }
 printf("输出转置后的数列:\n"); 
 shift(a,m,n);
 return 0;
}
void shift(int (*a)[4],int m,int n){             //第一次出错的地方是参数中的int (*a)[4],我写的是int (*a)[3],这
                                                 //是对于二维数组指针传参的不理解;这是行指针的定义格式,每行由多少个元素,后边就由多大的数组;
             //可以分解成a[0][4],a[1][4],a[2][4]-----a[n][4],方便理解;  
 int i,j,k;
 for(i=0;i<n;i++){
  for(j=0;j<m;j++){
   printf("%d  ",*(a[j]+i));
  }
  printf("\n"); 
 }
}

第一次出错原因:出错的地方是参数中的int (*a)[4],我写的是int (*a)[3]这是对于二维数组指针传参的不理解;这是行指针的定义格式,每行有多少个元素,后边就由有大的数组;可以分解成a[0][4],a[1][4],a[2][4]-----a[n][4],方便理解;
出现问题:如果要实现任意行列的转置,在方法的参数值无法定义列的任意值,设置输入的任意值列为静态变量也不行,这里不知道如何解决;
但是可以在不用多余函数的情况下,仅仅在main函数中写出所有的代码即可实现;方法代码在以下运行结果后;
运行结果:

方法二:
代码如下:

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int i,j,m,n;
 printf("请输入二维数组的行数:");
 scanf("%d",&m);
 printf("请输入二维数组的列数:");
 scanf("%d",&n); 
 printf("\n");
 int a[m][n];
 printf("输入数列:\n"); 
 for(j=0;j<m;j++){
  for(i=0;i<n;i++){
   scanf("%d",&a[j][i]);
  }
 }
 int b[n][m];
 int k,l;
 printf("输出转置后的数列:\n"); 
 for(k=0;k<n;k++){
  for(l=0;l<m;l++){
   b[k][l]=a[l][k];
   printf("%d  ",b[k][l]);
  }
  printf("\n");
 }
 return 0;
}

运行结果:

问题二: 矩阵的乘法运算
矩阵的乘法运算:

  1. 依照于数学的运算法则给定两个矩阵;
  2. 定义一个新的二维数组,新二维数组的行数是第一个矩阵的行数,二维数组的列数是第二个矩阵的列数;
  3. 根据运算法则求值存储;

详细理解见代码中分析;
运行代码:

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
/*矩阵的乘法运算:1,依照于数学的运算法则给定两个矩阵; 
      2,定义一个新的二维数组,新二维数组的行数是第一个矩阵的行数,二维数组的列数是第二个矩阵的列数;
      3,根据运算法则求值存储;
*/
 int a1,a2,a3,a4;
 printf("输入第一个矩阵的行数:");       //输入第一个矩阵 
 scanf("%d",&a1);
 printf("输入第一个矩阵的列数:");
 scanf("%d",&a2);
 int a[a1][a2];
 int i1,j1;
 for(i1=0;i1<a1;i1++){
  for(j1=0;j1<a2;j1++){
   scanf("%d",&a[i1][j1]);
  }
 }
  printf("\n");
 printf("输入第二个矩阵的行数:");       //输入第二个矩阵 
 scanf("%d",&a3);
 printf("输入第二个矩阵的列数:");
 scanf("%d",&a4); 
 int b[a3][a4];
 int i2,j2;
 for(i2=0;i2<a3;i2++){
  for(j2=0;j2<a4;j2++){
   scanf("%d",&b[i2][j2]);
  }
 } 
 if(a2!=a3){
  printf("两矩阵不满足相乘的基本条件;");
 }else{
  printf("输出相乘后的矩阵:\n");
  int c[a1][a4];
  int i,j;
  int m,n;
  int k,l;                                  //数组的每一位赋0 
  for(k=0;k<a1;k++){
   for(l=0;l<a4;l++){
    c[k][l]=0;
   }
  }
  for(i=0;i<a1;i++){
   for(j=0;j<a4;j++){
    for(m=0;m<a2;m++){
    c[i][j]+=a[i][m]*b[m][j];         //超级关键 
    }
    printf("%d  ",c[i][j]); 
   }
   printf("\n");
  }  
 }
 return 0;
}

切记关键代码c[i][j]+=a[i][m] * b[m][j];见代码
运行结果:

  • 6
    点赞
  • 0
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值