求解步骤与文档规范pascal

如题所述

求解步骤与文档规范

1. 求解步骤
通过计算机系统来求解一个问题,一般应经过以下几个步骤:

1.1 明确问题要求;

1.2 建立求解问题的数学模型与计算方法;

1.3 算法分析, 也就是确定待解问题的数据对象之间的关系与求解步骤, 或者说确定数据结构与算法;

1.4 程序设计, 即使用程序设计语言将由1.3所确定的数据结构与算法根据自顶向下、逐步求精的原则描述出来,逐步形成符合该程序设计语言语法规则的程序。该程序我们将其称之为源程序。

1.5 编译运行,源程序必需经过计算机系统的编译程序编译,然后生成目标程序后才能运行。在这个步骤中,通常使用预先准备好的与问题有关的数据,让计算机系统运行目标程序,通过调试,以最终显示或输出正确的运行结果。

上面提到的是比较理想的流程。但事实上,往往难以避免各种错误。错误通常来自两个方面:一类是书写或录入程序时由于疏忽和遗漏,导致程序不合语法要求,计算机系统无法理解。如:缺少标点符号、缺少语句成分等。这类错误在编译时都能检查出来,编译程序会将这些错误的有关信息反馈出来,以供修改源程序后重新编译。
另一类错误,往往是算法上的错误。例如:没有给定变量的初始值、计算公式本身有错误、出现了不应有的运算,或是计算机无法完成的计算,例如除法的除数为零等等。这些错误一般要在运行阶段才能发现、或者不能发现而得到错误的结果。这一类错误的纠正往往比较困难。但是,一般可以通过调试得以解决。

调试,是指为了确保运行结果的正确,可根据问题预先知道的一些结果进行测试。即用一些预先准备好的数据,在程序中的一些特定位置上检验是否能够得到预期的结果。调试与测试都能在一定程度上提供程序正确与否的信息。这些调试与测试信息将能指导程序人员修改原来的算法与源程序,然后再重新进行编译与调试运行,直到得到正确结果为止。

2. 文档规范

为了加快程序的形成,便于程序的管理、推广与使用,针对求解问题的过程,应该强调在每一个工作步骤都要形成一个规范的文档。一般来说该文档应包括五个部分:
(1) 问题要求。指待解问题的各项要求、指标,应当能十分明确与详细地进行书写,这既是以后进行程序设计的依据,也是检验程序正确性的唯一标准。
(2) 算法分析。包括待解问题的数学模型、数据结构、计算方法。
(3) 程序设计。应自顶向下、逐步求精地生产程序。先描述总体算法,再描述局部细节。程序应有注解,并有详细使用说明。
(4) 调试记录。在调试过程中所出现的问题与解决的措施,以及采用哪些数据验证程序,运行结果与实际是否相符等方面的记载与分析。
(5) 小结。通过求解这一问题,分析采用的算法有哪些特点,这一算法还能适用于哪些方面,以及怎么样优化该算法或扩充程序功能等。
这五个部分的内容,应当在整个求解问题的过程中逐步形成,而不是在测试完毕后再形成。特别是在学习程序设计的开始阶段,就应注意逐步培养这种良好的工作习惯。

3. 例题
一. 问题描述:
所谓H数, 是指该数除1以外,只有2,3,5,7四种因子。如:630即为满足条件的H数,而22却不是。要求对键盘输入的自然数N,求出第N个H数。如:当N=30时,应输出49。这里规定的H数不超过长整型数的范围。
二. 问题分析:
题目要求的H数不超过长整型范围,即最多可达 2^31 数量级,
显然用穷举或逐一判断的方法效率太低无法接受。能否有更好的办法呢?那就是构造法。
分析题目,我们可以发现H数只有4种,这就启发我们可以考虑从因子出发由小到大的生成H数。具体操作是:利用4个指针分别代表2,3,5,7这4个因子,表中存有第一个H数1。一开始,它们均指向1,即当前四个数为2*1,3*1,5*1,7*1。取四个数中最小者为第二个H数2,记入表中,并将代表2的指针下移一,指向2。再比较2*2,3*1,5*1,7*1, 取3。再将代表3的指针下移一,指向3,以此类推。直到求得的H数的个数达到输入要求为止。
三. 算法设计
4个指针由数组 P, MARK实现, P 表示指针指向表中的位置,MARK
表示指针代表的因子。H数表由数组A来表示。四数中若有相等者,
取一个即可,并将相应指针下移一格。

四. 程序清单:
const
max=5910;
var
I,j,N,min :longint;
p,mark :array[1..4]of longint;
a :array[1..max] of longint;

Begin
a[1]:=1;
mark[1]:=2; mark[2]:=3; mark[3]:=5; mark[4]:=7;
for I:=1 to 4 do p[I]:=1;
for I:=2 to max do
begin
min:=a[p[1]]*mark[1]; {找出下一个H数}
for j:=2 to 4 do
if a[p[j]]*mark[j] < min
then min:=a[p[j]]*mark[j];
a[I]:=min;
for j:=1 to 4 do {找出四数中相等的H数并下移指针}
if a[p[j]]*mark[j]=min then p[j]:=p[j]+1;
end;

repeat {读入所求的H数位置,N=1时结束}
readln(N);
writeln(‘N=’;N);
writeln(a[N]);
until N=1;

End.

五.运行结果:
N=100 450
N=389 15309
N=1998 7056000
N=4096 260406090
N=5910 2143750000
温馨提示:答案为网友推荐,仅供参考