#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
Ответ №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);
}