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

如何为菱形添加星号边框?C语言代码调试求助

菱形星号边框实现问题

我需要为菱形添加星号边框,输入值为9时的预期输出如下:

*
    *.*
   *. .*
  *. . .*
 *. . . .*
*. . . . .*
 *. . . .*
  *. . .*
   *. .*
    *.*
     *

以下是无边框的菱形代码:

int main()
{
    int d = 0;
    scanf("%d", &d);
    int d2 = (d / 2) + 1;
    for(int i = 1; i <= d2;i++)
    {
        for(int c = 1; c<=d2-i;c++)
        {
            printf(" ");
        }
        for(int j = 0;j < i;j++)
        {
            printf(".");
            printf(" ");
        }
        printf("\n");
    }
    for(int i = d2-1; i >= 1;i--)
    {
        for(int c = 1; c<=d2-i;c++)
        {
            printf(" ");
        }
        for(int j = i;j > 0;j--)
        {
            printf(".");
            printf(" ");
        }
        printf("\n");
    }
}

上述无边框代码的输出如下:

.
   . .
  . . .
 . . . .
. . . . .
 . . . .
  . . .
   . .
    .

我自己编写了带边框的代码,但无法正常运行,空格和点的显示均不正确:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int d = 0;
    scanf("%d", &d);
    int d2 = (d / 2) + 1;
    int s = 0;

    // Printing the upper half of the diamond and the frame
    for(int i = 1; i <= d2; i++)
    {
        for(int c = 1; c <= d2 - i; c++)
        {
            printf(" ");
        }
        printf("*");
        if (i > 1)
        {
            for (int j = 0; j < i - 1; j++)
            {
                printf(".");
                printf(" ");
            }
            printf("*");
        }
        printf("\n");
    }

    // Printing the lower half of the diamond and the frame
    for(int i = d2 - 1; i >= 1; i--)
    {
        for(int c = 1; c <= d2 - i; c++)
        {
            printf(" ");
        }
        printf("*");
        if (i > 1)
        {
            for (int j = i - 2; j >= 0; j--)
            {
                printf(".");
                printf(" ");
            }
            printf("*");
        }
        printf("\n");
    }
}

上述代码的输出如下:

*
   *. *
  *. . *
 *. . . *
*. . . . *
 *. . . *
  *. . *
   *. *
    *

问题分析

你的代码问题集中在中间内容的输出逻辑:

  1. 上半部分i>1时,循环输出的. 会在最后一个点后多一个空格,导致右侧星号错位;
  2. 下半部分错误地将循环起始值设为i-2,直接减少了中间点的数量,同时同样存在空格冗余问题。

修复后的代码

#include <stdio.h>

int main()
{
    int d = 0;
    scanf("%d", &d);
    int d2 = (d / 2) + 1;

    // 打印菱形上半部分(含中间行)
    for(int i = 1; i <= d2; i++)
    {
        // 前置空格
        for(int c = 1; c <= d2 - i; c++)
        {
            printf(" ");
        }
        printf("*");
        if (i > 1)
        {
            // 先输出第一个点,后续点前加空格
            printf(".");
            for (int j = 1; j < i - 1; j++)
            {
                printf(" .");
            }
            printf("*");
        }
        printf("\n");
    }

    // 打印菱形下半部分
    for(int i = d2 - 1; i >= 1; i--)
    {
        // 前置空格
        for(int c = 1; c <= d2 - i; c++)
        {
            printf(" ");
        }
        printf("*");
        if (i > 1)
        {
            printf(".");
            for (int j = 1; j < i - 1; j++)
            {
                printf(" .");
            }
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

修复说明

  • 调整中间内容输出逻辑:先输出第一个.,后续每个点前加空格,避免最后一个点后出现冗余空格,保证右侧星号和点紧密衔接;
  • 统一上下半部分的中间点循环逻辑,修正下半部分的循环起始值错误,确保点的数量符合预期;
  • 移除了不必要的stdlib.h头文件,精简代码结构。

运行修复后的代码,输入9即可得到预期的菱形边框效果。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:49