ccidnet????

出版日期:2003-07-28 总期号:528 本年期号:28

本期导读
综合报道
零组件
数字新生活
软件.net
新手玩电脑
游戏空间
办公新人类
教育信息化
社会培训
轻松掌握双重循环(上)

朱志祥

  在学习计算机程序设计语言的过程中,循环结构的设计是重要内容之一,也是学习后续知识(如递推、排序等)的重要基础。在大学、中学(普高、职高的计算机专业)的不少教材中,都试图通过一个或几个图形打印类的例题,来引入双重循环的教学;而且,全国计算机等级考试、普通高校对口单招等大型考试中,也多用图形打印类试题来考核考生有关双重循环的程序设计、调试能力。遗憾的是,在这些教参、书籍或考试辅导书中,对这类问题的具体分析较少,初学者往往会搞不清楚。

  本文中的几个图形,在各类教材、教参或考试中经常碰到。这些图形可以用一个“通用程序”来完成。笔者就结合自己多年的教学实践,利用这些图例,简单阐述一下学习双重循环的有关思路。(以VB语言为例,其他语言可参照。)


  从程序角度考虑,实现图一所示的程序最为简单。程序如下:

  for I=1 to 4

   print tab(10-I);

   for J= 1 to I*2 - 1

   print "*";

   next J

   print

  next I

  先来分析一下该程序:外层循环的循环次数用来设定打印的行数(循环4次,打印4行)。每行由三个print语句来确定打印情况,第一个print语句确定了每行符号的起始打印位置(I 每行增1,开始位置tab(10-I)每行减1);第二个print语句放置在内层循环中,与内循环一起确定每一行打印的符号数量(循环次数与打印“*”号数量相同);最后一个print空语句表明该行打印结束。要注意的是:前两个print语句后有一分号,表明该行打印没结束,下次执行print语句时仍紧跟其后打印;最后一个print语句后没有任何符号,表明打印该行后换行。

  对该程序抽象一下,得出如下的“通用程序”:

  for I= ① 外循环的次数确定图形打印的行数

   print tab( ② ); 确定每行开始打印的位置

   for J= ③ 内循环的次数确定每一行打印符号的个数

   print ④ ; 确定每一个打印的符号内容

   next J

   print 一行打印结束

  next I

  注意:②和④两处print语句后的分号“;”千万不能漏掉。有了这样的“通用程序”,实现这些图形的打印也就可以“照模脱样”了。


  如图二,该图与图一相比:每一行不再是固定不变的符号(“*”)了,且每行都不同。在图一的程序中,I的值是逐行变化的(I从1变到4,要打印的图形也是从1到4)。所以,只要将图一程序中的第2个print语句改为“print trim(I);”即可。此处用到trim()函数,是因为要去除数值型数据在打印时会出现的前导空格和尾部的分隔空格。图二是容易实现了,但对图二稍作修改为图三,如何套用“通用程序”呢?可作分析如下:


  该图仍为4行(外循环次数不要修改),起始位置仍为逐行减一(第一个print语句不要改),每行所打印的符号个数也对应不变(内循环的对应次数不变),但与图二相比:每行数字不再固定不变,而呈左右对称关系。如何实现这样对称的关系?I的取值不能变,因为每行开始的位置是单向变化的,因此①②处仍确定为1 to 4;及(10-I);看来只能在J的取值上动脑筋了。

  根据上述变量的关系做出下表:

   行数 I的值 各行符号个数

  第1行 1 1

  第2行 2 3

  第3行 3 5

  第4行 4 7

  取出最后一行作为典型分析:打印该行时,程序中I的值为4不变;而打印的7个符号呈对称关系,则内循环(J的取值)也应为7次,也应呈对称关系。作为整数,只有负数与正数以0为对称点分布,所以J的取值应是:-3~3这7个数。由此补充完整上面的表格,如下:

  对J的取值范围用一通用表达式表示,即为:(1 - I ) ~ (I - 1 ) 。再套用“通用程序”,则实现图三的具体程序为:

行数

i的值

各行符
号个数 

j的取
值范围

打印的数值

第1行

1

1

0~0

i

第2行

2

3

-1~1

i-1,i,i-1

第3行

3

5

-2~2

i-2,i-1,i,i-1,i-2

第4行

4

7

-3~3

…i-|j|…


  for I=1 to 4

   print tab(10-I);

   for J= 1 - I to I - 1

   print trim(I - abs(J ));

   next J

   print

  next I (未完待续)