为何C语言金字塔程序中while循环未更新变量k的值?
金字塔程序的while循环错误排查
错误根源
变量k在函数开头仅初始化一次,导致其值在后续循环中持续累积,无法满足每行重新计数打印星号的需求:
- 第一次外层循环(
i=1)时,while循环将k递增到1(即2*1-1),完成第一行星号打印。 - 进入第二次循环(
i=2)时,k的当前值已经是1,而终止条件是k != 3,因此只会额外打印2个星号,而非从头开始打印3个。 - 后续循环中,
k会持续增长,当k超过当前行需要的2*i-1时,while循环直接跳过,不再打印星号。
修复方案
将k的初始化移至外层for循环内部,确保每处理一行时,k都从0开始重新计数:
#include <stdio.h> int main() { int height, i, j; printf("This program is to make a pyramid\n\n"); printf("Enter the pyramid height: \n"); scanf("%d", &height); for (i = 1; i <= height; i++) { int k = 0; // 每行开始时重置k为0 for (j = 1; j <= height - i; j++) { printf(" "); } while (k != 2 * i - 1) { printf("*"); ++k; } printf("\n"); } return 0; }
替代优化方案
可以直接用for循环替代while循环,省去单独初始化k的步骤,代码更简洁直观:
#include <stdio.h> int main() { int height, i, j; printf("This program is to make a pyramid\n\n"); printf("Enter the pyramid height: \n"); scanf("%d", &height); for (i = 1; i <= height; i++) { for (j = 1; j <= height - i; j++) { printf(" "); } // 用for循环直接控制星号数量 for (int k = 0; k < 2 * i - 1; k++) { printf("*"); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Daksh
相关产品推荐
相关产品推荐

