簡體   English   中英

C ++:如何從這段代碼中創建這個形狀?

[英]C++: How do I make this shape from this code?

我試圖從下面的代碼中形成這個形狀。 我很困惑如何打印第二行,第二行到最后一顆星而不跳過它並在打印星星之前打印額外的空間。 一旦確定了下半部分,當星星向外擴展時,代碼是否與上半部相似? 我在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;
}

我只剩下兩個變量left=0right=num-1並且left增加並right減小直到r<=num/2 ,之后我反轉過程,當col <= leftcol >=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;

}

這種方法是數學方式。

此外,它在邊緣繪制了一個帶有加字符的完整框架。

試試看。

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

只是另一種方式(有一些更多的用戶輸入檢查):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM