鱼C论坛

 找回密码
 立即注册
查看: 1547|回复: 6

[已解决]在学c的第25节课后作业动手题出现的问题

[复制链接]
发表于 2022-10-2 13:48:27 | 显示全部楼层 |阅读模式
60鱼币
[ 本帖最后由 teredoo 于 2022-10-2 16:02 编辑 ]\n\n各位大佬,这个是我写的代码,是想实现矩阵乘法,但是我在实践的过程中发现实现矩阵乘的代码(标注红色的部分)在未知条件下会把我已经赋过值的第二个矩阵的第一个元素变成零(其他元素不变),此段代码中并没有对除第三个矩阵外的的元素进行赋值。为什么会出现这样的情况 各位帮我看看吧

#include<stdio.h>
int main()
{
        int FML,FMH,SML,SMH,i,j,k,flag,num=0;
        printf("输入第一个矩阵的尺寸:(行*列)");
        scanf("%d*%d",&FMH,&FML);
        getchar();
        printf("输入第二个矩阵尺寸:(行*列)");
        scanf("%d*%d",&SMH,&SML);
        getchar();
        int Fmatrix[FMH][FML];//第一个矩阵
        int Smatrix[SMH][SML];//第二个矩阵
        int Tmatrix[FMH][SML];//矩阵乘后的矩阵
        printf("输入第一个矩阵的值:\n");
        for(i = 0;i<FMH;i++)
        {
                for(j = 0;j<FML;j++)
                {
                        Fmatrix[i][j] = getchar();
                }
                getchar();
        }
                for(i = 0;i<FMH;i++)//getchar值处理 第一个矩阵
        {
                for(j = 0;j<FML;j++)
                {
                        Fmatrix[i][j]=Fmatrix[i][j]-48 ;
                }
        } //
        printf("输入第二个矩阵的值:\n");
        for(i = 0;i<SMH;i++)
        {
                for(j = 0;j<SML;j++)
                {
                        Smatrix[i][j] = getchar();
                }
                getchar();
        }
        for(i = 0;i<SMH;i++)//getchar值处理 第二个矩阵
        {
                for(j = 0;j<SML;j++)
                {
                        Smatrix[i][j]=Smatrix[i][j]-48 ;
                }
        } //
        printf("%d\n",Smatrix[0][0]);//测试 第二个矩阵第一个元素的值(此时测试输出的值还是我赋给它的值)
        for(i = 0;i<FML;i++)//初始化Tmatrix 初始化第三个矩阵
        {
                for(j = 0;j<SMH;j++)
                {
                        Tmatrix[i][j] = 0;
                }
        }
        printf("进行矩阵乘\n");
        [color=Red]                                //计算矩阵乘 (我个人排查后认为问题就出在这段代码中,未知条件下会把第二个矩阵第一个元素的值变成零)
        {for(i=0;i<FMH;i++)//计算矩阵乘
        {
                for(j=0,k=0;j<SML;j++,k++)
                {
                        for(flag=0;flag<SMH;flag++)
                        {
                                Tmatrix[i][k] = Tmatrix[i][k] + Fmatrix[i][flag] * Smatrix[flag][j];
                        }
                }
        }[/color]
        printf("%d\n",Smatrix[0][0]);//测试
最佳答案
2022-10-2 13:48:28
本帖最后由 jackz007 于 2022-10-2 15:33 编辑

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int m , n , p , q                                                                ;
  5.         int i , j , k , x , row                                                          ;
  6.         printf("请输入第一个矩阵的尺寸(M*P) : ")                                        ;
  7.         scanf("%d*%d" , & m , & p)                                                       ;
  8.         printf("请输入第二个矩阵的尺寸(P*N) : ")                                        ;
  9.         scanf("%d*%d" , & q , & n)                                                       ;
  10.         if(p != q) printf("矩阵尺寸不能计算")                                            ;
  11.         int array1[m][p] , array2[p][n] , array3[m][n]                                   ;
  12.         printf("请输入第一个矩阵的值:\n")                                               ;
  13.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < p ; j ++) scanf("%d" , & array1[i][j]) ;
  14.         printf("请输入第二个矩阵的值:\n")                                               ;
  15.         for(i = 0 ; i < p ; i ++) for(j = 0 ; j < n ; j ++) scanf("%d" , & array2[i][j]) ;

  16. //计算矩阵值
  17.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < n ; j ++) array3[i][j] = 0             ;
  18. //矩阵相乘计算
  19.         for(i = 0 ; i < m ; i ++) {
  20.                 for(j = 0 ; j < n ; j ++) {
  21.                         for(k = 0 ; k < p ; k ++) {
  22.                                 array3[i][j] += array1[i][k] * array2[k][j]              ;
  23.                         }
  24.                 }
  25.         }
  26. //输出
  27.         row = m > p ? m : p                                                              ;
  28.         for(i = 0 ; i < row ; i ++) {
  29. //打印第一个矩阵行
  30.                 if(i < m) printf("| %d" , array1[i][0])                                  ;
  31.                 else printf("   ")                                                       ;
  32.                 for(j = 1 ; j < p ; j ++) {
  33.                         if(i < m) printf(" %d" , array1[i][j])                           ;
  34.                         else printf("  ")                                                ;
  35.                 }
  36.                 if(i < m) printf(" |")                                                   ;
  37.                 else printf("  ")                                                        ;
  38. //打印*号
  39.                 if(i == row / 2) printf(" * ")                                           ;
  40.                 else printf("   " )                                                      ;

  41. //打印第二个矩阵行
  42.                 if(i < p) printf("| %d" , array2[i][0])                                  ;
  43.                 else printf("   ")                                                       ;
  44.                 for(j = 1 ; j < n ; j ++) {
  45.                         if(i < p) printf(" %d" , array2[i][j])                           ;
  46.                         else printf("  ")                                                ;
  47.                 }
  48.                 if(i < p) printf(" |")                                                   ;
  49.                 else printf("  ")                                                        ;
  50. //打印=号
  51.                 if(i == row / 2) printf(" = ")                                           ;
  52.                 else printf("   ")                                                       ;
  53. //打印第三个矩阵行
  54.                 if(i < m) printf("| %2d" , array3[i][0])                                 ;
  55.                 else printf("    ")                                                      ;
  56.                 for(j = 0 ; j < n ; j ++) {
  57.                         if(i < m) printf(" %2d" , array3[i][j])                          ;
  58.                         else printf("   ")                                               ;
  59.                 }
  60.                 if(i < m) printf(" |")                                                   ;
  61.                 else printf("  ")                                                        ;
  62.                 printf("\n")                                                             ;
  63.         }
  64. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入第一个矩阵的尺寸(M*P) : 4*5
  4. 请输入第二个矩阵的尺寸(P*N) : 5*8
  5. 请输入第一个矩阵的值:
  6. 1 2 3 4 5
  7. 2 2 2 2 2
  8. 3 3 3 3 3
  9. 5 4 3 2 1
  10. 请输入第二个矩阵的值:
  11. 8 7 6 5 4 3 2 1
  12. 1 1 1 1 1 1 1 1
  13. 2 2 2 2 2 2 2 2
  14. 3 3 3 3 3 3 3 3
  15. 1 2 3 4 5 6 7 8
  16. | 1 2 3 4 5 |   | 8 7 6 5 4 3 2 1 |   | 33 33 37 41 45 49 53 57 61 |
  17. | 2 2 2 2 2 |   | 1 1 1 1 1 1 1 1 |   | 30 30 30 30 30 30 30 30 30 |
  18. | 3 3 3 3 3 | * | 2 2 2 2 2 2 2 2 | = | 45 45 45 45 45 45 45 45 45 |
  19. | 5 4 3 2 1 |   | 3 3 3 3 3 3 3 3 |   | 57 57 53 49 45 41 37 33 29 |
  20.                 | 1 2 3 4 5 6 7 8 |

  21. D:\[00.Exerciese.2022]\C>
复制代码

最佳答案

查看完整内容

编译、运行实况:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-2 13:48:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-2 15:33 编辑

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int m , n , p , q                                                                ;
  5.         int i , j , k , x , row                                                          ;
  6.         printf("请输入第一个矩阵的尺寸(M*P) : ")                                        ;
  7.         scanf("%d*%d" , & m , & p)                                                       ;
  8.         printf("请输入第二个矩阵的尺寸(P*N) : ")                                        ;
  9.         scanf("%d*%d" , & q , & n)                                                       ;
  10.         if(p != q) printf("矩阵尺寸不能计算")                                            ;
  11.         int array1[m][p] , array2[p][n] , array3[m][n]                                   ;
  12.         printf("请输入第一个矩阵的值:\n")                                               ;
  13.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < p ; j ++) scanf("%d" , & array1[i][j]) ;
  14.         printf("请输入第二个矩阵的值:\n")                                               ;
  15.         for(i = 0 ; i < p ; i ++) for(j = 0 ; j < n ; j ++) scanf("%d" , & array2[i][j]) ;

  16. //计算矩阵值
  17.         for(i = 0 ; i < m ; i ++) for(j = 0 ; j < n ; j ++) array3[i][j] = 0             ;
  18. //矩阵相乘计算
  19.         for(i = 0 ; i < m ; i ++) {
  20.                 for(j = 0 ; j < n ; j ++) {
  21.                         for(k = 0 ; k < p ; k ++) {
  22.                                 array3[i][j] += array1[i][k] * array2[k][j]              ;
  23.                         }
  24.                 }
  25.         }
  26. //输出
  27.         row = m > p ? m : p                                                              ;
  28.         for(i = 0 ; i < row ; i ++) {
  29. //打印第一个矩阵行
  30.                 if(i < m) printf("| %d" , array1[i][0])                                  ;
  31.                 else printf("   ")                                                       ;
  32.                 for(j = 1 ; j < p ; j ++) {
  33.                         if(i < m) printf(" %d" , array1[i][j])                           ;
  34.                         else printf("  ")                                                ;
  35.                 }
  36.                 if(i < m) printf(" |")                                                   ;
  37.                 else printf("  ")                                                        ;
  38. //打印*号
  39.                 if(i == row / 2) printf(" * ")                                           ;
  40.                 else printf("   " )                                                      ;

  41. //打印第二个矩阵行
  42.                 if(i < p) printf("| %d" , array2[i][0])                                  ;
  43.                 else printf("   ")                                                       ;
  44.                 for(j = 1 ; j < n ; j ++) {
  45.                         if(i < p) printf(" %d" , array2[i][j])                           ;
  46.                         else printf("  ")                                                ;
  47.                 }
  48.                 if(i < p) printf(" |")                                                   ;
  49.                 else printf("  ")                                                        ;
  50. //打印=号
  51.                 if(i == row / 2) printf(" = ")                                           ;
  52.                 else printf("   ")                                                       ;
  53. //打印第三个矩阵行
  54.                 if(i < m) printf("| %2d" , array3[i][0])                                 ;
  55.                 else printf("    ")                                                      ;
  56.                 for(j = 0 ; j < n ; j ++) {
  57.                         if(i < m) printf(" %2d" , array3[i][j])                          ;
  58.                         else printf("   ")                                               ;
  59.                 }
  60.                 if(i < m) printf(" |")                                                   ;
  61.                 else printf("  ")                                                        ;
  62.                 printf("\n")                                                             ;
  63.         }
  64. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入第一个矩阵的尺寸(M*P) : 4*5
  4. 请输入第二个矩阵的尺寸(P*N) : 5*8
  5. 请输入第一个矩阵的值:
  6. 1 2 3 4 5
  7. 2 2 2 2 2
  8. 3 3 3 3 3
  9. 5 4 3 2 1
  10. 请输入第二个矩阵的值:
  11. 8 7 6 5 4 3 2 1
  12. 1 1 1 1 1 1 1 1
  13. 2 2 2 2 2 2 2 2
  14. 3 3 3 3 3 3 3 3
  15. 1 2 3 4 5 6 7 8
  16. | 1 2 3 4 5 |   | 8 7 6 5 4 3 2 1 |   | 33 33 37 41 45 49 53 57 61 |
  17. | 2 2 2 2 2 |   | 1 1 1 1 1 1 1 1 |   | 30 30 30 30 30 30 30 30 30 |
  18. | 3 3 3 3 3 | * | 2 2 2 2 2 2 2 2 | = | 45 45 45 45 45 45 45 45 45 |
  19. | 5 4 3 2 1 |   | 3 3 3 3 3 3 3 3 |   | 57 57 53 49 45 41 37 33 29 |
  20.                 | 1 2 3 4 5 6 7 8 |

  21. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-2 13:49:55 | 显示全部楼层
帮帮孩子吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-2 15:55:44 | 显示全部楼层
jackz007 发表于 2022-10-2 13:48
编译、运行实况:

但是,我写的那段代码问题是出在哪里呢,我并没有对第二个矩阵的元素进行赋值,为什么会改变其中元素的值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-2 16:04:21 | 显示全部楼层
jackz007 发表于 2022-10-2 13:48
编译、运行实况:

比起答案,我更希望能知道自己错在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-2 16:08:49 | 显示全部楼层
teredoo 发表于 2022-10-2 16:04
比起答案,我更希望能知道自己错在哪里

这样子
屏幕截图 2022-10-02 160737.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-2 16:10:48 | 显示全部楼层
jackz007 发表于 2022-10-2 13:48
编译、运行实况:

而且您这个多输出了1列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 05:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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