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-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編寫更舒服。
有一個很好的辦法,就是把問題分成幾個大塊進行調試,這樣會更簡潔明了,最后只需拼裝就好

調試了其實很多次,但是忘了截圖,現在也不怎么想找回那個錯誤的思路再重新調試了

運行結果截圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM