程序设计语言原理-课件-要点等

一.命令式语言与函数式语言区别:

1.命令式语言语法复杂,函数式语言语法结构简单。

2.函数式语言语义比命令式语言简单。

3.函数式程序比相应命令式程序小得多,但是函数式程序编译后执行起来是等价命令式程序时间的两倍,因为函数式语言的一些语言特性对执行效率有很大的负面影响。

4.函数式语言可读性强,命令式语言的细节处理可能会模糊程序处理逻辑。

5.命令式语言中并发执行难以设计和使用。命令式语言必须由程序员静态地将其分解成可并发的部分,再写成任务,函数式语言可由执行系统动态地划分为可并发的部分,是这一过程高度地适应所运行的硬件。

6.命令式语言应用较广泛。

 

二.变量分类:

静态变量:程序运行开始将变量绑定在特定存储单元里

优点:高效率 无需运行时分配和解除分配所需的额外代价

缺点:降低灵活性 不支持递归子程序,且不能共享存储空间

栈动态变量:变量声明语句确定后再产生存储绑定,类型则是静态绑定。存储空间运行时从栈中分配。

方法调用时确立变量,方法执行完成后将变量接触分配。

递归子程序可以使用栈动态存储

缺点:运行时分配和解除分配需要额外开销

间接寻址使访问速度慢 子程序不是历史敏感

显示堆动态变量:抽象存储单元,有程序员编写的显性运行时指令来进行分配和解除分配。分配由指针变量或引用变量进行。运行时,变量和类型静态绑定。

缺点:正确地使用指针和引用变量比较困难,引用变量的开销和存储管理实现的复杂性。

隐式堆动态变量:当变量被赋值时才绑定到堆存储空间

优点:高度灵活性,允许编写极为通用的程序

缺点:运行时维护所有动态属性的额外开销

编译器会遗漏对某些错误的检查

存储管理存在问题

 

三.指针与引用

指针:指针类型变量值范围由内存地址的值和特殊值“零”(nil)构成,指内存中的地址。

用途:间接寻址、管理动态存储

悬挂指针:向内存空间已被释放的堆上创建的动态变量的指针。

危险性:指向的内存空间被重新分配,用于新的堆上创建的动态变量。从而变量类型和变量值均可能改变。

指向内存空间被内存系统调用

问题解决:墓碑法:每个堆上的动态变量中加入一个叫做墓碑的特殊单元,变量释放时墓碑留下但为空。

禁止程序显示释放堆动态变量

引用:指内存中的对象或值。

 

 

四.多态、重载:

面向对象的多态定义为:使用多态指针或多态引用来访问一个方法,该方法的名字在类的层次结构中被覆盖,这个层次结构定义了指针或引用所指向的对象。

百度百科中解释:

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。

重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法。

 

五.Goto语句:控制程序语句执行流程的最有力的一种语句。强大的力量和很高的灵活性

缺点:程序晦涩难懂,导致高度不可靠性和高昂的维护成本。

 

习题:

1. 静态数组、固定栈动态数组、栈动态数组、固定堆动态数组以及堆动态数组的定义及其优点:

[1]静态数组在编译的绑定,在调用的过程中,始终指向同一个内存区域,无需进行存储空间的申请和释放,因此运行时间最短。

[2]栈数组在栈上申请空间,每次调用都需要在栈上申请空间,空间的释放有系统完成。栈上申请的空间时连续的,一般所需时间较短。

[3]堆数组在堆上申请空间,用户需要自己释放存储空间。堆上申请的空间一般是不连续的,所需时间较多。

 

2. page.289第五题:

Rubin在一封致CACM编辑的信中提到,一些含有goto语句的程序段的可读性要优于等价的不含goto语句的程序段。他举了以下例子为证:

for ( i = 1; i <= n; i++ ){

for ( j = 1; j <= n; j++ )

if ( x[i][j] != 0 )

goto reject;

println("First all-zero row is:", i );

break;

reject:

}

这段代码将找出一个n阶方阵中的第一个零行。

选用C、C++、Java、C#或Ada中的一种语言重写这段程序,但不可以使用goto。比较你的代码与示例代码的可读性.

【解答】

for ( i = 0; i < n; i++ ){

for ( j = 0; j < n; j++ )

if ( x[i][j] != 0 )

break;

if ( j == n )

{

printf("First all-zero row is: %d\n", i );

break;

}

}

 

可读性比较:没差^_^.另外,可读性在一定程度上是因人而异的。

 

3、比较Java中String和StringBuffer,并说出三种字符串长度设计的方案

String vs. StringBuffer

String和StringBuffer是Java中提供的两种处理字符串的类。首先我们查阅他们的编程文档,看看文档中是如何描述他们的。

public final class String extends Object

implements Serializable, Comparable<String>, CharSequence

The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class. Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared.

public final class StringBuffer extends Object

implements Serializable, CharSequence

A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls

从上面的描述中,可以看出String和StringBuffer的最大区别在于String对象是不可变对象,一旦创建,就不能修改它的值;StringBuffer的对象是可变对象,可以通过append等方法动态修改对象中的内容。例如如下的代码:

String str1 = "程序设计语言原理";

String str2 = "我爱";

str2 = str2 + str1;

str2 = str1;

str2 = "我爱厦门大学 ";

System.out.print(str2);

StringBuffer str_buf = new StringBuffer("我爱");

str_buf.append(str1);

str_buf.append(str2);

StringBuffer str_buf2 = str_buf;

在调试的过程中,可以发现,str2对象的id在发生改变,说明改变字符串的值后,系统重新生成了另外一个String对象。

由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.

原来的对象就要被垃圾回收.影响了性能.

StringBuffer对象可以通过toString方法转换成String对象,如,

str2 = str_buf.toString();

System.out.print(str2);

三种字符串长度设计的方案

参考书本page.189。

[1]静态长度字符串:长度在创建的时候确定,如Java中的String对象,Python中的字符串;

[2]动态限长字符串:允许字符串具有可变的长度,但上限不能超过一个固定的值。例如C中的字符串;

[3]动态长度字符串:字符串具有可变的长度,且没有上限。例如Javascript、Perl和C++标准库中的字符串。

 课件:http://pan.baidu.com/share/link?shareid=126698819&uk=1678594189

 英语书:http://pan.baidu.com/share/link?shareid=147242680&uk=1678594189

posted @ 2013-06-05 21:22  xjx_user  阅读(264)  评论(0编辑  收藏  举报