星号形状

时间:2014-11-30 22:43:04

标签: c++ shapes

我需要将这个形状(或类似的)用于星号:

 *           *   
 * *       * * 
 * * * * * * *
 * *       * * 
 *           *

我有点知道如何做'嵌套for循环'。我只能做一个三角形,我需要两个并排...

#include <iostream>
using namespace std;

int main()
{
    cout<<"Insert A Number...\n" <<endl;
    int i;
    int j;
    int size;
    cin >> size;
    for(i=1;i<size*2;i+=2)
    {
        cout<<endl;
        for(j=(size-i)/2+1;j>=0;j--)
        {
            cout<<' ';
        }
        for(j=0;i>j;j++)
        {
            cout<<'$';
        }
    }
    cin.get();
    return 0;
}

4 个答案:

答案 0 :(得分:1)

一些观察可以帮助您:

  1. 前N行包含星号作为行 号。
  2. 将形状视为一个矩形,其中一个三角形为 星号,其他空间。
  3. 同一行的第二个形状是第一个的镜像。
  4. N后的行减少星号数,但增加 空格数。
  5. 例如,给定N为10:
    第1行有1个星号,10 - 1个空格,10 - 1个空格,1个星号 2号线有2个星号,10 - 2个空格,10 - 2个空格,2个星号 3号线有3个星号,10-3个空格,10-3个空格,3个星号 4号线有4个星号,10-4个空格,10-4个空格,4个星号 // ...
    11号线有9个星号,10-9个空格,10-9个空格,9个星号 12号线有8个星号,10-8个空格,10-8个空格,8个星号 13号线有7个星号,10-7个空格,10-7个空格,7个星号。

    看到任何模式?

答案 1 :(得分:0)

您的代码会打印一个顶部为峰值的三角形。你想要的是一个横向三角形 - 实际上是其中两个。要弄清楚如何做到这一点,请在纸上完成一个例子。

如果您在上面显示,假设输入为3,您将如何打印每一行?

  • 第1行左边有一颗星,右边有一颗星。
  • 第2行左边有两颗星,右边有两颗星。
  • 第3行左边有三颗星,中间有一颗星,右边有三颗星。
  • 第4行左边有两颗星,右边有两颗星。
  • 第5行左边有一颗星,右边有一颗星。

获取每一方星数的简便方法是从1计算到3,然后从2倒计时到1。现在你只需要计算每行的空格数。还有最长线中心的孤星问题,这意味着你必须单独处理这条线。

当用户输入3时,下面的程序会准确打印出您在问题中显示的输出。请注意我如何定义一对辅助函数repeat()printRow(),以避免多次编写相同的代码。

#include <iostream>
#include <string>
using namespace std;

void repeat(int n, string s) {
  for (int i = 0; i < n; ++i) {
    cout << s;
  }
}

void printRow(int size, int i) {
  repeat(i, "* ");
  repeat(2*(size-i)+1, "  ");
  repeat(i-1, "* ");
  cout << "*" << endl;
}

int main() {
    cout << "Enter a number:" << endl;
    int size;
    cin >> size;
    for (int i = 1; i < size; ++i) {     // Rows of increasing length.
      printRow(size, i);
    }
    repeat(2*size, "* ");                // Middle row.
    cout << "*" << endl;
    for (int i = size-1; i >= 1; --i) {  // Rows of decreasing length.
      printRow(size, i);
    }
    return 0;
}

答案 2 :(得分:0)

考虑一下如何逐行,而不是从左到右思考,如果你要用于循环。

答案 3 :(得分:0)

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    cout << "Insert A Number...\n" << endl;
    int size;
    cin >> size;

    int user_rows = size;
    int user_cols = ceil(user_rows / 2.0)*2;

    for (int row = 1; row <= user_rows; row++) { //print each row of asterisks

        int asterisksPerSide = (row * 2 <= user_rows) ? row : user_rows - row + 1;
        int spacesTotal = user_cols - (2 * asterisksPerSide);

        for (int asterisksPrinted = 0; asterisksPrinted < asterisksPerSide; asterisksPrinted++) { //print first part of row
            cout << "*";
        }

        for (int spacesPrinted = 0; spacesPrinted < spacesTotal; spacesPrinted++) { //print spaces
            cout << " ";
        }

        for (int asterisksPrinted = 0; asterisksPrinted < asterisksPerSide; asterisksPrinted++) { //print last part of row
            cout << "*";
        }
        cout << endl;
    }
}