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+瀏覽量

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告