鱼C论坛

 找回密码
 立即注册
查看: 1804|回复: 14

[已解决]二维数组作业,矩阵相乘。我错哪里了?

[复制链接]
发表于 2020-10-25 11:28:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Fivk 于 2020-10-25 11:31 编辑

题目

题目
20201025111927.png

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int m,p,n;
  5.         scanf("%d %d %d",&m,&p,&n);
  6.         int a[m][p],b[p][n],c[m][n]={0};
  7.         for(int i=0;i<m;i++)
  8.         {
  9.                 for(int j=0;j<p;j++)
  10.                 {
  11.                         scanf("%d",&a[i][j]);
  12.                 }
  13.         }
  14.                 for(int i=0;i<p;i++)
  15.         {
  16.                 for(int j=0;j<n;j++)
  17.                 {
  18.                         scanf("%d",&b[i][j]);
  19.                 }
  20.         }
  21.         for(int i=0;i<m;i++)
  22.         {
  23.                 for(int j=0;j<n;j++)
  24.                 {
  25.                         for(int k=0;k<p;k++)
  26.                         {
  27.                                 c[i][j] +=a[i][k]*b[k][j];
  28.                         }
  29.                 }
  30.         }
  31.         for(int i=0;i<m;i++)
  32.         {
  33.                 for(int j=0;j<n;j++)
  34.                 {
  35.                         printf("%d ",c[i][j]);
  36.                 }
  37.                 printf("\n");
  38.         }
  39.         return 0;
  40. }
复制代码
最佳答案
2020-10-25 13:00:04
shooan 发表于 2020-10-25 12:33
你说的应该不对,C99标准,C的数组大小是可以变长的。这个应该是DevC++,默认用的是gcc,支持C99的。

既然你说gcc支持,我就跑了一遍
确实gcc可以用变量定义数组长度
这又出现一个问题,题主对c数组初始化其实并没有起作用
因为长度为变量,这里初始化必须要用双循环
然后我运行是并没有报错,只有c数组初始化那里有个警告
改了初始化之后,在程序上已经没什么错误了
至于题目逻辑这一块
我输入的所有值都是2
输出为:
8 8
8 8
  1. int m,p,n;
  2.         scanf("%d %d %d",&m,&p,&n);
  3.         int a[m][p], b[p][n], c[m][n]; //={0};
  4.         for (int i = 0; i < m; ++i)
  5.         {
  6.                 for (int j = 0; j < n; ++j)
  7.                 {
  8.                         c[i][j] = 0;
  9.                 }
  10.         }
  11.                 for (int i = 0; i < m; i++)
  12.                 {
  13.                         for (int j = 0; j < p; j++)
  14.                         {
  15.                                 scanf("%d", &a[i][j]);
  16.                         }
  17.                 }
  18.                 for(int i=0;i<p;i++)
  19.         {
  20.                 for(int j=0;j<n;j++)
  21.                 {
  22.                         scanf("%d",&b[i][j]);
  23.                 }
  24.         }
  25.         for(int i=0;i<m;i++)
  26.         {
  27.                 for(int j=0;j<n;j++)
  28.                 {
  29.                         for(int k=0;k<p;k++)
  30.                         {
  31.                                 c[i][j] +=a[i][k]*b[k][j];
  32.                         }
  33.                 }
  34.         }
  35.         for(int i=0;i<m;i++)
  36.         {
  37.                 for(int j=0;j<n;j++)
  38.                 {
  39.                         printf("%d ",c[i][j]);
  40.                 }
  41.                 printf("\n");
  42.         }
  43.         return 0;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-25 11:36:20 | 显示全部楼层
本帖最后由 yuxijian2020 于 2020-10-25 11:42 编辑

首先你定义的m, p, n都是变量,变量是不可以定义数组长度的
后面的代码已经无关紧要了  这里就已经报错了
你可以用vector嘛   什么年代了  就模板库就完事儿了
c的话  那就用二级指针吧  0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-10-25 12:33:02 | 显示全部楼层
yuxijian2020 发表于 2020-10-25 11:36
首先你定义的m, p, n都是变量,变量是不可以定义数组长度的
后面的代码已经无关紧要了  这里就已经报错了
...

你说的应该不对,C99标准,C的数组大小是可以变长的。这个应该是DevC++,默认用的是gcc,支持C99的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 13:00:04 | 显示全部楼层    本楼为最佳答案   
shooan 发表于 2020-10-25 12:33
你说的应该不对,C99标准,C的数组大小是可以变长的。这个应该是DevC++,默认用的是gcc,支持C99的。

既然你说gcc支持,我就跑了一遍
确实gcc可以用变量定义数组长度
这又出现一个问题,题主对c数组初始化其实并没有起作用
因为长度为变量,这里初始化必须要用双循环
然后我运行是并没有报错,只有c数组初始化那里有个警告
改了初始化之后,在程序上已经没什么错误了
至于题目逻辑这一块
我输入的所有值都是2
输出为:
8 8
8 8
  1. int m,p,n;
  2.         scanf("%d %d %d",&m,&p,&n);
  3.         int a[m][p], b[p][n], c[m][n]; //={0};
  4.         for (int i = 0; i < m; ++i)
  5.         {
  6.                 for (int j = 0; j < n; ++j)
  7.                 {
  8.                         c[i][j] = 0;
  9.                 }
  10.         }
  11.                 for (int i = 0; i < m; i++)
  12.                 {
  13.                         for (int j = 0; j < p; j++)
  14.                         {
  15.                                 scanf("%d", &a[i][j]);
  16.                         }
  17.                 }
  18.                 for(int i=0;i<p;i++)
  19.         {
  20.                 for(int j=0;j<n;j++)
  21.                 {
  22.                         scanf("%d",&b[i][j]);
  23.                 }
  24.         }
  25.         for(int i=0;i<m;i++)
  26.         {
  27.                 for(int j=0;j<n;j++)
  28.                 {
  29.                         for(int k=0;k<p;k++)
  30.                         {
  31.                                 c[i][j] +=a[i][k]*b[k][j];
  32.                         }
  33.                 }
  34.         }
  35.         for(int i=0;i<m;i++)
  36.         {
  37.                 for(int j=0;j<n;j++)
  38.                 {
  39.                         printf("%d ",c[i][j]);
  40.                 }
  41.                 printf("\n");
  42.         }
  43.         return 0;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 13:06:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-25 13:08:47 | 显示全部楼层
yuxijian2020 发表于 2020-10-25 13:00
既然你说gcc支持,我就跑了一遍
确实gcc可以用变量定义数组长度
这又出现一个问题,题主对c数组初始化其 ...

我用一维数组的时候可以像我这上面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 13:14:23 | 显示全部楼层
Fivk 发表于 2020-10-25 13:08
我用一维数组的时候可以像我这上面

你可以实验一下,依然不可以
因为是变量定义的数组长度
初始化应该是只能用循环赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 13:15:27 | 显示全部楼层
yuxijian2020 发表于 2020-10-25 13:14
你可以实验一下,依然不可以
因为是变量定义的数组长度
初始化应该是只能用循环赋值

可以帮我修改一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 13:15:59 | 显示全部楼层
yuxijian2020 发表于 2020-10-25 13:14
你可以实验一下,依然不可以
因为是变量定义的数组长度
初始化应该是只能用循环赋值

这个定义数组是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 13:18:53 | 显示全部楼层
Fivk 发表于 2020-10-25 13:15
这个定义数组是正确的

不懂你说的,改什么?
本帖的初始化已经改过了就在我之前回复中贴的代码上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-25 13:24:10 | 显示全部楼层
yuxijian2020 发表于 2020-10-25 13:18
不懂你说的,改什么?
本帖的初始化已经改过了就在我之前回复中贴的代码上

我这个结果好像不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 13:29:15 | 显示全部楼层
shooan 发表于 2020-10-25 12:33
你说的应该不对,C99标准,C的数组大小是可以变长的。这个应该是DevC++,默认用的是gcc,支持C99的。

程序运行没错啊。
你那里报什么错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 13:37:18 | 显示全部楼层
sunrise085 发表于 2020-10-25 13:29
程序运行没错啊。
你那里报什么错了?

我并没有去运行代码,我只是指出了C99标准,是可以用变长数组这种东西的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 14:21:02 | 显示全部楼层
Fivk 发表于 2020-10-25 13:24
我这个结果好像不对

我按你例子中给出的数组输入了一遍,输出是正确的
不知道你的结果不对是啥意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 20:04:04 | 显示全部楼层
shooan 发表于 2020-10-25 13:37
我并没有去运行代码,我只是指出了C99标准,是可以用变长数组这种东西的。

哦,不好意思。回复错人了,我以为你是楼主。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 23:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表