我必须打印出一个横向金字塔:
O
OO
OOO
OOOO
OOO
OO
O
我已经设法使用两个 for 循环和一个 if 语句来做到这一点,但我想知道是否可以使用两个 for 循环和没有条件语句来做到这一点。
char character = 79;
int temp = 1;
for (int i = 0; i < 7; i++)
{
std::cout << character;
if (i >= 4)
{
temp = temp + 2;
}
for (int j = 0 + temp; j <= i; j++)
{
std::cout << character;
}
std::endl(std::cout);
}
可以使用嵌套的两个(或 1 个,带有辅助函数)循环。哦,还有一些数学。
考虑到我们可以非常轻松地编写一个函数来打印一行。
void print_row(char ch, int len) {
for (int i = 0; i < len; i++) {
std::cout << ch;
}
std::cout << std::endl;
}
如果我们调用它,我们只需要 1 个循环。如果我们循环到某个大小,我们真的需要去大小乘以 2 减去 1。每次生成什么数字?
const int size = 4;
for (int i = 1; i <= size * 2 - 1; i++) {
...
}
1
2
3
4
5
6
7
不过,我们真正需要的是这些数字,以提供给print_row
:
1
2
3
4
3
2
1
直到我们达到 5 岁,一切都很好。对于 5 及以上,我们需要回到较低的数字。我们可以使用三元运算符和一些数学来达到目标。
const int size = 4;
for (int i = 1; i <= size * 2 - 1; i++) {
int len_of_row = (i <= size ? i : size - (i - size));
print_row('0', len_of_row);
}
让我们把它分开。i - size
当i
是 5 岁而size
是 4 时会给我们1
.如果我们从size
中减去它,我们得到3
。如果我们对i
做同样的事情6
,我们会得到2
,如果我们对7
这样做,我们会得到1
。
现在,也许三元是一个作弊,因为它是有条件的替代品。
我们可以通过利用运算符优先级和布尔逻辑如何短路来消除三元表达式。我们确实必须重写print_row
转返回bool
并始终返回true
。
const int size = 4;
for (int i = 1; i <= size * 2 - 1; i++) {
i <= size && print_row('0', i) || print_row('0', size - (i - size);
}