Pascal语言绘制对称空心矩形图案问题求助
绘制指定空心对称图形的问题解决
需要绘制的目标图形(示例中n=3):
****** ** ** * * ** ** ******其中n为用户输入的参数,决定图形的“层数”。我尝试把图形拆成两部分绘制,结果得到了这样的输出:
*** ** * ** *** *** ** * ** ***
变量翻译说明
brojredova:行数brojzvezda:星号*的数量brojpraznih:空格的数量
我的尝试代码
program veasdsa; var n,brojredova,brojzvezda,brojpraznih : integer; begin readln(n); // prva polovina 1st half for brojredova := 1 to n do begin // * for brojzvezda := 1 to ((n-brojredova) + 1) do begin write('*'); end; writeln; end; for brojredova := 2 to n do begin for brojzvezda := 1 to brojredova do begin write('*'); end; writeln; end; // ovde pocinje druga polovina ( second half starts from here) for brojredova := 1 to n do begin //prazna for brojpraznih := 1 to (brojredova - 1) do begin write(' '); end; // * for brojzvezda := 1 to ((n - brojredova) + 1) do begin write('*'); end; writeln; end; for brojredova := 2 to n do begin //prazna for brojpraznih := 1 to (n - brojredova) do begin write(' '); end; // * for brojzvezda := 1 to brojredova do begin write('*'); end; writeln; end; end.
解决方案
不需要拆分左右部分绘制,应该逐行构造完整内容:每一行由左边星号 + 中间空格 + 右边星号组成,整个图形总行数为2n-1。
修改后的代码如下:
program drawShape; var n, row, starsLeft, spaces: integer; begin readln(n); // 绘制上半部分(含中间行) for row := 1 to n do begin starsLeft := n - row + 1; // 打印左边星号 for starsLeft downto 1 do write('*'); // 打印中间空格 spaces := 2*(row - 1); for spaces downto 1 do write(' '); // 打印右边星号 for starsLeft downto 1 do write('*'); writeln; end; // 绘制下半部分 for row := 2 to n do begin starsLeft := row; // 打印左边星号 for starsLeft downto 1 do write('*'); // 打印中间空格 spaces := 2*(n - row); for spaces downto 1 do write(' '); // 打印右边星号 for starsLeft downto 1 do write('*'); writeln; end; end.
代码说明
- 每行总长度固定为
2n(n=3时为6个字符),保证图形对称 - 前n行:左边星号数量从n递减到1,中间空格数从0递增到
2(n-1),实现向内收缩效果 - 后n-1行:左边星号数量从2递增到n,中间空格数从
2(n-2)递减到0,实现向外扩展效果
内容的提问来源于stack exchange,提问作者Ognjen
相关产品推荐
相关产品推荐

