1、SI-NS图程序设计与开发方法
[题目] 编一程序,读入形式为XXX…X<A>B的字符串,其中A和B是2到10之间的整数,X是0到9的数字,XXX…X是一个A进制的数字串,代表一个A进制的整数。要求将此整数转换成B进制的整数再输出。例如程序读入的字符串是:
178<10>2
它表示将一个10进制的整数178转换成一个二进制的整数,然后再输出。
[提示] 该题看似简单,却涉及对输入字符串的语法和语义分析。这里采用自顶向下、逐步扩充的SI-NS图程序设计与开发方法,并将该题分解成以下一个个简单得多的问题和步骤加以解决。
(1)用语法图设计一个符合题意的文法,文法的语法分析程序能对读入的字符串进行语法检查。
(2)用SI-NS图设计文法的语法分析程序,并测试程序。
(3)将语法分析程序扩充为能辨别类似于“17<2>8”这种语意上不合法的字符串错误,并测试程序。
(4)将程序扩充成能实现十以内不同进制数据的转换,并测试程序。
以下是解题过程:
(1)用语法图设计一个符合题意的文法,文法的语法分析程序能对读入的字符串进行语法检查。
文法的语法图如下:
(2)用SI-NS图设计文法的语法分析程序,并测试程序。
①依据语法图,设计SI-NS图语法分析程序(最好用铅笔,便于修改)。
②在设计好的SI-NS图上执行并验证程序逻辑(Code Walkthrough),该程序能够辨认出如:20<8>、8<18>3等输入字符串的语法错误,但不能辨别出符合语法但不符合语意的错误,如:17<2>8。
③依据设计好的SI-NS图,键盘输入相应的程序(注:稍加训练,就可以达到熟练的程度)。
④立即将程序变换成SI-NS图,并比较生成的SI-NS图与手工设计的SI-NS图两者在结构上是否一致,以确认输入代码的正确性。
整个过程如下图所示:
⑤添加相关变量和过程说明,使语法分析程序可以编译执行。这时最好变换并打印出一份可执行程序的SI-NS图。
⑥在计算机上测试程序。测试过程如果遇到问题,总是先对打印出来的SI-NS图分析并进行修改,没有问题后再修改代码程序,并随时将修改后的程序又变换成SI-NS图。这样,分析SI-NS图就是分析代码程序。修改代码程序,通过随后的变换,等同于修改SI-NS图。总之,软件工程师始终面对的是SI-NS图,再也不需要为分析和读懂程序耗费太多无谓的精力。
以下是扩充了read(ch)、 error过程,以及ch等变量后可以上机执行的SI-NS图语法分析程序(扩充部分用红色标记),右图是点击了等号键后,对输入有语法错误字符串测试的实况。
(3)将语法分析程序扩充为能辨别类似于“17<2>8”这种语意上不合法的字符串错误,并测试程序。
算法是:将读入形式为XXX…X<A>B字符串中的每一个字符X与A比较,假如有大于或等于A的X,则出现语义错误。
实施的扩充如下:
①新增i、j、以及数组A变量,i的初始值为零。
②将左图3个用不同颜色标记的read(ch)分别扩充成右图所示的语句块。
③以下是作了语义分析扩充后的SI-NS图语法分析程序(扩充部分用红色标记),该程序不仅能识别输入字符串的语法错误,还能识别语义错误。右图是点击等号键后对输入有语义错误字符串测试的实况。
(4)将程序扩充成能实现不同进制数字串的转换,并测试程序。
算法是:
①先将XXX…X<A>B字符串中的A进制字符串“XXX…X”转换成十进制数Iten。
②再将十进制数Iten通过对B进制值求模取余转换成B进制的数。
以下是在原有SI-NS图程序基础上为实现不同进制数据转换而进行的又一次扩充(扩充部分用红色标记)。
③以下是完成了不同进制数据转换扩充后点击等号键的SI-NS图程序,以及最后的测试实况。
[结束语]
(1)在上述程序设计与开发过程中,软件工程师始终面对的是读起来远比程序容易理解得多的SI-NS图。用SI-NS图算法设计,在SI-NS图上执行并验证程序的算法逻辑(Code Walkthrough)。当计算机执行结果与预期的不一致时,在SI-NS图上分析出错原因并进行修改。当有新的需求时,首先也在SI-NS图上找到相关的程序模块,扩充和修改相应的程序逻辑。即便用到计算机也是短暂的,不耗费精力的,而且完全可以交给其他人去做。软件工程师的聪明才智都可以用在刀刃上,并始终保持充沛的精力和清醒的头脑。这样的开发模式能保证程序的开发质量,一次开发成功率非常高,自然能有效缩短软件的开发周期,降低软件的开发成本。
(2)对于一个复杂的问题,能否善用分解的方法,分解为一个个简单得多的问题和步骤,是软件工程师分析和解决问题能力强弱的一个重要标志。在解决问题过程中,往往又采用自顶向下、逐步扩充的方法,解决一个,测试一个,然后在此基础上扩充,再解决下一个,这样步步为营,直到问题被完整解决。这种方法能保证设计出来的程序有较高的可靠性、可用性和可维护性。
(3)许多编程的人,容易犯的一个毛病是,将简单的问题复杂化,复杂的问题简单化。设计出来的程序只有自己可以用,别人一用就出问题。倘若能学习采用上述SI-NS图程序设计与开发方法,相信能很快克服毛病,开发出高质量、高可靠、高可信的程序。
(4)最后,为了检验您的学习能力,试用上述方法,解决“十六以内不同进制数据转换”的问题。例如程序读入的字符串是:
178A<16>2
它表示将一个16进制的整数178A转换成一个二进制的整数,然后再输出。
文法用语法图定义如下:
|