自顶向下,逐步求精

来源:互联网 发布:sql和access的区别 编辑:程序博客网 时间:2024/06/05 05:42

自顶向下是一种程序开发技术,其中问题被分解为更容易处理的子问题,这些子问题的解决方案组合起来构成整体问题的解决方案。

下面,采用“自顶向下,逐步求精”的技术来设计求一个班级测验成绩平均分的程序。

首先,给出表示“顶”的伪码:

Determine the class average for this qiuz.

这个顶是表示整个程序功能的一句话,但它不能够为我们编写C语言程序提供足够多的细节信息。所以,要逐步将其细化,即逐步求精。求精的过程是将“顶”划分为一系列更小的任务,并将这些任务按照它们将被处理的顺序罗列成一个任务清单。

下面是进行第一次求精的结果:

Initialize variables

Input, sum, and count the quiz grades

Calculate and printf the class average

采用顺序结构--

每一次求精的结果,都是对算法的完整描述,它们的差别只在于精华、细化的程度不同。

接着向更高一级精化,即进行第二次求精。在第二次求精中,开始接触到变量。这个程序需要一个不断增值的数据总和变量total,需要一个统计已处理数据个数的计数器counter,还需要一个用来接收用户输入成绩的变量grade,最后需要一个保存平均分的变量average。经过上面的分析,第一条伪码语句第二次求精的结果是:

Initialize total to zero 

Initialize counter to zero

接下来对第二条伪码语句进行第二次求精。这条语句需要一个循环结构来实现成绩的逐个输入,采用“标记控制的循环”。首先用户逐个输入学生成绩,当最后一个合法的成绩被输入后,用户将输入“标记值”。每次接受到一个用户的输入,程序都要判断是否是“标记值”。若不是,则将输入累加到总和变量total中,并将计数器变量counter加一;若是,则终止循环。第二次求精的结果是:

Input the first grade

While the user has not as yet entered the sentinel 

           Add this grade into the running total

           Add one to the grade counter

           Input the next grade ( possibly the sentinel )

同理,最后一条伪码语句求精的结果是:

If the counter is not equal to zero

           Set the average to the total divided by the counter

           Print the average

else

           Print " No grade were entered "

最后,方法总结: