问答详情
源自:4-13 使用for循环打印9×9乘法表

关于for父循环与子循的思考(for循环,倒叙打印9*9乘法表)

首先引起我思考的是,父循环和子循环,在解决该问题时,分别起了什么作用?

目标:9*1 9*2 →9*9

          8*1 8*2→8*8

          ...

          1*1

父循环for(i = 9, i >= 1, i--)循环变量 9→1,对应“列”。

子循环for(j=1, j< = i, j++)循环变量1→9,对应“行”。

但这里有一个小矛盾,当我着手去解决这个问题时,先思考的是“行”,然后思考“列”。

但写语句时,是先写父循环,再写子循环,即应该先写“列”,而后写“行”。

也就是最终我应该可以按写语句的顺序,先写父循环,再写子循环,且语句简洁而精炼,正确无误。

然而这与我正常的思路却背道而驰,这也正是这个问题是我感到绊脚的第一个原因。


尝试

为了尝试理解父循环与子循环的更深层的关系,按着我的思路,假如让当前子循环与父循环调换一下位置,会怎么样?

#include <stdio.h>
int main()
{
    int i, j, result;
    for(i=1; i <=9; i++)
    {
        for(j=9; j >= 1; j- -)
        {
            result = i * j;
            printf("%d * %d = %d\t", i, j, result);
         }
         printf("\n");
     }
     return 0:
}

在只改变i ,j的相对位置的情况下,不改变任何语句,得到的输出结果是

http://img2.mukewang.com/5f85298c000137ae05320202.jpg

调换一下printf("%d*%d=%d\t",i, j, result)中i,j的位置

改为printf("%d*%d=%d\t", j , i, result)得到:

http://img4.mukewang.com/5f852b5e0001c9a805240219.jpg

对比发现,本来的书写目标是9*X应该横向书写,X*1应该纵向书写,

i和j对调以后,9*X变成了纵向,1*X变成了横向,

也就是假如我们的目标输出是:先横向循环一定次数,换行,再横向输出一定次数...换行...

那么父循环负责的就是换行,以及决定子循环持续多久,后结束。整体上负责纵向循环。

                                                                                       子循环总是负责横向的循环。

启发

针对这类“先横向,换行,再横向,再换行”的制表类问题

如何快速按照程序语句的顺序(先父循环后子循环)写出正确而简洁的语句?

先确定“列目标”中的变量,如题目中,列目标指的就是X*1中的X,在本问题中,变化简单,为自减,变化顺序从9→1,

那么就可以直接写出for(i=9,i>=1{或者i>0},i--)

然后再看“行目标”中的变量,行目标:9*X,X自增,变化1→9,

子循环确定:for(j=1,j<=9{或j<10或j<i},j++),父循环确定了{i>=1}这个集合以后,可以直接用这个集合来规定j的取值范围,相比于再输入一个值,更不容易出错,应该会方便后期debug。当然如题目所说,前提是,两个集合有交集。

然后根据需求,比如本题中有tab("\t")的需求,放在对应语句位置,即可。

提问者:Penthesilea 2020-10-13 12:41

个回答

  • qq_慕前端4318977
    2020-10-13 21:31:37
    已采纳

    ?看完你的回答后,清楚多了

  • qq_慕哥2142912
    2021-06-16 00:47:34

    大神,求教。i为什么就是行,j为什么就是列

  • 永远喜欢my
    2021-01-25 12:39:40

    太酷了吧!!大神能教我个题吗?

  • qq_慕哥4143616
    2020-10-22 20:25:17

    666666666