PTA 7-82 打印沙漏 帮我改改我的屎山代码

最近遇到一个问题,写代码之前我没有思考算法,直接蒙头大写特写,跑起来遇到问题这里修修那里补补,最后跑是能跑出正确结果,但是整个框架看起来很恶心。变量巨多,维护成本很高。请问各位有什么办法提高写代码效率?有什么书籍推荐?

比如:本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

我写的代码是这样的(感谢大家花时间看我制造的屎):

#include 

//我悟了!!循环条件里加入变量,变量自增放在前,就可以避免多输出一组!!
//还要保证min>=0

int main(){
    int N;
    char sign;
    scanf("%d ",&N);
    scanf("%c",&sign);
    int min,i=1;
    min=N-1;
    while (min>=i)
    {
        i += 2;
        min -= 2*i;
    }
    if (min<0)
    {
        min += 2*i;
        i -= 2;
    }
    //printf("min=%d,i=%d\n",min,i);
    
    int j,m,temp=i+2;                //j记录行号,m记录列号,行i/2,temp增2
    for (j=0;jif (j<=i/2)
        {
            for (int k=j;k>0;k--)
            {
                printf(" ");
            }
            temp -= 2;
            for (m=temp;m>0;m--)
            {
                printf("%c",sign);
            } 
        } else {
            temp += 2;
            for (int k=(i-temp)/2;k>0;k--)
            {
                printf(" ");
            }
            for (m=temp;m>0;m--)
            {
                printf("%c",sign);
            }
        }
        printf("\n");
    }
    printf("%d",min);
    return 0;
}

代码结构:将生成沙漏的过程封装成了一个函数。

#include <stdio.h>

// 生成沙漏
void printHourGlass(int N, char sign) {
    int min = N - 1;
    int i = 1;
    // 计算行数和剩余符号数
    while (min >= i) {
        i += 2;
        min -= 2 * i;
    }
    if (min < 0) {
        min += 2 * i;
        i -= 2;
    }

    int j, count, width = i + 2;
    // 生成沙漏
    for (j = 0; j < i; j++) {
        count = j <= i / 2 ? width -= 2 : width += 2;
        int k;
        for (k = 0; k < (i - count) / 2; k++) {
            printf(" ");
        }
        for (k = 0; k < count; k++) {
            printf("%c", sign);
        }
        printf("\n");
    }
    printf("%d", min);
}

int main() {
    int N;
    char sign;
    scanf("%d %c", &N, &sign);

    printHourGlass(N, sign);

    return 0;
}