打印沙漏編程總結


7-1 打印沙漏 (20 分)

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

*****
 ***
  *
 ***
*****

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最后在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:

*****
 ***
  *
 ***
*****
2

1)實驗代碼


#include<stdio.h>
#include<math.h>
int main()
{
    int i,j,k,a,b,c,d=0;;
	char op;
	scanf("%d %c",&a,&op);
	for(i=3;;i=i+2)//用循環試出菱形最長一條的星數,要從星數為3的一邊算起 
	{
		c=i*2;//菱形有上下對稱,算總數要乘2. 
		d=d+c;//把每邊的星數相加,算總數 ,總數只有大於或等於輸入數的情況,大於就是多加了一行 
		if(d+1>a)
		{ 
		    i=i-2;//i是最長一層的星數 
			break;
		}
		if(d+1==a)
		{
			break;//總數剛剛好,沒有多加一層,直接輸出i 
		} 
	}
	int z=0;//計算打印出來的星數 
	int g=i;//i同時也是從上往下數菱形的層數 
	int e=(i-1)/2;int f=e;//空格數最多為e,然后逐層遞減 
	for(int h=1;h<=g;h++)//菱形層數
	{ 
		for(j=fabs(e);j<f;j++)
		{
			printf(" ");//星前空格數 
		}
		for(int k=fabs(i);k>0;k--)
		{
		printf("%c",op); //每一層的星數 
		z++; 
	    }
		printf("\n");
		e=e-1;//用絕對值讓空格數從少到多,再到少。
		i=i-2;//每層星數相差兩個 
		if(i==-1)
		{
			i=i-2;//當i=1時,i-1=-1,則i=-1時,又輸出一個星,一顆星的有了兩層,需要將i變成-3. 
		} 
    }
    printf("%d",a-z);
    return 0;
 } 

2)設計思路

3)本題調試過程碰到問題及解決辦法

這題以前做過,有印象,這次做沒有遇到問題,一次性通過。

4).運行結果截圖


免責聲明!

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



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