題目要求:輸入 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 - in - i + 1n + i - 1 + 2*(n-1) = 3n - i - 1 (下底比上底寬 2*(n-1))#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;
}
Input n: 4
*******
* *
* *
*************
i 精確計算星號數與空白數。printf("\n") 僅在行末呼叫一次。掌握幾何規律,迴圈控制即清晰可控。