CS50右对齐金字塔代码异常求助:输出不符合预期
CS50右对齐金字塔代码错误原因解析
问题情况
刚开始学CS50,做右对齐金字塔的挑战时,代码跑出来的结果不对:
# # # # # #
我要的预期输出是:
# ## ###
后来改了k的计算方式,输出变成这样:
# # # ###
虽然最后搞定了挑战,但还是没搞懂最初的代码为啥会出错,想弄明白原因。
出错的代码
#include<stdio.h> void row(int i) { for (int y = 0; y < i ; y++) { int k = 3 - i; if (k > 0 ) { for (int x = 0 ; x < k ; x++) { printf(" "); } } printf("#"); } printf("\n"); } int main(void) { int len = 3; for (int ye = 0; ye < len ; ye++) { row(ye+1); } }
错误根源
核心问题就是打印空格的循环被放在了打印#的循环里面,导致每输出一个#之前,都会重复打印一遍空格。
举个例子,当row函数接收的i=2(对应金字塔的第二行)时,k=3-2=1,此时外层的y循环会执行2次:
- 第一次循环:先打印1个空格,再输出1个
# - 第二次循环:又打印1个空格,再输出1个
#
所以第二行就变成了# #,而不是我们要的##。
正确的逻辑应该是:先一次性把整行需要的空格全部打印完,再接着打印对应数量的#,而不是每打一个#就重复打一次空格。
你修改后的输出说明
你调整k的计算方式后,应该是修正了空格的数量,但当时可能还没把空格打印的逻辑移到#循环外面,所以第二行的#之间还是多了空格。不过你最后解决了问题,说明后来调整了循环结构,把空格打印放到了#循环的外层,这才得到了正确的右对齐金字塔。
内容的提问来源于stack exchange,提问作者zalmy touger
相关产品推荐
相关产品推荐

