Как мне печатать HI большими печатными буквами, заключенными в коробку *? - PullRequest
2 голосов
/ 24 марта 2020

От меня требуется вывести Hi в виде огромной печатной буквы, которая заключена в коробку * в C ++. изображение требуемого вывода До сих пор мне только удалось выяснить базовый c способ, которым я печатаю каждую строку за строкой, но есть ли более разумный способ сделать это?

Вот что мне удалось до сих пор

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

Ответы [ 5 ]

6 голосов
/ 24 марта 2020

Вы можете сделать это следующим образом:

#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 голосов
/ 24 марта 2020

Большинство других ответов, на мой взгляд, не "умнее", чем ваши.

Они на короче , чем ваши. Программа может быть меньше вашей. Но они по-прежнему уникальны c и бесполезны ни для чего, кроме печати "HI". Так почему бы просто не сделать это простым способом, как у вас?

Теперь, если вы хотите иметь возможность печатать произвольных вложенных в коробку сообщений в этой форме - тогда у вас будет причину, чтобы попытаться «оптимизировать», используйте loops et c. Для этого, возможно, вы можете посмотреть исходный код утилиты figlet , которая принимает произвольный текст и использует файлы пользовательских шрифтов:

$ figlet -f bigascii12 HI

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

4 голосов
/ 24 марта 2020

В данном случае мы рисуем картинку: я бы сказал, что лучше всего нарисовать картинку напрямую. Вы можете использовать петли и тому подобное, чтобы сократить длину, но, на мой взгляд, это просто скрывает структуру того, что вы пытаетесь нарисовать, без реальной выгоды. Если вы пытались обобщить метод печати большого текста, это было бы другой историей, но здесь это не так.

В этом случае, вероятно, лучшее, что вы можете сделать, это использовать необработанный строковый литерал. Например:

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

Другой вариант - сохранить изображение в файле и просто распечатать содержимое файла.

1 голос
/ 24 марта 2020

Вы можете немного упростить модификацию вашей программы, используя симметрию того, что вы печатаете:

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

Это даст тот же результат, но гораздо проще изменить размер и тому подобное.

0 голосов
/ 24 марта 2020

Вы можете сделать это одной строкой кода, если используете символ новой строки, но это будет уродливо и не имеет смысла делать это так:

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, чтобы попросить вывести правильную строку для значения счетчика, но на самом деле нет никаких причин менять то, что у вас уже есть.

...