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-2*y+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語句時,沒清楚條件,並且也弄混了我下一步需要的變量,還忘了賦初始值
![(https://img2018.cnblogs.com/blog/1581854/201901/1581854-20190113121215924-1372711420.png)
]
問題解答:思考了許久,靈光一閃,一切關系都明了了。
第二個問題:后面輸出沙漏可以用絕對值的方法進行編寫,但是我覺得這個for語句更適合我,
問題解答:一氣呵成編寫出來,中間有少許瑕疵,但是我覺得用for編寫更舒服。
有一個很好的辦法,就是把問題分成幾個大塊進行調試,這樣會更簡潔明了,最后只需拼裝就好
調試了其實很多次,但是忘了截圖,現在也不怎么想找回那個錯誤的思路再重新調試了
運行結果截圖

