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

CS50 Mario简易版最后一步问题:无法移除最后一行前置点

解决CS50 Mario.c最后一行多余点的问题

你的问题出在打印点的do-while循环上——do-while是先执行一次循环体,再判断条件。当到最后一行(b = i-1)时,d初始值是i-1,此时d > b的条件不成立,但do-while已经先输出了一个点,这就是最后一行开头多余点的原因。

修改方案1:把do-while换成while循环

直接调整打印点的循环逻辑,先判断条件再执行输出,这样就不会在最后一行多打那个点了:

int main(void)
{
    int i;
    do
    {
        i = get_int ("Height: ");
    }
    while (i < 1 || i > 8);

    for (int b = 0; b < i; b++)
    {
        int d = i - 1;
        // 替换为while循环,先判断后执行
        while (d > b)
        {
            printf(".");
            d--;
        }
        
        for (int c = 0; c < b + 1; c++)
        {
            printf("#");
        }

        printf("\n");
    }
}

修改方案2:直接计算点的数量(更清晰)

你也可以直接算出每行需要打印的点的数量,用for循环输出,逻辑更直观:每行的点数量是i - b - 1,当到最后一行时,这个值为0,自然不会输出任何点:

int main(void)
{
    int i;
    do
    {
        i = get_int ("Height: ");
    }
    while (i < 1 || i > 8);

    for (int b = 0; b < i; b++)
    {
        // 计算需要打印的点的数量,用for循环输出
        for (int d = 0; d < i - b - 1; d++)
        {
            printf(".");
        }
        
        for (int c = 0; c < b + 1; c++)
        {
            printf("#");
        }

        printf("\n");
    }
}

两种方法都能解决问题,第二种逻辑可读性更强,更推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:11