Mario习题集(进阶版):哈希符号金字塔无法输出问题求助
分析你的Mario金字塔代码问题
嘿,我帮你梳理下这段代码里的问题,咱们一步步来修正:
几个核心问题
- 变量作用域坑:你在
do循环里重新声明了int height,这就导致外面那个height变量根本没被赋值!循环结束后,后面的代码用的是未初始化的height,行为完全不可预测。得把循环里的int去掉,直接给外面的height赋值。 - 哈希循环逻辑搞反了:你写的
for (hashes = (i + 1); hashes >= height; hashes++),这个条件从一开始就不成立啊!比如height=3,i=0时hashes=1,1 >=3?显然不成立,循环直接跳过,所以啥都打不出来。正确的逻辑应该是每一行打印i+1个哈希,或者反过来先算需要的空格,再打哈希。 - 没处理前置空格:Mario金字塔每一行前面需要
height - i -1个空格,你完全没写这部分,就算打出哈希也不是金字塔形状。 - 忘记换行:每一行打完哈希后没有
printf("\n"),就算有内容也会挤在一行。
修正后的代码
#include <cs50.h> #include <stdio.h> int main(void) { int height; // 修正作用域问题,直接给外面的height赋值 do { height = get_int("height: "); } while (height < 0 || height > 5); // 外层循环控制行数 for (int i = 0; i < height; i++) { // 打印前置空格:每一行需要height - i -1个空格 for (int space = 0; space < height - i - 1; space++) { printf(" "); } // 打印哈希符号:每一行需要i+1个哈希 for (int hashes = 0; hashes < i + 1; hashes++) { printf("#"); } // 每行结束换行 printf("\n"); } }
简单解释下修正点
- 把do循环里的
int height改成直接赋值给外层的height,确保变量被正确初始化。 - 新增了打印前置空格的循环,这样每一行前面的空格数会随着行数增加而减少,形成金字塔的左对齐效果。
- 哈希循环改成从0到i+1,确保每一行的哈希数量正确(第1行1个,第2行2个,以此类推)。
- 每一行结束后添加换行,让金字塔每一行单独显示。
你可以试试这段代码,输入0到5之间的数字,就能得到正确的哈希金字塔啦!
内容的提问来源于stack exchange,提问作者redautumnleaves
相关产品推荐
相关产品推荐

