1. 程式人生 > >7-1 列印沙漏 (20 分)

7-1 列印沙漏 (20 分)

7-1 列印沙漏 (20 分)

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“”,要求按下列格式列印
****
***



所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:
19 *

輸出樣例:
*****
***



  • 2

實驗程式碼

include <stdio.h>

void shalou(int n, char c);
int main (void)
{
int n;
char c;
scanf("%d %c", &n, &c);
shalou(n, c);

return 0;

}
void shalou(int n, char c)
{
int y=0, N=-1, line=0, x=1, a, i, b, d, e, f, sum=0;
while(1){
N=N+2;
line++;
y=y+N;
if(n-2y+1==0) {
break;
}
if(n-2

y+1<0){
N=N-2;
line=line-1;
break;
}
}
for(i=1; i<=line; i++){
for(a=0; a<N; a++){
printf("%c", c);
}
N=N-2;
printf("\n");
if(i!=line){
for(b=1; b<=x; b++){
printf(" ");
}
x=x+1;
}
sum=sum+a;
}
for(d=1; d<=line-1; d++){
for(e=1; e<=x-2; e++){
printf(" ");
}
x=x-1;
for(f=0; f<N+4; f++){
printf("%c", c);
}
N=N+2;
printf("\n");
sum=sum+f;
}
printf("%d", n-sum);
}

設計思路
第一步:宣告一個無返回值函式shalou(int n, char c),在主函式中做一個單獨語句使用。
第二步:定義函式shalou(int n, char c)
:用while迴圈語句來確定行數和最後一行有多少個符號
:用第一個for來列印上沙漏上部分,再巢狀兩個for,第一個用來輸出符號,第二個用來輸出空格,最後用一個計數器計算第一個for用了多少個符號
:第二個for用來輸出沙漏下部分,同上。
:最後輸出沒有用的符號數

除錯過程遇到的問題及解決方法
第一個除錯問題:在除錯while語句時,沒清楚條件,並且也弄混了我下一步需要的變數
問題解答:思考了許久,靈光一閃,一切關係都明瞭了。
第二個問題:後面輸出沙漏可以用絕對值的方法進行編寫,但是我覺得這個for語句更適合我,
問題解答:一氣呵成編寫出來,中間有少許瑕疵,但是我覺得用for編寫更舒服。

執行結果截圖