c++ - 如何在不使用条件语句的情况下打印横向金字塔?
问题描述
我必须打印出一个横向金字塔:
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
turn returnbool
并且总是 return 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);
}
推荐阅读
- dart - 在 Flutter 中使用 GetX 更新 FutureBuilder 中的列表
- python - Python csv DictReader 以异常安全的方式读取列
- angular - 使用 CloudBuild 在 Google App Engine 中部署 ANGULAR build --prod 错误
- java - 使用 DefaultTableModel 将 ArrayList 项添加到 JTable
- flutter - 如何从另一个屏幕使用颤振_pageControler.jumpToPage()?
- visual-studio - Visual Studio 2017 - 如何查看基于 dmp 文件的调用堆栈?
- spring - Spring Boot @Valid 不显示来自@NotBlank 的消息
- qt - QtWebEngine Fetch API 因自定义方案而失败
- python - 由于 Ubuntu 上的 ArialMT 字体,无法导入 matplotlib.pyplot
- php - 如何使用 Laravel 在 Intervention Image 包中设置图像大小和尺寸