我应该如何用*框内的大字体打印HI?

问题描述 投票:0回答:5

我必须以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
5个回答
0
投票

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

#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;
}

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


5
投票

您可以这样做:

#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";
  }
}

不过我不推荐。


5
投票

我认为,大多数其他答案都不比您的答案“聪明”。

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

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

$ figlet -f bigascii12 HI

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


4
投票

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

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

#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";
}

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


0
投票

如果使用换行符,您可以在一行代码中完成此操作,但是这样做很丑陋,那样做是没有意义的:

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语句,要求在右行显示计数器的值,但实际上没有理由更改已经拥有的值。

© www.soinside.com 2019 - 2024. All rights reserved.