2016-03-18 26 views
3

我想从下面的代码做出这个形状。我很困惑如何使它打印第二行,倒数第二颗星,而不打印明星之前跳过并打印额外的空间。一旦明确了下半部分,当星星展开时,代码是否与上半部分相似?我已经尝试了c和r之间的几个代码组合,但我一直坚持我目前的。C++:如何从此代码制作此形状?

---------------------- //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; 
} 
+4

如果你不得不做手工,你会用什么逻辑? –

+1

尝试通过为上半部分和下半部分创建两个不同的环(一个用于循环(用于行))中的两个环)。这将很容易理解并且以这种方式实现。 –

+0

广场左侧怎么没有'|'? – NathanOliver

回答

3

我只是把两个变量left=0 & right=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; 

} 
+0

啊,非常感谢你!这现在非常合理。我一直试图在几个小时内完成不同的陈述,只是无法让它做我想要的哈哈 – cknox

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