teredoo 发表于 2022-10-2 13:48:27

在学c的第25节课后作业动手题出现的问题

[ 本帖最后由 teredoo 于 2022-10-2 16:02 编辑 ]\n\n各位大佬,这个是我写的代码,是想实现矩阵乘法,但是我在实践的过程中发现实现矩阵乘的代码(标注红色的部分)在未知条件下会把我已经赋过值的第二个矩阵的第一个元素变成零(其他元素不变),此段代码中并没有对除第三个矩阵外的的元素进行赋值。为什么会出现这样的情况{:10_269:} 各位帮我看看吧{:10_291:}

#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;//第一个矩阵
        int Smatrix;//第二个矩阵
        int Tmatrix;//矩阵乘后的矩阵
        printf("输入第一个矩阵的值:\n");
        for(i = 0;i<FMH;i++)
        {
                for(j = 0;j<FML;j++)
                {
                        Fmatrix = getchar();
                }
                getchar();
        }
                for(i = 0;i<FMH;i++)//getchar值处理 第一个矩阵
        {
                for(j = 0;j<FML;j++)
                {
                        Fmatrix=Fmatrix-48 ;
                }
        } //
        printf("输入第二个矩阵的值:\n");
        for(i = 0;i<SMH;i++)
        {
                for(j = 0;j<SML;j++)
                {
                        Smatrix = getchar();
                }
                getchar();
        }
        for(i = 0;i<SMH;i++)//getchar值处理 第二个矩阵
        {
                for(j = 0;j<SML;j++)
                {
                        Smatrix=Smatrix-48 ;
                }
        } //
        printf("%d\n",Smatrix);//测试 第二个矩阵第一个元素的值(此时测试输出的值还是我赋给它的值)
        for(i = 0;i<FML;i++)//初始化Tmatrix 初始化第三个矩阵
        {
                for(j = 0;j<SMH;j++)
                {
                        Tmatrix = 0;
                }
        }
        printf("进行矩阵乘\n");
                                      //计算矩阵乘 (我个人排查后认为问题就出在这段代码中,未知条件下会把第二个矩阵第一个元素的值变成零)
        {for(i=0;i<FMH;i++)//计算矩阵乘
        {
                for(j=0,k=0;j<SML;j++,k++)
                {
                        for(flag=0;flag<SMH;flag++)
                        {
                                Tmatrix = Tmatrix + Fmatrix * Smatrix;
                        }
                }
        }
        printf("%d\n",Smatrix);//测试

jackz007 发表于 2022-10-2 13:48:28

本帖最后由 jackz007 于 2022-10-2 15:33 编辑

teredoo 发表于 2022-10-2 13:49
帮帮孩子吧

#include <stdio.h>

int main(void)
{
      int m , n , p , q                                                                ;
      int i , j , k , x , row                                                          ;
      printf("请输入第一个矩阵的尺寸(M*P) : ")                                        ;
      scanf("%d*%d" , & m , & p)                                                       ;
      printf("请输入第二个矩阵的尺寸(P*N) : ")                                        ;
      scanf("%d*%d" , & q , & n)                                                       ;
      if(p != q) printf("矩阵尺寸不能计算")                                          ;
      int array1 , array2 , array3                                 ;
      printf("请输入第一个矩阵的值:\n")                                             ;
      for(i = 0 ; i < m ; i ++) for(j = 0 ; j < p ; j ++) scanf("%d" , & array1) ;
      printf("请输入第二个矩阵的值:\n")                                             ;
      for(i = 0 ; i < p ; i ++) for(j = 0 ; j < n ; j ++) scanf("%d" , & array2) ;

//计算矩阵值
      for(i = 0 ; i < m ; i ++) for(j = 0 ; j < n ; j ++) array3 = 0             ;
//矩阵相乘计算
      for(i = 0 ; i < m ; i ++) {
                for(j = 0 ; j < n ; j ++) {
                        for(k = 0 ; k < p ; k ++) {
                              array3 += array1 * array2            ;
                        }
                }
      }
//输出
      row = m > p ? m : p                                                            ;
      for(i = 0 ; i < row ; i ++) {
//打印第一个矩阵行
                if(i < m) printf("| %d" , array1)                                  ;
                else printf("   ")                                                       ;
                for(j = 1 ; j < p ; j ++) {
                        if(i < m) printf(" %d" , array1)                           ;
                        else printf("")                                                ;
                }
                if(i < m) printf(" |")                                                   ;
                else printf("")                                                      ;
//打印*号
                if(i == row / 2) printf(" * ")                                           ;
                else printf("   " )                                                      ;

//打印第二个矩阵行
                if(i < p) printf("| %d" , array2)                                  ;
                else printf("   ")                                                       ;
                for(j = 1 ; j < n ; j ++) {
                        if(i < p) printf(" %d" , array2)                           ;
                        else printf("")                                                ;
                }
                if(i < p) printf(" |")                                                   ;
                else printf("")                                                      ;
//打印=号
                if(i == row / 2) printf(" = ")                                           ;
                else printf("   ")                                                       ;
//打印第三个矩阵行
                if(i < m) printf("| %2d" , array3)                                 ;
                else printf("    ")                                                      ;
                for(j = 0 ; j < n ; j ++) {
                        if(i < m) printf(" %2d" , array3)                        ;
                        else printf("   ")                                             ;
                }
                if(i < m) printf(" |")                                                   ;
                else printf("")                                                      ;
                printf("\n")                                                             ;
      }
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
请输入第一个矩阵的尺寸(M*P) : 4*5
请输入第二个矩阵的尺寸(P*N) : 5*8
请输入第一个矩阵的值:
1 2 3 4 5
2 2 2 2 2
3 3 3 3 3
5 4 3 2 1
请输入第二个矩阵的值:
8 7 6 5 4 3 2 1
1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3
1 2 3 4 5 6 7 8
| 1 2 3 4 5 |   | 8 7 6 5 4 3 2 1 |   | 33 33 37 41 45 49 53 57 61 |
| 2 2 2 2 2 |   | 1 1 1 1 1 1 1 1 |   | 30 30 30 30 30 30 30 30 30 |
| 3 3 3 3 3 | * | 2 2 2 2 2 2 2 2 | = | 45 45 45 45 45 45 45 45 45 |
| 5 4 3 2 1 |   | 3 3 3 3 3 3 3 3 |   | 57 57 53 49 45 41 37 33 29 |
                | 1 2 3 4 5 6 7 8 |

D:\\C>

teredoo 发表于 2022-10-2 13:49:55

帮帮孩子吧{:10_254:}

teredoo 发表于 2022-10-2 15:55:44

jackz007 发表于 2022-10-2 13:48
编译、运行实况:

但是,我写的那段代码问题是出在哪里呢,我并没有对第二个矩阵的元素进行赋值,为什么会改变其中元素的值呢?

teredoo 发表于 2022-10-2 16:04:21

jackz007 发表于 2022-10-2 13:48
编译、运行实况:

比起答案,我更希望能知道自己错在哪里{:10_292:}

teredoo 发表于 2022-10-2 16:08:49

teredoo 发表于 2022-10-2 16:04
比起答案,我更希望能知道自己错在哪里

这样子

teredoo 发表于 2022-10-2 16:10:48

jackz007 发表于 2022-10-2 13:48
编译、运行实况:

而且您这个多输出了1列
页: [1]
查看完整版本: 在学c的第25节课后作业动手题出现的问题