C ++:如何从这段代码中创建这个形状?

时间:2016-03-18 16:53:40

标签: c++ if-statement for-loop

我正在尝试通过以下代码制作此形状。我很困惑如何在打印明星之前打印第二行,倒数第二行而不跳过它并打印额外的空间。一旦确定了下半部分,当星星向外扩展时,代码是否与上半部相似?我在c和r之间尝试了几种代码组合,但我一直坚持我目前的情况。

---------------------- //row 0
*                   *| //row 1
* *               * *| //row 2
* * *           * * *|
* * * *       * * * *|
* * * * *   * * * * *|
* * * * * * * * * * *|
* * * * *   * * * * *|
* * * *       * * * *|
* * *           * * *|
* *               * *|
*                   *|
----------------------

#include <iostream>

using std::cout; using std::cin; using std::endl;

int main() {
    cout << "Enter a positive odd number less than 40: ";
    int num = 0;
    int z = 1;

    for (int a = 0; a < 3; ++a)
    {   
        cin >> num;
            if (num < 38 && num > 0 && num % 2 == 1)
            {
                cout << "Thank you!" << endl << endl;

                for (int r = 0; r < num; ++r)  //outer loop/rows
                {
                    for (int c = 0; c < num; ++c)  //inner loop/columns
                    {
                        if (r == 0) cout << "--"; //top of square
                        else if (c >= r + r - c && c < num - 1)
                            cout << "  ";
                        //else if (c == num - 1) cout << "*|";
                        else if (r == num - 1) cout << "--"; //bottom of square
                        else if (c == num - 1) cout << "*|"; //right side of square
                        else if (r > c) cout << "* ";
                    }
                        cout << endl;

                }
                break;
            }
            else cout << "Please enter a positve odd number that is less than 40!" << endl;
    }
    cout << endl;
}

3 个答案:

答案 0 :(得分:3)

我刚刚接受了两个变量left=0&amp; right=num-1并增加left&amp;在rightr<=num/2我打印col <= left之后,我将col >=right*推迟#include <iostream> using std::cout; using std::cin; using std::endl; int main() { cout << "Enter a positive odd number less than 40: "; int num = 0; int z = 1; for (int a = 0; a < 3; ++a) { cin >> num; if (num < 38 && num > 0 && num % 2 == 1) { cout << "Thank you!" << endl << endl; int left=0,right=num-1; //for printing top line for(int i = 0; i < num; i++) cout<<"- "; cout<<"-"<<endl; for (int r = 0; r < num; ++r) //outer loop/rows { //printing columns for(int c = 0; c < num; c++) { if(c <= left || c >= right) cout<<"* "; else cout<<" "; } if(r >= num/2) //checking for half of the rows { left--;right++; } else { left++;right--; } cout<<"|"<<endl; } //for printing last additional line for(int i = 0; i < num; i++) cout<<"- "; cout<<"-"<<endl; break; } else cout << "Please enter a positve odd number that is less than 40!" << endl; } cout << endl; } ,直到sudo locale-gen pt_BR 。 我希望这很容易理解 这是代码:

python -c "import locale; locale.setlocale(locale.LC_ALL, 'pt_BR')"

答案 1 :(得分:1)

这种方法是数学方式。

此外,它在边缘绘制一个带有加号的完整帧。

试一试。

#include <iostream>
#include <cmath>

using std::cout; using std::cin; using std::endl;

int main() {
  cout << "Enter a positive odd number less than 40: ";
  int num = 0;
  int z = 1;

  for (int a = 0; a < 3; ++a) {
    cin >> num;
    if (num < 40 && num > 0 && num % 2 == 1) {
      cout << "Thank you!" << endl << endl;

      int center = ceil(num / 2.0);

      for (int r = 0; r <= num+1; ++r) { //outer loop/rows
        for (int c = 0; c <= num+1; ++c) { //inner loop/columns
          if (r == 0 || r == num+1) {
            if (c == 0 || c == num+1)
              cout << "+"; // corner
            else
              //top or botton of square between corners
              if (c == center)
                cout << "-";
              else
                cout << "--";
          }
          else if (c == 0 || c == num+1) {
            cout << "|"; // left or right frame
          } else {
            // inner part
            if ((center-std::abs(center-r)) >= center-std::abs(center-c))
              if (c < center)
                cout << "* ";
              else if (c > center)
                cout << " *";
              else
                cout << "*";
            else
              if (c == center)
                cout << " ";
              else
                cout << "  ";
          }
        }
        cout << endl;
      }
    } else
      cout << "Please enter a positve odd number that is less than 40!" << endl;
  }
  cout << endl;
}

答案 2 :(得分:1)

另一种方式(通过更多用户输入检查):

#include <iostream>
#include <string>
#include <limits>
#include <sstream>

using std::cout;
using std::cin;
using std::string;

const auto ssmax = std::numeric_limits<std::streamsize>::max();

const int max_dim = 40;
const int max_iter = 3;

int main() {
    cout << "Enter a positive odd number less than " << max_dim << ": ";
    int num = 0, counter = 0;

    while ( counter < max_iter ) {   
        cin >> num;
        if ( cin.eof() ) 
            break;
        if ( cin.fail() ) {
            cout << "Please, enter a number!\n";
            cin.clear();
            cin.ignore(ssmax,'\n');
        }
        if ( num < max_dim  &&  num > 0  &&  num % 2 ) {
            cout << "Thank you!\n\n";

            //top line
            string line(num * 2, '-');
            cout << line << '\n';

            for ( int r = 0, border = num - 1; r < num; ++r ) {
                cout << '*';
                for ( int c = 1; c < num; ++c ) {
                    if ( (c > r  &&  c < border) || (c < r  &&  c > border) )
                        cout << "  ";
                    else
                        cout << " *";
                }    
                // right border
                cout << "|" << '\n';
                --border;
            }

            //bottom line
            cout << line << '\n';

            ++counter;
        } else {
            cout << "Please, enter a positive odd number that is less than 40!\n";
        }
    }
    cout << std::endl;
}

或者我最喜欢的:

        // top line
        string line = string(num * 2, '-') + '\n';
        cout << line;

        // inside lines
        int r = 0, border = ( num - 1 ) * 2;
        string inside = string(border + 1, ' ') + "|\n";
        // top
        while ( r < border ) {
            inside[r] = '*';
            inside[border] = '*';
            r += 2;
            border -= 2;
            cout << inside;
        }
        // center line
        inside[r] = '*';
        cout << inside;
        // bottom
        while ( border > 0 ) {
            inside[r] = ' ';
            inside[border] = ' ';
            r += 2;
            border -= 2;
            cout << inside;
        }

        //bottom line
        cout << line;