顶级太阳 发表于 2022-9-26 21:34:16

s1e25动动手输出格式还是做不出来,求助。

本帖最后由 顶级太阳 于 2022-9-27 08:18 编辑

这个矩阵输出考虑了一段时间了,最终还是抄袭了小甲鱼的在s1e20的输出方式,结果怎么改也不能按照要求的格式输出。求助我错在哪里。


#include<stdio.h>

int main()
{
int m,n,p,q;
int i,j,k,x,row;
printf("请输入第一个矩阵的尺寸(M*P);");
scanf("%d",&m);
getchar();
scanf("%d",&p);
printf("请输入第二个矩阵的尺寸(P*N);");
scanf("%d",&q);
getchar();
scanf("%d",&n);
if(p!=q)printf("矩阵尺寸不能计算");

int array1;
printf("请输入第一个矩阵的值:\n");
for(i=0;i<m;i++)
{
        for(j=0;j<p;j++)
        {
                scanf("%d",&array1);
        }
        getchar();
}
//临时检查用输出
//输出第一个矩阵值
//printf("第一个矩阵值\n");
//for(i=0;i<m;i++)
//{
//        for(j=0;j<p;j++)
//        {
//                printf("%d ",   array1);
//        }
//        printf("\n");
//}





printf("请输入第二个矩阵的值:\n");
int array2;
for(i=0;i<p;i++)
{
        for(j=0;j<n;j++)
        {
                scanf("%d",&array2);
        }
        getchar();
}
//临时检查输入用,输出第二个矩阵值
//printf("第二个矩阵值\n");
//for(i=0;i<p;i++)
//{
//        for(j=0;j<n;j++)
//        {
//                printf("%d ",array2);
//        }
//        printf("\n");
//}

//计算矩阵值
int array3;
for(i=0;i<m;i++) //矩阵赋初值为0
{
        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;
                }

        }

}
//检查输出运算结果矩阵值
//printf("第三个矩阵计算结果\n");
//for(i=0;i<m;i++)
//{
//        for(j=0;j<n;j++)
//        {
//                printf("%d ",array3);
//        }
//        printf("\n");
//}



//输出
row=m>p?m:p;
for(i=0;i<row;i++)
{
        //打印第一个矩阵行
        printf("| ");
        for(j=0;j<p;j++)
        {
                if(i<m)
                {
                        printf("\b%d ",array1);
                        printf("|");
                }
                else
                {
                        printf("\b\b ");
                        for(k=0;k<p;k++)printf("\b ");
                }
        }

        //打印*号
        if(i==row/2)
        {
                printf(" * ");
        }       
        else
        {
                printf("   " );
        }
        //打印第二个矩阵行
        printf("| ");
        for(j=0;j<n;j++)
        {
                if(i<p)
                {
                        printf("\b%d ",array2);
                        printf("|");
                }
                else
                {
                        printf("\b\b   ");
                        for(k=0;k<j;k++)printf(" ");
                }

        }       
        //打印=号
        if(i==row/2)
        {
                printf(" = ");
        }
        else
        {
                printf("   ");
        }
        //打印第三个矩阵行
        printf("| ");
        for(j=0;j<n;j++)
        {
                if(i<m)
                {
                        printf("\b%d ",array3);
                        printf("|");
                }
                else
                {
                        printf("\b\b\b   ");
                }
        }
        printf("\n");
}
return 0;

}



代码前面就不说了,只看最后的结果输出怎么处理,谢谢。
上面是要求的矩阵输出格式,下面的截屏是我的结果,第二个矩阵输出一直对不正,我怀疑是第一个矩阵输出出了问题,但是找不到呀。求教了。

jackz007 发表于 2022-9-26 22:20:51

      要求的格式是什么,你现在的格式又是什么,你得说清楚,最好不要让别人去猜你的意图。

人造人 发表于 2022-9-26 22:25:42

把代码格式化好

人造人 发表于 2022-9-26 22:28:04

s1e25动动手是什么?
好多人要么是没有做过这些题目,要么就是好久好久之前做的,现在早忘了题目是什么了
所以,还要把题目贴出来

两手空空儿 发表于 2022-9-27 10:15:56

for(k=0;k<p;k++)printf("\b ");

第114行这个代码 循环的结果是只输出一个空格,前面输出的都被‘\b’ 吃掉了

jackz007 发表于 2022-9-27 11:08:09

本帖最后由 jackz007 于 2022-9-27 15:47 编辑

      把输出部分做了修改,自己对号入座吧
//输出
      row = m > p ? m : p                                        ;
      for(i = 0 ; i < row ; i ++) {
//打印第一个矩阵行
                printf("|")                                    ;
                for(j = 0 ; j < p ; j ++) {
                        if(i < m) printf("\b%d |" , array1);
                        else printf("\b\b\b   ")               ;
                }

//打印*号
                if(i == row / 2) printf(" * ")                     ;
                else printf("   ")                                 ;
//打印第二个矩阵行
                printf("|")                                    ;
                for(j = 0 ; j < n ; j ++) {
                        if(i < p) printf("\b%d |" , array2);
                        else printf("\b\b\b   ")               ;
                }
//打印=号
                if(i == row / 2) printf(" = ")                     ;
                else printf("   ")                                 ;
//打印第三个矩阵行
                printf("|")                                    ;
                for(j = 0 ; j < n ; j ++) {
                        if(i < m) printf("\b%2d |" , array3) ;
                        else printf("\b\b\b      ")                ;
                }
                printf("\n")                                       ;
      }
      return 0                                                   ;
}

      【另一个版本】- 不使用 '\b',容易把人绕晕。
         完整代码如下
#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>

顶级太阳 发表于 2022-9-28 08:13:52

jackz007 发表于 2022-9-27 11:08
把输出部分做了修改,自己对号入座吧




明白了,谢谢

顶级太阳 发表于 2022-9-28 08:17:26

jackz007 发表于 2022-9-27 11:08
把输出部分做了修改,自己对号入座吧




再一个问题。你给出的第一段代码里,第8、18、27行,利用\b退格3次,分别对应第5、15、24行的”|“和一个空格,那么第三个退格是什么意思呢?

jackz007 发表于 2022-9-28 08:56:29

本帖最后由 jackz007 于 2022-9-28 08:57 编辑

顶级太阳 发表于 2022-9-28 08:17
再一个问题。你给出的第一段代码里,第8、18、27行,利用\b退格3次,分别对应第5、15、24行的”|“和一个 ...

      为了叉掉首次打印的 '|',因为,首次打印的是 3 个字符。

顶级太阳 发表于 2022-9-28 11:11:06

jackz007 发表于 2022-9-28 08:56
为了叉掉首次打印的 '|',因为,首次打印的是 3 个字符。

明白了,拷贝出来挨个数字符才明白为什么是3个字符。谢谢。
页: [1]
查看完整版本: s1e25动动手输出格式还是做不出来,求助。