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)本題調試過程碰到問題及解決辦法
這題以前做過,有印象,這次做沒有遇到問題,一次性通過。