问题一:二维数组转置问题;
代码如下:
#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;
}
运行结果:
问题二: 矩阵的乘法运算
矩阵的乘法运算:
- 依照于数学的运算法则给定两个矩阵;
- 定义一个新的二维数组,新二维数组的行数是第一个矩阵的行数,二维数组的列数是第二个矩阵的列数;
- 根据运算法则求值存储;
详细理解见代码中分析;
运行代码:
#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];见代码
运行结果: