我应该如何用 * 框内的大写字母打印 HI?
How should I print HI in huge block letters enclosed in a box of *?
我需要在 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;
}
如果你使用换行符,你可以在一行代码中完成,但那样做会很丑陋而且没有意义:
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;
你现在的方式很好。您也可以使用 switch 或 if 语句来询问打印正确的行以获取计数器的值,但实际上没有理由更改您已有的内容。
您可以通过使用打印内容的对称性使您的程序更容易修改:
#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;
}
这将产生相同的输出,但更改大小等要容易得多。
你可以这样做:
#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";
}
}
虽然我不推荐它。
在这种情况下,我们正在绘制图片:我认为最好的选择是直接绘制图片。您可以使用循环等来缩短长度,但在我看来,这只是隐藏了您要绘制的内容的结构而没有任何实际好处。
如果您试图概括一种打印大文本的方法,那将是另一回事,但这里不是这种情况。
在这种情况下,最好的办法可能就是使用原始字符串文字。例如:
#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";
}
另一种方法是将图像存储在文件中,然后只打印出文件的内容。
在我看来,大多数其他答案 "smarter" 都不如您的答案。
它们比你的矮。该程序可能比您的程序小。但它们仍然很特殊,除了打印 "HI" 之外没有任何用处。那么,为什么不像您那样以直接的方式进行呢?
现在,如果您希望能够以这种形式打印 任意 盒装消息 - 那么您就有理由尝试 "optimize",使用循环等。为此,您也许可以查看 figlet 实用程序的源代码,它采用任意文本并使用自定义字体文件:
$ figlet -f bigascii12 HI
## ## ######
## ## ######
## ## ##
## ## ##
## ## ##
######## ##
######## ##
## ## ##
## ## ##
## ## ##
## ## ######
## ## ######
我需要在 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;
}
如果你使用换行符,你可以在一行代码中完成,但那样做会很丑陋而且没有意义:
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;
你现在的方式很好。您也可以使用 switch 或 if 语句来询问打印正确的行以获取计数器的值,但实际上没有理由更改您已有的内容。
您可以通过使用打印内容的对称性使您的程序更容易修改:
#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;
}
这将产生相同的输出,但更改大小等要容易得多。
你可以这样做:
#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";
}
}
虽然我不推荐它。
在这种情况下,我们正在绘制图片:我认为最好的选择是直接绘制图片。您可以使用循环等来缩短长度,但在我看来,这只是隐藏了您要绘制的内容的结构而没有任何实际好处。 如果您试图概括一种打印大文本的方法,那将是另一回事,但这里不是这种情况。
在这种情况下,最好的办法可能就是使用原始字符串文字。例如:
#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";
}
另一种方法是将图像存储在文件中,然后只打印出文件的内容。
在我看来,大多数其他答案 "smarter" 都不如您的答案。
它们比你的矮。该程序可能比您的程序小。但它们仍然很特殊,除了打印 "HI" 之外没有任何用处。那么,为什么不像您那样以直接的方式进行呢?
现在,如果您希望能够以这种形式打印 任意 盒装消息 - 那么您就有理由尝试 "optimize",使用循环等。为此,您也许可以查看 figlet 实用程序的源代码,它采用任意文本并使用自定义字体文件:
$ figlet -f bigascii12 HI
## ## ######
## ## ######
## ## ##
## ## ##
## ## ##
######## ##
######## ##
## ## ##
## ## ##
## ## ##
## ## ######
## ## ######