8

我正在从“像程序员一样思考”这本书中学习和提高我的编程技能,我被要求展示这种金字塔。

########
 ######
  ####
   ##

我用这段代码做到了

for(int i = 0; i < 4; i++){

    for(int k = 0; k < i; k++)
        cout << ' ';

    for(int j = 0; j < 8 - i * 2; j++)
        cout << '#';

    cout << '\n';
}

但是......问题是“使用与本章前面的形状程序相同的规则(只有两个输出语句 - 一个输出哈希标记和一个输出行尾),编写一个生成的程序以下形状:

我不确定,但是否可以只用 2 个语句而不使用空格字符来显示类似的内容?

编辑。

谢谢大家的回答。但根据作者的说法,我应该只用cout << '#'and来做这件事cout << '\n'。这是我的观点,因为似乎使用某些方法或函数进行操作不是一种选择。

编写一个仅使用两个输出语句 cout << "#" 和 cout << "\n" 的程序,以生成形状像 ... 当然使用循环的哈希符号模式:P

4

4 回答 4

10
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
    for(int i = 0; i < 4; i++) {
        cout << setw(8-i) << string(8-i*2, '#') << endl;
    }
    return 0;
}
于 2013-05-14T22:39:53.807 回答
7

不幸的是,这个问题的答案要简单得多:作者错误。前几个问题的措辞应该也允许使用单个空格输出(cout << " ";)。我不知道我们是如何在编辑中错过了这一点,对于由此造成的混乱,我深表歉意。一般来说,任何旨在迫使读者去“挖掘”的练习在这一点上都会很清楚。

顺便说一句,第一版中的这个问题和其他问题在我的网站上可以找到的文档中进行了讨论。如果您对本书有其他疑问或问题,请与我联系。

于 2013-05-24T02:18:54.670 回答
0

您可以在循环中检查每一行的位置。这与 3 个操作数运算符相结合可以通过两个输出语句解决此问题。

for(int i = 0; i < 4; i++){

    for(int k = 0; k <= 8-i; k++)
        cout << k<i ? ' ' : '#';

    cout << endl;
}

无论如何,前导空格字符都会在那里,您不能用“空”空格代替它们。

于 2013-05-14T22:45:06.353 回答
0

我不知道这是否与不使用的“艺术”有关cout << ' ',但在这种情况下,还有另一个巧妙的解决方案:

#include <iostream>

int main() {
    for (int i = 0; i < 4; ++i, std::cout << '\n') {
        for (int j = 0; j < 8-i; ++j) {
            std::cout << (char)('#' - 3*(j<i));
        }
    }
}

而且,另一个更晦涩的版本使用 ASCII 表示而不是' '显式编写,只使用一个 for 循环:

int main() {
    for (int i = 1; i < 37; ++i) {
        std::cout << (char)(35-3*((i%9)<=((i-1)/9)) - 3*((i%9)>=(9-(i-1)/9)) \
            - 22*(!(i%9)) );
    }
}

我并不是说这是一种好的编程实践,但也许它可以帮助某人再次意识到它最终是所有数字和寄存器。

于 2013-05-23T16:25:07.660 回答