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

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

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

转载于:https://www.cnblogs.com/xjx-user/archive/2013/06/05/3119775.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是网上对杨力祥老师的评价: 有感于杨力祥老师和中科院的牛人们,进而有感于中科院和北京的学生 (2007-03-23 09:47:45) 转载▼ 还是再说一个高级Windows程序设计的杨力祥老师,周三上完课后还在回味呢,在他滔滔不绝,口若悬河的精彩讲演中深知计算机这东东的快乐是在巨大的痛若经历和深厚功底下的,当然了激情是支撑这一路下去的唯一东东。对编程的感觉就像艺术般地发挥。像那个五分钟搞出汇编把软件驱修好的牛人,与IBM的角力,小编程的演示,无不透出其出的深厚内涵 ,不禁想到自已是否可以几年以后如此这般萧洒。(总不明白为何身边有那夸夸其谈不干实事的人,不可能是物以类聚吧?呵自认是绝对勤快的人啊)。 再说中科院和北京的大学生,有他们是有那么好的机会和资源啊,不在于有多少钱有多好的硬件设施,他们可以看到的和听到的是我们所无法比的。可以请王永明,可以听INTEL的高手,见到不同的牛人,于此不会也是不可能的。呵如果这些都搬到广州就好了。为什么偏是在北京呢?如果哪天哪个领导人英明一下,大手一挥,北京只搞政治,不搞经济,别的都给我投出去,呵,这下可好了,牛人们都往南方走了。 刚才上传了CSDN把我的资源删了,不知道怎么回事。。可能是后缀名的问题 重新弄了一下。下载后把后缀名改成downlist就可以用迅雷打开了。 解压密码:abab123.gfugifyr7t565

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值