LXMARCO 发表于 2019-12-30 01:46:03

二维数组课后习题问题求教

      // row 取行数最大值
      row = M > P ? M : P;

      for (i = 0; i < row; i++)
      {
                // 打印A
                printf("|");
                for (j = 0; j < P; j++)
                {
                        if (i < M)
                        {
                              printf("\b%d ", a);
                              printf("|");
                        }
                        else
                        {
                              printf("\b\b\b   ");
                        }
                }
                // 打印 * 号
                if (i == row / 2)
                {
                        printf(" * ");
                }
                else
                {
                        printf("   ");
                }
                printf("|");
                // 打印B
                for (j = 0; j < N; j++)
                {
                        if (i < P)
                        {
                              printf("\b%d ", b);
                              printf("|");
                        }
                        else
                        {
                              printf("\b\b\b   ");
                        }
                }
                // 打印 = 号
                if (i == row / 2)
                {
                        printf(" = ");
                }
                else
                {
                        printf("   ");
                }
                // 打印C
                printf("|");
                for (j = 0; j < N; j++)
                {
                        if (i < M)
                        {
                              printf("\b%d ", c);
                              printf("|");
                        }
                        else
                        {
                              printf("\b\b\b      ");
                        }
                }
                printf("\n");
      }

      return 0;
}
输出:
| 1 2 3 |    | 1 4 |    | 1432 |
| 4 5 6 | * | 2 5 | = | 32 77 |
               |3 6 |            


最开始前面一些代码省略 了,在打印A和后面的地发    里面“\b%d”    "\b\b\b       "   为什么要这么写呢?   我查了\b 是退格的意思,但是还是不是很明白在这里为什么要这么用,这几句代码具体是什么意思呢?   谢谢!
// 打印A
                printf("|");
                for (j = 0; j < P; j++)
                {
                        if (i < M)
                        {
                              printf("\b%d ", a);
                              printf("|");
                        }
                        else
                        {
                              printf("\b\b\b   ");
                        }
                }

suweixuan1998 发表于 2020-1-4 17:39:31

//打印A
       printf("|");             //注意这里“|”后面跟着两个空格
                for (j = 0; j < P; j++)
                {
                        if (i < M)
                        {
                              printf("\b%d ", a);   //这句的意思是如果在有效行数M(就原来有M行东西)里面,打印整数%d,但是由于前面有两个空格,为了美观,可以退回一格。(其实空格还有占位的作用,还有,\b是退回上一格的位置,如果没有新内容覆盖的话,退格就没有作用哦,它跟删除还是有区别的)
                              printf("|");
                        }
                        else
                        {
                              printf("\b\b\b   ");   //这一行就是把“|”这一个整体全都删除,由于“|”占了三个位置,就退三格,然后用三个空字符替换“   ”
                        }
                }
懂了记得采纳哈,不懂再问

LXMARCO 发表于 2020-1-4 22:51:38

suweixuan1998 发表于 2020-1-4 17:39
//打印A
       printf("|");             //注意这里“|”后面跟着两个空格
                for (j = 0; j ...

我可以这么理解吗:

//打印A
         printf("|");             //注意这里“|”后面跟着两个空格

到这里,输出是:
|   (“|”后面和两个空格)
然后进入了for循环,i代表行,j代表列
所以:
                for (j = 0; j < P; j++)
                {
                        if (i < M)
                        {
                              printf("\b%d ", a);
\b%d:相当于:| 1(“|”后面和一个空格)然后加上数字1。
这里数字1后面还有一个空格把?因为\b只是往前推一个并不是删除,所以这里就是:“|”空格1空格
然后print“|”    输出就是| 1 |

第二次进入for:
| 1 |    往前推一个再打印数字和“|”就是: | 1 2||这个时候2后面没有空格了吧?

同理第三次for:
| 1 2||         ———— | 1 2 3|||
第四次进入的时候就是else判断:
\b\b\b 就是退到了三后面一个,三个空字符替换完后不就变成了 | 1 2 3   了吗? 3后面一个空格加“|”是怎么打印出来的呢?

谢谢!

suweixuan1998 发表于 2020-1-5 09:58:18

LXMARCO 发表于 2020-1-4 22:51
我可以这么理解吗:

//打印A


理解错了,第一次进入for循环这里没有问题。第二次进入for循环的时候,在循环发生之前是“| 1 |”
接着打印“\b%d ”,输出就变成了“| 1 2 |”。(这里退一个回到“| 1 |”右边的“|”位置上,用2将“|”覆盖了,所以这条竖杆就不见了,其他按你理解就行)第三次循环同理。

LXMARCO 发表于 2020-1-5 22:12:27

suweixuan1998 发表于 2020-1-5 09:58
理解错了,第一次进入for循环这里没有问题。第二次进入for循环的时候,在循环发生之前是“| 1 |”
接着 ...

好的,明白了,谢谢

suweixuan1998 发表于 2020-1-6 21:29:35

LXMARCO 发表于 2020-1-5 22:12
好的,明白了,谢谢

不客气,一起加油。
页: [1]
查看完整版本: 二维数组课后习题问题求教