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

如何用C语言实现右对齐金字塔?CS50课程学习者技术求助

右对齐金字塔代码修改方案及逻辑解释

你当前代码的核心问题是:print_row函数里的空格循环按当前行#的数量输出空格,导致各行宽度不一致,无法形成右对齐效果。要实现右对齐,关键是让每一行的总宽度等于金字塔高度,通过前置对应数量的空格把#推到右侧。

分步修改及原因

1. 给print_row添加总高度参数

右对齐需要知道金字塔的总高度来计算每行的前置空格数,所以要给print_row增加height参数:

  • 函数声明改为:void print_row(int length, int height);
  • 函数定义的参数列表改为:void print_row(int length, int height)

2. 调整空格循环逻辑

原来的空格循环条件g < length会让空格数等于#数,现在要改成空格数 = 总高度 - 当前行#的数量,循环条件改为g < (height - length):

for (int g = 0 ; g < (height - length); g++)
{
    printf(" ");
}

逻辑解释:比如金字塔高度为3,第1行有1个#,需要前置3-1=2个空格才能让#靠右;第2行有2个#,前置3-2=1个空格;最后一行无空格,直接输出3个#。所有行总宽度统一为3,形成标准右对齐金字塔。

3. 修改main中print_row的调用方式

现在print_row需要两个参数,把print_row(i + 1);改为print_row(i + 1, height);,将总高度传递给函数。

修改后的完整代码

#include <cs50.h>
#include <stdio.h>

void print_row(int length, int height);

int main(void)
{
    int height = get_int("Height: ");
    for (int i = 0; i < height; i++)
    {
        print_row(i + 1, height);
    }
}

void print_row(int length, int height)
{
    // 输出前置空格:总高度 - 当前行#的数量
    for (int g = 0 ; g < (height - length); g++)
    {
        printf(" ");
    }

    // 输出当前行的#
    for (int h = 0; h < length; h++)
    {
        printf("#");
    }

    printf("\n");
}

验证示例(高度为4时)

输出结果:

#
  ##
 ###
####

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:52:56