1. 程式人生 > >2019寒假作業1(列印沙漏)程式設計總結

2019寒假作業1(列印沙漏)程式設計總結

7-1 列印沙漏 (20 分)

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
*****
 ***
  *
 ***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。

輸入格式:

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

輸出格式:

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

輸入樣例:

19 *

輸出樣例:

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

1).實驗程式碼

#include <stdio.h> 
#include <math.h> 
int main()
{
    int i=1,m,n,x=1,y,z,h,l,a;
    char c;
    scanf("%d %c",&m,&c);
    while(2*x-1<=m){
        i=i+2;
        x=x+i;
    }
    i=2-i;
    n=2-i;
    while(i<fabs(n)){
        for(z=1;z<(fabs(n)-fabs(i))/2;z++){
            printf(" "); 
        }
        for(h=1;h<=fabs(i);h++) {
            printf("%c",c);
        }
    printf("\n");
    if(i!=-1){
    i=i+2;
}
    else{
    i=i+4;
}
 } 
 a=m-2*(x-fabs(i))+1;
 printf("%d",a);
 return 0;
}

2).設計思路

第一步:考慮到組成沙漏所用符號數等於首項為1,公差為2的等差數列的前n項和的兩倍減1,運用while迴圈算出小於或等於輸入值的最大符號數和末項的值。
第二步:取末項的值及其負數結合while迴圈控制迴圈次數。
第三步:需要輸出的空格數等於末項的值減去當前需要輸出符號數除以2,運用for迴圈控制輸出空格的次數,再運用for迴圈控制輸出所輸入的符號的次數,最後輸出換行符進如下一次while迴圈。(為了防止連續兩行輸出一個符號,需要加一個if-else語句去掉其中一行的輸出)
第四步:剩下的符號數等於輸入值減去最大符號數。輸出剩下的符號數。

3)。本題除錯過程碰到的問題以及解決辦法

碰到的問題:編譯錯誤。
解決辦法:仔細對比輸出示例後發現每行都多輸出了一個空格,將第15行for(z=1;z<=(fabs(n)-fabs(i))/2;z++){改為for(z=1;z<(fabs(n)-fabs(i))/2;z++){後答案正確。

4).執行結果截圖