Linux 版 (精华区)

发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标  题: ◇ 星星流讲座 0018
发信站: 紫 丁 香 (Sun Nov  8 18:28:33 1998), 转信


寄信人: guest.bbs@hgluo.hust.edu.cn 
标  题: ◇ 星星流讲座 0018
发信站: 华南理工大学 BBS木棉站
日  期: Thu Feb 20 14:46:49 1997

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test
标  题: 星星流讲座 0018
发信站: ☆清华电机☆ (Tue May 16 11:39:54 1995)


;35m第 4 讲 之 3            基本的流程控制
                        Topic: Flow Designm

再来看看比较难一点的部份:

label1:
    if (input != 0)                        ◇ 数字是否为 0 ?
    {
        scanf ("%d", &input);              □ 输入一数字并加总
        if (input > 0)                     ◇ 数字是否小於 0?
            sum += input;
        goto label1;
    }

    sum *= 1.05;                           □ 结总并加上营业税

这个地方和我们的流程图顺序不一样,我们的流程图顺序是:

          □ 输入一数字并加总 ←┬———┐
                   ↓           │ 是   │
             ◇ 数字是否小於 0?┘      │否
                   ↓否                 │
             ◇ 数字是否为 0 ? ————┘
                   ↓是

为什麽要把顺序换过来呢?那是因为流程图本身有问题。当数字小於 0 的
时候,当然是不能加总的 (钱有负值的吗?) 。而当数字等於 0 的时候,
表示输入完毕,就不需要再输入了,所以我们先判断输入数字是否为 0,
如果为 0 那就不需要再输入下一个了。输入一个数字之後,判断它的值是
否合法,然後再加总。

你也许会想到,为什麽不等全部输入完再判断呢?我们可以用阵列呀!
这是因为用阵列太浪费空间了。

现在相信给各位一个流程图,你大概都能用 if-else 和 goto 来完成了,
我们比较感兴趣的是:怎麽设计流程图?

写程式解决一个问题,可以分成五个步骤:

                        定义问题 (Requirement Collection)
                                ↓
                        分析需求 (Requirement Analysis)
                                ↓
                        程式设计 (Coding)
                                ↓
                        测试更正 (Testing and Debugging)
                                ↓
                        程式维护 (Maintainence)

我们现在要讲的,就是实施前两个步骤的一种方法。首先是定义问题:我
们要做一个收银机的程式,它可以加总,算出总金额和找钱的数目。这是
我们写这个程式的终极目标,所以不管怎麽样,做出来的程式一定必须符
合这个需求。

有了需求,我们就要分析它,研究出如何做它,一个基本的方法是画流程
图。流程图最常用的就是方块和菱形,方块代表程序,菱形代表条件判断
和分支,只要会这两个就可以了,其他的除非你考试要考,否则也不太用
的到 :p 我们现在就收银机程式的需求来想想如何画流程图。

收银机的行为是操作员把资料一笔一笔的输入,输入完之後按加总键算出
总金额。我们使用的键盘上并没有什麽加总键可以利用,这时候该怎麽办
呢?我们可以利用输入一个不可能发生的数值来当做是加总键。什麽是不
可能发生的数值?那当然是小於或等於 0 的数值了,我们就挑 0 来当做
我们的加总键。为什麽挑 0 呢?因为所有的电脑里处理条件跳跃都用 0
当作基准,这是比较深入一些的考量了。到目前为止,我们就可以画出如
下的流程了:

              □ 输入一数字 ←—┬———┐
                   ↓           │ 是   │
             ◇ 数字是否小於 0?┘      │否
                   ↓否                 │
             ◇ 数字是否为 0 ? ————┘

输入一个数值,如果数值的值不对,那麽表示操作员操作错误,必须重新
输入。那麽,输入完的数字要存在那儿呢?这是一个问题,因为如果是正
确的数字,它就没有储存的必要,直接加进总金额就可以了。所以我们可
以画流程图如下:

          □ 输入一数字并加总 ←┬———┐
                   ↓           │ 是   │
             ◇ 数字是否小於 0?┘      │否
                   ↓否                 │
             ◇ 数字是否为 0 ? ————┘

但是数字小於 0 时是不可以加总的,所以正确的流程图应为:

              □ 输入一数字 ←—┬———┐
                   ↓           │ 是   │
             ◇ 数字是否小於 0?┘      │否
                   ↓否                 │
                □ 加总                 │
                   ↓                   │
             ◇ 数字是否为 0 ? ————┘

接下来後面的东西就简单了:

                () 开始
                   ↓
              □ 输入一数字 ←—┬———┐
                   ↓           │ 是   │
             ◇ 数字是否小於 0?┘      │否
                   ↓否                 │
                □ 加总                 │
                   ↓                   │
             ◇ 数字是否为 0 ? ————┘
                   ↓是
           □ 结总并加上营业税
                   ↓
          □ 要求操作员输入收银金额 ←┐
                   ↓                 │是
        ◇ 检查金额是否小於应收货款 —┘
                   ↓否
             □ 输出找钱金额
                   ↓
               () 结束

写程式最大的障碍不在於技术不够,而是在於想像力不足。所以对於解决问题,
平常就必须多多努力学习如何分析它,这才是学习程式设计最主要的课题。

--
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。


--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.818毫秒