CS50 Pset1 Mario More 右侧金字塔输出异常问题求提示
CS50 Pset1 Mario More 右侧金字塔形状异常排查提示
问题现象:左侧金字塔、中间双空格分隔输出正常,右侧金字塔输出为矩形
你当前编写的代码如下:
#include <cs50.h> #include <stdio.h> int main(void) { int height, i2, i; do { height = get_int("Height: "); } while(height < 1 || height > 8); for(i = 0; i < height; i++) { printf("\n"); for(int o = 0; o < height - i - 1; o++) { printf(" "); } for(int j = 0; j <= i; j++) { printf("#"); } printf(" "); for(i2 = 0; i2 < height; i2++) { //printf("\n"); for(int j2 = 0; j2 <= i2; j2++) { printf("#"); } } } printf("\n"); }
针对性排查提示(无完整题解)
- 先复盘左侧金字塔正常运行的核心逻辑:每一行要打印的
#数量完全由当前所在的行序号决定,第i行(从0开始计数)只需要打印i+1个#,打印完就结束当前行的右侧部分,等下一轮外层循环进入下一行,再打印下一行对应数量的#。 - 检查你写的右侧金字塔外层循环终止条件:现在的写法是
i2 < height,等于你在同一行内,把从第0行到最后一行所有需要打印的#一次性全输出了,这就是右侧变成实心矩形的核心原因——你没有让右侧打印的#数量和当前正在处理的行号i绑定,反而在单行内跑满了所有行的打印量。 - 你可以临时加一行调试代码:在右侧打印
#的语句旁边,顺带打印当前的i2值,运行后就能直观看到,同一行里i2会从0一直递增到height-1,把所有层级的#都堆在了同一行。 - 先把代码里错乱的大括号缩进、对应关系理清楚,现在右侧循环部分的大括号嵌套层级是混乱的,理清层级后你会更容易发现哪段逻辑应该属于「单行打印」的范畴,哪段逻辑应该跨多行运行。
- 顺带检查换行符的位置:你现在把换行放在了最外层行循环的开头,末尾又额外加了一个换行,很容易出现第一行是空行的格式问题,可以顺带着调整。
内容的提问来源于stack exchange,提问作者Salah Addin Al Ayubi
相关产品推荐
相关产品推荐

