“自顶向下,逐步求精”方法简要介绍

来源:互联网 发布:apache 2.2.3 漏洞 编辑:程序博客网 时间:2024/06/05 15:35

什么是自顶向下,逐步求精

  • “自顶向下, 逐步求精”是结构化程序设计常见的思路。
  • “自顶向下”是将复杂、大的问题划分为小问题,找出问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。
  • “逐步求精” 是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。复杂问题经抽象化处理变为相对比较简单的问题。经若干步抽象(精化)处理,最后到求解域中只是比较简单的编程问题。

总的来说,就是采用模块分解与功能抽象和分而治之的方法分解细化大问题到足以解决的小问题。

类比

数学上的分析法是“自顶向下, 逐步求精”思想的一种展现。分析法由果索因,由需知逐步推向已知结果,最后由已知的能解决的问题得到未知问题的结果。
借由分析的过程,可以将复杂问题逐步简单化,直至解决问题。
如:要判断两个根式的大小,可以将其进行适当的变换直到问题归结为判断两个整数的大小。

程设实例

问题:
这里写图片描述
分析:
题目显然是让我们打印一个旗帜,输入的第一个数字是其行数,第二个数字是其列数,再仔细分析发现整图案可以分为三部分,其中上半部分有星号空格和等号,下半部分全是等号;
再细分上半部分又可分为左半部分和右半部分,左半部分奇数行打印星号在前,空格在后,两者交叉出现,右半部分奇数行全为等号,偶数行全为空格;
最后再考虑每个符号出现的位置即可写出答案。
1. 根据总思路写出主程序:

int main(){    int m,n;    scanf("%d%d",&m,&n);    for(int j=0 ; j < m ; ++j){        if (j < m/2){            print_left(n,j);            print_right(n,j);        }        else print_down(n,j);        printf("\n");    }}

先读取输入数据,再按行依次打印上半部分的左边和右边和下半部分,打完每行后输出换行符。
2. 打印上半部分每行的左半部分。

void print_left(int n,int j){    if (j%2 == 0){        for (int i=0 ; i < n/2 ; i++){            if (i%2 == 0) printf("*");            else printf(" ");        }    }    else  {         for (int i=0 ; i < n/2 ; i++){            if (i%2 == 0) printf(" ");            else printf("*");        }    }}

如果是奇数行,则先打印星号再打印空格,偶数行则先打印空格再打印星号,共打印到列数的一半。
3. 同理,打印上半部分每行的右半部分

void  print_right(int n,int j){    for (int i=0 ; i < n/2 ; i++){        if (j%2 ==0) printf("=");        else  printf(" ");    }}

奇数行打印等号,偶数行打印空格,打印列数的一半次。
4. 打印下半部分

void print_down(int n,int j){    for (int i=0 ; i < n ; i++){        if (j%2 == 0) printf ("=");        else printf(" ");    }}

就这样,应用“自顶向下,逐步求精”的方法,通过分析旗帜的构成,分部求解,我们得到了这道题的解法。