师:通过前面的学习,我们学会了运用模块化程序设计的思想和方法解决一些简单问题,感受到了模块化程序设计思想的独特魅力,也体验到了编程求解问题带来的乐趣。但我们发现,用一些简单的模块化程序解决太复杂的问题,有时甚至无法实现。那有没有更自然的方法帮助我们解决问题呢?当然有。从今天开始,我们来学习第五章面向对象的程序设计,首先学习第一节面向对象程序设计的基本思想。
之前我们学习了结构化程序设计思想,它是一种面向过程的设计方法,把程序定义为数据结构加算法,将程序和过程分开。这意味着当描述事物的程序算法发生变化时,对应的函数和过程也要改变。上个世纪60年代末出现了软件危机,随着软件造价越来越高,软件开发人员负担越来越重。为解决这场危机,人们探索了很多方法,其中就有面向对象的技术。
说到对象,在第三章我们已接触过。计算机软件开发过程,是人们使用各种计算机语言将现实世界映射到计算机世界的过程。在现实世界中,任何事物都可称作对象,比如人、汽车、电脑。如果将软件结构建立在对象而非过程之上,计算机的求解过程就更类似人们的思想逻辑活动,按照我们平时认识客观世界的方式进行,这就是最自然、最容易被理解和接受的计算机求解问题的方法,面向对象技术便应运而生。
那么,什么是面向对象程序设计的思想呢?它基于一种自然、朴素的思想,追求把现实中的对象尽可能直接映射到软件系统的求解空间,将数据结构和算法结合起来,不再分开。在软件系统中构造一个个对象,实现对现实世界的直接模拟,这样用户就能用最小的精力,最大程度地利用软件系统解决实际问题。
现实世界与面向对象如何建立对应关系呢?我们知道,现实世界由物质和意识构成。比如学生张三是具体存在的事物,而“学生”是对具体事物抽象出的概念。张三就是学生类中的一个对象,也是学生类的一个实例。生活中有很多这样的实例,像一辆白色的自行车,不管颜色如何,“自行车”类是人们对具体事物抽象的概念,一辆白色自行车映射到计算机世界,就是自行车类中的一个对象和实例。
前面我们从理论上分析了从现实世界映射到软件世界,从现实世界的对象映射到计算机世界的类和对象。下面通过具体实例,对比面向对象程序设计和面向过程程序设计,看看有什么不同。
我们来看程序5 - 1,假设在学校学生学籍管理系统设计中,要设计这样一个程序:从键盘输入某一学生姓名,以及该学生修读信息技术基础和算法与程序设计两门信息技术课的成绩,求学生的平均成绩,并输出学生姓名、两门课成绩和平均成绩。某同学根据问题要求,经过问题分析、算法设计、程序编码和调试,写出程序5 - 1。现在请同学们阅读此程序并回答两个问题:一、找到程序中定义变量stud的语句;二、程序中有哪些语句和函数可以对变量stud进行处理?
程序5 - 1由声明、自定义数据类型以及主函数、显示结果函数、求平均成绩函数四部分组成。这句就是定义变量stud的语句。主程序main、显示结果函数和求平均成绩函数均可以对变量stud进行处理。
读懂这个程序后,我们思考一下,如果在程序中加入一门英语课的成绩,会发生怎样的结果呢?同学们先打开程序5 - 1,点击运行菜单启动,也可按快捷键F5操作。程序运行后弹出对话框,要求输入姓名。在程序设计中,用inputbox函数显示提示,告知使用者怎么做,能使程序更友好、便于使用。这里输入姓名和成绩都用到了该函数。我们根据程序提示先输入姓名李四,再输入信息技术基础成绩80、算法与程序设计成绩90。最后看程序运行结果,显示姓名李四及各科成绩和平均成绩,说明程序显示结果正确,能正常运行。
前面实践中有个任务,如果自定义数据类型student的结构增加一门英语课的成绩,该如何调整程序呢?首先要修改自定义数据类型student,添加一个变量“英语”,用于存放英语成绩。
除了修改自定义数据类型student,还有哪些地方需要修改呢?在求平均成绩和显示结果的两个自定义函数中都用到了自定义类型student,显然这两个函数也要修改。这里是三门成绩求平均数,所以要把相关计算改成3。主程序是否要修改呢?主程序中有语句直接调用了自定义的student数据类型,所以主程序同样要修改,要加上一条收集英语成绩的语句。
程序修改好后,我们再来运行一下。点击运行菜单启动,输入姓名、成绩,大家注意运行结果是否正确。最后得到了正确结果,说明我们的修改是合适的。
对比原程序和修改后的程序,我们发现在程序中增加一门课的成绩,除了修改sech函数和求平均成绩average函数外,主程序main中也进行了修改。由此可见,结构化程序设计常常牵一发而动全身,如果一处修改不当,就可能导致整个程序运行不正确,这是结构化思想设计程序的固有缺陷。程序的一个数据结构通常由许多过程或函数处理,修改数据结构会影响到所有相关的过程或函数,且容易出错。5 - 1只是个非常简单的程序,如果是更大规模的程序,调整起来难度更大。
在前一个任务中,我们只是修改了student变量,就引发了一系列函数的变化。现在我们试着在程序中加入一行这样的代码,请同学们阅读程序,猜想程序的运行结果会有怎样的变化。
同学们打开程序5 - 1,运行未修改的程序,注意观察输入的姓名和显示的姓名是否一致。根据提示输入姓名李四及各科成绩,这里显示的姓名是李四。现在我们在主程序这里添加一行代码:张三赋予stud.name。
