Прямоугольная форма с символами внутри нее, размещенными с определенной шириной

#c

#c

Вопрос:

Я пытаюсь воспроизвести это:

 Type the height and width of the rectangle: 10 13

 ------------- 
|   w   w   w |
|  w   w   w  |
| w   w   w   |
|w   w   w   w|
|   w   w   w |
|  w   w   w  |
| w   w   w   |
|w   w   w   w|
|   w   w   w |
|  w   w   w  |
 ------------- 
 

 Type the height and width of the rectangle: 0 0

 - 
 - 
 

 Type the height and width of the rectangle: 4 1
    
     - 
    | |
    | |
    | |
    |w|
     - 
 

Я успешно создал подпрограмму, которая распечатала прямоугольник (хотя это беспорядочно и есть очевидные дублирования кода). Как я могу в той же подпрограмме (или, может быть, в другой) распечатать 'w' и заполнить пустые пробелы пробелами? Значение width каждого ‘ w' равно 4 пробелам. У меня вроде как есть идея. Это мы делаем cout << setfill(' ') << setw(4) << 'w' , а затем if-statement , если значение setw превышает <= width , оно будет выполнять 'n'
Однако это мой код, и я был бы очень признателен за то, как можно улучшить мой код и как реализовать символ шириной 4 внутри прямоугольника.

 #include <iostream>
#include <iomanip>

using namespace std;

void print_rectangle (int const width,
              int const height)

{
  cout << ' ' << '-';

  for (int i {1}; i < width;   i)

    {
      cout << '-';
    }

  cout << ' ' << endl;

  for (int j {}; j < height;   j)

    {
      cout << '|' << setw(width   1) << '|' << endl;
    }

  cout << ' ' << '-';

  for (int i {1}; i < width;   i)
  
    {
      cout << '-';
    }

  cout << ' ' << endl;

}

int main()

{
  int width {};
  int height {};

  cout << "Enter the height and width of the rectangle: ";
  cin >> height;
  cin >> width;
  print_rectangle(width,height);

  return 0;
}
 

Комментарии:

1. небольшой рефакторинг должен дать вам больше шансов сделать это самостоятельно: godbolt.org/z/3xqxxTWjf

2. Кто научил вас использовать фигурные скобки для инициализации int s? Это некрасиво. И зачем использовать пустые фигурные скобки вместо явного указания нуля?

3. Согласен, @Jim , но это стало влиятельным. Я думаю, что это люди, пытающиеся создать универсальное правило инициализации, в котором они найдут дыры, как только начнут создавать контейнеры.

4. @JimRhodes это ваше мнение. Это вызывает инициализацию встроенных типов по умолчанию, и это прекрасно (здесь не нужно).

5. @JimRhodes Мой профессор делает это вместо ввода «int i = 0;» или «int i {0};», поэтому я тоже это делаю.

Ответ №1:

Ну, решение для второй части, в которой будут напечатаны «w» и пробелы, выглядит следующим образом:

 #include <iostream>
#include <iomanip>

using namespace std;

void print_rectangle (int const width,
              int const height)

{
    int counter=1;
    int remainder= (width 1) % height;
  cout << ' ' << '-';

  for (int i = 1; i < width;   i)

    {
      cout << '-';
    }

  cout << ' ' << endl;

  for (int j =0 ; j < height;   j)

    {
        if(j == 0 || j == height )
      cout << '|' << setw(width   1) << '|' << endl;
        else
        {
            cout << '|';
            for (int i = 0; i <width ; i  )
            {
                if(counter % remainder == 0)
                    cout<<"w";
                else
                   cout<<" ";

                counter  ;
            }

            cout << '|'<<endl;

        }
    }

  cout << ' ' << '-';

  for (int i =1 ; i < width;   i)
  
    {
      cout << '-';
    }

  cout << ' ' << endl;

}

int main()

{
  int width =0;
  int height =0;

  cout << "Enter the height and width of the rectangle: ";
  cin >> height;
  cin >> width;
  print_rectangle(width,height);

  return 0;
}
 

Я также протестировал на нем данные варианты ввода, и это дает правильный результат. Здесь происходит то, что остаток от высоты и ширины 1 дает нам остаток, и с помощью этого остатка мы собираемся напечатать буквы w. Счетчик увеличивается в цикле, и всякий раз, когда этот счетчик кратен этому остатку, w будет напечатан иначе пробел.

Вот выходные данные тестового примера input 4 и 1 output

И вот результат ввода тестового примера 10 и 13 вывод

Ответ №2:

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

 using std::setw;

void print_ending(std::ostreamamp; out, int const width) {
    out << ' ' << std::string(width, '-') << ' ' << 'n';
}

void print_row(std::ostreamamp; out,
               int const width,
               int const period,
               int offset) {
    out << '|' << std::string(std::min(width, offset), ' ');
    if (offset < width) {
        out << 'w';

        auto remainin_width = width - offset - 1;
        for (int i = remainin_width / period; i > 0; --i) {
            out << setw(period) << 'w';
        }
        out << std::string(remainin_width % period, ' ');
    }
    out << "|n";
}

void print_rectangle(std::ostreamamp; out,
                     int const width,
                     int const height,
                     int period = 4) {
    print_ending(out, width);
    for (int j{}; j < height;   j) {
        print_row(out, width, period, (height - j) % period);
    }
    print_ending(out, width);
}
 

Живая демонстрация