关于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的相对位置的情况下,不改变任何语句,得到的输出结果是
调换一下printf("%d*%d=%d\t",i, j, result)中i,j的位置
改为printf("%d*%d=%d\t", j , i, result)得到:
对比发现,本来的书写目标是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")的需求,放在对应语句位置,即可。