C++程序打印X星形图案


以不同的形状(如金字塔、正方形和菱形)显示星形图案是基础编程和逻辑开发的常见部分。在我们学习编程中的循环语句时,我们遇到了各种涉及星形和数字图案的问题。本文将演示如何使用星号打印X或十字形。

我们将看到两种方法来实现相同的结果。第一种方法稍微复杂一些,但第二种方法效率更高。

X星形图案(使用两组空格)

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

对于此图案,行数为n = 5。这是上半部分。整个X图案有2n – 1行。让我们看看如何使用下表来实现这一点:

行号 星号数量 左侧空格 中间空格 描述
1 2 0 7 当i = n时,打印一个星号,否则打印两个星号。左侧空格为(i – 1),中间空格为2(n – i) - 1
2 2 1 5
3 2 2 3
4 2 3 1
5 1 4 -
6 2 3 1 左侧星号递减,如n – (i – n) – 1 = 2n – i – 1。中间空格将遵循:2*(i – n) - 1
7 2 2 3
8 2 1 5
9 2 0 7

算法

  • 读取n作为输入
  • 对于i从1到2n - i,执行以下操作
    • 如果i <= n,则
      • 对于j从1到i - 1,执行以下操作
        • 显示空格
      • 结束循环
      • 显示星号
      • 如果i和n不相等,则
        • 对于j从1到2(n - i) - 1,执行以下操作
          • 显示空格
        • 结束循环
        • 显示星号
      • 结束if
    • 否则
      • 对于j从1到2n - i - 1,执行以下操作
        • 显示空格
      • 结束循环
      • 显示星号
      • 对于j从1到2(i - n) - 1,执行以下操作
        • 显示空格
      • 结束循环
      • 显示星号
    • 结束if
    • 将光标移动到下一行
  • 结束循环

示例

#include <iostream>
using namespace std;
void solve( int n ){
   for ( int i = 1; i <= 2*n - 1; i++ ) {
      if ( i <= n ) {
         for ( int j = 1; j <= i - 1; j++ ) {
            cout << ". ";
         }
         cout << "*  ";
         if ( i != n ) {
            for ( int j = 1; j <= 2 * (n - i) - 1; j++ ) {
               cout << "  ";
            }
            cout << "*  ";
         }
      } else {
         for ( int j = 1; j <= (2 * n) - i - 1; j++ ) {
            cout << ". ";
         }
         cout << "*  ";
         for ( int j = 1; j <= 2 * (i - n) - 1; j++ ) {
            cout << "  ";
         }
         cout << "*  ";
      }
      cout << "\n";
   }
}
int main(){
   int n = 8;
   cout << "X Star Pattern for " << n << " lines." << endl;
   solve( n );
}

输出

X Star Pattern for 8 lines.
*                            *  
. *                        *  
. . *                    *  
. . . *                *  
. . . . *            *  
. . . . . *        *  
. . . . . . *    *  
. . . . . . . *  
. . . . . . *    *  
. . . . . *        *  
. . . . *            *  
. . . *                *  
. . *                    *  
. *                        *  
*                            *

输出(n = 10)

X Star Pattern for 10 lines.
*                                    *  
. *                                *  
. . *                            *  
. . . *                        *  
. . . . *                    *  
. . . . . *                *  
. . . . . . *            *  
. . . . . . . *        *  
. . . . . . . . *    *  
. . . . . . . . . *  
. . . . . . . . *    *  
. . . . . . . *        *  
. . . . . . *            *  
. . . . . *                *  
. . . . *                    *  
. . . *                        *  
. . *                            *  
. *                                *  
*                                    *  

使用网格方法

可以通过考虑一个网格来解决相同的问题,并且从这个网格中,我们可以计算出打印星号和打印空格的公式。

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

从上面的网格可以很容易地理解,星号只会在列号与行号相同(对角线)以及列号为(2n + 1 – i)时放置。

算法

  • 读取n作为输入
  • m = 2n - i
  • 对于i从1到m,执行以下操作
    • 对于j从1到m,执行以下操作
      • 如果j等于i或j等于(m + 1) - i,则
        • 显示星号
      • 否则
        • 显示空格
      • 结束if
    • 结束循环
    • 将光标移动到下一行
  • 结束循环

示例

#include <iostream>
using namespace std;
void solve( int n ){
   int m = 2*n - 1;
   for ( int i = 1; i <= m; i++ ) {
      for ( int j = 1; j <= m; j++ ) {
         if (j == i || j == (m + 1 - i))
            cout << "* ";
         else
            cout << ". ";
      }
      cout << endl;
   }
}
int main(){
   int n = 6;
   cout << "X Star Pattern for " << n << " lines." << endl;
   solve( n );
}

输出

X Star Pattern for 6 lines.
* . . . . . . . . . * 
. * . . . . . . . * . 
. . * . . . . . * . . 
. . . * . . . * . . . 
. . . . * . * . . . . 
. . . . . * . . . . . 
. . . . * . * . . . . 
. . . * . . . * . . . 
. . * . . . . . * . . 
. * . . . . . . . * . 
* . . . . . . . . . * 

输出(n = 8)

X Star Pattern for 8 lines.
* . . . . . . . . . . . . . * 
. * . . . . . . . . . . . * . 
. . * . . . . . . . . . * . . 
. . . * . . . . . . . * . . . 
. . . . * . . . . . * . . . . 
. . . . . * . . . * . . . . . 
. . . . . . * . * . . . . . . 
. . . . . . . * . . . . . . . 
. . . . . . * . * . . . . . . 
. . . . . * . . . * . . . . . 
. . . . * . . . . . * . . . . 
. . . * . . . . . . . * . . . 
. . * . . . . . . . . . * . . 
. * . . . . . . . . . . . * . 
* . . . . . . . . . . . . . * 

结论

星形图案易于使用,并且对于学习编程循环概念很有用。本文演示了如何使用C++来显示左对齐和右对齐半菱形图案。然后,在考虑n行数的情况下,使用星号显示X或十字图案。为此,我们提供了两种方法。一种使用填充和空格,另一种使用网格计算。我们添加了点而不是添加空格。否则,它们有时会从输出中修剪空格。

更新于: 2022年12月14日

4K+浏览量

开启你的职业生涯

完成课程获得认证

开始学习
广告

© . All rights reserved.