“自顶而下,逐步求精” 应用体会

来源:互联网 发布:春晚 知乎 编辑:程序博客网 时间:2024/05/08 20:11

作为我们程序设计的初学者,不知道如何把现实中的问题,直接转换到计算机的高级语言中,这里就需要我们转换思路,应用一种新的形势,将看似复杂的问题变得简单,看似凌乱的步骤变得有序,看似十分精确的语句,一点一点突破。

在处理代码问题的时候,普通常用函数和代码的记忆是编写程序的基础,而在这基础之上,就是我们对于问题的分析能力,和转换到代码的能力了。这个能力并不是与生俱来的,而是在观察大量程序之后,通过自己的思想与总结,渐渐地形成一种惯性思维,进而演化为一种条件反射,能对一些基本简单的套路在脑海中保留自己解决问题的模板。

当然,形成模板是大佬的常态。初学者需要对于一个单一的问题,提出自己的思考。面对看似复杂的问题,把看似形象的现实问题抽象出来,明确自己的目的,把大概的过程变成脑海中的伪代码,再经过注释和进一步修复,变成计算机高级语言。这个过程就是我理解的“自顶向下,逐步求精”。

首先,看到窗台上嗡嗡作响的洗衣机,用洗衣机举一个小例子吧。
洗衣机是我们日常经常使用的家电,大家对洗衣机的正常工作程序肯定不陌生。简单来说,洗衣机能进行三种最主要的功能。
1.正常洗涤
2.快速洗涤
3.脱水

首先是正常洗涤:这个程序的作用是利用充足的时间,将放在滚筒里面的衣服洗涤干净,对于时间的要求并不高,但是对于洁净程度要求高。所以逐步求精,我们可以大致地描述出程序的使用过程。

1.从使用者获得程序
2.设定水位
3.开始注水
4.漂洗
5.浸泡
6.排水
7.进行三次注水 + 漂洗 + 排水
8.甩干
9.报警

1.从使用者获得程序,这个方式系统默认为正常漂洗:
Get the instruction
If operator doesn’t input anything, do rinse.
2.设定水位有两种方式,如果没有输入水位,则调用感应系统进行体积质量感应,计算出将要注入的大概水位。
Get the instruction of water line.
If (operator doesn’t input anything )
order the sensing-system to get the approximate amount of water.
3.注水
Pour water in to the bucket.If there isn’t water source, warning.
4.漂洗
Do rinse for ten minute ,
If (the cover of the washing machine is open)
warning and cut the electricity;
5.浸泡
After the rinse , the machine should wait for twenty minutes to let the clothes get clean.
6.排水
Drain until there is no water in bucket.
7.三次冲洗
Int t = 3;
while (–t){
Input the correct amount of water,wash for ten minutes and drain.
}
8.甩干
If (t == 0)
{
spin-dry the clothes in the bucket .
if(the cover is open) cut off tht electricity.
}
9.发出报警
Warning until them aster come。

下面,用举一个自我的真实的例子。

UVA1588试题
这里写图片描述
非常形象的图形说明,好像张开的嘴中两排牙齿,互相重叠之后让两排牙齿成功合上。
换算成数据就是这样子了。
这里写图片描述
给出两行数据,之后1代表只有一个方块,2代表只有两个方块,如何让总体长度最短,使得两组数据能成功合在一起?
这种题目,一定要用字符串来做,但是设计到字符串和整数类型的转化,就需要动一番脑筋了。
这个非常典型的,把形象的物体图形抽象成为计算机高级语言。我们可以采用自顶而下,逐步求精的办法。

首先明确我们的目标,要输出一个整数,这个证书是他们重叠之后的总长度,要求这个总长度为最小。
所以,我们首先把这个总程序写成几个伪代码
int main function
while input two lines of characters
make a character set that have 300 place and make another has 100 place.
let the top to the 100 th position of tht first character set
make another characerset;
let the position of the below changing like this.
这里写图片描述
then make another function to judge if the addition of the same position is larger than three
if it is larger than three ,this pair is failed.
if all of them are less than three ,this pair is accepted.
then make less the least position that two pair take.
print the less.

大体上,包含:
主函数:输入输出,调用函数
判断函数:判断是否加起来之和小于三。
循环函数:从最左边一位一个一个尝试,调用判断函数。

有了这三个函数,我打出了以下代码:
起到控制作用的主函数:
这里写图片描述
判断是否大于三的函数:
这里写图片描述
承上启下作用的循环函数:
这里写图片描述

构思很好,但是发现了一个问题,发现我把top放在300 个位置的字符串组中,不能轻易地调用strlen函数来判断输入的位数,也就没办法一个一个比对了。所以我只能自己再写一个函数,来求top的位数:
这里写图片描述
有了这个函数,即使前面有很多‘0’也不用担心了。
在最终测试的时候,突然发现了一个问题。
因为我自顶向下,有了四个主要的板块,看似是没有问题了。
但接下来就是求精的过程。
发现在我main函数调用的时候,存在scanf()输入top函数。而我之前top函数全部初始化为0。而在输入字符串之后,自动在末尾增添‘\0’导致我之后比对的时候出现bug。
我又不得不写出另外一个函数,来修复这个bug,那就是把不可避免的’\0’强行放到最后吧。
这里写图片描述

终于,看到了正确的结果。。。

这里写图片描述

反思一下,从头到尾,经历了:分析题目、明确目的、写伪代码,进行构思、写主要板块,修复。是“自顶而下,逐步求精”的一次实际的体现。当然有了“逐步求精”这四个字,意味着编程序的过程并不是一帆风顺的,而更需要一步步地提升与修改。

原创粉丝点击