【问题标题】:C++: How do I make this shape from this code?C++:如何从这段代码中制作这个形状?
【发布时间】:2016-07-05 13:00:02
【问题描述】:

我正在尝试从下面的代码中制作这个形状。我很困惑如何让它打印第二行,倒数第二个星,而不是在打印星之前跳过和打印额外的空间。一旦弄清楚了下半部分,当星星向外扩展时,代码会与上半部分相似吗?我尝试了 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;
}

【问题讨论】:

  • 如果你必须手动做,你会使用什么逻辑?
  • 尝试为上半部分和下半部分创建两个不同的循环(一个 for loop(for rows) 中的两个循环)。这种方式很容易理解和实现。
  • 正方形的左边怎么没有|
  • 我会试试@RajeevSingh,谢谢!
  • 为什么拒绝39?这是一个小于 40 的正奇数。

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


【解决方案1】:

我只取了两个变量left=0right=num-1 并增加了left 并减少了right 直到r&lt;=num/2,之后我颠倒了这个过程,当col &lt;= leftcol &gt;=right 我打印了@987654328 @。 我希望它会很容易理解。
代码如下:

#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;

}

【讨论】:

  • 啊,非常感谢!现在这完全有道理。几个小时以来,我一直在尝试制定不同的陈述,但无法让它做我想做的事哈哈
【解决方案2】:

这种方法以数学方式实现。

此外,它会在边缘绘制一个带有加号字符的完整框架。

试一试。

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

【讨论】:

    【解决方案3】:

    只是另一种方式(更多的用户输入检查):

    #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;
    

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2017-04-09
      相关资源
      最近更新 更多