==========
第1章概述
==========
程序语言越低级,则必须对过程描写得越具体,指令也就越接近机器的硬件逻辑,其编译器也相对越简单;相
反,程序语言越高级,则越接近对问题的描述与表达,因而更容易被人们所理解。因此,程序语言的发展,总是从
低级到高级,也就是从具体描述到抽象描述,这一过程其所依赖的编译器会越来越复杂。
-------------- -----------------
|人的思维逻辑| _<抽象>_____<具体>_|计算机的硬件逻辑|
-------------- -----------------
<--高级语言----中间语言----低级语言-->
程序设计语言(人与计算机的沟通)
提纲:
C++语言的历史
C++编程流程
程序与算法
----------------------
|C++及编程语言简史|
----------------------
【c++前史】
<FORTRAN>1953-1954,FORTRAN—用于科学计算的“公式翻译语言”;版本:FORTRAN—FORTRAN66(标准化)—
FORTRAN77和FORTRAN90.
<COBOL>1959,COBOL—面向商业的通用语言,其重要特征是语法与英文很接近,容易理解。
<ALGOL>1960,ALGOL60—国际代数语言(标准化计算机语言),首次引入了局部变量和递归的概念,在数学表
达和算法描述上比FORTRAN更出色,但由于其设计要求是独立于机器的,因此面临许多语言实现方面的技术问题,致
使ALGOL无法流行,但其却演变为其他编程语言设计的概念基础。
<BASIC>20世纪60年代,面向非专业程序设计人员推出的编程语言,特别是非计算机专业学生,通过简化
FORTRAN语言的基础上,研究出了BASIC语言,后推出qbasic和VB。
<Lisp>用于人工智能研究的编程语言,Lisp基于表处理的函数语言,该语言由于技术实现复杂,一直停留在实
验室阶段。
<LOGO>1967,MIT人工智能实验室为儿童设计的语言,旨在启发孩子们的思考和学习,LOGO成为一种热门的计算
机教学语言。
<Simula67>该语言第一次提出类的概念,能够把应用中的概念直接用编程语言描述,使其更具可读性,同时编
译系统捕捉类型错误的能力也非常强,保证了程序规模扩大之后,错误量不会非线性增长。其成为未来面向对象编
程语言的概念基础。
<C>1970,Bell实验室,研制C语言的初衷是用它编写UNIX系统。(想一想,为什么用C来写UNIX系统或者说用来
编写操作系统如UNIX的语言应具备什么条件),它充分结合了汇编语言和高级语言的优点,高效灵活,又容易移植
。
<Pascal>1971,Pascal语言语法严谨,层次分明,程序易写,具有很强的可读性。
<C++>剑桥大学的Bjarne Stroustrup以高效灵活的C为背景,以Simula思想(以类的概念面向对象的思想)为基
础,设计了C++(带类的C)。
从上述过程可以看出,程序设计语言以描述问题、解决问题为目的,讲求编程的灵活、运行的高效、解决问题
的抽象性,程序设计语言越高级,越利于问题描述的抽象,也就越接近人类的思维方式,更容易编程和减少错误的
发生。这一切同时依赖于编译系统的发达。
程序设计语言主要适用于三大领域:商业处理、科学计算和系统应用。
【C的优缺点】
程序设计方法的发展,主要是计算机应用范围的扩大和编程规模的扩大。
早期的编程多用于科学计算,其数据量并不大,数据种类也不多,但讲求精巧的数据结构,更强调计算和性能
,因此算法的优劣举足轻重。编程主要是围绕如何提高计算过程的运行效率来进行的。
C具有高效的灵巧性和实现上的高效性,因此比擅长于科学计算的FORTRAN更胜一筹。C的基本编程思想是面向过
程的程序设计方法,该类方法更加侧重在算法的设计与实现上,同时C语言的高度灵活性也就意味着所收限制更小,
那么带来的就是C对程序员的要求较高,由于程序员的疏忽易导致越界访问、类型错误等一些语言漏洞和缺陷。
面向过程的编程方法是基于自顶向下,逐级简化的思想,把一个大的复杂的问题逐步简化为易于实现、独立性
强的子过程,可见其主要对程序的运行过程进行描述,其数据类型描述和算法实现耦合度强,在整个程序设计中,
对数据类型的描述与算法的实现互相交叉,盘根错节;而面对商业中许多大量复杂的数据问题,及随着程序规模的
不断扩大,对数据类型的扩充要求的越来越高,编译系统对错误捕捉的要求也越来越高,面向过程的编程方法逐步
不能适应,而代替的是面向对象的程序设计方法。
面向过程设计方法和面向对象设计方法优缺点的比较:
例:人是具有属性和行为的,假设人之间相互的行为足以影响一个人的属性
案例1,只有几个人(程序规模小),采用面向过程的编程方法,那么我们可以单独为每个人的属性设计其数据
类型的实现,程序侧重在描述人们之间的相互行为(操作)对其属性(数据)的影响。这时由于数据少,行为相对
复杂,因此编程侧重在对操作的实现上是有效地。
案例2,几个人扩展到几十人或几百人(程序规模扩大),这时如采用面向过程的编程方法,其数据类型的扩充
就存在着相当大的问题,要来处理几十人甚至几百人的不同属性(一个人还可有多种属性),这时对过程的描述和
对数据的描述交叉在一起,繁杂又容易出错。而采用面向对象的设计方法,可以提供一个模板(类),这个模板提
供属性(数据)和行为(操作)的封装,通过对外的接口供其外部对象进行调用和影响。通过对类的实例化产生对
象,不同的对象又可具有不同的个性,这时面对的是几十或几百个具有数据和行为关联的对象,其编程重点在于对
象之间的联系和相互作用,通过这些接口来影响对象的属性,这时由于思考问题的抽象性加强了,因而编程实现更
加高效,同时减少错误的发生。
【C++优点】
既可以面向过程的设计方法,又可进行以抽象数据类型为特点的基于对象的程序设计;
可进行以继承和多态为特点的面向对象的程序设计;
正在完善以模板为特点的泛型程序设计;
总之,C++是一种混合型程序设计语言,适应问题的规模可大可小,“混合”体现在可以采用不同的程序设计方
法。“混合”意味着决不放弃对计算机高效运行的实用性特征,而又致力于提高大规模程序的编程质量,提高程序
设计语言的问题描述能力。
【标准C++】
共享的基础来源于标准化。标准C++意味着良好的系统可移植性,意味着在不同的标准C++编译器上都能得到相
同的结果,也意味着能充分享用C++的标准库资源。
标准C++工具:C++Builder6.0及以上版本,VC++.NET或以上版本(windows);G++3.0、Borland C++ Kylix3.0
以上版本(linux);通用的C++编译器当数G++3.0了,它既有windows版本又有linux版本。
---------------
|C++编程流程|
---------------
【编程操作流程】
编辑————编译————链接(Link或make或build)————调试
.cpp .obj .exe
目标代码(+库文件)
目标代码即机器代码,是计算机能够识别的指令集合。但是,目标代码还不能在具体的计算机上运行,因为目
标代码只是一个个独立的程序段,程序段之间还没有彼此呼应,程序段中用到的C++库代码和其他资源还没有挂接上
,需要相互衔接成适应一定操作系统环境的可执行程序整体,这个过程就是链接。
库文件是系统提供的程序链接资源,它一般是以版本为文件单位,带有一个特殊的后缀,不同公司的产品有不
同的后缀。如C++builder6.0的库文件后缀是.bpl和.lib。标准C++提供C++标准库,而用户库是软件开发商或程序员
提供的。
【最小样板程序】
#include <iostream>
int main()
{
std::cout<<"hello world!/n";
}
#include 对编译器发出的操作指令,它指示编译器在编译前,先原地展开<>中的头文件内容;
<iostream>标准输入/输出流类的标准库头文件;
main()—同C一样,C++的程序入口点;
与C不同的是:
cout是标准输出设备的名称,“<<”是操作命令,形象的标示出流操作的方向,即将后面的字符输出到标准输出设备cout上(对应的物理设备:显示器);
std是“名空间”,程序中有若干名称,前面说过C++是为适应大规模程序编程的,而程序规模大起来后,难免会有名称上的的冲突,就好像一个学校A班有个张三,B班也有个张三,如果A、B班分别上课(程序规模小时),直接喊张三的名字不会有问题,但如果AB班一起上课(程序规模大了),这时再喊张三就会产生冲突,因此应分别喊“A班的张三”和“B班的张三”,即在名字前需要加上各自的名空间,C++也是这样解决问题的。
std::cout表示“标准库std中的cout”。
注释:
// 单行注释
/* 段注释 */
------------
|程序与算法|
------------
【程序与算法的区别】
程序:
从静态看,程序是以某种语言为工具编制出来的动作序列,它表达了人的系统性思维。
从动态看,程序是一系列逐一执行的操作,其操作主体是计算机,因此其运行必然受到计算机的限制。不同的操作主体其操作
性能不同,即使同一主体在不同状态下执行一个程序,也会表现出差异。所以,同一个程序,可以反复运行而结果一致,但性能上
的细微差异总是有的。
程序的动作序列包含了对数据的存取访问和算术运算,数据结构的设计和动作序列(算法)的设计关系到程序运行的效率。
算法:
算法是求解特定问题的一组有限的操作序列,算法有别于程序—
(1)目的性
算法必须有运算结果,必须在有限的操作序列下达到求解目的,而程序只是强调过程性,可以存在不能自行终止的操作序列。
如操作系统随计算机启动而运行,随着关闭电源而终止,不能自行终结。
(2)抽象性
算法离不开数据结构,而数据结构在具体的计算机上实现是要受到表示范围的限制,因此算法比具体的程序设计更抽象,算法
不在乎用什么程序语言和用什么计算机来描述。
(3)研究性
算法多用于理论研究,描述算法的目的是沟通人们的思想,而不是实现。但算法也是要靠程序实现来验证的,即通过有限的数
据,在有限时间内,得到正确的结果,并测试其资源占用与性能等各项指标。
也就是说,算法更侧重于表达解决问题的思想和思路,具有思想上的高度抽象性;而程序用于实现某种算法来最终解决问题,具体问题具体对待。
【编程与结构】
程序=算法+数据结构;
数据以数据结构的方式来描述,则算法就可以数据结构为依托,通过数据结构来访问数据,实现数据存在形式与算法的相互独立,从而简化算法和提高逻辑表达的清晰度。
从动态讲,程序仍是计算机中运行的过程体。
从静态讲,程序不再只是单纯的过程序列,不再只是单纯的算法了,而是算法和数据结构的有机组织。这意味着算法设计依赖于抽象层次更高的数据结构,而不再只是单纯空间上的原始数据了。
【过程化程序设计】
在基于过程的程序设计中,问题模型反映了过程结构模型,实际上就是功能模型,过程模块与数据的复杂关系没有清晰地分离出来,所以一般都是“具体问题具体解决”,代码的重用性低,而且随着问题规模的扩大,其程序复杂性也大大提高。
过程化程序设计遵循结构化程序设计思想,程序设计中各个过程体和组成部分应以模块表示,同时使用三种基本控制结构(顺序、条件和循环)。每个模块其内聚性越强,外联性越少,模块的独立性就越高。
内聚性强:模块实现的功能越单一越好;
外联性少:模块间的联系越少越好;联系意味着依赖,外联性多意味着模块内聚性不强,功能还有待于进一步细化。
过程化程序设计方法采用自顶向下,逐步细分的方法展开。
程序=算法+数据结构;
【对象化的程序设计】
<基于对象的程序设计>
程序=算法+抽象数据结构;
抽象数据类型反映了数据组织及其相关操作,实现了数据与行为的捆绑。程序的行为表现为分层的过程结构和对象定义的集合。
基于对象的程序设计采用抽象数据结构来描述数据,其本质仍是过程化的,只是某些数据关系被提取出来,成为一个类,便可以更好的重用了。
<面向对象的程序设计>
程序=(对象+对象+...+对象);对于程序和程序员来说,程序是满世界的对象。
对象间访问:对象---界面----对象;
(接口)
学习编程,在构造了起码的程序框架后,就要开始涉及算法和数据结构。