打印实心钻石图案时出现无限循环问题求助
咱们一步步来分析你遇到的无限循环问题,顺便把实心钻石的打印逻辑也修正到位:
首先,无限循环的直接原因:你下半部分的k变量初始值完全错了!当second递减到1的时候,2*second-1等于1,但你把k初始化成了rows(比如输入rows=3时k=3),然后在while循环里让k一直递增,它永远不可能等于1,自然就死循环了。
再仔细看你的代码,还有几个逻辑错误:
- 变量初始化时机错了:你把
k=rows放在打印空格的for循环增量里,这意味着每次j循环结束后才会赋值,而且这个值完全不符合星号计数的需求——上半部分用n=0来从零开始数星号数量,下半部分也应该用同样的逻辑,把k初始化为0。 - 下半部分循环范围错了:你从
second=rows开始循环,会导致重复打印上半部分最后一行的最大星号行,最终钻石会有2rows行(正确的实心钻石应该是2rows-1行),而且当second=1时,星号数量要求是1,但k初始值远大于1,直接触发无限循环。 - 空格逻辑错了:下半部分的space初始值设为rows完全不对,应该从1开始递增,对应每一行的空格数逐渐增加。
下面是修正后的完整代码,我标注了关键修改点:
#include <stdio.h> // 打印实心钻石的程序 int main(){ int j, k, first, second, rows, space; // 移除了冗余的n变量,代码更简洁 printf("Enter value of n : "); scanf("%d", &rows); // 打印上半部分(包含中间最大的星号行) space = rows - 1; for (first = 1; first <= rows; first++) { // 修正空格循环条件:j<=space 才能打印正确数量的空格 for(j = 1; j <= space; j++) { printf(" "); } space--; k = 0; // 显式初始化星号计数器为0 while (k != 2*first - 1) { printf("*"); ++k; } printf("\n"); } // 打印下半部分(从中间行的下一行开始到最后一行) space = 1; // 循环从rows-1开始,避免重复打印中间最大的星号行 for (second = rows - 1; second >= 1; second--) { for(j = 1; j <= space; j++) { printf(" "); } space++; k = 0; // 正确初始化计数器,避免垃圾值 while (k != 2*second - 1) { printf("*"); ++k; } printf("\n"); } return 0; }
关键修改说明:
- 删掉了没用的
n变量,统一用k作为星号计数器,逻辑更清晰。 - 上半部分的空格循环条件从
j<space改成j<=space,确保每行的空格数正确。 - 下半部分的
space初始值改为1,每次循环后递增,对应下半部分每行空格数逐渐变多。 - 下半部分循环从
rows-1开始,这样不会重复打印中间的最大星号行,最终钻石总行数是2*rows-1,符合实心钻石的标准形状。 - 每个星号while循环前都显式把计数器设为0,彻底避免了未初始化变量或错误初始值导致的问题。
测试一下,比如输入rows=3,输出会是:
* *** ***** *** *
完美解决了无限循环,同时也打印出了正确的实心钻石。
内容的提问来源于stack exchange,提问作者Mai Ehab
相关产品推荐
相关产品推荐

