首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言列印空心等腰梯形:邏輯修正與完整代碼

     編輯:程式設計綜合問答

題目要求:輸入 n,列印高度為 n 的空心等腰梯形。上底寬 2n-1,下底寬 4n-3,左右邊緣為 *,中間空白。以下分析常見錯誤並給出正確實現。

錯誤代碼分析

for (i=1; i<=n; i++) {
    if (i==1 || i==n) {          // 首尾行
        for (j=1; j<=n-i; j++) printf(" ");   // 前導空格
        for (j=n-j+1; j<=n+i+1; j++) printf("*"); // 錯誤:j 已被改變,邊界混亂
        printf("\n");
    } else {                      // 中間空心行
        for (j=1; j<=n-i; j++) {
            printf(" ");
            if (j==i || j==3*i+1) printf("*"); // 邏輯錯誤:星號位置計算不正確
            printf("\n");        // 換行位置錯誤,應在內層迴圈外
        }
    }
}

主要問題:

  • 迴圈變數 j 在多層迴圈中重複使用且未重置。
  • 星號列印條件 j==i || j==3*i+1 不符合梯形幾何關係。
  • printf("\n") 位置導致每列都換行。

正確幾何關係

第 i 行 (1-based):

  • 前導空格數:n - i
  • 首星號位置:n - i + 1
  • 尾星號位置:n + i - 1 + 2*(n-1) = 3n - i - 1 (下底比上底寬 2*(n-1))
  • 首行 (i=1) 與尾行 (i=n) 全星號填滿。

修正代碼

#include <stdio.h>

int main() {
    int n, i, j;
    printf("Input n: ");
    scanf("%d", &n);

    for (i = 1; i <= n; i++) {
        // 前導空格
        for (j = 1; j <= n - i; j++) printf(" ");

        if (i == 1 || i == n) {
            // 首尾行:連續星號
            int stars = (i == 1) ? (2*n - 1) : (4*n - 3);
            for (j = 1; j <= stars; j++) printf("*");
        } else {
            // 中間空心行:兩側星號
            printf("*");                          // 左邊緣
            for (j = 1; j <= (2*i - 3) + 2*(n-2); j++) printf(" "); // 中間空白
            printf("*");                          // 右邊緣
        }
        printf("\n");
    }
    return 0;
}

執行範例 (n=4)

Input n: 4
   *******
  *     *
 *       *
*************

關鍵點總結

  1. 分離「首尾行」與「中間行」邏輯。
  2. 使用獨立迴圈變數,避免汙染。
  3. 根據行號 i 精確計算星號數與空白數。
  4. printf("\n") 僅在行末呼叫一次。

掌握幾何規律,迴圈控制即清晰可控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved