如何避免在同一行上打印?

时间:2019-10-03 11:31:08

标签: c++ loops for-loop

我试图从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 个答案:

答案 0 :(得分:2)

看来您的意思是您的最后一个模式输出的以下版本。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

如何避免在同一行上打印?

我不确定我是否很好地理解了您的问题,但是您只需要使用\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);
}