You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:55:21