鱼C论坛

 找回密码
 立即注册
查看: 2173|回复: 9

[已解决]s1e25动动手输出格式还是做不出来,求助。

[复制链接]
发表于 2022-9-26 21:34:16 | 显示全部楼层 |阅读模式

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

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

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

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


  1. #include<stdio.h>

  2. int main()
  3. {
  4. int m,n,p,q;
  5. int i,j,k,x,row;
  6. printf("请输入第一个矩阵的尺寸(M*P);");
  7. scanf("%d",&m);
  8. getchar();
  9. scanf("%d",&p);
  10. printf("请输入第二个矩阵的尺寸(P*N);");
  11. scanf("%d",&q);
  12. getchar();
  13. scanf("%d",&n);
  14. if(p!=q)printf("矩阵尺寸不能计算");

  15. int array1[m][p];
  16. printf("请输入第一个矩阵的值:\n");
  17. for(i=0;i<m;i++)
  18. {
  19.         for(j=0;j<p;j++)
  20.         {
  21.                 scanf("%d",&array1[i][j]);
  22.         }
  23.         getchar();
  24. }
  25. //临时检查用输出
  26. //输出第一个矩阵值
  27. //printf("第一个矩阵值\n");
  28. //for(i=0;i<m;i++)
  29. //{
  30. //        for(j=0;j<p;j++)
  31. //        {
  32. //                printf("%d ",   array1[i][j]);
  33. //        }
  34. //        printf("\n");
  35. //}





  36. printf("请输入第二个矩阵的值:\n");
  37. int array2[p][n];
  38. for(i=0;i<p;i++)
  39. {
  40.         for(j=0;j<n;j++)
  41.         {
  42.                 scanf("%d",&array2[i][j]);
  43.         }
  44.         getchar();
  45. }
  46. //临时检查输入用,输出第二个矩阵值
  47. //printf("第二个矩阵值\n");
  48. //for(i=0;i<p;i++)
  49. //{
  50. //        for(j=0;j<n;j++)
  51. //        {
  52. //                printf("%d ",array2[i][j]);
  53. //        }
  54. //        printf("\n");
  55. //}

  56. //计算矩阵值
  57. int array3[m][n];
  58. for(i=0;i<m;i++) //矩阵赋初值为0
  59. {
  60.         for(j=0;j<n;j++)
  61.         {
  62.                 array3[i][j]=0;
  63.         }
  64. }
  65. for(i=0;i<m;i++)  //矩阵相乘计算
  66. {
  67.         for(j=0;j<n;j++)
  68.         {
  69.                 for(k=0;k<p;k++)
  70.                 {
  71.                         array3[i][j]+=array1[i][k]*array2[k][j];
  72.                 }

  73.         }

  74. }
  75. //检查输出运算结果矩阵值
  76. //printf("第三个矩阵计算结果\n");
  77. //for(i=0;i<m;i++)
  78. //{
  79. //        for(j=0;j<n;j++)
  80. //        {
  81. //                printf("%d ",array3[i][j]);
  82. //        }
  83. //        printf("\n");
  84. //}



  85. //输出
  86. row=m>p?m:p;
  87. for(i=0;i<row;i++)
  88. {
  89.         //打印第一个矩阵行
  90.         printf("| ");
  91.         for(j=0;j<p;j++)
  92.         {
  93.                 if(i<m)
  94.                 {
  95.                         printf("\b%d ",array1[i][j]);
  96.                         printf("|");
  97.                 }
  98.                 else
  99.                 {
  100.                         printf("\b\b ");
  101.                         for(k=0;k<p;k++)printf("\b ");
  102.                 }
  103.         }

  104.         //打印*号
  105.         if(i==row/2)
  106.         {
  107.                 printf(" * ");
  108.         }       
  109.         else
  110.         {
  111.                 printf("   " );
  112.         }
  113.         //打印第二个矩阵行
  114.         printf("| ");
  115.         for(j=0;j<n;j++)
  116.         {
  117.                 if(i<p)
  118.                 {
  119.                         printf("\b%d ",array2[i][j]);
  120.                         printf("|");
  121.                 }
  122.                 else
  123.                 {
  124.                         printf("\b\b   ");
  125.                         for(k=0;k<j;k++)printf(" ");
  126.                 }

  127.         }       
  128.         //打印=号
  129.         if(i==row/2)
  130.         {
  131.                 printf(" = ");
  132.         }
  133.         else
  134.         {
  135.                 printf("   ");
  136.         }
  137.         //打印第三个矩阵行
  138.         printf("| ");
  139.         for(j=0;j<n;j++)
  140.         {
  141.                 if(i<m)
  142.                 {
  143.                         printf("\b%d ",array3[i][j]);
  144.                         printf("|");
  145.                 }
  146.                 else
  147.                 {
  148.                         printf("\b\b\b   ");
  149.                 }
  150.         }
  151.         printf("\n");
  152. }
  153. return 0;

  154. }

复制代码


代码前面就不说了,只看最后的结果输出怎么处理,谢谢。
上面是要求的矩阵输出格式,下面的截屏是我的结果,第二个矩阵输出一直对不正,我怀疑是第一个矩阵输出出了问题,但是找不到呀。求教了。
040130k4eostq0u1t94qv4.png
屏幕截图 2022-09-26 213049.jpg
最佳答案
2022-9-27 11:08:09
本帖最后由 jackz007 于 2022-9-27 15:47 编辑

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

  10. //打印*号
  11.                 if(i == row / 2) printf(" * ")                     ;
  12.                 else printf("   ")                                 ;
  13. //打印第二个矩阵行
  14.                 printf("|  ")                                      ;
  15.                 for(j = 0 ; j < n ; j ++) {
  16.                         if(i < p) printf("\b%d |" , array2[i][j])  ;
  17.                         else printf("\b\b\b     ")                 ;
  18.                 }
  19. //打印=号
  20.                 if(i == row / 2) printf(" = ")                     ;
  21.                 else printf("   ")                                 ;
  22. //打印第三个矩阵行
  23.                 printf("|  ")                                      ;
  24.                 for(j = 0 ; j < n ; j ++) {
  25.                         if(i < m) printf("\b%2d |" , array3[i][j]) ;
  26.                         else printf("\b\b\b      ")                ;
  27.                 }
  28.                 printf("\n")                                       ;
  29.         }
  30.         return 0                                                   ;
  31. }
复制代码


        【另一个版本】- 不使用 '\b',容易把人绕晕。
         完整代码如下
  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>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-26 22:20:51 | 显示全部楼层
        要求的格式是什么,你现在的格式又是什么,你得说清楚,最好不要让别人去猜你的意图。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:25:42 | 显示全部楼层
把代码格式化好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-26 22:28:04 | 显示全部楼层
s1e25动动手  是什么?
好多人要么是没有做过这些题目,要么就是好久好久之前做的,现在早忘了题目是什么了
所以,还要把题目贴出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 10:15:56 | 显示全部楼层
  1. for(k=0;k<p;k++)printf("\b ");
复制代码


第114行这个代码 循环的结果是只输出一个空格,  前面输出的都被‘\b’ 吃掉了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 11:08:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-9-27 15:47 编辑

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

  10. //打印*号
  11.                 if(i == row / 2) printf(" * ")                     ;
  12.                 else printf("   ")                                 ;
  13. //打印第二个矩阵行
  14.                 printf("|  ")                                      ;
  15.                 for(j = 0 ; j < n ; j ++) {
  16.                         if(i < p) printf("\b%d |" , array2[i][j])  ;
  17.                         else printf("\b\b\b     ")                 ;
  18.                 }
  19. //打印=号
  20.                 if(i == row / 2) printf(" = ")                     ;
  21.                 else printf("   ")                                 ;
  22. //打印第三个矩阵行
  23.                 printf("|  ")                                      ;
  24.                 for(j = 0 ; j < n ; j ++) {
  25.                         if(i < m) printf("\b%2d |" , array3[i][j]) ;
  26.                         else printf("\b\b\b      ")                ;
  27.                 }
  28.                 printf("\n")                                       ;
  29.         }
  30.         return 0                                                   ;
  31. }
复制代码


        【另一个版本】- 不使用 '\b',容易把人绕晕。
         完整代码如下
  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>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-28 08:13:52 | 显示全部楼层
jackz007 发表于 2022-9-27 11:08
把输出部分做了修改,自己对号入座吧

明白了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-28 08:17:26 | 显示全部楼层
jackz007 发表于 2022-9-27 11:08
把输出部分做了修改,自己对号入座吧

再一个问题。你给出的第一段代码里,第8、18、27行,利用\b退格3次,分别对应第5、15、24行的”|“和一个空格,那么第三个退格是什么意思呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 08:56:29 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2022-9-28 08:57 编辑
顶级太阳 发表于 2022-9-28 08:17
再一个问题。你给出的第一段代码里,第8、18、27行,利用\b退格3次,分别对应第5、15、24行的”|“和一个 ...


      为了叉掉首次打印的 '|',因为,首次打印的是 3 个字符。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-28 11:11:06 | 显示全部楼层
jackz007 发表于 2022-9-28 08:56
为了叉掉首次打印的 '|',因为,首次打印的是 3 个字符。

明白了,拷贝出来挨个数字符才明白为什么是3个字符。谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 14:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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