热门关键字:  听力密码  听力密码  新概念美语  单词密码  巧用听写练听力
图书信息

通俗模糊数学与程序设计

中国水利水电出版社
    【作 者】吴士力 编著 【I S B N 】978-7-5084-5169-5 【责任编辑】宋俊娥 【适用读者群】研究生 【出版时间】2008-01-01 【开 本】16开本 【装帧信息】平装(光膜) 【版 次】2008年01月第1版 【页 数】240 【千字数】 【印 张】 【定 价】28 【丛 书】暂无分类 【备注信息】
图书详情

      本书的主要内容是模糊数学以及程序设计的相关知识。其中,模糊数学从模糊集合开始,依次介绍了模糊关系、模糊度量、模糊逻辑与模糊推理等基本知识。接着在上述知识点的基础上,又分别介绍了模糊模式识别、模糊聚类、模糊控制三种模糊算法的基本原理和具体内容。介绍完模糊数学后,本书从Java语言开始介绍程序设计方面的内容。首先是Java语言的基本语法和特性,然后介绍了面向对象技术和可视化程序设计的原理和实现,并简单介绍了如何使用Jbuilder2005来开发可视化程序。

      阅读本书需要具有基本的数学知识和一定的计算机软件基础知识(如程序语言、数据结构等)。本书适合于大学低年级的本科生,也适合于对模糊数学和Java程序设计感兴趣的自学人员。

      亲爱的读者朋友们,如果翻阅一下计算机专业的教学大纲,不难发现编程语言总是安排在其余课程的前面。这也就是说,学习计算机编程一般都是从学习编程语言开始的。从第一个高级编程语言Fortran发明以来,编程语言的种类日益丰富、数目不断增加,到目前为止人们已经发明了数千种编程语言了。高级语言屏蔽了计算机的底层细节,在语法和格式上很容易被人理解和接受。这些特性大大降低了编程的难度,使得编程不再只是科研人员和专家才能做的事情了,受过初、中级教育的人同样可以从事编程工作。在印度的许多IT公司中,就已经大量聘用了中学生来担当编程人员。

      随着高级语言的进一步发展,编程变得越来越方便。在这种情形下,大多数人不但把计算机编程语言的学习看成了编程的必要条件,还看成了充分条件。概括地说,“学习编程就是学习编程语言”几乎成为了多数编程学习者的观点。更为严重的是,如今种类繁多的高级语言更加迷惑了刚刚步入编程殿堂的初学者。可以想象到,当他们看到书店里琳琅满目的计算机语言书时,必定会愈加感慨自己的才疏学浅吧。慢慢地在人们心中就会形成一种错误的观念——以掌握编程语言数目的多少来衡量编程水平的高低。为此,许多人从Visual Basic到Delphi、从C++到Java、从J2EE到.NET,学得废寝忘食、不亦乐乎,还自我感觉编程水平与日俱增。然而事实却是客观的,那些貌似掌握了多门编程语言的“高手”往往写不出优质的代码,甚至连正确有效的代码都写不出来。那么问题到底出在哪里呢?也就是该如何学习编程呢?

      回想一下我们小时候学写作文的过程。作文课一般都是在小学中年级的时候开设的。为什么不在小学一年级就开呢?道理很简单,写作文必须要先认识一定数量的字才行。那么,对于已经认识了一些字的小学中年级学生而言,他们写的作文质量大致如何呢?我想大家也都知道,多数作文都是流水账,有的连事情都叙述不清。这也就是说,写作文绝不是认识几个字那么简单。现在几乎人人都识字,但是能写出一手好文章的还只是少数人而已。因为衡量作文好坏的标准不在于字本身,文字只是起到了描述作文内容、表达作文思想的作用而已。对于内容枯燥紊乱的作文,无论用什么文字来写都不会变成好作文的。

      计算机编程和写作文的过程在一定程度上是很相似的。如果把程序看成作文,那么计算机语言就是文字;作文可以用中文、英文等来写;程序也可以用C、Java来编。作文的好坏主要取决于其内在的思想和内容;程序质量的高低同样取决于程序本身的实现思路和方法,编程语言只不过是一种实现思路和方法的工具而已。

      对于自然语言而言,主要是学习其词法、语法和语义;对于计算机编程语言的学习,主要也是学习其词法、语法和语义。但是和自然语言相比,编程语言的词法、语法和语义要简单得多,根本没有必要花费太多精力去教条地学习和记忆。在实际编程时,对于不熟悉或遗忘的语法点和方法,翻阅相关资料就可以了。对于从事特定领域的编程人员而言,很多语法点还会由于反复使用而自然而然地熟记于心。同时,计算机语言也没有好坏之分,只有分工不同。例如,C语言因为支持对硬件的访问,常用于开发系统软件或底层应用;Delphi提供了Win32应用程序开发平台,能大大简化Win32应用程序的编写;Java具有跨平台的特点,方便了网络应用软件的开发。再者,计算机高级语言之间的词法、语法和语义相似程度较高(如C、Java和C#)。所以说,编程人员的学习重点不应该放在编程语言本身上。既然如此,学习编程的重点又在哪里呢?下面讨论左右程序质量的两大重要因素:实现思路和方法。

      概括地讲,计算机程序的主要任务是对问题进行求解。我们把求解问题的方法称为算法。算法是程序功能具体实现的步骤集合,是程序的“灵魂”。因为做任何一件事情都要讲究方法,我们评价一件事情做得好与不好,关键就是看所用的方法好不好。而具体采用什么方法是由问题的特点决定的。在现实世界中,广泛存在着两大类问题:一类是数值问题,一类是非数值问题。数值问题的核心就是数值计算,一般可以用代数方程组来描述,进而应用初等代数、连续数学等方法进行求解(如线性代数、微积分等)。对于基于数据比较的非数值问题来说,就无法直接建立代数方程组模型来描述了。为了把数学方法引入到解决非数值问题中去,人们逐渐发明了离散数学。离散数学的内容极其广泛,包括拓扑论、图论、组合数学、逻辑学、代数系统等。离散数学很好地实现了对非数值问题模型的建立,为进一步解决问题做好了准备。对于不同问题的数学模型,必定需要设计不同的算法。一般来说,对于数值问题而言,算法可以直接从相对应的代数求解公式直接归纳推导出来。在电子计算机发明之前,数学家大多把精力放在了数值问题的求解上,因此其相应的求解方法相对成熟丰富,所以设计数值问题的求解算法是相对容易的。而对于非数值问题,算法就失去了直接从代数求解公式进行归纳的可能,必须另辟蹊径。在现代的计算机的教育体系中,学习的重点也是求解非数值问题的算法。但是,非数值问题的求解最终还是会转变到数值问题上,因为目前计算机只能进行数值运算。

      要想设计出解决非数值问题的算法,首先必须在计算机中描述出问题的模型。就好比让某个人去做一件事情,首先要把事情描述给他听。在计算机中对非数值问题进行描述的方法就是建立数据结构。又因为目前我们使用的计算机采用的是“程序存储”体系结构,所以数据结构就包括两个方面:描述问题逻辑意义的是逻辑结构;描述问题在计算机中的存储结构的是物理结构。常见的逻辑结构有集合、线性表、树、图等;常见的物理结构有数组、链表等。我们可以在此基础上设计出新的数据结构。对于任意问题的逻辑结构,可以选择多种物理结构来存储;同样,任意的物理结构也可以存储多种逻辑结构。如树可以存储在数组或链表中,链表可以存储线性表、树、图等。

      有了数据结构,算法的设计就有根据了。根据逻辑结构可以设计出算法的实现思路;根据物理结构可以设计出算法的实现方法。如对树的遍历而言,根据其逻辑结构特点,人们设计出了前序遍历、中序遍历和后序遍历算法,然后根据树的物理结构来具体实现这些遍历算法。对于一个具体问题来讲,数据结构的选择以及算法的设计是大有学问的。因为对于同一个问题,采用不同的数据结构与算法,会直接影响求解过程的性能好坏,即程序运行时的时空复杂度。如在物理结构为数组的线性表上插入一个元素,其时间复杂度为 ,所需空间为n个单元;在物理结构为链表的线性表上插入一个元素,其时间复杂度为 ,所需空间为2n个单元。再如采用插入法对线性表中的数据进行排序,其时间复杂度为 ;而采用快速排序法进行排序的时间复杂度为 等。所以说,对数据结构和算法的学习,主要就是要掌握各种逻辑和物理结构以及算法的性质规律,最终设计出具有较好运行性能的求解方法。有一个经典的公式很好地描述了数据结构和算法在编程中的作用——“程序=算法+数据结构”。

      设计好了问题的数据结构和算法就等于为建造大楼准备好了砖和瓦,另外一个问题就是程序的开发方法。熟悉房建的朋友知道,一般的楼房有砖混结构和框架结构,其对应的建造方法是不同的。对于程序开发而言,也同样存在着面向过程和面向对象两大类开发方法。自软件危机爆发以来,面向对象技术开发方法逐渐替代了面向过程开发方法。面向对象的核心思想就是程序代码重用。重用代码一方面可以大大减少编码的工作量,还可以增加程序的健壮性、可读性、可维护性、易修改性等。面向对象技术主要是通过封装、继承和多态来具体实现的。其中,封装代码是基石;再通过继承已封装的代码来扩展重用手段;多态则是对继承的进一步扩展和优化,使得重用封装代码的过程变得灵活多变、简炼方便。面向对象的思想其实早就运用在日常生产的方方面面了。像维修业中的配件替换,生产线中的部件装配、升级、改装等。在众多的计算机高级语言里,可以直接使用面向对象技术的语言有C++、Java、Delphi、Visual Basic、Visual C++等。这些语言都完全支持面向对象中的几乎所有的特性。使用面向对象技术编写的程序可以看成是一个对象的集合,也就是“程序=对象 对象”。但是,有一点必须着重提出,对象是对功能代码的封装,而功能代码最终是由数据结构和算法来实现的。就好比结构复杂的大楼都是由砖和瓦砌起来的一样。面向对象思想对算法和数据结构进行了抽象,抽象的结果就是对象。也就是说,算法是对象的基石,对象又是面向对象的基石。

      以上简要介绍了算法、数据结构和面向对象开发方法之间的相互关系,以及它们在编程过程中的重要作用。如果您已经开始准备把学习重点先放在算法和数据结构上了,那么先不要急着那样做。因为在学习算法和数据结构前,还有更基础的知识要学习,那就是数学!

      从唯物辨证法的角度来讲,人的任务就是不断地认识世界和改造世界。而数学则是人们在认识世界过程中发现和总结出的逻辑规律,这些规律对改造世界具有实质性的指导意义。

    马克思是这样评价数学的作用的:“任何科学只有当它成功地使用了数学,才能趋于完善。”那么数学是如何在计算机程序的编写中发挥作用的呢?

      首先,数学以其严密的形式语言给问题建立出逻辑模型,然后使用各种推理手段归纳总结出这个模型的求解方法。编程者根据这个数学方法的思路设计出能在计算机上实现的算法和数据结构,最后使用计算机语言编写出程序。由此可见,数学模型及其计算方法的设计是程序编写的首要步骤。如果数学模型建不起来,那么算法和数据结构也就无从谈起。就算建立了数学模型,如果计算方法效率很低,同样会影响最终程序的质量。举个非常简单的例子(百钱买百鸡问题),设一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱,如用100元钱买一百只鸡,则公鸡、母鸡、小鸡各多少只。最直观的办法就是用三重循环来求解,每重循环分别代表公鸡、母鸡和小鸡,循环范围从1到100。如果再仔细想一下,可以发现公鸡的个数不会超过20只,母鸡的个数不会超过33只,小鸡的个数就是100减去公鸡和母鸡的个数总和。这样一来,三重循环就可以降为二重循环,循环范围分别为19和33,明显加快了程序求解的速度。

      总而言之,数学的核心作用就是发现事物规律,并从中找到解决问题、优化问题的逻辑方法,指导模型的建立,为程序编写提供最原始也是最重要的依据,是程序真正的驾驭者。可以说,从计算机本身的电路设计到计算机应用都是直接建筑在数学的基础上的。没有数学的支撑,任何计算机技术都无法实现和发展。与此同时,计算机技术的发展与应用又反过来推动了数学的研究和发展。像图论、组合数学、数值分析等学科都是在计算机发明后才迅速发展起来的。数学与计算机的这种辨证关系和相互作用,大大加快了人们认识世界、改造世界的步伐。在许多如天气预报、DNA密码破解、仿真试验、宇宙探索、人工智能等新兴领域的研究中,更是到处可见计算机的身影。

      说到这里,我想大家应该大致知道应该如何去学习计算机编程的基本方法了吧。计算机编程是一项创新性、技巧性很强的工作,是思维逻辑的产物。而数学正是对逻辑的完美体现。所以说,没有坚实的数学基本功和计算机理论基础,是很难保证思维逻辑的正确和高效的。

      以上的介绍都是抽象的文字说明,似乎有些泛泛。为了让读者能够直观地感受到以上介绍内容的意义,本书以模糊数学理论为基础,综合了数据结构以及算法设计,并通过面向对象语言Java来实现程序。让读者逐步了解编程的一般规律和方法,正确地认识计算机语言、算法与数据结构以及面向对象技术之间的辨证关系,从而抓住编写程序的本质核心,把学习精力和重点放在正确的地方,扎扎实实地练习基本功。本书没有涉及到高深的理论知识,读者只需要具备一定的离散数学基础知识,以及对计算机高级语言有一个基本了解就可以了。

      本书在编写过程中,参考和引用了国内外部分著作和文献中的相关内容,在此对这些资料的作者表示衷心感谢!由于编者水平有限,时间紧迫,书中难免会出现错误和漏洞,真诚希望广大读者批评指正!

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册