我正在使用C Primer Plus第6版进行练习。它说使用嵌套循环来产生这个输出
$
$$
$$$
$$$$
$$$$$
我的代码生成了正确的输出,但我真的不明白为什么会这样做 有人可以解释它正在做什么
#include <stdio.h>
int main(void)
{
const int ROWS = 5;
const int CHAR = 5;
int row;
int qty;
char ch;
ch = '$';
for(row = ROWS; row > 0; row--)
{
for(qty = row ; qty <= CHAR; qty++ )
{
printf("%c", ch);
}
printf("\n");
}
getchar();
return 0;
}
答案 0 :(得分:4)
for(row = ROWS; row > 0; row--)
上面的这个外部循环创建一个循环,其中row
的值从5到1迭代。它每行一次运行循环体,共五行。
for(qty = row ; qty <= CHAR; qty++ )
这个内部循环类似,但它从qty
到row
迭代5
。它的行为每次都略有不同,因为row
的值不同。每行每个字符运行一次。
在第一行,row
为5
,因此qty
从5到5(一次)迭代,产生一个$
。
在第二行,row
为4
,因此qty
从4到5(两次)迭代,生成$$
。
我会跳过第三和第四行,因为你应该能够弄清楚发生了什么。
在第五行,row
为1
,因此qty
从1到5(五次)迭代,生成$$$$$
。
这就是真的。
我喜欢教我的学生的一件事是如何在他们的头脑中运行代码。从包含每个变量空格的工作表(以及本例中的输出)开始,逐行运行代码,随时更改变量。
这是一个填充到外循环准备好运行的点:
ROWS | CHAR | ch | row | qty | output
-----+------+----+-----+-----+-------
5 | 5 | $ | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
您的代码有点不寻常,因为每个循环的计数不一定是直观的。一个更“逻辑”的方法可能是从1
到5
为行运行计数器,并输出每行上的许多字符,如:
for (row = 1; row <= ROWS; row++) {
for (qty = 1 ; qty <= row; qty++ ) {
putchar (ch);
}
putchar ('\n');
}
您还会注意到我已使用printf()
替换了您的putchar()
来电,选择正确的输出函数是我的特定问题: - )
答案 1 :(得分:1)
看看这段代码(我稍微改了一下):
for(row = 5; row > 0; row--)
{
for(qty = row ; qty <= 5; qty++ )
{
printf("$");
}
printf("\n");
}
首先,row
设置为5.然后,检查条件row>0
。如果为true,则执行外循环。
其次,qty
设置为row
并检查qty>=5
。如果为true,则执行内循环。
第三,在内循环的每次迭代之后,qty
递增,并且在外循环的每次迭代之后,row
递减。
row
将为5,qty
将为5,并将循环1次,打印1 $
。row
将为4,qty
将为4,将循环2次,打印2 $
。row
将为3,qty
将为3,将循环3次,打印3 $
。row
将为2,qty
将为2,将循环4次,打印4 $
。row
将为1,qty
将为1,将循环5次,打印5 $
。