【问题标题】:How should I print HI in huge block letters enclosed in a box of *?我应该如何在 * 框中以大块字母打印 HI?
【发布时间】:2020-07-04 11:37:42
【问题描述】:

我需要在 C++ 中用 * 框括起来的大块字母输出 Hi。 image of the output required 到目前为止,我只是想出了一个基本的方法来逐行打印,但是有没有更聪明的方法呢?

这是我到目前为止所管理的

#include <iostream>
using namespace std;

int main(){
  cout << "**********************" << endl;
  cout << "*                    *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HHHHHHHH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*   HH    HH     II  *" << endl;
  cout << "*                    *" << endl;
  cout << "**********************" << endl;
  return 0;
}

【问题讨论】:

  • 不,这是你能做的最好的。
  • 如果您读取带有字符的文件并输出它会更通用,如果您只有基本字母形状并且可以缩放它并根据字符串和比例绘制框,则更智能 - - 因为你无论如何都不能去上学;-)
  • 称某事为“更聪明”似乎相当主观。当您不需要选项/灵活性时,过度设计解决方案是否更明智?如果没有更具体的标准,我认为这个问题属于“产生自以为是的答案”类别。 (对不起。)

标签: c++ c++11 pretty-print ascii-art


【解决方案1】:

你可以这样做:

#include <iostream>
using namespace std;

int main(){
  for (int i = 0; i < 13; ++i) {
    for (int j = 0; j < 22; ++j) {
      char c = ' ';
      if (i == 0 || i == 12) c = '*';
      else if (j == 0 || j == 21) c = '*';
      else if (i >= 2 && i <= 10) {
        if (j >= 5 && j <= 12) {
          if (i == 6 || j == 5 || j == 6 || j == 11 || j == 12) c = 'H';
        }
        if (j == 17 || j == 18) c = 'I';
      }
      cout << c;
    }
    cout << "\n";
  }
}

我不推荐它。

【讨论】:

  • 是的,我想知道是否有这样的方法,但考虑到所涉及的所有不同数字以及另一种通过充分利用对称性来做到这一点的方法,我也会避免这种情况哈哈。不过感谢您的帮助! :D
【解决方案2】:

在我看来,大多数其他答案并不比你的“聪明”。

它们比你的短。该程序可能比您的程序小。但它们仍然是特殊的,除了打印“HI”之外,它们对任何其他东西都没有用。那么,为什么不像您一样以直接的方式来做呢?

现在,如果您希望能够以这种形式打印 任意 框封闭消息 - 那么您就有理由尝试“优化”、使用循环等。为此,您或许可以查看figlet 实用程序的源代码,它接受任意文本并使用自定义字体文件:

$ figlet -f bigascii12 HI

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

【讨论】:

    【解决方案3】:

    在这种情况下,我们正在绘制图片:我想说最好的选择是直接绘制图片。您可以使用循环等来缩短长度,但在我看来,这只是隐藏了您尝试绘制的结构,并没有真正的好处。 如果您试图概括一种打印大文本的方法,那将是另一回事,但这里不是这种情况。

    在这种情况下,您能做的最好的可能就是使用原始字符串文字。例如:

    #include <iostream>
    
    int main() {
        std::cout << 
    R"(**********************
    *                    *
    *   HH    HH     II  *
    *   HH    HH     II  *
    *   HH    HH     II  *
    *   HH    HH     II  *
    *   HHHHHHHH     II  *
    *   HH    HH     II  *
    *   HH    HH     II  *
    *   HH    HH     II  *
    *   HH    HH     II  *
    *                    *
    **********************)" << "\n";
    }
    

    另一种选择是将图像存储在文件中,然后打印出文件的内容。

    【讨论】:

    • 使用原始字符串文字的好主意。
    【解决方案4】:

    您可以通过使用打印内容的对称性使您的程序更容易修改:

    #include <iostream>
    using namespace std;
    
    void n_lines(int n)
    {
        for (auto i = 0; i < n; i++)
          cout << "*   HH    HH     II  *" << endl;
    }
    
    void star_line()
    {
        cout << "**********************" << endl;
    }
    
    void empty_line()
    {
        cout << "*                    *" << endl;
    }
    
    int main(){
      star_line();
      empty_line();
      n_lines(4);
      cout << "*   HHHHHHHH     II  *" << endl;
      n_lines(4);
      empty_line();
      star_line();
      return 0;
    }
    
    

    这将产生相同的输出,但更改大小等要容易得多。

    【讨论】:

    • 天哪,这实际上更聪明了,谢谢你的建议!非常感激 ! :D
    【解决方案5】:

    如果你使用换行符,你可以在一行代码中做到这一点,但这样做会很丑,而且没有意义:

    cout << "**********************\n*                    *\n*   HH    HH     II  *\n*   HH    HH     II  *\n*   HH    HH     II  *\n*   HH    HH     II  *\n*   HHHHHHHH     II  *\n*   HH    HH     II  *\n*   HH    HH     II  *\n*   HH    HH     II  *\n*   HH    HH     II  *\n*                    *\n**********************" endl;
    

    你现在拥有它的方式很好。您还可以使用开关或 if 语句来要求打印正确的行以获取计数器的值,但实际上没有理由更改您已经拥有的值。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2020-09-07
      相关资源
      最近更新 更多