好吧,所以我对嵌套循环很新,并且很难理解它们。
提示:
编写一个打印下图所示形状的程序。您可以使用输出语句打印单个星号(*)或单个空白。最大限度地使用重复(使用嵌套的结构)并最小化输出语句的数量。
*******
*********
***********
*************
***********
*********
*******
到目前为止我所拥有的:
for (int row = 7; row <= 13; row = row + 2){
for (int col = 1; col <= row; col++)
cout << '*';
cout << '\n';
}
for ( int row = 12; row >= 7; row = row - 2) {
for ( int col = 1; col <= row; col++ )
cout << '*';
cout << '\n';
}
我无法弄清楚间距?前三行的空格减少一个,后三行的空格减去一。我该如何添加它们?
答案 0 :(得分:2)
你走在正确的轨道上。这种任务最难的部分是找出“规则”。或者根据行的索引计算每行中空白量和星数的公式。一旦你想到将其翻译成一个程序就更容易了。
编辑:虽然这个解释使用特定的作业作为例子,但这是一种通用的方法,如果学会了,它应该帮助你和其他人解决这类编程问题。
您可以通过使用索引
标记行来简化操作0 *******
1 *********
2 ***********
3 *************
4 ***********
5 *********
6 *******
然后创建一个输入 - 输出表
row blanks *s
0 6 7
1 5 9
2 4 11
3 3 13
4 4 11
5 5 9
6 6 7
这个表可以扩展(推广)到从1
到N
(N>=1
)的任意数量的行,但它真的适用于N>=3
它开始有意义了。有时应该决定如何处理N
的偶数和奇数值,但通常可以从您提供的样本中找出。
在您的示例中,行数为7,因此N=7
。
通过了解您的输入N
,您可以通过将值替换为计算(作为N
的函数)来开始推广上表
N=7
row blanks *s
0 N-1 N+0
1 N-2 N+2
2 N-3 N+4
3 N-4 N+6
4 N-3 N+4
5 N-2 N+2
6 N-1 N+0
此时如果您无法确定所有行的单个公式,只需引入新的辅助变量。我们可以看到在表格的上半部分我们看到增加的校正值(+ 0,+ 2,+ 4,+ 6),在表格的下半部分我们看到减少的校正值(+ 6,+ 4,+ 2,+ 0)。因此,让我们介绍一个辅助变量,它将帮助我们处理表的下半部分(类似于row
索引如何帮助我们使用上半部分)。我将此变量称为help1
。
N=7
row help1 blanks *s
0 6 N-1 N+0
1 5 N-2 N+2
2 4 N-3 N+4
3 3 N-4 N+6
4 2 N-3 N+4
5 1 N-2 N+2
6 0 N-1 N+0
此时如果模式仍然难以概括,您可以在2种情况下拆分问题并在程序中使用if {} else {}
语句。一个用于表格的上半部分(if
部分),一个用于下半部分(else
部分)。但是,如果仔细查看row
和help1
变量之间的关系以及空白和星号的校正值,您会发现它们遵循一种模式。它们之间存在线性关系。您可以看到,您总是需要减去或添加row
和help1
的较小值,以获得给定行所需的空白或星号数。因此,让我们为较小的值引入一个新的帮助,也称为最小值,或简称为min
。
row help1 min blanks *s
0 6 0 N-1 N+0
1 5 1 N-2 N+2
2 4 2 N-3 N+4
3 3 3 N-4 N+6
4 2 2 N-3 N+4
5 1 1 N-2 N+2
6 0 0 N-1 N+0
现在让我们使用min
辅助变量来更新表格的最后两列。
row help1 min blanks *s
0 6 0 N-(min+1) N+2*min
1 5 1 N-(min+1) N+2*min
2 4 2 N-(min+1) N+2*min
3 3 3 N-(min+1) N+2*min
4 2 2 N-(min+1) N+2*min
5 1 1 N-(min+1) N+2*min
6 0 0 N-(min+1) N+2*min
表格完全概括。
赋值的提示是使用嵌套结构(嵌套循环)。一般的想法是使用外部循环迭代从0
到N-1
的行和内部循环(或两个)来打印当前行所需的空白和星号数量。 / p>
现在由您决定循环条件和步骤/增量以及辅助变量help1
和min
的计算。