lisp语言入门
Lisp语言入门
Lisp是一门历史悠久的语言,全名叫LISt Processor,也就是“表处理语言”,它是由John McCarthy于1958年就开始设计的一门语言。和Lisp同时期甚至更晚出现的许多语言如Algo等如今大多已经消亡,又或者仅仅在一些特定的场合有一些微不足道的用途,到现在还广为人知的恐怕只剩下了Fortran和COBOL。但唯独Lisp,不但没有随着时间而衰退,反倒是一次又一次的焕发出了青春,从Lisp分支出来的Scheme、ML等语言在很多场合的火爆程度甚至超过了许多老牌明星。那么这颗常青树永葆青春的奥秘究竟在哪里呢?
如果你只接触过C/C++、Pascal这些“过程式语言”的话,Lisp可能会让你觉得十分不同寻常,首先吸引你眼球(或者说让你觉得混乱的)一定是Lisp程序中异常多的括号,当然从现在的角度来讲,这种设计的确对程序员不大友好,不过考虑到五六十年代的计算机处理能力,简化语言本身的设计在那时算得上是当务之急了。
Lisp的基本语法很简单,它甚至没有保留字(有些语言学家可能对这一点有异议,别怕,我听你们的),它只有两种基本的数据,仅有一种基本的语法结构就是表达式,而这些表达式同时也就是程序结构,但是正如规则最简单的围棋却有着最为复杂的变化一样,Lisp使用最基本的语言结构定义却可以完成其它语言难于实现的、最复杂的功能。
废话少说,现在我们就来看看Lisp语言中的基本元素。
Lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如a b c;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:
a b c
()
(a b c x y z)
(a b(c)d)
最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。
正如算数表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。
正如欧几里德的几何世界中有五个公理一样,我们在这里给出Lisp世界中的7个公理(基本操作符):
(qu ote x)返回x,我们简记为'x
(atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lisp中我们习惯用原子t表示真,而用空表()表示假。
>(atom 'a)
t
>(atom '(a b c))
()
>(atom '())
t
现在我们有了第一个需要求出自变量值的操作符,让我们来看看qu ote操作符的作用——通过引用
(qu ote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom将其视为代码,例如:>(atom (atom 'a))
t
反之一个被引用的表仅仅被视为表
>(atom '(atom 'a))
()
引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用qu ote来区分它们。
(e q x y)当x和y的值相同或者同为空表时返回t,否则返回空表()
>(e q'a 'a)
t
>(e q'a 'b)
()
>(e q'()'())
t
下一章,我们将讲解与表相关的操作符和条件操作符,以及Lisp程序的基本元素——函数。
一集我们讲了Lisp世界七个公理的前三个,这一集我们接着讲剩下的四个。
首先是三个表操作
(car x)要求x是一个表,它返回x中的第一个元素,例如:
>(car '(a b))
a
(c d r x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如:
>(c d r '(a b c))
(b c)
(cons x y)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如:>(cons 'a '(b c))
(a b c)
>(cons 'a (cons 'b(cons 'c ())))
(a b c)
看到这里大家可能会问,为什么没有取表中除开头外其它某个位置上的元素的操作符,别急,等我们讲到地球人都知道的函数和递归你就知道该怎么办了,也许你现在已经想得差不多了?
接下来要介绍给大家的是构成程序逻辑的一个基本功能……条件分支,在Lisp中,它是由con d操作符完成的,con d是七个公理中最后一个也是形式最复杂的一个(欧几里德的最后一个公理也如是):
(con d(p1 e1)(p2 e2)...(pn en))
p1到pn为条件,e1到en为结果,con d操作符依次对p1到pn求值,直到找到第一个值为原子t(还记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如:
>(con d((e q'a 'b)'f irst)
((atom 'a)'secon d))
secon d
好了,至此我们已经有了Lisp世界的所有基本公理,我们可以开始构建整个世界的规则了。
在这七个操作符中,除qu ote和con d之外,以其他的五个操作符开头的表达式总是要对它的所有自变量求值,然后产生结果,我们把这样的表达式叫做函数。
上一集我们讲到了“函数”,其实这个概念早在初中数学里就已经学过了,一个函数无非就是将自变量映射到值的对应关系,在Lisp里也一样。
Lisp中的函数定义我们已经在上节给出(快速抢答:谁还记得请举手),在Lisp中采用如下形式描述一个函数:
(lam bd a (p1 p2... pn) e)
其中,pi为原子,在函数中称之为参数,e是表达式,也就是函数体。
调用一个函数的方式如下:
((lam bd a (p1 p2... pn) e) a1 a2... an)
其中ai为表达式,按照我们的惯例,称之为实参。
整个函数的调用过程如下:每一个表达式ai(实参)先求值,然后再将这些实参代入e中求值,最后的结果即为整个表达式的返回值。
如果一个表达式的第一个元素是一个原子,但不是基本操作符(也就是我们先前提到的那7个),如:
(f a1 a2... an)
并且f的值是一个函数(lam bd a (p1 p2... pn) e),则上述表达式等价于
((lam bd a (p1 p2... pn) e) a1 a2... an)
看了这一段,可能大家都有点晕,到窗口去做几个深呼吸,然后回来做下面这个练习,看看这个表达式的结果是什么?
((lam bd a (f)(f'(b c)))'(lam bd a (x)(cons 'a x)))
如果你得出了结果,那么继续往下看,否则再把前面几段话多读几遍,把上面的练习输入到一个能自动匹配括号的文本编辑器里继续研究。
在这里我打算插几句题外话,可能有很多人已经见识过这个lam bd a了,不过不太可能是在Lisp里(要是这样的话你就应该不用来看这片“入门”了,不是吗?),而多半是在Python里,Python手册中对这个lam bd a仅仅是一笔带过,他大概是这么说的:“使用lam bd a这个词是因为它类似于Lisp语言里同名的一个语法结构。”好了,我们现在就来看看lam bd a这个典故的真正起源。
lam bd a这个词来源于lam bd a演算理论。lam bd a是什么?对于现在的人来说,这个概念不过就是“函数”而已,但是对于lam bd a演算理论的出现的那个年代来说,它可是一种革命性的创新。lam bd a演算理论过于复杂,而且作为一篇Lisp的简介,讨论它已经完全偏离了主题,但是它所提出的另一个概念——高阶函数(H igh Or d er F u nction)——却在Lisp语言中占有重要的地位,甚至可以说是Lisp如此与众不同的主要原因。
正如“高阶导数”就是“导数的导数”一样,所谓高阶函数,其实就是“函数的函数”(高数老师,原谅我吧)。即把一个函数本身当作另一个函数的自变量(在现代的C++中提出的“fu nctor”这个概念其实就是高阶函数在C++中的一种实现)。高阶函数的出现,将“函数”在编程语言中的地位提升到一个“一等公民”的地位,你可以像操作任何基本数据类型一样操作一个函数,对它进行变换、传递,随你怎么折腾。
下面我们回到正题,继续讨论Lisp中的函数,我们可以看到,至今为止,我们的函数都还没有名字,函数可以没有名字,也就是匿名函数正是Lisp的另一大特色,Lisp可以让程序员把数据和名字剥离开,这对于许多其它的编程语言来说是直到现在也无法享受到的一种奢侈。
函数没有名字会带来一个问题,那就是你无法在函数中调用自身(好啦,我知道还有Y组合,不过这是一篇入门文章),所以Lisp提供了一种形式可以让你用一个标识符来引用函数:
(la b el f(lam bd a (p1 p2... pn) e))
这个表达式和前面的简单lam bd a表达式等价,但是在e中出现的所有f都会被替换为整个lam bd a表达式,也就是递归。
同时,Lisp为它提供了一种简写形式:
(d e fu n f(p1 p2... pn) e)
你可以开始写你的第一个有用的Lisp程序了,你打算写什么?(无论什么,只要不是H ello w orl d就好)下一集,我们将给出一些常用的函数。
Lisp的语法元素在前几集中已经基本讨论完毕,相比C#或Ja v a数百页的Speci f ication,它可能简单的让你有些惊讶,不过,伟大的东西总是简单的,不是吗?现在让我们来回顾一下上一集中提到的内容,首先提几个问题:
既然con d在概念上相当于过程式语言中的i f语句,那么与i f相对的else分支在con d表达式中应该如何描述?
在(我们已经学过的)Lisp中如何表达“重复”这个语义?或者你能写一个f oreach循环函数?
(注:不要问输入输出函数或算术逻辑运算在哪儿之类的问题,它们都是微不足道的事……)
这一集中,我们将描述几个常用的函数,并给出它们的简单实现
首先解答在第一集中提出的问题:如何取一个表中的第二个、第三个或第n个元素?
可能有些读者已经想到了,取第二个元素可以采用如下形式:
(car (c d r x))
同理,取第三个元素是这样的:
(car (c d r (c d r x)))
事实上,这种组合在Lisp中经常要用到,为了方便,Lisp提供了一个通用模式——c x r,其中x为a或d 的序列,来简记car和c d r的组合,例如:
>(ca d r '((a b)(c d) e))
(c d)
>(ca dd r '((a b)(c d) e))
e
>(c d ar '((a b)(c d) e))
(b)
另外,使用(list e1 e2... en)来表示
(cons e1 (cons e2(...(cons en '())...)))
>(cons 'a (cons 'b(cons 'c '())))
(a b c)
>(list 'a 'b'c)
(a b c)
现在我们定义一些新的常用函数,我建议你先自己想一想,不要急着看我给出的实现。(注:某些函数在Common Lisp中已经存在,所以如果你想试验一下,给它们换个名字)
(n u ll x),测试x是否为空表。例如:
>(n u ll 'a)
()
>(n u ll '())
t
(an d x y),逻辑与,当且仅当x和y都不是空表时返回't,否则返回空表。
>(an d'a 'b)
t
>(an d(atom 'a)(e q'b'c))
()
(not x),逻辑非,当x是空表时返回't,否则返回空表。(有人问我or在哪儿?)例如:>(not 'a)
()
>(not (e q'a 'b))
t
(appen d x y),连接两个表x和y,注意它与cons和list之间的不同之处。例如:
>(appen d'(a b)'(c d))
(a b c d)
>(appen d'()'(x y))
(x y)
(pair x y),这里x和y是两个长度相同的表,pair生成一个表,其中每个元素是x和y中相应位置上的元素组成的一个元素对,这个函数的返回值类似于其它语言中的map或d ictionary的概念。例如:
>(pair '(a b c)'(x y z))
((a x)(b y)(c z))
(assoc x y),其中x是一个原子,y是一个形如pair所返回的表,assoc在y中查找第一个左元素为x的元素对并返回。例如:
>(assoc 'a '((a x)(b y)))
x
>(assoc 'a '((a (f oo b ar))(b y)(c z)))
(f oo b ar)
(s ub st x y z),在表z中将任意层次上出现的原子y都替换为表达式x。例如:
>(s ub st '(x y)'b'(a b(a b c)d))
(a (x y)(a (x y) c)d)
下面我们给出这些常用函数的简单实现:
(d e fu n n u ll (x)
(e q x'()))
(d e fu n an d(x y)
(con d(x(con d(y 't)('t '())))
('t '())))
(d e fu n not (x)
(con d(x'())
('t 't)))
(d e fu n appen d(x y)
(con d((n u ll x) y)
('t (cons (car x)(appen d(c d r x) y)))))
(d e fu n pair (x y)
(con d((an d(n u ll x)(n u ll y))'())
((an d(not (atom x))(not (atom y)))
(cons (list (car x)(car y))
(pair (c d r)(c d r y))))))
(d e fu n assoc (x y)
(con d((e q(caar y)x)(ca d ar y))
('t (assoc x(c d r y)))))
(d e fu n s ub st (x y z)
(con d((atom z)
(con d((e q z y)x)
('t z)))
('t (cons (s ub st x y (car z))
(s ub st x y (c d r z))))))
如果看到这里你还没有晕菜,说明你的神经的确很坚强。注意在这些例子中是如何表达“重复”这个概念的,在Lisp中,最常用的重复其实并不是真正意义上的重复,而是递归,这也是绝大多数函数式语言的一个共同特征——函数的嵌套和递归,构成了整个程序逻辑。
这一部分内容可以让你真正感受到Lisp的特色,与编写过程式语言的程序相比,编写Lisp程序需要一种完全不同的思维方式,也许这正是Lisp语言几十年来长盛不衰的真正原因吧。
理解了这一部分,下一集中我们将领教一下Lisp的威力,我们将用Lisp编写一个Lisp解释器。如果你以前没有见过这个程序,我保证它一定会让你吃惊。
上一集我们已经见到了一个Lisp程序的大致外貌,在文末,我提到这一集中我们将会用Lisp写一个Lisp 解释器,事实上这个解释器并不太长,虽然它有可能是你至今为止见过的最长的一个。
我已经有点等不及了,让我们先来看一下整个程序,然后再来讲解:
(d e fu n e v al (e a)
(con d
((atom e)(assoc e a))
((atom (car e))
(con d
((e q(car e)'qu ote)(ca d r e))
((e q(car e)'atom)(atom (e v al (ca d r e) a))) ((e q(car e)'e q)(e q(e v al (ca d r e) a)
(e v al (ca dd r e) a)))
((e q(car e)'car)(car (e v al (ca d r e) a)))
((e q(car e)'c d r)(c d r (e v al (ca d r e) a)))
((e q(car e)'cons)(cons (e v al (ca d r e) a)
(e v al (ca dd r e) a)))
((e q(car e)'con d)(e v con (c d r e) a))
('t (e v al (cons (assoc (car e) a)
(c d r e))
a))))
((e q(caar e)'la b el)
(e v al (cons (ca dd ar e)(c d r e))
(cons (list (ca d ar e)(car e)) a)))
((e q(caar e)'lam bd a)
(e v al (ca dd ar e)
(appen d(pair (ca d ar e)(e v lis (c d r e) a))
a)))))
(d e fu n e v con (c a)
(con d((e v al (caar c) a)
(e v al (ca d ar c) a))
('t (e v con (c d r c) a))))
(d e fu n e v lis (m a)
(con d((n u ll m)'())
('t (cons (e v al (car m) a)
(e v lis (c d r m) a)))))
(注:可能有的读者已经发现,Lisp并不要求你一定要在使用函数前先定义它)
整个程序包含三个函数,主函数我们遵从Lisp(和Python、Perl)的惯例,叫它e v al,它是整个程序的骨架。e v al的定义比我们以前看到的任何一个函数都要长,让我们考虑它的每一部分是如何工作的。
e v al有两个自变量:e是要求值的表达式,a是由一些赋给原子的值构成的表,这些值有点象函数调用中的参数。这个形如pair返回值的表叫做上下文,正是为了构造和搜索这种表我们才在前一章写了pair和assoc。
e v al的骨架是一个有四个子句的con d表达式,如何对表达式求值取决于它的类型,第一个分支处理原子,如果e是原子,我们在上下文中寻找它的值:
>(e v al 'x'((x a)(y b))) a
第二个分支是另一个con d,它处理形如(a)的表达式,其中a是原子。这包括所有的基本操作符,每个对应一条分支。
>(e v al '(e q'a 'a)'()) t >(e v al '(cons x'(b c))'((x a)(y b)))(a b c)
这几个分支(除了qu ote)都调用e v al来寻找自变量的值。
最后两个分支更复杂些。为了求con d表达式的值我们调用了一个叫e v con的辅助函数。它递归地对
con d分支进行求值,寻找第一个元素返回t的子句,如果找到了这样的子句,它返回此分支的第二个元素。
>(e v al '(con d((atom x)'atom)('t 'list))'((x'(a b)))) list
第二个分支的最后部分处理函数调用。它把原子替换为它的值(应该是lam bd a或la b el表达式)。然后对所得结果表达式求值。于是:
(e v al '(f'(b c))'((f(lam bd a (x)(cons 'a x)))))
变为:
(e v al '((lam bd a (x)(cons 'a x))'(b c))'((f(lam bd a (x)(cons 'a x)))))
它返回(a b c)
e v al的最后两个con d分支处理第一个元素是lam bd a或la b el的函数调。用为了对la b el表达式求值,先把函数名和函数本身压入上下文,然后调用e v al对一个内部有lam bd a的表达式求值,即:
(e v al '((la b el f irstatom (lam bd a (x)(con d((atom x)x)('t (f irstatom (car x)))))) y)'((y ((a b)(c d)))))
变为
(e v al '((lam bd a (x)(con d((atom x)x)('t (f irstatom (car x))))) y)'((f irstatom (la b el
f irstatom (lam bd a (x)(con d((atom x)x)('t (f irstatom (car x)))))))(y ((a b)(c d)))))
最终返回a。
最后,对形如((lam bd a (p1 p2... pn) e) a1 a2... an)的表达式求值,先调用e v lis来求得自变量(a1
a2... an)对应的值(v1 v2...v n),把(p1 v1)(p2v2)...(pn v n)添加到上下文里,然后对e求值。于是:
(e v al '((lam bd a (x y)(cons x(c d r y)))'a '(b c d))'())
变为:
(e v al '(cons x(c d r y))'((x a)(y (b c d))))
最终返回(a c d)。
讲了这么一大篇,如果你看懂了,说明你已经理解Lisp甚至FP的基本编程方式和思路,那么我们写了一个如此之长的程序究竟能干什么呢?
我们在这里得到了一个非常优美的计算模型,e v al函数实际上实现了整个语言,用它我们可以定义所需的任何其它函数。换句话说,我们现在有了一个自己的Lisp。
(注:由此可见,递归下降的语法分析是多么美好啊,因为它意味着你可以用几十、最多不过一两百行程序搞定一个复杂的分析器,对比LAL R你将更有体会)
下面我们该去哪儿?这个问题,请读者自己去寻找答案。
这个系列终于写完,很是费了我不少力气,因为我从小语文就一直不太好,有时很难表达清楚自己的意思。这次算是自己撵着自己这只鸭子上架吧。
Lisp的历史十分悠久,据说仅次于Fortran,算得上是第二古老的语言。对于Fortran,语言学家给予的负面评价远比正面评价多,甚至在很多场合被作为程序设计语言的反面教材;但是Lisp则刚好相反,它一直被人们作为一个优秀作品的例子被大加赞扬,这些人中包括著名的计算机科学家,Smalltal k的发明人——Alan K ay。
有一个传言,据说McCarthy当时想把这门语言的语法设计往后拖一拖,等到他把一些有趣的事做完之后,再回过头来给这门基于Lam bd a演算理论的语言加上一些数学家们熟悉的语法,可是他的一个学生发现,在一个还没有定义正式语法的抽象语法中写程序,感觉非常好,于是McCarthy干脆就决定不定义Lisp的语法。直到如今,Lisp的“语法”定义中值得一提的规则似乎只有一条“括号要配对”,其它的都是“语义”上的规范。
这样做当然不是没有代价的,很快Lisp就出现了第一个分支Scheme。这个语言由G u y Steele, Jr.和他的老师G eral d S u ssman设计。这两位最开始的工作是改进Lisp,他们共同把Lisp由D ynamic scope变成了Le x ical scope。今天几乎大家熟悉的所有语言都是Le x ical scope。后来他们共同把Contin u ation这个概念引入了Lisp,于是一门新语言就这样诞生。
随后,S u ssman把Le x ical scope和Scheme中的一些其它概念都引入了Lisp,并由此确立了Common Lisp的标准,S u ssman本人也一直是Common Lisp的主力。
作为一门最早出现的FP语言,Lisp当然有它的缺点,其中最为人诟病的恐怕就是括号了,所以随后出现的许多FP语言都试图使用另外的语法来清晰的描述程序,这其中最著名的当属H as k ell(也许还有Caml?),H as k ell是一门“纯正”的FP语言,在H as k ell中,变量不能赋值,没有循环,甚至没有程序流程,一切都是函数。
(注:我个人认为,想要领会FP的精髓,用H as k ell入门似乎更合适)
近年来,随着FP的进一步流行,许多命令式语言当中也逐步加入了FP的成分,典型如C++中的
“fu nctor”,如果你用过S T L或者Boost,你会发现利用fu nctor可以完成很多不可思议的功能。就我个人的经验,fu nctor最密集的应用是在Boost.Spirit库中,它可以让你用一大堆Parse/Match
F u nctor构造一个复杂的语法分析器。
熟悉一门函数式语言,用心体会它的妙用。在你转变思维方式后,你会发现即便是原来你熟悉的命令式语言
也能发挥出更大的威力。
C语言打字练习程序课程设计报告
青岛理工大学 《C语言程序设计》 题目打字练习程序 指导教师:李兰老师 姓名: 学号:2011 班级: 专业:计算机科学 地点:现代教育中心机房201 时间:2012.6.26 至2012.6.29
一、内容 本程序主要实现的是对使用者的打字速度进行练习和提高。因为界面友好亲和,因此能让使用者在轻松愉快中练习并快速提高自己的打字速度和准确性。程序主要的功能有记录使用者在本次使用中的击中数和总下落字母的个数之比。并且游戏设置了九个等级,随着数字的增加,等级越高,字母下落的速度逐步提高,这样能够更好的迎合不同水平的用户需求。使用本程序很简单,因为在写代码时,我很注重的是界面的友好,所以,在用户的每次操作前,界面上都有详细的操作提醒,只要跟着提示输入就能很快速地进入并开始练习。 二、上机环境 操作系统:windows XP(win7兼容) 开发工具:VC6.0 三、函数调用关系图 void main( ) start( ) printfScreen( ) levelChoice( ) newWord ( ) moving( ) wordHit( ) result( ) leave( )
四、各函数功能说明 1、void main( ) 主函数 2、void printScreen( ) 刷新屏幕函数 3、int levelChoice( ) 游戏等级选择函数 4、int newWord( ) 生成新字符函数 5、int moving( ) 字符下降函数 6、int wordHit( ) 击中字符函数 7、int result ( ) 结果输出函数 8、int start( ) 程序开始提示操作 9、void leave( ) 函数结束
《HTML基础试题》
《HTML基础试题》 一、单项选择题: 1、下面哪一个属性不就是文本的标签属性?( ) A. B.size C.color D.face 2、当链接指向下列哪一种文件时,不打开该文件,而就是提供给浏览器下载。( ) A.ASP B.HTML C.ZIP D.CGI 3、关于文本水平对齐,源代码设置不正确的一项就是:( ) A.居中对齐:
D. 5、下列哪一项就是在新窗口中打开网页文档。( ) A._self B._blank C._top D._parent 6、下面对JPEG格式描述不正确的一项就是。( ) A.照片、油画与一些细腻、讲求色彩浓淡的图片常采用JPEG格式 B.JPEG支持很高的压缩率,因此其图像的下载速度非常快 C.最高只能以256色显示的用户可能无法观瞧JPEG图像 D.采用JPEG格式对图片进行压缩后,还能再打开图片,然后对它重新整饰、编辑、压缩 7、常用的网页图像格式有____与_____( ) A、gif,tiff B.tiff,jpg C.gif,jpg D.bmp,png 8、下面说法错误的就是( ) A、CSS样式表可以将格式与结构分离 B.CSS样式表可以控制页面的布局 C、CSS样式表可以使许多网页同时更新 D.CSS样式表不能制作体积更小下载更快的网页 9、CSS样式表不可能实现( )功能。 A将格式与结构分离 B.一个CSS文件控制多个网页 C、控制图片的精确位置 D.兼容所有的浏览器 10、在HTML中,( )不就是链接的目标属性。 A、self B.new C.blank D.top 11、在网页设计中,( )就是所有页面中的重中之重,就是一个网站的灵魂所在。 A.标题栏 B.脚本页面 C、导航栏 D.页面内容 12、为了标识一个HTML文件应该使用的HTML标记就是( )。 A. B.
C语言入门经典(第四版)8-程序的结构
本文由泽五令贡献 ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C入门经典(第4版) 入门经典( 第08章 程序的结构 08章 如第1 如第1章所述,将程序分成适度的自包含单元是开发任一程序的基本方式. 当工作很多时,最明智的做法就是把它分成许多便于管理的部分,使每一部分 能很轻松地完成,并确保正确完成整个工作.如果仔细设计各个代码块,就可 以在其他程序中重用其中的一些代码块. . C入门经典(第4版) 入门经典( 8.1 程序的结构 如概述所言,C程序是由许多函数组成的,其中最重要的就是函数main(), 如概述所言,C程序是由许多函数组成的,其中最重要的就是函数main(), 它是执行的起点.本书介绍库函数printf()或scanf()时,说明了一个函数可以调 它是执行的起点.本书介绍库函数printf()或scanf()时,说明了一个函数可以调 用另一个函数,完成特定的工作,然后调用函数继续执行.不考虑存储在全局 变量中的数据的负面影响,程序中的每个函数都是一个执行特定操作的自包含 单元 . 变量的作用域和生存期 变量的作用域和函数 C入门经典(第4版) 入门经典( 8.1.1 变量的作用域和生存期 .1.1 在前面所有的例子中,都是在定义main()函数体的起始处声明程序的变量. 在前面所有的例子中,都是在定义main()函数体的起始处声明程序的变量. 事实上,可以在任何代码块的起始处定义变量.这有什么不同吗?这是绝对不 同的.变量只存在于定义它们的块中.它们在声明时创建,在遇到下一个闭括 号时就不存在了 . C入门经典(第4版) 入门经典( 8.1.2 变量的作用域和函数 .1.2 在讨论创建函数的细节之前,最后要讨论的是,每个函数体都是一个块 (当然,它可能含有其他块).因此,在一个函数内声明的自动变量是这个函数 当然,它可能含有其他块) 的本地变量,在其他地方不存在.所以在一个函数内部声明的变量完全独立于 在其他函数内声明的变量.可以在不同的函数内使用相同的变量名称,它们是 完全独立的. C入门经典(第4版) 入门经典( 8.2 变量的作用域和函数 本书的程序广泛使用了内置函数,例如printf()或strcpy().还介绍了在按 本书的程序广泛使用了内置函数,例如printf()或strcpy().还介绍了在按 名称引用内置函数时如何执行它们,如何通过函数名称后括号内的参数,给函 数传递信息.例如printf()函数的第一个参数通常是一个字符串,其后的参数 数传递信息.例如printf()函数的第一个参数通常是一个字符串,其后的参数 (可能没有)是一系列变量或要显示其值的表达式 . 可能没有) 定义函数 Return语句 Return语句 C入门经典(第4版) 入门经典( 8.2.1 定义函数 创建一个函数时,必须指定函数头作为函数定义的第一行,跟着是这个 函数放在括号内的执行代码.函数头后面放在括号内的代码块称为函数体. C入门经典(第4版) 入门经典( 8.2.2 return语句 return语句 return语句允许退出函数,从调用函数中发生调用的那一点继续执行. return语句允许退出函数,从调用函数中发生调用的那一点继续执行. return语句最简单的形式如下: return语句最简单的形式如下: return; C入门经典(第4版) 入门经典( 8.3 按值传递机制 这个重点是:valuel和value2的副本作为变元传送给函数,而没有传送变 这个重点是:valuel和value2的副本作为变元传送给函数,而没有传送变 量本身.也就是说,函数不能改变存储在value1或value2中的值.例如,如果 量本身.也就是说,函数不能改变存储在value1或value2中的值.例如,如果 给两变量输入4.0和6.0,编译器会在堆栈上创建这两个值的副本,在调用 给两变量输入4.0和6.0,编译器会在堆栈上创建这两个值的副本,在调用 average()函数时,average()函数会访问这些副本.这个机制是C average()函数时,average()函数会访问这些副本.这个机制是C语言中给函 数传送变元值
c语言入门经典必背个程序
c语言入门经典必背个程序 c语言入门经典必背18个程序 1 、/* 输出9*9 口诀。共9 行9 列,i 控制行,j 控制列。*/ #include "stdio.h" main() {int i,j,result; for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d 表示左对齐,占3 位*/ } printf("\n");/* 每一行后换行*/ } } 2 、/* 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔 子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21....*/ main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld",f1,f2); if(i%2==0) printf("\n");/* 控制输出,每行四个*/ f1=f1+f2; /* 前两个月加起来赋值给第三个月*/ f2=f1+f2; /* 前两个月加起来赋值给第三个月*/ } } 3 、/* 判断101-200 之间有多少个素数,并输出所有素数及素数的个数。 程序分析:判断素数的方法:用一个数分别去除 2 到sqrt( 这个数) ,如果能被整除, 则表明此数不是素数,反之是素数。*/ #include "math.h" main()
HTML语言入门教程
语言入门教程(一) ?什么是HTML语言 HTML(HyperText MarkUp Language)是使用特殊标记来描述文档结构和表现形式的一种语言,由W3C(World Wide Web Consortium)所制定和更新。我们可以用任何一种文本编译起来编辑HTML文件,因为它就是一总纯文本文件。 ?HTML语言的基本结构 下面我们来看一小段HTML语言的代码,来了解HTML语言的基本结构:
在文本编译器中编译,改变网页的大小,就会看到这两者表示长度方法的不同。
html入门教程适合初学者
希望可以帮到大家 一、HTML基本概念 什么是HTML文件? ?HTML的英文全称是Hypertext Marked Language,中文叫做“超文本标记语言”。?和一般文本的不同的是,一个HTML文件不仅包含文本内容,还包含一些Tag,中文称“标记”。 ?一个HTML文件的后缀名是.htm或者是.html。 ?用文本编辑器就可以编写HTML文件。 这就试写一个HTML文件吧! 打开你的Notepad,新建一个文件,然后拷贝以下代码到这个新文件,然后将这个文件存成first.html。
要浏览这个first.html文件,双击它。或者打开浏览器,在File菜单选择Open,然后选择这个文件就行了。 示例解释 这个文件的第一个Tag是,这个Tag告诉你的浏览器这是HTML文件的头。文件的最后一个Tag是,表示HTML文件到此结束。 在
和之间的内容,是Head信息。Head信息是不显示出来的,你在浏览器里看不到。但是这并不表示这些信息没有用处。比如你可以在Head信息里加上一些关键词,有助于搜索引擎能够搜索到你的网页。 在HTML语言入门教程
语言入门教程(一) 第一课基础 Html是英文 HyperText Markup Language 的缩写,中文意思是“超文本标志语言”,用它编写的文件(文档)的扩展名是.html或.htm,它们是可供浏览器解释浏览的文件格式。您可以使用记事本、写字板或 FrontPage Editor 等编辑工具来编写Html文件。Html语言使用标志对的方法编写文件,既简单又方便,它通常使用<标志名>标志名>来表示标志的开始和结束(例如标志对),因此在Html文档中这样的标志对都必须是成对使用的。 当我们畅游Internet时,我们透过浏览器所看到的网站,是由HTML (HyperText Markup Language) 语言所构成。HTML ( 超文件标记语言 ) 是一种建立网页文件的语言,透过标记式的指令 (Tag),将影像、声音、图片、文字等连结显示出来。 HTML标记是由 < 和 > 所括住的指令,主要分为 : 单标记指令、双标记指令 ( 由 < 起始标记 >,< / 结束标记 >所构成 ) 。HTML网页文件可由任何文本编辑器或网页专用编辑器编辑,完成后 ( 以 .htm
.html 为文件后缀保存 ) 将HTML网页文件由浏览器打开显示,若测试没有问题则可以放到服务器 (Server) 上,对外发布信息。 HTML文件基本架构 文件开始
标头区开始HTML语言基础练习题
如对你有帮助,请购买下载打赏,谢谢! 第一部分:基础词汇 1、单词 head,头body,身体block,块inline,一行内width,宽度height,高度image,图像title,标题parent,父亲blank,空白的table,表格row,行character,字符 column,列 caption,说明文字 list,列表 form,表单 type,类型 input,输入 text,文本 password,密码 value,值 select,选择 option,选项 textarea,文本域 submit,提交 button,按钮 reset,重置 action,动作 method,方法 target,目标 left,左 right,右 center,中 top,上 bottom,下 2、词语缩写 术语:HTML,HyperText Markup Language,超级文本标记语言 术语:URL,Uniform Resoure Locator,统一资源定位器 术语:HTTP,Hyper Text Transfer Protocol,超文本传输协议 术语:WWW,World Wide Web,万维网 术语:IP,Internet Protocol,网络互连协议 属性:src,source,源 属性:href,hypertext reference,超文本引用 属性:id,identification,身份证、唯一标识 属性:class,类别 属性:title,标题、字幕 属性:style,样式 标签:a,anchor,锚或超链接 标签:div,division,部分区域 标签:ul,unordered lists,无序列表 标签:ol,ordered lists,有序列表 标签:img,image,图像 标签:p,paragraph,段落 标签:meta,metadata,元数据、描述信息的数据 第二部分:HTML基本结构(以html5为例)
我是一级标题
这是一个段落 2、有一幅鲜花图片,名称为“flower.jpg”,假设图片与网页文件在同一个文件夹内,设置鲜花图片的高度为85px,宽度为100px,并要求实现鼠标指针停留在图片上时,显示字幕“鲜花”。
(完整word版)(整理)C语言入门经典案例及源代码.
循环控制输出图案 【程序1】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include "stdio.h" main() { int i,j,result; printf("\n"); for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/ } printf("\n");/*每一行后换行*/ } } 【程序2】 题目:要求输出国际象棋棋盘。 1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: #include "stdio.h" main() { int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) if((i+j)%2==0) printf("%c%c",219,219); else printf(" "); printf("\n"); } } ============================================================== 【程序3】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。 2.程序源代码: #include "stdio.h"
main() { int i,j; printf("\1\1\n");/*输出两个笑脸*/ for(i=1;i<11;i++) { for(j=1;j<=i;j++) printf("%c%c",219,219); printf("\n"); } } 【程序4】 题目:打印出如下图案(菱形) * *** ****** ******** ****** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。 2.程序源代码: main() { int i,j,k; for(i=0;i<=3;i++) { for(j=0;j<=2-i;j++) printf(" "); for(k=0;k<=2*i;k++) printf("*"); printf("\n"); } for(i=0;i<=2;i++) { for(j=0;j<=i;j++) printf(" "); for(k=0;k<=4-2*i;k++) printf("*"); printf("\n"); } }
HTML基础试题》
《H T M L基础试题》 一、单项选择题: 1、下面哪一个属性不是文本的标签属性?() A. B.size C.color D.face 2、当链接指向下列哪一种文件时,不打开该文件,而是提供给浏览器下载。 () A.ASP B.HTML C.ZIP D.CGI 3、关于文本水平对齐,源代码设置不正确的一项是:() A.居中对齐:
D. 5、下列哪一项是在新窗口中打开网页文档。() A._self B._blank C._top D._parent 6、下面对JPEG格式描述不正确的一项是。()
A.照片、油画和一些细腻、讲求色彩浓淡的图片常采用JPEG格式 B.JPEG支持很高的压缩率,因此其图像的下载速度非常快 C.最高只能以256色显示的用户可能无法观看JPEG图像 D.采用JPEG格式对图片进行压缩后,还能再打开图片,然后对它重新整饰、 编辑、压缩 7、常用的网页图像格式有____和_____( ) A.gif,tiff B.tiff,jpg C.gif,jpg D.bmp,png 8、下面说法错误的是( ) A.CSS样式表可以将格式和结构分离 B.CSS样式表可以控制页面的布局 C.CSS样式表可以使许多网页同时更新 D.CSS样式表不能制作体积更小下 载更快的网页 9、CSS样式表不可能实现( )功能。 A将格式和结构分离 B.一个CSS文件控制多个网页 C.控制图片的精确位置 D.兼容所有的浏览器 10、在HTML中,( )不是链接的目标属性。 A.self B.new C.blank D.top 11、在网页设计中,( )是所有页面中的重中之重,是一个网站的灵魂所在。 A.标题栏 B.脚本页面 C.导航栏 D.页面内容 12、为了标识一个HTML文件应该使用的HTML标记是( )。 A. B.
基于HTML语言的网页制作基础
《网页设计基础与网站维护》课程论文基于HTML语言的网页制作基础 学号: 姓名: 专业: 学院: 日期: 学期: 上课教室: 联系方式: 指导老师: 论文成绩:
基于HTML语言的网页制作基础 【内容摘要】本文着重于基于HTML语言的网页制作,通过对“网页设计基础”课程的总结学习,主要介绍了网页制作的基本知识、HTML语言的具体介绍、利用HTML语言制作网页的基本方法技术,以及网页设计的发展方向等。 【关键词】HTML语言、网页设计、代码、标记 一、网页设计制作介绍 网页(Web page)是一个文件,他存放在世界某个角落的某一部计算机中,而这部计算机必须是与互联网相连的。网页经由网址(URL)来识别与存取,是万维网中的一“页”,是超文本标记语言格式(标准通用标记语言的一个应用,文件扩展名为.html或.htm)。网页通常用图像档来提供图画。网页要透过网页浏览器来阅读。 网页设计是指使用标识语言(markup language),通过一系列设计、建模、和执行的过程将电子格式的信息通过互联网传输,最终以图形用户界面(GUI)的形式被用户所浏览。简单来说,网页设计的目的就是产生网站,什么是网站呢,就是服务器内的一系列网页的组合,终端用户发出请求后[[服务器通过传输特定的网页向用户传输所需的信息。简单的信息如文字,表格,都可以通过使用HTML/XHTML/XML放置到网站页面上。而更复杂的信息如动画,视频,声频则需要插件程序例如Flash, QuickTime, Java run-time environment,等等,这些插件程序也是通过HTML/XHTML/XML植入网页的。 网页设计的工具: ⑴Dreamweaver,用于编辑HTML、ASP、JSP、PHP、CSS、XML、JS的页面制作工具; ⑵Frontpage,跟Dreamweaver一样,不过个人感觉还是Dreamweaver好; ⑶Flash,网页需要画面流动时的首选择; ⑷Photoshop,图像处理软件,一般网页都需要有图片相搭配,Photoshop是款很强大的工具。 ⑸Fireworks,跟Photoshop一样都是图像处理软件,但Fireworks偏向与对网页
51单片机及C语言入门教程
51单片机 及C语言入门教程 注:排成16开版式,是为了方便自已打印阅读。请不要用于非法用途。 2007.12.20
51单片机及C语言入门教程 第一课 建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。(安装的方法和普通软件相当这里就不做介绍了) 安装好后,你是不是迫不及待的想建立自己的第一个C程序项目呢?下面就让我们一起来建立一个小程序项目吧。或许你手中还没有一块实验板,甚至没有一块单片机,不过没有关系我们可以通过KEIL软件仿真看到程序运行的结果。 首先当然是运行KEIL51软件。怎么打开?噢,天!那你要从头学电脑了。呵呵,开个玩笑,这个问题我想读者们也不会提的了:P。运行几秒后,出现如图1-1的屏幕。 图1-1启动时的屏幕
接着按下面的步骤建立您的第一个项目: (1)点击Project菜单,选择弹出的下拉式菜单中的New Project,如图1-2。接着弹出一个标准Windows文件对话窗口,如图1-3,这个东东想必大家是见了N次的了,用法技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在"文件名"中输入您的第一个C程序项目名称,这里我们用"test",这是笔者惯用的名称,大家不必照搬就是了,只要符合Windows文件规则的文件名都行。"保存"后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。 图1-2New Project菜单 图1-3文件窗口 (2)选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。此时屏幕如图1-4
html基础网页编程语言
HTML 文档主题标记
标记的主要属性: 。bgcolor 设置页面颜色,如:bgcolor=“#eeffee” 。background 设置页面背景图片,如:background = “images/bg.gif” 。bgproperties = “fixed” 使背景图片不随着滚动条的滚动而滚动 。text 设置文档正文的文字颜色,如:text = “#ff6666” 其它的标记: 分段标记:段落文字 换行标记:段内第一段文字段内第二段文字 正文标记:
1号正文标题文字
注释标记: 水平分隔线:. 文档头部信息 用于标记HTML文档头部信息,主要是供给浏览器或网络搜索引擎使用,而不会显示在网页正文中。 的主要子标记:
HTML语言基础练习题
第一部分:基础词汇1、单词 head,头body,身体block,块inline,一行内width,宽度height,高度image,图像title,标题parent,父亲blank,空白的table,表格row,行character,字符 column,列 caption,说明文字 list,列表 form,表单 type,类型 input,输入 text,文本 password,密码 value,值 select,选择 option,选项 textarea,文本域 submit,提交 button,按钮 reset,重置 action,动作 method,方法 target,目标 left,左 right,右 center,中 top,上 bottom,下 2、词语缩写 术语:HTML,HyperText Markup Language,超级文本标记语言 术语:URL,Uniform Resoure Locator,统一资源定位器 术语:HTTP,Hyper Text Transfer Protocol,超文本传输协议 术语:WWW,World Wide Web,万维网 术语:IP,Internet Protocol,网络互连协议 属性:src,source,源 属性:href,hypertext reference,超文本引用 属性:id,identification,身份证、唯一标识 属性:class,类别 属性:title,标题、字幕 属性:style,样式 标签:a,anchor,锚或超链接 标签:div,division,部分区域 标签:ul,unordered lists,无序列表 标签:ol,ordered lists,有序列表 标签:img,image,图像 标签:p,paragraph,段落 标签:meta,metadata,元数据、描述信息的数据 第二部分:HTML基本结构(以html5为例)
HTML零基础入门教程
首语 人们常常以为制作一个网站很难,但其实并非如此!人人都能学会如何制作网站。而且,假如你继续阅读本教程的话,你将能在一小时内制成一个网站。 有些人觉得制作网站需要昂贵的、高级的工具——当然这是错误的。的确有许多软件声称它们可以为你创建网站,它们有的比较好用,有的就差些。但如果你要制作符合W3C规范并令你满意的网页的话,你必须自己动手做。好在这不难,而且你已具备所需的全部软件了。本教程的目的就是:通过简单、全面和正确的介绍,教会你如何创建网站。本教程将从基础讲起,不要求你具备任何编程知识。 当然,本教程无法遍及所有知识,所以你要自己多做实验。不过别担心,学习制作网站是件充满乐趣的事,而且一旦掌握它,你便会感到无比满足。 你可以自由选择如何使用本教程,但我们建议你每天学习2到3课,然后花点时间来实验你所学到的新知识。 好的,不多说,我们现在就开始吧! 第1课:开始学习 1
2
你可以先在自己的计算机上制作网站,待网站制作完毕再上传到因特网上。 接下来学习什么? 下一课将介绍HTML是什么,然后从第三课开始学习有趣的HTML。 第2课:HTML是什么? 这一课将为你简要介绍你的新朋友——HTML。 HTML是什么? HTML是浏览器的“母语”。 长话短说,HTML是由一名叫Tim Berners-Lee的科学家发明的。他发明HTML的目的,是为了方便不同大学的科学家们可以更容易地获取彼此的研究文档。HTML取得了的巨大成功,大大超出了Tim Berners-Lee的原本预计。通过发明HTML,他为我们今天所认识的万维网奠定了基础。 HTML是一门语言,它令我们可以在因特网上展示信息(例如科学研究信息)。你所看到的网页,是浏览器对HTML进行解释的结果。要查看一个网页的HTML代码,只需在浏览器菜单栏上点击“查 ”,然后选择 3
计算机C语言基础提高试题(附答案)
计算机基础提高资料:C语言篇 一、基础知识专项练习 1、以下标识符中,不能作为合法的C用户定义标识符的是()。 (点击查看答案>>>>>>>>) A、a3_b3 B、void C、_123 D、IF 难度:★ 2、在C语言中,引用数组元素时,其数组下标的数据类型允许是()。(点击查看答案>>>>>>>>) A、整型常量 B、整型表达式 C、整型常量或整型表达式 D、任何类型的表达式 难度:★ 3、枚举类型中的每个枚举常量的值都是一个()。 (点击查看答案>>>>>>>>) A、整数 B、浮点数 C、字符 D、记录 难度:★ 4、下列关于C语言的自增和自减运算符的使用中,正确的是()。(点击查看答案>>>>>>>>) A、15++ B、(x+y)-- C、++(a-b) D、s+++t+++u++ 难度:★★
5、设int x[]={1,2,3,4,5,6},*p=x; 则值为3 的表达式是( ) (点击查看答案>>>>>>>>) A、p+=2,*++p; B、p+=2,*p++ C、p+=3,*p D、p+=2,++*p 难度:★★ 6、下面函数的功能是()(点击查看答案>>>>>>>>) A、计算字符串的位(bit)数 B、复制一个字符串 C、求字符串的长度 D、求字符串存放的位置 难度:★★ 7、下面程序的输出是什么()(点击查看答案>>>>>>>>) A、2 1 B、2 5 C、1 2 D、5 2 难度:★★★
8、能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()(点击查看答案>>>>>>>>) A、return这二个数 B、形参用数组 C、形参用二个指针 D、用二个全局变量 难度:★★★ 9、若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为( )。(点击查看答案>>>>>>>>) A、a<>0 B、!a C、a=0 D、a 难度:★★★ 10、请找出下面代码中的所有错误。说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”( )。(点击查看答案>>>>>>>>) A、第7行要为'\0'分配一个空间 B、第9行改成char * s = &src[len-1] C、第12行前要加上*d = '\0' D、第13行前要加上free(dest)释放空间 难度:★★★
HTML基础知识
HTML 学习任何一门语言,都要首先掌握它得基本格式,就像写信需要符合书信得格式要求一样。HTML标记语言也不例外,同样需要遵从一定得规范。接下来将具体讲解HTML文档得基本格式。 HTML文档得基本格式主要包括文档类型声明、根标记、
头部标记、主体标记,具体介绍如下: (1) 标记 标记位于文档得最前面,用于向浏览器说明当前文档使用哪种 HTML 或 XHTML(可扩展超文本标记语言)标准规范,必需在开头处使用标记为所有得XHTML文档指定XHTML版本与类型,只有这样浏览器才能将该网页作为有效得XHTML文档,并按指定得文档类型进行解析。 (2) 标记 标记位于 标记之后,也称为根标记,用于告知浏览器其自身就是一个 HTML 文档, 标记标志着HTML文档得开始,标记标志着HTML文档得结束,在它们之间得就是文档得头部与主体内容。 在之后有一串代码“xmlns=""”用于声明XHTML统一得默认命名空间。 (3)标记 标记用于定义HTML文档得头部信息,也称为头部标记,紧跟在标记之后,主要用来封装其她位于文档头部得标记,例如