C++输入菱形数组

sh7euo9m  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(181)

我有一个问题与此代码,它跳到3星号,和我想要的程序遵循星号顺序.如1到2到3星号等.我想要的程序只接受数字和不特殊字符.

*

                                                            **
  
                                                            ***

                                                           ****

                                                           *****

                                                           ****

                                                           ***

                                                            **

                                                            *

所需输出示例^
代码:

#include <iostream>

using namespace std;

int main() {
 
  cout << "Enter a number: ";
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n - i; j++) {
      cout << " ";
    }
    for (int j = 1; j <= 2 * i - 1; j++) {
      cout << "*";
    }
    cout << endl;
  }

  for (int i = n - 1; i >= 1; i--) {
    for (int j = 1; j <= n - i; j++) {
      cout << " ";
    }

    for (int j = 1; j <= 2 * i - 1; j++) {
      cout << "*";
    }

    cout << endl;
  }

  return 0;
}

例如,我输入5,星号就不跟着了,它只是跳到3,例如,1,3,等等。

mwg9r5ms

mwg9r5ms1#

让我给你解释一下如何解决这个问题。
让我们把大问题分解成小问题。
如果我们只看星号的个数,也就是说,只看字符,而不看缩进或前导空格,那么我们可以看到输入5:

Row   Asterics   Number of asterics
 0                0
 1     *          1
 2     **         2
 3     ***        3  
 4     ****       4
 5     *****      5
 6     ****       4
 7     ***        3
 8     **         2
 9     *          1
10                0

所以我们需要一个函数,它能把行数转换成星号的个数,然后我们看到一个模式,看起来像金字塔或者三角形。
这就引出了三角函数,请阅读here,在这类函数中,"绝对值"起着重要作用,在C++中,我们可以使用std::abs
此外,我们可以看到,创建菱形的前导空格数就是给定的宽度减去星号数,再除以2。
有了这些知识,我们现在可以进行以下简单计算:

Number of stars         leading blanks
Row  width-abs(row-width)    abs(row-width)/2 
 0             0                  5/2 = 2 
 1             1                  4/2 = 2
 2             2                  3/2 = 1 
 3             3                  2/2 = 1
 4             4                  1/2 = 0 
 5             5                  0/2 = 0
 6             4                  1/2 = 0       
 7             3                  2/2 = 0 
 8             2                  3/2 = 1
 9             1                  4/2 = 2  
10             0                  5/2 = 2

此外,我们可以看到行数是宽度的2倍。
有了这些,我们就可以编写一个简单的程序,只使用一个for循环。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>

int main() {
    // Get the max width of the pattern and perform a short input validation
    int maxWidth{};
    if ((std::cin >> maxWidth) and (maxWidth > 0)) {

        // The number of rows for the pattern is dependent on the width. It is a simple relation
        const int numberOfRows = 2 * maxWidth;

        // Show all rows
        for (int row = 1; row < numberOfRows; ++row) {

            // Use triangle formular to create star pattern
            const std::string starPattern(maxWidth - std::abs(row - maxWidth), '*');

            // Create leading spaces
            const std::string leadingSpaces(std::abs(row - maxWidth)/2, ' ');

            // Show output
            std::cout << leadingSpaces << starPattern << '\n';
        }
    }
    else std::cout << "\n*** Error: Invalid input\n\n";
}

请注意,在创建字符串时,我们使用了它的constructor number 2。在这里,您可以指定std::string的长度和填充字符。
如果你不想使用字符串,那么你需要再次添加2个for循环。
请参阅:

#include <iostream>
#include <cmath>

int main() {
    // Get the max width of the pattern and perform a short input validation
    int maxWidth{};
    if ((std::cin >> maxWidth) and (maxWidth > 0)) {

        // The number of rows for the pattern is dependent on the width. It is a simple relation
        const int numberOfRows = 2 * maxWidth;

        // Show all rows
        for (int row = 1; row < numberOfRows; ++row) {

            // Calculate number of characters using the trinagular formular idea
            const int numberOfStars = maxWidth - std::abs(row - maxWidth);
            const int numberOfSpaces = std::abs(row - maxWidth) / 2;

            // print leading spaces
            for (int i = 0; i < numberOfSpaces; ++i)
                std::cout << ' ';

            // print stars
            for (int i = 0; i < numberOfStars; ++i)
                std::cout << '*';
            // Create new line
            std::cout << '\n';
        }
    }
    else std::cout << "\n*** Error: Invalid input\n\n";
}

而且,如果您甚至没有std::abs,您可以自己创建这样的函数。
那么代码就是

#include <iostream>

int absValue(int v) {
    if (v < 0)  v = -v;
    return v;
}

int main() {
    // Get the max width of the pattern and perform a short input validation
    int maxWidth{};
    if ((std::cin >> maxWidth) and (maxWidth > 0)) {

        // The number of rows for the pattern is dependent on the width. It is a simple relation
        const int numberOfRows = 2 * maxWidth;

        // Show all rows
        for (int row = 1; row < numberOfRows; ++row) {

            // Calculate number of characters using the trinagular formular idea
            const int numberOfStars = maxWidth - absValue(row - maxWidth);
            const int numberOfSpaces = absValue(row - maxWidth) / 2;

            // print leading spaces
            for (int i = 0; i < numberOfSpaces; ++i)
                std::cout << ' ';

            // print stars
            for (int i = 0; i < numberOfStars; ++i)
                std::cout << '*';
            // Create new line
            std::cout << '\n';
        }
    }
    else std::cout << "\n*** Error: Invalid input\n\n";
}

输出与您指定的相同。请查找宽度为5的最后一个示例:

这里宽度为20:

相关问题