如何用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
相关产品推荐
相关产品推荐

