BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0018 
发信站: ☆清华电机☆ (Tue May 16 11:39:54 1995) 
 
 
第 4 讲 之 3            基本的流程控制 
                        Topic: Flow Design 
 
再来看看比较难一点的部份: 
 
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,谢谢。 
 
 

BBS水木清华站∶精华区