为何我的C语言阶梯方阵函数中MAX_LENGHT-1可正常工作?
阶梯方阵打印的循环条件问题解析
以MAX_LENGHT=5的情况为例,预期输出每行恰好包含5个带空格的符号(*或+):
* + + + + * * + + + * * * + + * * * * + * * * * *
你的当前代码如下:
void quadratoScalaPiu(int MAX_LENGHT) { printf("\nCaso 4\n\n"); // Colonna for (int i = 0; i < MAX_LENGHT; i++) { for (int j = 0; j <= i; j++) { printf("* "); } for (int j = i; j < MAX_LENGHT - 1; j++) { printf("+ "); } printf("\n"); } }
正确循环的计数逻辑
每行由两个循环协作完成符号打印:
- 打印
*的循环:j从0到i(包含i),循环次数是i+1次,每次输出*,对应i+1个带空格的*。 - 打印
+的循环:条件j < MAX_LENGHT -1意味着j从i开始,最多到MAX_LENGHT-2,循环次数为(MAX_LENGHT-2 - i +1) = MAX_LENGHT -i -1次,每次输出+,对应MAX_LENGHT -i -1个带空格的+。
将两个循环的次数相加:(i+1) + (MAX_LENGHT -i -1) = MAX_LENGHT,刚好等于方阵的边长,所以每行的符号总数正好是MAX_LENGHT个,完全匹配预期输出。
错误条件的问题所在
如果把第二个循环条件改成j < MAX_LENGHT,循环次数会变成MAX_LENGHT -i次,两个循环的总次数就成了:(i+1) + (MAX_LENGHT -i) = MAX_LENGHT +1,相当于每行多打印了一个+ ,这就是错误输出每行末尾多一个+的原因。
对应错误输出如下:
* + + + + + * * + + + + * * * + + + * * * * + + * * * * * +
最后一行的验证
拿最后一行(i=MAX_LENGHT-1,即i=4)来说:
- 正确条件下:
j=4时,4 < 5-1不成立,第二个循环直接跳过,只打印5个*,符合预期的最后一行。 - 错误条件下:
j=4时,4 <5成立,第二个循环会执行一次,多打印一个+,就出现了错误输出里的* * * * * +。
内容的提问来源于stack exchange,提问作者Luca Facchini
相关产品推荐
相关产品推荐

