c语言软件的思想,C语言设计思想01

C语言设计思想01

为什么只有设计师才能发明流行的新语言

先回顾一下知名编程语言的作者和创造时间:

Fortran 语言,50年代,IBM 研究员;

Lisp 语言,50年代,MIT 的教授和学生;

C语言,70年代,贝尔实验室的两位研究员;

PHP,1994年,作者 Rasmus Lerdorf ,名字代表“Personal Home Page Tools”;

JavaScript,1995年,作者 Brendan Eich;

Python,1990年,作者 Guido van Rossum;

Ruby,1994年,作者 Yukihiro“Matz”Matsumoto。

从这些例子中,你可以发现早期的程序语言是学者和研究人员设计的,而近期的语言发明者多数是程序设计师 或资深程序员。

加州大学欧文分校的计算机科学家 Cristina Videira Lopes 提出疑问,为什么只有设计师才能发明流行的新语言? 她根据自己在学界的经验认为,生活在象牙塔中的研究人员不再创造用户真正能使用的新语言,因为他们将创造语言当作科研,在 90 年代之前,计算机性能有限,创造语言需要克服需要种种挑战,考虑各种硬件限制。如今计算机性能日新月异,创造语言不再是什么重要的事情。她指出,现在流行 的程序语言基本没有什么创新,全都类似既有编程概念的混搭。

结构化程序设计

一、结构化程序设计(StructuredProgramming)的核心是算法设计,基本思想是采用自顶向下、逐步细化的设计方法和单入单出的控制结构。

自顶向下和逐步细化的设计方法是将一个复杂任务按照功能进行拆分,并逐层细化到便于理解和描述的程度,最终形成由若干独立模块组成的树状层次结构,

单入单出的控制结构是指每个模块内部均用顺序、选择、循环三种基本结构来描述。

二、方法原则:

1、只采用三种基本的程序控制结构来编制程序,从而使程序具有良好的结构;

2、程序设计自顶而下;

3、用结构化程序设计流程图来表示算法。

20190805103634705.png

扩展资料

结构化程序设计的三种基本结构:顺序,分支和循环:

1、顺序从上到下依次执行下来,中间没有任何分叉

2、分支在执行过程中,根据条件成立与否产生了不同的操作

3、循环当某一条件成立时,反复做相同的操作。

结构化程序设计强调的是程序设计风格和程序结构的规范化,提倡清晰的结构。

结构化程序设计风格需要经过以下几个步骤进行:

?

自顶向下

程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。

逐步细化

对复杂问题,应设计一些子目标作为过渡,逐步细化。

3、模块化设计

一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步。

20190805103719651.png

?

结构化程序设计

?

分解为具体的小目标,把每一个小目标称为一个模块。

?

4、结构化编码

编码就是把已经设计好的算法用计算机语言表示,即根据已经细化的算法正确写出计算机程序。结构化的语言(如 Pascal,C,QBASIC等)都有与三种基本结构对应的语句。

二、C是一个结构化语言

C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。

所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

对语言本身而言,C是C++的子集,那么是什么样的一个子集?从上文可以看出, C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。

再提高一点,在C++中,数据封装、类型这些东东已不是什么新鲜事了,需要考虑的是诸如:对象粒度的选择、对象接口的设计和继承、组合与继承的使用等等问题。

所以相对于C,C++包含了更丰富的“设计”的概念,但C是C++的一个自洽子集,也具有强大的功能,同样值得学习。

C语言是“C语言之父”Dennis?MacAlistair Ritchie(中文名:丹尼斯·里奇)创造出来的。

C语言是D.M.Ritchie在B语言的基础上创造出来的。C语言的出现经历了以下历程:

在1970年,美国贝尔实验室的 Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。

1972年,美国贝尔实验室的 D.M.Ritchie?在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。

1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX。直到今天,各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言,其中还有不少继承Thompson和Ritchie之手的代码。

?

B语言

?

B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后由美国贝尔实验室的电脑科学家肯·汤普逊(Ken Thompson)在丹尼斯·利奇(Dennis Ritchie)的支持下设计出来。后来,丹尼斯·利奇以B语言为基础开发出C语言——目前世界上最常用的程序语言之一。自从被C语言取代之后,B语言几乎已遭弃置。

什么是B语言?

?

B语言是一种无类型语言,所有的数据都和机器字相对应,并且程序员可以直接通过内存地址操作内存。B语言最初在DEC的PDP-7和PDP-11小型机的早期Unix版本和Honeywell机器的GCOS系统上实现。

B语言的无类型特性使得其在PDP-11机器上无法以比较优雅的方式访问字符类型,因而从1971年开始,Dennis Ritchie开始对B语言进行改造,其中最重要的是引入了数据类型的概念,这些改造最终使B语言演化为了计算机发展历史上最为重要的编程语言——C语言。

时至今日,除了在一些古老的大型机或是特殊的嵌入式平台上,B语言已经芳踪难觅了。但B语言在编程语言发展历史上重要的承前启后的里程碑地位,却将永远为人们铭记。 [1]??

历史

?

B语言是从BCPL系统中删减了汤普逊认为非必备的组件以便能运行在当时的小型计算机上而产生的。B语言还包括了汤普逊的一些个人偏好(主要在一些特定的程序中减少非空格字符的数量)。

和BCPL以及FORTH类似,B语言只有一种数据类型,计算机字。大部分操作将其作为整数对待(例如进行+、-、*、/操作),但其余操作将其作为一个复引用的内存地址。在许多方面B语言更像是一个早期版本的C语言,它还包括了一些库函数,其作用类似于C语言中的标准输入/输出函数库。

BCPL

?

Basic Combined Programming Language(BCPL),是一种早期的高级语言。

1967年

简介

?

Basic Combined Programming Language(BCPL),1967年由剑桥大学的Matin Richards在同样由剑桥大学开发的CPL语言上改进而来。BCPL最早被用做牛津大学的OS6操作系统上面的开发工具。后来通过美国贝尔实验室的改进和推广成为了UNIX上的常用开发语言。

BCPL有些类似于Fortran,也是典型的面向过程的高级语言。BCPL的语法更加靠近机器本身,适合于开发精巧,高要求的应用程序,同时对编译器的要求也不高。BCPL也是最早使用库函数封装基本输入输出的语言之一,这使得他跨平台的移植性很好。BCPL的代码用小写字母书写,有别于同时代的BASIC和PASCAL。BCPL对于字符串的支持很差,这种缺点一直延续到了他的后代中,BCPL的内存管理也很糟糕,不过幸好在他的后代中这个缺点被改掉了。BCPL程序从一个主函数中开始,功能模块可以添加在各个函数中,函数支持嵌套和递归。

BCPL本身并没有被使用太长时间,这是因为他的后代们实在太强大了。1970年,贝尔实验室的Ken Thompson在BCPL的基础上改进出了B语言,用于书写UNIX。这个名字取自BCPL中的第一个字母。B语言使用的时间更短,因为三年后的1973年同样是贝尔实验室的D.M.RITCHIE将B语言进一步改进,并且取了BCPL中的第二个字母将其命名为C语言。而C语言和C++则在日后成为了最流行的高级语言。

范例

?

下列是马丁查理斯的 BCPL distribution.

Printing factorials:

GET "libhdr"

LET start() = VALOF

{ FOR i = 1 TO 5 DO writef("fact(%n) = %i4*n", i, fact(i))

RESULTIS 0

}

AND fact(n) = n=0 -> 1, n*fact(n-1)

N个皇后问题:

N个皇后问题:

GET "libhdr"

GLOBAL { count:200; all:201 }

LET try(ld, row, rd) BE TEST row=all

THEN count := count + 1

ELSE { LET poss = all & ~(ld | row | rd)

UNTIL poss=0 DO

{ LET p = poss & -poss

poss := poss - p

try(ld+p << 1, row+p, rd+p >> 1)

}

}

LET start() = VALOF

{ all := 1

FOR i = 1 TO 12 DO

{ count := 0

try(0, 0, 0)

writef("Number of solutions to %i2-queens is %i5*n", i, count)

all := 2*all + 1

}

RESULTIS 0

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值