Как мне избежать этой печати на одной строке? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь создать квадратную форму из X и O (граница - это X, а внутренняя часть - это O), и я пытаюсь избежать последнего куска кода с моей печатью цикла for на той же строке. Любая помощь будет принята с благодарностью!

#include <iostream>
using namespace std;

int main() {
  int x = 0;
  cout << "Please enter an integer for the dimension that will represent the "
          "rows and columns: "
       << endl;
  cin >> x;
  cout << endl;

  for (int i = 0; i <= x; i++) {
    for (int j = x; j > i; j--)
      cout << "X";
    cout << endl;
  }

  for (int i = 0; i < x; i++) {
    for (int j = 0; j < i; j++) {
      cout << " ";
    }
    for (int k = x; k >= i + 1; k--) {
      cout << "X";
    }
    cout << endl;
  }
  cout << endl;

  for (int m = 0; m < x; m++) {
    cout << "X";
  }
  for (int m = 0; m < x - 2; m++) {
    cout << "X";
    for (int n = 0; n < x - 2; n++) {
      cout << "O";
    }
  }
  for (int m = 0; m < x; m++) {
    cout << "X";
  }
  cout << endl;

  return 0;
}

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Кажется, вы имеете в виду следующие выпуски вашего последнего шаблона вывода.

for (int m = 0; m < x; m++){
        cout << "X";
    }
    cout << endl;
    ^^^^^^^^^^^^^
    for (int m = 0; m < x - 2; m++){
        cout << "X";
        for (int n = 0; n < x - 2; n++){
            cout << "O";
        }
        cout << "X" << endl;
        ^^^^^^^^^^^^^^^^^^^^
    }
    for (int m = 0; m < x; m++){
        cout << "X";
    }
cout << endl;

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

Вотдемонстрационная программа.

#include <iostream>
#include <iomanip>

std::ostream & square( unsigned int n, 
                       char outer = 'X', 
                       char inner = 'O', 
                       std::ostream &os = std::cout )
{
    if ( n )
    {
        for ( unsigned int i = 0; i < n; i++ )
        {
            os << outer;
            if ( n != 1 )
            {
                os << std::setw( n - 1 ) 
                   << std::setfill( i % ( n - 1 ) == 0 ? outer : inner )
                   << outer;
            }
            os << '\n';
        }
    }

    return os;
}

int main() 
{
    const unsigned int N = 10;

    for ( unsigned int i = 1; i < N; i++ ) square( i ) << '\n';

    return 0;
}

Выход составляет

X

XX
XX

XXX
XOX
XXX

XXXX
XOOX
XOOX
XXXX

XXXXX
XOOOX
XOOOX
XOOOX
XXXXX

XXXXXX
XOOOOX
XOOOOX
XOOOOX
XOOOOX
XXXXXX

XXXXXXX
XOOOOOX
XOOOOOX
XOOOOOX
XOOOOOX
XOOOOOX
XXXXXXX

XXXXXXXX
XOOOOOOX
XOOOOOOX
XOOOOOOX
XOOOOOOX
XOOOOOOX
XOOOOOOX
XXXXXXXX

XXXXXXXXX
XOOOOOOOX
XOOOOOOOX
XOOOOOOOX
XOOOOOOOX
XOOOOOOOX
XOOOOOOOX
XOOOOOOOX
XXXXXXXXX
0 голосов
/ 03 октября 2019

Как мне избежать этой печати в той же строке?

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

std::cout << '\n'; // Add a new line

Таким образом, возможная реализация будет:

void drawSquareShape(size_t rows, size_t cols)
{
    for(size_t i = 0; i < rows; ++i)
    {
        for(size_t j = 0; j < cols; ++j)
        {
            std::cout << ( (i == 0 || j == 0 || i == rows-1 || j == cols-1) ? 'X' : 'O' );
            if(j < cols-1)
                std::cout << ' ';
        }
        std::cout << '\n';
    }
    std::cout.flush();
}

И может быть использована следующим образом:

int main()
{
    drawSquareShape(5, 8);

    return 0;
}

, который привлекает вконсоль выводит следующее:

X X X X X X X X
X O O O O O O X
X O O O O O O X
X O O O O O O X
X X X X X X X X

РЕДАКТИРОВАТЬ:

Я знаю, что это прямоугольник, а не квадрат, но его легко модифицировать / специализироватьэта функция для рисования квадрата. Например:

void drawSquare(size_t s)
{
    drawSquareShape(s, s);
}
0 голосов
/ 03 октября 2019
  1. Разделите ваш код на функции, которые выполняют простейшую задачу (согласно поговорке «разделяй и властвуй»)
  2. Избегайте повторения кода

Я бы сделал что-то вродеэто:

#include <iostream>
#include <sstream>

static void printEdge(const size_t length) {
    std::stringstream out;
    for(size_t idx{}; idx < length; ++idx) {
        out << "X" << ((idx +1 < length) ? " " : "" );
    }
    std::cout << out.str() << std::endl;
}

static void printLine(const size_t length) {
    std::stringstream out;
    out << "X ";
    for(size_t idx{}; idx < length-2; ++idx) {
        out << "O" << ((idx +1 < length-2) ? " " : "" );
    }
    out << " X";
    std::cout << out.str() << std::endl;
}

static void printRectangle(const size_t length) {
    printEdge(length);
    for(size_t idx{}; idx < length -2; ++idx) {
        printLine(length);
    }
    printEdge(length);
}


int main() {
    int x = 0;
    std::cout
        << "Please enter an integer for the dimension that will represent the rows and columns: "
        << std::endl;
    std::cin >> x;
    printRectangle(x);
}
...