CS50 Mario简易版最后一步问题:无法移除最后一行前置点
解决CS50 Mario.c最后一行多余点的问题
你的问题出在打印点的do-while循环上——do-while是先执行一次循环体,再判断条件。当到最后一行(b = i-1)时,d初始值是i-1,此时d > b的条件不成立,但do-while已经先输出了一个点,这就是最后一行开头多余点的原因。
修改方案1:把do-while换成while循环
直接调整打印点的循环逻辑,先判断条件再执行输出,这样就不会在最后一行多打那个点了:
int main(void) { int i; do { i = get_int ("Height: "); } while (i < 1 || i > 8); for (int b = 0; b < i; b++) { int d = i - 1; // 替换为while循环,先判断后执行 while (d > b) { printf("."); d--; } for (int c = 0; c < b + 1; c++) { printf("#"); } printf("\n"); } }
修改方案2:直接计算点的数量(更清晰)
你也可以直接算出每行需要打印的点的数量,用for循环输出,逻辑更直观:每行的点数量是i - b - 1,当到最后一行时,这个值为0,自然不会输出任何点:
int main(void) { int i; do { i = get_int ("Height: "); } while (i < 1 || i > 8); for (int b = 0; b < i; b++) { // 计算需要打印的点的数量,用for循环输出 for (int d = 0; d < i - b - 1; d++) { printf("."); } for (int c = 0; c < b + 1; c++) { printf("#"); } printf("\n"); } }
两种方法都能解决问题,第二种逻辑可读性更强,更推荐使用。
内容的提问来源于stack exchange,提问作者greyskape
相关产品推荐
相关产品推荐

