人人范文网 其他范文

java游戏高级编程(精选多篇)

发布时间:2022-05-16 12:06:15 来源:其他范文 收藏本文 下载本文 手机版

推荐第1篇:Java线程编程总结

线程编程方面

60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法

反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被\"挂起\"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。 6

1、sleep() 和 wait() 有什么区别? 答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

62、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 6

3、启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

64、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 答:不能,一个对象的一个synchronized方法只能由一个线程访问。

我认为:其他线程可以进入非synchronized方法,但不能进入这个对象的synchronized方法。 6

5、请说出你所知道的线程同步的方法。

答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

66、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 6

7、线程的基本概念、线程的基本状态以及状态之间的关系

答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束

68、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 答:主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

Jsp方面

69、forward 和redirect的区别

答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以seion,request参数都可以获取。 70、jsp有哪些内置对象?作用分别是什么?

答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):

request 用户端请求,此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

seion 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出 config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

71、jsp有哪些动作?作用分别是什么? 答:JSP共有以下6种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记 7

2、JSP中动态INCLUDE与静态INCLUDE的区别?

答:动态INCLUDE用jsp:include动作实现

它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

<%@ include file=\"included.htm\" %>7

3、两种跳转方式分别是什么?有什么区别? 答:有两种,分别为:

前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

74、JSP的内置对象及方法。

答:request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和seion数据的有用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

seion表示一个请求的javax.servlet.http.HttpSeion对象。Seion可以存贮用户的状态信息

applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 page表示从该页面产生的一个servlet实例

Servlet方面

75、说一说Servlet的生命周期?

答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

76、JAVA SERVLET API中forward() 与redirect()的区别?

答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。 7

7、Servlet的基本架构 答:

public cla ServletName extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }

78、什么情况下调用doGet()和doPost()?

答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。 7

9、servlet的生命周期

答:web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

80、如何现实servlet的单线程模式 答:<%@ page isThreadSafe=\"false\"%>8

1、页面间对象传递的方法

答:request,seion,application,cookie等

82、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

答:JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是\"类servlet\"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。 8

3、四种会话跟踪技术

答:会话作用域ServletsJSP 页面描述

page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面

request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)

seion是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求

application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 8

4、Request对象的主要方法 答:

setAttribute(String name,Object):设置名字为name的request的参数值 getAttribute(String name):返回由name指定的属性值

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的Body的长度

getHeader(String name):获得HTTP协议定义的文件头信息 getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例 getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例 getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法

getParameter(String name):获得客户端传送给服务器端的有name指定的参数值

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 getParameterValues(String name):获得有name指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串

getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字

getSeion([Boolean create]):返回和请求相关Seion getServerName():获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号

removeAttribute(String name):删除请求中的一个属性

85、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 答:

Public String translate (String str) { String tempStr = \"\"; try { tempStr = new String(str.getBytes(\"ISO-8859-1\"), \"GBK\"); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMeage()); } return tempStr; } 8

6、Servlet执行时一般实现哪几个方法? 答:

public void init(ServletConfig config) public ServletConfig getServletConfig() public String getServletInfo() public void service(ServletRequest request,ServletResponse response) public void destroy()

Jdbc、Jdo方面8

8、Jdo是什么?

87、Cla.forName的作用?为什么要用?

答:调用该访问返回一个以字符串指定类名的类的对象。 答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。 8

9、说出数据连接池的工作机制是什么? 答:J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 90、Jdo是什么? 答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

Xml方面

91、xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问。

SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML (StAX) 9

2、你在项目中用到了xml技术的哪些方面?如何实现的?

答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。

93、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 答:a: 两种形式 dtd schema,b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问

SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML (StAX)

推荐第2篇:游戏编程入门

游戏编程入门

经常有人问我,没有编程经验的人该如何开始开发游戏。在此之前,我总是一个个的尽力回答。然而,后来提相同问题的人数增长到难以处理的地步。我决定,是时候把我所有的建议写成文章,作为一个大概。

这篇文章是针对那些想要开发自己游戏,但几乎没有编程经验的人。事实上,我假设读者没有任何编程经验。我主要讨论游戏开发的程序和设计方面,而不是艺术性。我也不准备讲述如何进入游戏行业(这方面已经有足够的资料),而只是让你逐步的开始开发自己的游戏。最后,我所指出的这条道路也并不能作为唯一的,或是最好的路径来学习开发游戏,但至少对我和一些人很有用。 选择一门语言

你要做的第一件事就是选择一门开发语言。你有很多选择,包括

Basic,Pascal,C,C++,Java,等等。也经常会有人争论对于初学者那一门语言是最好的。对于这一系列流行语言的讨论,你可以参看John Hattan的著作,What Language Do I Use?(我用什么语言?)

我的建议是以C和C++开始。有些人会说这些语言对初学者来说太高级了,但因为我自己就是学C++,我并不同意这一说法。而且,C/C++是当今使用最广泛的语言(译者认为应该是汉语。。。),所以你可以找到大量学习资料和帮助。你先学C或C++都无所谓,因为只要学了一个,再学另外一个就很容易。但是,如果你先学C++,请保证在学习面向对象编程之前能理解和使用过程编程(等编程熟练再去学习类)。(译者:C是过程性语言,C++是面向对象语言)

如果你开始学习C/C++,发现太难,那再学一个简单一点的也没关系,比如Basic或Pascal。但是我真的认为,如果你坚持努力,而且有好的资料,学C/C++应该没有太大问题。

你的下一个问题可能会是:“我该怎么学C/C++?”我很高兴你这样问。最好的办法是上课。有老师可以回答你的问题,帮助你产生很大进步,编程练习作业也可以保证你能用到所学的东西。

如果你不觉得上课是个好主意,那最好的办法就是买一些好书。不要花太多时间去选一本什么“超级宝典”或“万用全书”,因为你最终可能会买几本。我建议你去一家书店,然后拿几本比较入眼的C或C++书看,直到找到一本或几本你能看懂,并且可以拿来学习的。同时,你可能会想要一些更深入的,或者一些材料,但是你一旦对于这门语言有了一些了解,我相信你应该有自己更好的选择。在这里,我有必要花一些时间,来说我看到很多初学者所关心的一个事情,特别是年轻人:没有钱买书和其他东西。首先,有很多免费资源可以利用,图书馆,Macmillan Computer Publishing(/personal),有成千上百的编程书籍。但是如果你真的想要成为一个好的程序员,还是应该投入一部分资金。应当想方设法(合法的)帮助你弄到一些钱。

网上也有很多C/C++的学习指南。但是我认为那只能作为补充而不是你自学的主要资源。

选择正确的编译器

你写的程序,或者代码,是以文本方式储存的,你甚至可以用记事本写C/C++程序。但是总需要有东西把他们转换成为可执行文件。对于C和C++,那就是编译器。

可用的编译器有好多种,包括很多免费的。选择一款自己适合的编译器很重要,免费的编译器就有这样的好处,你可以把它们试个遍,然后从中选择自己最喜欢的。然而,免费编译器比起商业版,可能会缺失一些功能和大部分服务。幸运的是,多数商业版编译器也兼售介绍版或学习版,这要便宜得多,通常功能却不见得少,唯一的限制是你不能发布用它编译的程序(短时间内你也根本用不着)。

总之,选择编译器取决于你能花多少钱,用什么操作系统,和为什么平台开发。如果要为windows开发,我强烈推荐Microsoft Visual C++。他强大的开发环境使得很多事做起来更方便,毫无疑问没有其他编译器更适合开发windows应用程序。如果你是个学生,你还可以折价买到。(译者:爽!)如果你在DOS平台开发,你最好的选择可能是DJGPP,免费的哦~。

选择开发平台

尽管最终你很可能为好几个平台开发,总要先选择一个来学。当你在学这门语言,还没有接触到图像的时候,你可能会想使用非图形用户界面的操作系统,比如DOS,Unix.这样可以避免接触高层,比如windows编程,让你集中精力学习语言本身。

一旦你做好开发游戏的准备,那么,应该考虑是否改变平台,让我们来看看每个选项的特征。

windows:如果你想成为游戏行业的专家,或者如果你想让许多人来玩你开发的游戏,那么,这就是你要选择的平台。因为多数你的用户使用windows,而且现在我也看不出有什么改变的迹象。当今大多数的windows游戏都是由一种你可能听说过技术---DirectX---开发的。你可以DirextX这个库直接访问硬件,这意味着你可以开发高性能的游戏。

DOS:DOS过去是占统治地位的游戏平台,但是已经一去不复返了。尽管可能有一些特殊爱好者还在为DOS开发游戏,现在没有一个为DOS开发的商业游戏,他也将继续衰落,直到微软不再支持。如果你只是想开发游戏,还是不要选择DOS,如果你非要这么做,也不要太久。记住:由于存在大量DOS游戏开发的书,可能还有人辩护从这些书中学习DOS游戏开发。但是,windows游戏开发的书越来越多,那些辩解也变得越来越无力。

Linux:Linux是Unix的一种,由于很多原因后来变得流行,包括稳定性,价格,和反微软情绪。尽管Linux用户还是相当少,但是围绕着他的热情和不断增长的市场潜力使其也成为不错的选择。

Macintosh:MAC有大量忠实粉丝并不能说明什么,几乎每一个和我讨论的MAC狂热者都需要更多更好的游戏。我没有见过多少MAC游戏开发资源,但我相信还是有的,因此这也是一个选择。

consoles:console(就是PS,N64,DC等等)的游戏市场十分巨大,当然

console游戏开发的前景也不错。然而以非商业的形式开发console游戏,出于各种原因,在现在似乎行不通。如果你开发console,很可能是在被商业游戏开发组雇用之后。

开始进入主题

现在是时候讨论开发游戏了。简单起见,我假设你选择用C/C++在windows平台开发,可能你选择别的,但大多数我说的还是有用的。

首先,甚至在你打算开始开发游戏之前,你必须很好掌握C和C++.你应该懂指针,数组,结构体,函数,可能还有类。如果你精通他们,就可以开始做游戏了。

这篇文章可能不能教会你所有关于开发游戏的东西。幸运的是,也没有这个必要。这方面有很多书,网上也有很多指南。GameDev.net应该有所有你想要的东西,这里我建议你怎么开始:

找一本或几本书。对于windows游戏开发初学者,Tricks of the Windows Game Programming Gurus是个完美的开始。除此之外,还有许多好书.读透这些书,试试所有的例子,不懂得部分多读几遍。

网上指南作为补充。除了弄清书上读到的,他们还涉及一些书上没有谈及的主题。

向专家寻求帮助。如果你不能在书上或指南找到问题的答案,好好利用我们的论坛和聊天室。那里有好多专家愿意帮助别人。

这并不是要你按照顺序执行的,而是可以同时并且不断的重复执行。

光学习还是不够的,你必须运用你所学到的。从一个小游戏开始,然后在这个基础上前进。你可以看一下Geoff Howlands 的著作: How do I Make Games?

A Path to Game Development.

开始,自己独立工作。不要急着加入团队,那样只会减缓学习过程。而且一旦你有了自己的几个游戏,你可以为团队做出更大的贡献。

还有关于书,你应该不仅仅看游戏开发的书。为了能够开发出你看到商店出售的游戏,你应该钻研比大多数游戏开发书籍更高级的一些主题。有一些可以在网上找到,但你也应该选一些图形学,人工智能,网络,物理学等方面的书。计算机科学学位看来唾手可得,但因为你被迫上这些课的时候可能认为他们和游戏开发无关----你错了!

包装

这里有一些提示很有用

不要只积累知识,用它:你永远不会知道会理解一些东西知道你是用他们。用你学的东西作些演示。做作书上的练习。

经常玩游戏:这样做会使你做出更好的游戏。而且可以减轻编程的枯燥。帮助别人:能帮别人的地方尽量帮助别人,教别人的过程中自己会学到更多。有始有终:不要有这样的想法“我能够完成这个游戏了,但是我又有一个新的想法,那就直接做下一个。”你可以学得更多如果你完成他,你也可以用事实证明你不是只会空谈。所以,尽量不要做很大很复杂的游戏,直到你有了一定经验。

开始吧!你现在可以开始准备QUAKE4了。可能你不是不是很了解,但是至少应该知道如何开始这条道路,找多些资料,加上多年努力工作,他一定会实现!

推荐第3篇:游戏编程感想

游戏编程感想

9

班 53080907 周杰

首先,通过游戏编程课程的学习,我了解了怎么用我们所学过的知识进行游戏编程,不过对于第一开始应该用什么语言,你有许多种选择,包括Basic、Pascal、C、C++、Java等等,而且在网上关于游戏制作新手应该选择哪门语言的讨论也很多。推荐选择C和C++做为开始写游戏的语言。一些人可能会说这两种语言对于没有编程经验的新手来说有点难度,我不同意这种说法,因为我就是刚开始的也是选择这两种语言。另外C/C++在今天是两种应用范围最广的语言,因此你才会更有可能得到更多的编程和学习资源以及其他人的帮助。

其次,如果要进行游戏编程,我们要对我们在大学期间学过的相关知识有个大概的了解,游戏编程设计到经济学,统筹学,物理学,机器人学,生物学,心理学,人工智能,计算机图形学,多媒体技术,虚拟现实等等。而且它也是一个团队的合作才能完成的工作,它所涉及的工作有策划、程序、美术、音乐等。只有每个方面的工作相互配合达到完美,所设计出来的游戏才是一款经典的游戏作品。

第三,作为游戏编程,它所设计的不单单是一款游戏,如果把它想成仅仅工人们娱乐消遣的工具,那就把游戏定义的有所狭隘。游戏只是人们日常生活中所能接触到的一部分应用,它更可以应用虚拟现实的技术把这个产品应用到人们生活的方方面面,比如军事模拟训练,仿真模拟等等。

最后,不要仅仅是积累知识,用它。除非你用它们,否则你不能真正的知道和理解它们。用你所学的东西制作一个小的Demo。认真的去做书里面每个章节后面留的练习。

尽量玩更多的游戏。这样做可以给你许多灵感并能帮助你把游戏做的更好一些。这也可以给你枯燥的编程工作减轻一些痛苦。

帮助别人。在教别人或者给别人讲解的过程中你将会更加的了解自己,学到很多东西。 有始有终。不要陷入“我知道我能完成这个游戏,但是我有更好的方法,因此我要继续想想我的那个方法。”如果你能完完整整的写完一个你从一开始要做的游戏,你将会学到非常非常多的东西,而且你也有东西可以证明你不是一个把什么东西都停留在嘴巴上的人。在你成为一个有经验的游戏程序员之前,请把你要做的游戏更简单更容易一些,不要贸然的去尝试写一些比较大或者很复杂的游戏。

推荐第4篇:高级JAVA、PHP程序员岗位职责

1.负责公产品软件设计、开发、测试和维护工作,主要为C++、java、php。2.负责任务的质量和完整性,包含故障分析、解决、修复,一般文档编制。3.发现和指出项目或计划中的设计问题。4.总结产品研发经验,持续改进产品性能。5.为产品的市场推广提供技术支持。6.报据用户或公司其他部门的要求进行设计修改和设计改进。7.研究项目技术细节,编写相应的说明书。

推荐第5篇:Android 4高级编程

Android 4高级编程

目录

第1章 Android简介 1

1.1 一些背景信息 2

1.1.1 不远的过去 2

1.1.2 未来的前景 2

1.2 对Android的误解 3

1.3 Android:开放的移动开发平台 3

1.4 原生Android应用程序 4

1.5 Android SDK的特征 5

1.5.1 访问硬件(包括摄像头、GPS和

传感器) 5

1.5.2 使用Wi-Fi、蓝牙技术和NFC

进行数据传输 6

1.5.3 地图、地理编码和基于位置的

服务 6

1.5.4 后台服务 6

1.5.5 使用SQLite数据库进行数据

存储和检索 7

1.5.6 共享数据和应用程序间通信 7

1.5.7 使用Widget和Live Wallpaper

增强主屏幕 7

1.5.8 广泛的媒体支持和2D/3D图形 7

1.5.9 Cloud to Device Meaging 8

1.5.10 优化的内存和进程管理 8

1.6 开放手机联盟简介 8

1.7 运行Android的环境 9

1.8 从事移动开发的原因 9

1.9 从事Android开发的原因 9

1.9.1 推动Android普及的因素 10

1.9.2 Android的独到之处 10

1.9.3 改变移动开发格局 11

1.10 开发框架简介 11

1.10.1 开发包中的资源 12

1.10.2 理解Android软件栈 12

1.10.3 Dalvik虚拟机 14

1.10.4 Android应用程序架构 14

1.10.5 Android库 15

第2章开始入手 17

2.1 Android开发 18

2.1.1 开始前的准备工作 18

2.1.2 创建第一个Android应用程序 24

2.1.3 Android应用程序的类型 31 2.2 面向移动设备和嵌入式设备的 开发 32 2.2.1 硬件限制带来的设计考虑事项 32 2.2.2 考虑用户环境 35 2.2.3 Android开发 36 2.3 Android开发工具 40 2.3.1 Android虚拟设备管理器 41 2.3.2 Android SDK管理器 42 2.3.3 Android模拟器 42 2.3.4 Dalvik调试监控服务(DDMS) 42 2.3.5 Android调试桥(ADB) 43 2.3.6 Hierarchy Viewer和Lint工具 43 2.3.7 Monkey和Monkey Runner 43 第3章创建应用程序和Activity 45 3.1 Android应用程序的组成部分 46 3.2 应用程序Manifest文件简介 47 3.3 使用Manifest编辑器 54 3.4 分离资源 55 3.4.1 创建资源 55 3.4.2 使用资源 63 3.4.3 为不同的语言和硬件创建 资源 66 3.4.4 运行时配置更改 68 3.5 Android应用程序生命周期 70 3.6 理解应用程序的优先级和进程 状态 70 3.7 Android Application类简介 72 3.7.1 扩展和使用Application类 72 3.7.2 重写应用程序的生命周期 事件 73 3.8 深入探讨Android Activity 74 3.8.1 创建Activity 74 3.8.2 Activity的生存期 76 3.8.3 Android Activity类 81 第4章创建用户界面 83 4.1 Android UI基本设计 84 4.2 Android UI的基础知识 84 4.3 布局简介 85 4.3.1 定义布局 86 4.3.2 使用布局创建设备无关的UI 87 4.3.3 优化布局 90 4.4 To-Do List示例 93 4.5 Fragment介绍 100

4.5.1 创建新的Fragment 101 4.5.2 Fragment的生命周期 101 4.5.3 Fragment Manager介绍 105 4.5.4 向Activity中添加Fragment 105 4.5.5 Fragment和Activity之间的 接口 110 4.5.6 没有用户界面的Fragment 111 4.5.7 Android Fragment 类 112 4.5.8 对To-Do List示例使用 Fragment 112 4.6 Android widget 工具箱 116 4.7 创建新视图 117 4.7.1 修改现有的视图 118 4.7.2 创建复合控件 122 4.7.3 使用布局创建简单的复合 控件 124 4.7.4 创建定制的视图 124 4.7.5 使用定制的控件 137 4.8 Adapter简介 137 4.8.1 部分原生Adapter简介 138 4.8.2 定制ArrayAdapter 138 4.8.3 使用Adapter绑定数据到 视图 139 第5章 Intent和Broadcast Receiver 145 5.1 Intent简介 145 5.1.1 使用Intent来启动Activity 146 5.1.2 Linkify简介 153 5.1.3 使用Intent广播事件 155 5.1.4 Local Broadcast Manager 159 5.1.5 Pending Intent简介 160 5.2 创建Intent Filter和Broadcast Receiver 161 5.2.1 使用Intent Filter为隐式Intent 提供服务 161 5.2.2 使用Intent Filter作为插件和 扩展 170 5.2.3 监听本地Broadcast Intent 173 5.2.4 使用Broadcast Intent监控设备的 状态变化 174 5.2.5 在运行时管理Manifest Receiver 176 第6章使用Internet资源 177 6.1 下载和分析Internet资源 177 6.1.1 连接Internet资源 178

6.1.2 使用XML Pull Parser分析 XML 179 6.1.3 创建一个地震查看器 180 6.2 使用Download Manager 186 6.2.1 下载文件 186 6.2.2 自定义Download Manager Notification 187 6.2.3 指定下载位置 188 6.2.4 取消和删除下载 189 6.2.5 查询Download Manager 189 6.3 使用Internet服务 192 6.4 连接到Google App Engine 192 6.5 下载数据而不会耗尽电量的 最佳实践 194 第7章文件、保存状态和首选项 195 7.1 保存简单的应用程序数据 195 7.2 创建并保存Shared Preference 196 7.3 检索Shared Preference 197 7.4 为地震查看器创建一个设置 Activity 197 7.5 首选项框架和Preference Activity 概述 205 7.5.1 在XML中定义一个 Preference Screen布局 206 7.5.2 Preference Fragment简介 208 7.5.3 使用Preference Header定义 Preference Fragment的层次 结构 208 7.5.4 Preference Activity简介 209 7.5.5 向后兼容性与Preference Screen 210 7.5.6 找到并使用Preference Screen 设置的Shared Preference 210 7.5.7 Shared Preference Change Listener简介 211 7.6 为地震查看器创建一个标准的 Preference Activity 211 7.7 持久化应用程序实例的状态 215 7.7.1 使用Shared Preference保存 Activity状态 215 7.7.2 使用生命周期处理程序保存和 还原Activity实例 215 7.7.3 使用生命周期处理程序保存和 还原Fragment实例状态 216

7.8 将静态文件作为资源添加 218 7.9 在文件系统下工作 218 7.9.1 文件管理工具 218 7.9.2 使用特定于应用程序的文件夹 存储文件 219 7.9.3 创建私有的应用程序文件 219 7.9.4 使用应用程序文件缓存 220 7.9.5 存储公共可读的文件 220 第8章数据库和Content Provider 223 8.1 Android数据库简介 223 8.1.1 SQLite数据库简介 224 8.1.2 Content Provider简介 224 8.2 SQLite简介 224 8.3 Content Value和Cursor 225 8.4 使用SQLite数据库 225 8.4.1 SQLiteOpenHelper简介 226 8.4.2 在不使用SQLiteOpenHelper的 情况下打开和创建数据库 228 8.4.3 Android数据库设计注意 事项 228 8.4.4 查询数据库 228 8.4.5 从Cursor中提取值 229 8.4.6 添加、更新和删除行 230 8.5 创建Content Provider 232 8.5.1 注册Content Provider 233 8.5.2 发布Content Provider的URI 地址 233 8.5.3 创建Content Provide的 数据库 234 8.5.4 实现Content Provider查询 235 8.5.5 Content Provider事务 236 8.5.6 在Content Provider中存储 文件 239 8.5.7 一个Content Provider的实现 框架 240 8.6 使用Content Provider 244 8.6.1 Content Resolver简介 244 8.6.2 查询Content Provider 244 8.6.3 使用Cursor Loader异步查询 内容 247 8.6.4 添加、删除和更新内容 249 8.6.5 访问Content Provider中存储的 文件 251 8.6.6 创建一个To-Do List数据库和

Content Provider 253 8.7 将搜索功能添加到应用程序中 260 8.7.1 使Content Provider可搜索 261 8.7.2 为应用程序创建一个搜索 Activity 261 8.7.3 将搜索Activity设置为应用 程序的默认搜索Provider 263 8.7.4 使用搜索视图微件 266 8.7.5 由Content Provider支持搜索 建议 267 8.7.6 在快速搜索框中显示搜索 结果 270 8.8 创建可搜索的地震Content Provider 270 8.8.1 创建Content Provider 270 8.8.2 使用地震Content Provider 276 8.8.3 搜索EarthquakeContent Provider 279 8.9 本地Android Content Provider 285 8.9.1 使用Media StoreContent Provider 285 8.9.2 使用Contacts Contract Content Provider 286 8.9.3 使用Calendar Content Provider 293 第9章在后台操作 297 9.1 Service简介 298 9.1.1 创建和控制Service 298 9.1.2 将Service绑定到Activity 302 9.1.3 地震监控Service示例 304 9.1.4 创建前台Service 308 9.2 使用后台线程 309 9.2.1 使用AsyncTask运行异步任务 310 9.2.2 Intent Service简介 312 9.2.3 Loader简介 313 9.2.4 手动创建线程和GUI线程 同步 313 9.3 使用Alarm 315 9.3.1 创建、设置和取消Alarm 316 9.3.2 设置重复Alarm 317 9.3.3 使用重复Alarm调度网络 刷新 318 9.4 使用Intent Service简化Earthquake 更新Service 320

第10章扩展用户体验 323 10.1 操作栏简介 324 10.1.1 自定义操作栏 325 10.1.2 自定义操作栏来控制应用 程序的导航行为 328 10.1.3 操作栏操作简介 333 10.2 向地震监控程序添加一个 操作栏 333 10.3 创建并使用菜单和操作栏 操作项 339 10.3.1 Android菜单系统简介 340 10.3.2 创建菜单 341 10.3.3 指定操作栏的操作 342 10.3.4 菜单项选项 343 10.3.5 添加操作View和操作提供 程序 344 10.3.6 在Fragment中添加菜单项 345 10.3.7 使用XML定义菜单层次 结构 345 10.3.8 动态更新菜单项 347 10.3.9 处理菜单选择 347 10.3.10 子菜单和上下文菜单简介 348 10.4 更新地震监控程序 351 10.5 全屏显示 353 10.6 对话框简介 355 10.6.1 创建一个对话框 356 10.6.2 使用AlertDialog类 356 10.6.3 使用专门的输入对话框 357 10.6.4 通过Dialog Fragment管理和 显示对话框 358 10.6.5 通过Activity事件处理程序 管理和显示对话框 360 10.6.6 将Activity用作对话框 361 10.7 创建Toast 361 10.7.1 自定义Toast 362 10.7.2 在工作线程中使用Toast 364 10.8 Notification简介 365 10.8.1 Notification Manager简介 366 10.8.2 创建Notification 366 10.8.3 设置和自定义通知托盘UI 369 10.8.4 配置持续和连续的 Notification 373 10.8.5 触发、更新和取消 Notification 374

10.9 向地震监控程序中添加 Notification和对话框 376 第11章高级用户体验 381 11.1 为每个屏幕尺寸和分辨率做 设计 382 11.1.1 分辨率无关 382 11.1.2 为不同的屏幕大小提供支持和 优化 383 11.1.3 创建可缩放的图形资源 386 11.1.4 创建优化的、自适应的、动态的设计 390 11.1.5 反复测试 390 11.2 确保可访问性 391 11.2.1 为非触屏设备提供导航 391 11.2.2 为每个View提供文本 描述 391 11.3 Android Text-to-Speech简介 392 11.4 使用语音识别 394 11.4.1 使用语音识别进行语音 输入 395 11.4.2 使用语音识别进行搜索 396 11.5 控制设备振动 396 11.6 使用动画 397 11.6.1 补间View动画 397 11.6.2 创建和使用逐帧动画 400 11.6.3 插值属性动画 400 11.7 强化View 404 11.7.1 高级Canvas绘图 404 11.7.2 硬件加速 419 11.7.3 Surface View简介 420 11.7.4 创建交互式控件 423 11.8 高级Drawable资源 428 11.9 复制、粘贴和剪贴板 431 11.9.1 向剪贴板中复制数据 431 11.9.2 粘贴剪贴板数据 431 第12章硬件传感器 433 12.1 使用传感器和传感器 管理器 433 12.1.1 受支持的Android传感器 434 12.1.2 虚拟传感器简介 435 12.1.3 查找传感器 435 12.1.4 监视传感器 436 12.1.5 解释传感器值 438 12.2 监视设备的移动和方向 439

12.2.1 确定设备的自然方向 440 12.2.2 加速计简介 441 12.2.3 检测加速度变化 442 12.2.4 创建一个重力计 443 12.2.5 确定设备方向 446 12.2.6 创建一个指南针和人工 地平仪 450 12.2.7 陀螺仪传感器简介 453 12.3 环境传感器简介 454 12.3.1 使用气压计传感器 454 12.3.2 创建气象站 455 第13章地图、地理编码和基于位置的 服务 461 13.1 使用基于位置的服务 461 13.2 在模拟器中使用基于位置的 服务 462 13.2.1 更新模拟器位置提供器中的 位置 463 13.2.2 配置模拟器来测试基于位置的 服务 463 13.3 选择一个位置提供器 464 13.3.1 查找位置提供器 464 13.3.2 通过指定条件查找位置 提供器 464 13.3.3 确定位置提供器的能力 465 13.4 确定当前位置 466 13.4.1 位置的隐私性 466 13.4.2 找出上一次确定的位置 466 13.4.3 Where Am I示例 466 13.4.4 刷新当前位置 469 13.4.5 在Where Am I中跟踪 位置 472 13.4.6 请求单独一次位置更新 473 13.5 位置更新的最佳实践 474 13.6 使用近距离提醒 477 13.7 使用地理编码器 478 13.7.1 反向地理编码 479 13.7.2 前向地理编码 480 13.7.3 对“Where Am I”示例 进行地理编码 481 13.8 创建基于地图的Activity 482 13.8.1 MapView和MapActivity 简介 482 13.8.2 获得地图的API key 483

13.8.3 创建一个基于地图的 Activity 483 13.8.4 地图和Fragment 485 13.8.5 配置和使用MapView 486 13.8.6 使用MapController 486 13.8.7 对“Where Am I”示例使用 地图 487 13.8.8 创建和使用覆盖(Overlay) 490 13.8.9 MyLocationOverlay简介 497 13.8.10 ItemizedOverlay和 OverlayItem简介 498 13.8.11 将视图固定到地图和地图的 某个位置上 500 13.9 对Earthquake示例添加地图 功能 501 第14章个性化主屏幕 507 14.1 主屏幕Widget简介 507 14.2 创建App Widgets 509 14.2.1 创建Widget的XML 布局资源 509 14.2.2 定义Widget设置 511 14.2.3 创建Widget Broadcast Receiver 并将其添加到应用程序的 manifest文件中 512 14.2.4 AppWidgetManager和 RemoteView简介 513 14.2.5 刷新Widget 518 14.2.6 创建并使用Widget配置 Activity 521 14.3 创建地震Widget 522 14.4 Collection View Widget简介 528 14.4.1 创建Collection View Widget的 布局 529 14.4.2 创建RemoteViewsService 530 14.4.3 创建一个RemoteViews- Factory 531 14.4.4 使用RemoteViewsService 填充CollectionViewWidget 533 14.4.5 向Collection View Widget 中的项添加交互性 534 14.4.6 将Collection View Widget 绑定到Content Provider 535 14.4.7 刷新Collection View Widget 537

14.4.8 创建Earthquake Collection View Widget 537 14.5 Live Folder简介 543 14.5.1 创建Live Folder 544 14.5.2 创建Earthquake Live Folder 548 14.6 使用快速搜索框显示应用程序 搜索结果 551 14.6.1 在快速搜索框中显示搜索 结果 551 14.6.2 将Earthquake示例的搜索 结果添加到快速搜索框中 552 14.7 创建Live Wallpaper 553 14.7.1 创建Live Wallpaper定义 资源 553 14.7.2 创建Wallpaper Service 554 14.7.3 创建Wallpaper Service 引擎 555 第15章音频、视频以及摄像头的 使用 557 15.1 播放音频和视频 558 15.1.1 Media Player简介 559 15.1.2 准备音频播放 559 15.1.3 准备视频播放 560 15.1.4 控制Media Player的 播放 564 15.1.5 管理媒体播放输出 566 15.1.6 响应音量控制 566 15.1.7 响应Media播放控件 567 15.1.8 请求和管理音频焦点 569 15.1.9 当音频输出改变时暂停 播放 571 15.1.10 Remote Control Client简介 572 15.2 操作原始音频 574 15.2.1 使用AudioRecord录制 声音 574 15.2.2 使用AudioTrack播放音频 575 15.3 创建一个Sound Pool 577 15.4 使用音效 578 15.5 使用摄像头拍摄照片 579 15.5.1 使用Intent拍摄照片 579 15.5.2 直接控制摄像头 581 15.5.3 读取并写入 JPEG EXIF图像 详细信息 588 15.6 录制视频 589

15.6.1 使用Intent录制视频 589 15.6.2 使用MediaRecorder录制 视频 590 15.7 使用媒体效果 593 15.8 向媒体库中添加新媒体 594 15.8.1 使用媒体扫描仪插入媒体 594 15.8.2 手动插入媒体 595 第16章蓝牙、NFC、网络和Wi-Fi 597 16.1 使用蓝牙 597 16.1.1 管理本地蓝牙设备适配器 598 16.1.2 可发现性和远程设备发现 600 16.1.3 蓝牙通信 604 16.2 管理网络和Internet连接 609 16.2.1 Connectivity Manager简介 609 16.2.2 支持用户首选项以进行后台 数据传输 609 16.2.3 查找和监视网络连接 611 16.3 管理Wi-Fi 612 16.3.1 监视Wi-Fi连接 613 16.3.2 监视活动的Wi-Fi连接的 详细信息 613 16.3.3 扫描热点 613 16.3.4 管理Wi-Fi配置 614 16.3.5 创建Wi-Fi网络配置 615 16.4 使用Wi-Fi Direct传输数据 615 16.4.1 初始化Wi-Fi Direct框架 615 16.4.2 启用Wi-Fi Direct并监视其 状态 617 16.4.3 发现对等设备 618 16.4.4 连接对等设备 618 16.4.5 在对等设备之间传输数据 620 16.5近场通信 621 16.5.1 读取NFC标签 622 16.5.2 使用前台分派系统 623 16.5.3 Android Beam简介 625 第17章电话服务和SMS 629 17.1 电话服务的硬件支持 629 17.1.1 将电话功能指定为必需的 硬件功能 629 17.1.2 检查电话硬件 630 17.2 使用电话服务 630 17.2.1 启动电话呼叫 630 17.2.2 替换本机拨号程序 631 17.2.3 访问电话服务的属性及状态 632

17.2.4 使用PhoneStateListener 监视电话状态的变化 635 17.2.5 使用Intent Receiver监视传入的 电话呼叫 639 17.3 SMS和MMS简介 640 17.3.1 在应用程序中使用SMS和 MMS 640 17.3.2 使用Intent从应用程序中 发送SMS和MMS 640 17.3.3 使用SMS Manager发送 SMS消息 641 17.3.4 监听传入的SMS消息 644 17.3.5 紧急响应程序SMS示例 646 17.3.6 自动紧急响应程序 654 17.4 SIP和VOIP简介 662 第18章 Android高级开发 663 18.1 Android的安全性 664 18.1.1 Linux内核安全 664 18.1.2 权限简介 664 18.2 Cloud to Device Meaging简介 666 18.2.1 C2DM的局限性 667 18.2.2 注册使用C2DM 667 18.2.3 在C2DM服务器上注册 设备 667 18.2.4 向设备发送C2DM消息 670 18.2.5 接收C2DM消息 672 18.3 使用License Verification Library 实现版权保护 673 18.3.1 安装License Verification Library 673 18.3.2 获得License Verification 公钥 673 18.3.3 配置License Validation Policy 674 18.3.4 执行许可验证检查 674 18.4 应用程序内收费 675 18.4.1 应用程序内收费的局限性 676 18.4.2 安装IAB库 676 18.4.3 获得公钥和定义可购买的 物品 676 18.4.4 开始IAB交易 677 18.4.5 处理IAB购买请求的响应 678 18.5 使用Wake Lock 679 18.6 使用AIDL支持Service的

IPC 680 18.7 处理不同硬件和软件的可用性 686 18.7.1 指定硬件的要求 686 18.7.2 确认硬件可用性 687 18.7.3 构建向后兼容的应用程序 687 18.8 利用STRICT模式优化UI 性能 689 第19章推广和发布应用程序并从中 获利 691 19.1 签名和发布应用程序 691 19.2 发布应用程序 693 19.2.1 Google Play简介 693 19.2.2 开始使用Google Play 694 19.2.3 发布应用程序 695 19.2.4 开发者控制台上的应用程序 报告 697 19.2.5 查看应用程序错误报告 697 19.3 如何通过应用程序赚钱 698 19.4 应用程序销售、推广和分发的 策略 699 19.4.1 应用程序的起步策略 699 19.4.2 在Google Play上推广 700 19.4.3 国际化 700 19.5 分析数据和跟踪推荐人 701 19.5.1 使用移动应用程序的Google Analytics 702 19.5.2 使用Google Analytics追踪

推荐第6篇:编程语言Android java CC++的对比

编程语言Android java C/C++的对比

如果你想成为一名前景光明的程序员,则需选择一个适合自己同时热门的编程技术,现在最火的编程技术无非就是java、ios、android、c++了,那么,我们该如何选择呢?

Android现在待遇略低于Ios,但前景强于Ios

曾几何时,ios开发非常的火爆,开发人才供不应求,薪资待遇开的也非常的高,有一些刚刚具备1年工作经验的新手,都能拿到万元高薪,而同等资历的java程序员一般在

5、6千元左右。由此,各大培训机构赶紧想法设法开设ios培训班,这几年过去了,Ios的开发热没有下降,而人才却比较饱和了,随着乔布斯的离世,曾经风风光光的苹果品牌也有所下降,而相反以三星手机为首的android系统却大放异彩,放眼以后,android的市场需求和空间要更广阔。

Java依然是最热的高级编程语言

在高级编程语言中,java无疑是最火爆的,在全世界内应用最为广泛,国内的java热更是有增无减。java是所有程序员类招聘职位中职位需求最大的。如果你想做web开发或者企业级大型软件项目的开发,最好学习java,无论从当前热度和前景方面来看,都是非常不错的。同时,Java也比较容易学,许多自制力不强的同学通过几个月的java培训就能基本掌握入门知识。

C/C++依然是钻研型程序员的首选

C/C++开发要难度大一些,因此大都是科班出身,尤其是名校毕业的,因为从事C/C++开发,更讲究效率和性能,需要更多算法、数据结构的知识,实非普通人才适合从事的领域。如若想在该领域有所发展,则需要比较强的逻辑思维和钻研能力。

长沙欧柏#泰克#学院的老师对此有非常丰富的开发经验,他们建议,对于名校科班出身的钻研型人才,建议你学习C/C++,而对于普通的大中专毕业生等,建议从事anroid和JAVA领域。

推荐第7篇:C语言高级编程心得体会

高级语言程序设计心得体会

通过这五天的高级语言程序设计学习,我学到了很多东西,同时也更深一层次的体会到C语言知识的奥妙和无穷,激起了我对C语言知识学习的兴趣和激情。

学好C语言,除了一些必须要记忆的关键字、语法和库函数,还要学会使用C语言的有关算术运算符,以及包含这些运算符的表达式,掌握赋值语句的使用方法和各种类型数据(例如熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法,掌握不同类型数值之间赋值的规律等)的输入输出方法,能正确使用各种格式转换符等,并且还需要靠自己的逻辑思维能力。

另外,上机实验是学习程序设计语言必不可少的实践环节,特别是C语言灵活、简洁,更需要通过编程的实践来真正掌握它,然后,通过多次上机练习,就对语法知识慢慢有了感性的认识,时间久了,就会加深对它的理解,在理解的基础上就会自然而然地掌握C语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这就又加深了我们对C语言的认识。

还有就是在编程时我们要细心,编完后记得检查语法及符号遗漏或错误等相关的问题。

C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从

开始的算法思路到运行调试以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程,使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。使我们体会到自身知识和能力能在实际中的应用和发挥。不但可以激发创新意识,还可以开发创造能力、培养沟通能力。这次实习时间虽然仅有五天时间,但确实使我受益非浅。通过实习我丰富了计算机操作经验,更加深了对C语言的了解,熟悉了其环境,更增强了对visual c++的使用技巧。另外,实习中老师对我们进行了细心、耐心的指导,鼓励我们对程序进行合理改进,培养了我们的创新意识和创新能力。原来是我认为可怕的课程设计,就在种种辅助条件下完成了,心里有说不出的高兴。

在以后的三年大学专业学习乃至以后的就业工作中,C语言都起着巨大的作用,从很大程度上来说,我们专业的学生,要想在这个专业取得一定的成就,现在就得好好学好C语言,为未来埋下伏笔。总的来说,我觉得C语言并没想象中的那么晦涩难懂,关键是我们要先认真学会,熟悉它的语法知识,多多上机实践。只有先打好基础,我们才能学好C语言,才会熟练编程,最后才有所突破,有所建树。

推荐第8篇:高级Bash脚本编程指南

译者序

毫无疑问,UNIX/Linux 最重要的软件之一就是 shell,目前最流行的 shell 被称为 Bash(Bourne Again Shell),几乎所有的 Linux 和绝大部分的 UNIX 都可以使用 Bash。作为系统与用户之间的交互接口,shell 几乎是你在 UNIX 工作平台上最亲密的朋友,因此,学好 shell,是学习Linux/UNIX 的的开始,并且它 会始终伴随你的工作学习。

shell 是如此地重要,但令人惊奇的是,介绍 shell 的书没有真正令人满意的。所幸的是,我看到了 这本被人称为 abs 的书,这本书介绍了 bash 大量的细节和广阔的范围,我遇到的绝大部分的技术问题 --无论是我忘记的或是以前没有发现的--都可以在这本书里找到答案。这本使用大量的例子详细地介绍 了 Bash 的语法,各种技巧,调试等等的技术,以循序渐进的学习方式,让你了解 Bash 的所有特性, 在书中还有许多练习可以引导你思考,以得到更深入的知识。无论你是新手还是老手,或是使用其他 语言的程序员,我能肯定你能在此书用受益。而本书除了介绍 BASH 的知识之外,也有许多有用的关 于 Linux/UNIX 的知识和其他 shell 的介绍。

在看到本书的英文版后,我决定把它翻译出来,在 Linuxsir 论坛上结识了译者之一杨春敏共同翻

译这本书,600 多页的书是本大部头的书,我们花了 6 个月的业余时间才翻译完了。

关于版权的问题,英文版的作者 Mendel Cooper 对英文版的版权做了详细的约定,请参考: Appendix Q.Copyright。中文版版权由译者杨春敏和黄毅共同所有,在遵守英文版版权相应条款的条 件下,欢迎在保留本书译者名字和版权说明以非盈利的方式自由发布此中文版,以盈利目的的所有行 为必须联系英文作者和两位中文译者以获得许可。

本书得以成稿,我(黄毅)要多谢我的女朋友,本该给予她的时间我用来了翻译,多谢你的理解, 你是一个很棒的女朋友!

译者 杨春敏 黄毅 2006.5.15

Advanced Bash-Scripting Guide >一本深入学习shell 脚本艺术的书籍

Version 3.7.2

2005/11/16

作者:Mendel Cooper

mail:thegrendel@theriver.com

这本书假定你没有任何脚本或一般程序的编程知识,但是如果你有相关的知识,那么你将很容易 达到中高级的水平...all the while sneaking in little snippets of UNIX? wisdom and lore(这句不知道怎么译).你可以把本书作为教材,自学手册,或者你获得 shell 脚本技术的文档.书中的练习和例子脚本中的注释将会与读者有更好的互动,但是最关键的前提是: 想真正学习脚本编程的唯一途径就是编写脚本.

这本书也可作为教材来讲解一般的编程概念.

下载本书最新版本,http://personal.riverusers.com/~thegrendel/abs-guide-3.7.tar.bz2, 这是一个以 tar 和 bzip2 进行打包的,并且是以 HTML 来发行的.当然,你也可以获得本书的 pdf 版本 在 http://www.daodoc.com/LDP/abs/abs-guide.pdf.可以在

http://personal.riverusers.com/~thegrendel/Change.log 中查看修订历史.

译者:杨春敏,黄毅

mail:chunmin.yang@gmail.com

一直想好好学习一下 bash,可惜网上的资料都杂乱不堪,我还是喜欢通过一本书系统的学习.这本 书来得正是时候.本书的作者真是非常的严谨,从例子里的改进人名单就能看出来.可惜我水平真 的是非常有限,好多地方估计译得都有问题.希望阅读的朋友们多多提些修改建议.我会尽我的最 大努力去修正它.

目录 ++++ 第一部分.热身

1. 为什么使用

2.1. 调用一个脚本

2.2. 初步的练习shell 编程

2. 带着一个 Sha-Bang 出发(Sha-Bang 指的是#!) 第二部分.基本

3. 特殊字符

4. 变量和参数的介绍

4.1. 变量替换

4.2. 变量赋值

4.3.Bash 变量是不分类型的

4.4. 特殊的变量类型

5. 引用(翻译的可能有问题,特指引号)

5.1. 引用变量

5.2. 转义(\)

6. 退出和退出状态

7.Tests

7.1.Test 结构

7.2. 文件测试操作

7.3. 其他比较操作

7.4. 嵌套的

8. 操作符和相关的主题

8.1. 操作符

8.2. 数字常量

if/then 条件 test

7.5. 检查你的 test 知识

第三部分.超越基本

9. 变量重游

9.1. 内部变量

9.2. 操作字符串

9.3. 参数替换

9.4. 指定类型的变量:declare 或者

9.5. 变量的间接引用

9.6.$RANDOM: 产生随机整数

9.7. 双圆括号结构

10. 循环和分支

10.1. 循环

10.2. 嵌套循环

10.3. 循环控制

10.4. 测试与分支(case 和

11. 内部命令与内建

11.1. 作业控制命令

12. 外部过滤器,程序和命令

12.1. 基本命令

12.2. 复杂命令

12.3. 时间/日期

typeset

select 结构)

命令

12.4. 文本处理命令

12.5. 文件与归档命令

12.6. 通讯命令

12.7. 终端控制命令

12.8. 数学计算命令

12.9. 混杂命令

13. 系统与管理命令

13.1. 分析一个系统脚本

14. 命令替换

15. 算术扩展

16.I/O 重定向

16.1. 使用

16.3. 应用

exec

16.2. 代码块的重定向

17.Here Documents

17.1.Here Strings

18. 休息时间

Part 4. 高级

19. 正则表达式

19.1. 一个简要的正则表达式介绍

19.2. 通配

20. 子 shell(Subshells)

21. 受限 shell(Restricted Shells)

22. 进程替换

23. 函数

23.1. 复杂函数和函数复杂性

23.2. 局部变量

23.3. 不使用局部变量的递归

24. 别名(Aliases)

25. 列表结构

26. 数组

27./dev 和 /proc

27.1./dev

27.2./proc

28. 关于

29. 调试

30. 选项

31.Gotchas

32. 脚本编程风格

32.1. 非官方的

33. 杂项

33.1. 交互式和非交互式的

33.2.Shell 包装

33.3. 测试和比较: 另一种方法

33.4. 递归

33.5. 彩色脚本 Zeros 和 Nulls

Shell 脚本风格

shells 和脚本

33.6. 优化

33.7. 各种小技巧

33.8. 安全话题

33.8.1.被感染的脚本 33.8.2.隐藏 Shell 脚本源码

33.9. 移植话题

33.10.

34.1.Bash, 版本

34.2.Bash, 版本

Windows 下进行 Shell 编程

34.Bash, 版本 2 和 3

2 3 35.后记

35.1. 作者后记

35.2. 关于作者

35.3. 哪里可以取得帮助?

35.4. 制作这本书的工具

35.4.1. 硬件

35.4.2. 软件和排版软件

35.5.Credits

Bibliography

A.Contributed Scripts B.Reference Cards

C.A Sed and Awk Micro-Primer

C.1.Sed

C.2.Awk

D.Exit Codes With Special Meanings

E.A Detailed Introduction to I/O and I/O Redirection F.Standard Command-Line Options G.Important Files H.Important System Directories I.Localization J.History Commands K.A Sample .bashrc File

L.Converting DOS Batch Files to Shell Scripts

M.Exercises

M.1.Analyzing Scripts

M.2.Writing Scripts

N.Revision History O.Mirror Sites

P.To Do List Q.Copyright

表格清单:

11-1.作业标识符

30-1.Bash 选项

33-1.转义序列中数值和彩色的对应 B-1.Special Shell Variables B-2.TEST Operators: Binary Comparison B-3.TEST Operators: Files B-4.Parameter Substitution and Expansion B-5.String Operations B-6.Miscellaneous Constructs C-1.Basic sed operators

C-2.Examples of sed operators D-1."Reserved" Exit Codes L-1.Batch file keywords / variables / operators, and their shell equivalents L-2.DOS commands and their UNIX equivalents N-1.Revision History

例子清单:

2-1. 清除:清除/var/log 下的 log 文件 2-2. 清除:一个改良的清除脚本

2-3.cleanup:一个增强的和广义的删除 logfile 的脚本 3-1. 代码块和 I/O 重定向

3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环

3-4. 备份最后一天所有修改的文件.4-1. 变量赋值和替换 4-2. 一般的变量赋值

4-3. 变量赋值,一般的和比较特殊的 4-4. 整型还是 string? 4-5. 位置参数

4-6.wh,whois 节点名字查询 4-7. 使用 shift

5-1.echo 一些诡异的变量 5-2. 转义符

6-1.exit/exit 状态

6-2. 否定一个条件使用! 7-1. 什么情况下为真? 7-2. 几个等效命令 test,/usr/bin/test,[],和/usr/bin/[ 7-3. 算数测试使用(( )) 7-4.test 死的链接文件 7-5. 数字和字符串比较

7-6. 测试字符串是否为 null 7-7.zmore 8-1. 最大公约数

8-2. 使用算术操作符

8-3. 使用&&和||进行混合状态的 test 8-4. 数字常量的处理 9-1.$IFS 和空白 9-2. 时间输入

9-3. 再来一个时间输入 9-4.Timed read 9-5. 我是 root?

9-6.arglist:通过$*和$@列出所有的参数 9-7. 不一致的$*和$@行为 9-8. 当$IFS 为空时的$*和$@ 9-9. 下划线变量

9-10.在一个文本文件的段间插入空行 9-11.利用修改文件名,来转换图片格式 9-12.模仿 getopt 命令

9-13.提取字符串的一种可选的方法 9-14.使用参数替换和 error meages 9-15.参数替换和"usage"meages 9-16.变量长度

9-17.参数替换中的模式匹配 9-18.重命名文件扩展名

9-19.使用模式匹配来分析比较特殊的字符串 9-20.对字符串的前缀或后缀使用匹配模式 9-21.使用 declare 来指定变量的类型 9-22.间接引用

9-23.传递一个间接引用给 awk 9-24.产生随机数

9-25.从一副扑克牌中取出一张随机的牌 9-26.两个指定值之间的随机数 9-27.使用随机数来摇一个骰子 9-28.重新分配随机数种子 9-29.使用 awk 产生伪随机数

9-30.C 风格的变量处理 10-1.循环的一个简单例子

10-2.每个[list]元素带两个参数的 for 循环

10-3.文件信息:对包含在变量中的文件列表进行操作 10-4. 在 for 循环中操作文件 10-5.在 for 循环中省略[list] 10-6.使用命令替换来产生 for 循环的[list] 10-7. 对于二进制文件的一个 grep 替换 10-8.列出系统上的所有用户

10-9.在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件

10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个 C 风格的 for 循环 10-13. 在 batch mode 中使用 efax 10-14. 简单的 while 循环 10-15. 另一个 while 循环 10-16. 多条件的 while 循环 10-17.C 风格的 while 循环 10-18.until 循环 10-19. 嵌套循环

10-20.break 和 continue 命令在循环中的效果 10-21. 多层循环的退出

10-22. 多层循环的 continue 10-23. 在实际的任务中使用"continue N" 10-24. 使用 case 10-25. 使用 case 来创建菜单

10-26. 使用命令替换来产生 case 变量 10-27. 简单字符串匹配 10-28. 检查是否是字母输入 10-29. 用 select 来创建菜单

10-30. 用函数中 select 结构来创建菜单 11-1.一个 fork 出多个自己实例的脚本 11-2.printf 11-3.使用 read,变量分配

11-4. 当使用一个不带变量参数的 read 命令时,将会发生什么? 11-5.read 命令的多行输入 11-6.检测方向键

11-7. 通过文件重定向来使用 read 11-8.管道输出到 read 中的问题 11-9.修改当前的工作目录

11-10. 用"let"命令来作算术操作.11-11. 显示 eval 命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本

11-14. 在 Perl 脚本中使用 eval 命令来强制变量替换 11-15. 使用 set 来改变脚本的位置参数 11-16. 重新分配位置参数 11-17.Unset 一个变量

11-18. 使用 export 命令传递一个变量到一个内嵌 awk 的脚本中 11-19. 使用 getopts 命令来读取传递给脚本的选项/参数.11-20."Including"一个数据文件

11-21. 一个没什么用的,source 自身的脚本 11-22.exec 的效果

11-23. 一个 exec 自身的脚本

11-24. 在继续处理之前,等待一个进程的结束 11-25. 一个结束自身的脚本.12-1.使用 ls 命令来创建一个烧录 CDR 的内容列表

12-2.Hello or Good-bye

12-3.删除当前目录下文件名中包含一些特殊字符(包括空白)的文件..12-4. 通过文件的 inode 号来删除文件 12-5.Logfile: 使用 xargs 来监控系统 log 12-6.把当前目录下的文件拷贝到另一个文件中 12-7. 通过名字 Kill 进程

12-8.使用 xargs 分析单词出现的频率 12-9.使用 expr

12-10. 使用 date 命令

12-11. 分析单词出现的频率 12-12. 那个文件是脚本? 12-13. 产生 10 进制随机数

12-14. 使用 tail 命令来监控系统 log 12-15. 在一个脚本中模仿 "grep" 的行为 12-16. 在 1913 年的韦氏词典中查找定义 12-17. 检查列表中单词的正确性 12-18. 转换大写: 把一个文件的内容全部转换为大写.12-19. 转换小写: 将当前目录下的所有文全部转换为小写.12-20.Du: DOS 到 UNIX 文本文件的转换.12-21.rot13: rot13, 弱智加密.12-22.Generating "Crypto-Quote" Puzzles 12-23. 格式化文件列表.12-24. 使用 column 来格式化目录列表 12-25.nl: 一个自己计算行号的脚本.12-26.manview: 查看格式化的 man 页 12-27. 使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释

12-30.Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令

12-32. 在一个脚本中使用 cmp 来比较 2 个文件.

12-33.basename 和 dirname 12-34. 检查文件完整性

12-35.Uudecod 编码后的文件

12-36. 查找滥用的连接来报告垃圾邮件发送者 12-37. 分析一个垃圾邮件域 12-38. 获得一份股票报价 12-39. 更新

Fedora Core 4

12-40. 使用 h 12-41. 一个可以 mail 自己的脚本 12-42. 按月偿还贷款 12-43. 数制转换

12-44. 使用 "here document" 来调用 bc 12-45. 计算圆周率

12-46. 将 10 进制数字转换为 16 进制数字 12-47. 因子分解

12-48. 计算直角三角形的斜边 12-49. 使用 seq 来产生循环参数 12-50. 字母统计

12-51. 使用 getopt 来分析命令行选项 12-52. 一个拷贝自身的脚本 12-53. 练习dd 12-54. 记录按键

12-55. 安全的删除一个文件 12-56. 文件名产生器 12-57. 将米转换为英里 12-58. 使用 m4 13-1.设置一个新密码 13-2.设置一个擦除字符

13-3.关掉终端对于密码的 echo 13-4. 按键检测

13-5.Checking a remote server for identd 13-6.pidof 帮助杀掉一个进程 13-7. 检查一个 CD 镜像

13-8.在一个文件中创建文件系统 13-9.添加一个新的硬盘驱动器

13-10. 使用 umask 来将输出文件隐藏起来 13-11.killall, 来自于 /etc/rc.d/init.d 14-1.愚蠢的脚本策略

14-2.从循环的输出中产生一个变量 14-3.找 anagram(回文构词法, 可以将一个有意义的单词, 个或多个有意义的单词, 但 是还是原来的子母集合) 16-1.使用 exec 重定向标准输入 16-2.使用 exec 来重定向 stdout 16-3.使用 exec 在同一脚本中重定向 stdin 和 stdout

变换为 1

16-4. 避免子 shell 16-5.while 循环的重定向

16-6.另一种 while 循环的重定向 16-7.until 循环重定向 16-8.for 循环重定向

16-9.for 循环重定向 loop (将标准输入和标准输出都重定向了) 16-10. 重定向 if/then 测试结构

16-11. 用于上面例子的"names.data"数据文件 16-12. 记录日志事件

17-1.广播: 发送消息给每个登录上的用户 17-2.仿造文件: 创建一个两行的仿造文件 17-3.使用 cat 的多行消息

17-4. 带有抑制 tab 功能的多行消息 17-5.使用参数替换的 here document

17-6.上传一个文件对到"Sunsite"的 incoming 目录 17-7. 关闭参数替换

17-8.一个产生另外一个脚本的脚本 17-9.Here documents 与函数 17-10."匿名" here Document 17-11. 注释掉一段代码块

17-12. 一个自文档化(self-documenting)的脚本 17-13. 在一个文件的开头添加文本 20-1.子 shell 中的变量作用域 20-2.列出用户的配置文件

20-3.在子 shell 里进行串行处理 21-1.在受限的情况下运行脚本 23-1.简单函数

23-2.带着参数的函数

23-3.函数和被传给脚本的命令行参数 23-4. 传递间接引用给函数

23-5.解除传递给函数的参数引用

23-6.再次尝试解除传递给函数的参数引用 23-7. 两个数中的最大者 23-8.把数字转化成罗马数字 23-9.测试函数最大的返回值 23-10. 比较两个大整数 23-11. 用户名的真实名 23-12. 局部变量的可见范围 23-13. 用局部变量来递归 23-14. 汉诺塔 24-1.脚本中的别名

24-2.unalias: 设置和删除别名

25-1.使用"与列表(and list)"来测试命令行参数 25-2.用"与列表"的另一个命令行参数测试

25-3."或列表"和"与列表"的结合使用 26-1.简单的数组用法 26-2.格式化一首诗 26-3.多种数组操作

26-4. 用于数组的字符串操作符 26-5.将脚本的内容传给数组 26-6.一些数组专用的工具

26-7. 关于空数组和空数组元素 26-8.初始化数组

26-9.复制和连接数组

26-10. 关于连接数组的更多信息 26-11. 一位老朋友: 冒泡排序 26-12. 内嵌数组和间接引用

26-13. 复杂数组应用: 埃拉托色尼素数筛子 26-14. 模拟下推的堆栈

26-15. 复杂的数组应用: 列出一种怪异的数学序列 26-16. 模拟二维数组,并使它倾斜 27-1.利用/dev/tcp 来检修故障 27-2.搜索与一个 PID 相关的进程 27-3.网络连接状态

28-1.隐藏 cookie 而不再使用

28-2.用/dev/zero 创建一个交换临时文件 28-3.创建 ramdisk 29-1.一个错误的脚本

29-2.丢失关键字(keyword) 29-3.另一个错误脚本

29-4. 用"aert"测试条件 29-5.捕捉 exit

29-6.在 Control-C 后清除垃圾 29-7. 跟踪变量

29-8.运行多进程

(在多处理器的机器里) 31-1.数字和字符串比较是不相等同的 31-2.子 SHELL 缺陷

31-3.把 echo 的输出用管道输送给 read 命令 33-1.shell 包装

33-2.稍微复杂一些的 shell 包装 33-3.写到日志文件的 shell 包装 33-4. 包装 awk 的脚本

33-5.另一个包装 awk 的脚本 33-6.把 Perl 嵌入 Bash 脚本 33-7.Bash 和 Perl 脚本联合使用 33-8.递归调用自己本身的(无用)脚本 33-9.递归调用自己本身的(有用)脚本

33-10. 另一个递归调用自己本身的(有用)脚本

33-11. 一个

"彩色的" 地址资料库 33-12. 画盒子

33-13. 显示彩色文本 33-14."赛马" 游戏 33-15. 返回值技巧

33-16. 整型还是 string? 33-17. 传递和返回数组 33-18.anagrams 游戏

33-19. 在 shell 脚本中调用的窗口部件 34-1.字符串扩展

34-2.间接变量引用.) | (cd /dest/directory && tar xpvf -)

2 # 从一个目录移动整个目录树到另一个目录

3 # [courtesy Alan Cox , with a minor change] 4

5 # 1) cd /source/directory

源目录

6 # 2) &&

与操作,如果

cd 命令成功了,那么就执行下边的命令

7 # 3) tar cf

'x'解档,'p'保证所有权和文件属性, 15 # 'v'发完整消息到 stdout 16 #

'f'后边跟'-',从 stdin 读取数据 17 # 18 #

注意:'x' 是一个命令, 'p', 'v', 'f' 19 # Whew! 20

21

22

23 # 更优雅的写法应该是 24 #

cd source/directory 25 #

tar cf2 # --未解压的 tar 文件--

| --然后把它传递到"tar"中-- 3 # 如果 "tar" 没能够正常的处理"bunzip2", 4 # 这就需要使用管道来执行 2 个单独的步骤来完成它.5 # 这个练习的目的是解档"bzipped"的 kernel 源文件.

####End Script

###### 注意:在上边这个例子中'-'不太象是 bash 的操作符,而更像是 tar 的参数.bash$echo "whatever" |catabc

standard input:

ASCII text

bash$file

最后,一个真实世界的使用 tar 命令的例子.

Example 3-4. 备份最后一天所有修改的文件.

####Start Script

#### 1 #!/bin/bash 2

3 # 在一个"tarball"中(经过 tar 和 gzip 处理过的文件) 4 #+ 备份最后 24 小时当前目录下 d 所有修改的文件. 5

6 BACKUPFILE=backup-$(date +%m-%d-%Y)

7 #

在备份文件中嵌入时间.

8 #

Thanks, Joshua Tschida, for the idea.

9 archive=${1:-$BACKUPFILE} 10 #

如果在命令行中没有指定备份文件的文件名, 11 #+ 那么将默认使用"backup-MM-DD-YYYY.tar.gz".12

13 tar cvf - `find .-mtime -1 -type f -print` >$archive.tar 14 gzip $archive.tar 15 echo "Directory $PWD backed up in archive file "$archive.tar.gz"."

16

17

18 #

Stephane Chazelas 指出上边代码, 19 #+ 如果在发现太多的文件的时候,或者是如果文件 20 #+ 名包括空格的时候,将执行失败.21

22 # Stephane Chazelas 建议使用下边的两种代码之一

23 # ----- 24 #

find .-mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar" 25 #

使用 gnu 版本的 find. 26

27

28 #

find .-mtime -1 -type f -exec tar rvf "$archive.tar" '{}' \; 29 #

对于其他风格的

UNIX 便于移植,但是比较慢.30 # ----- 31

32

33 exit 0

####End Script

######

注意:以"-"开头的文件名在使用"-"作为重定向操作符的时候,可能会产生问题.应该写一个脚本来检查这个问题,并给这个文件加上合适的前缀.如: ./-FILENAME, $PWD/-FILENAME,或$PATHNAME/-FILENAME.

如果变量的值以"-"开头,可能也会引起问题.1 var="-n" 2 echo$var 3 #具有"echo -n"的效果了,这样什么都不会输出的.

-

之前工作的目录."cd -"将回到之前的工作目录,具体请参考"$OLDPWD"环境变量.注意:一定要和之前讨论的重定向功能分开,但是只能依赖上下文区分.

- 算术减号.

=

算术等号,有时也用来比较字符串.1 a=28

2 echo $a

# 28

+ + 算术加号,也用在正则表达式中.选项,对于特定的命令来说使用"+"来打开特定的选项,用"-"来关闭特定的选项.算术取模运算.也用在正则表达式中.%

~

home 目录.相当于$HOME 变量.~bozo 是 bozo 的 home 目录,并且 ls ~bozo 将列出其中

内容.~/就是当前用户的 home 目录,并且 ls ~/将列出其中的内容,如: bash$ echo ~bozo /home/bozo

bash$ echo ~ /home/bozo

bash$ echo ~/ /home/bozo/

bash$ echo ~: /home/bozo:

bash$ echo ~nonexistent-user ~nonexistent-user

~+

当前工作目录,相当于$PWD 变量.之前的工作目录,相当于$OLDPWD 内部变量.用于正则表达式,这个操作将在正则表达式匹配部分讲解,只有 version3 才支持.行首,正则表达式中表示行首."^"定位到行首.~-

=~

^

控制字符

修改终端或文本显示的行为.控制字符以 CONTROL + key 组合.控制字符在脚本中不能正常使用.Ctl-B 光标后退,这应该依赖于 bash 输入的风格,默认是 emacs 风格的.Ctl-C Break,终止前台工作.Ctl-D 从当前 shell 登出(和 exit 很像) "EOF"(文件结束符).这也能从 stdin 中终止输入.在 console 或者在 xterm window 中输入的时候,Ctl-D 将删除光标下字符.当没有字符时,Ctrl-D 将退出当前会话.在 xterm window 也有关闭窗口 的效果.Ctl-G beep.在一些老的终端,将响铃.Ctl-H backspace,删除光标前边的字符.如:

1 #!/bin/bash

2 # 在一个变量中插入 Ctl-H

4 a="^H^H"

# 两个 Ctl-H (backspaces).

5 echo "abcdef"

# abcdef

6 echo -n "abcdef$a " # abcdf

7 # 注意结尾的空格

^

^ 两个 twice.

8 echo -n "abcdef$a"

# abcdef

没有 backspace 的效果了(why?).10

# 结果并不像期望的那样 11 echo; echo

Ctl-I 就是 tab 键.Ctl-J 新行.Ctl-K 垂直 tab.(垂直 tab?新颖,没听过) 作用就是删除光标到行尾的字符.Ctl-L clear,清屏.回车 Ctl-M

####Start Script

####

9 #

结尾没有空格

1 #!/bin/bash

2 # Thank you, Lee Maschmeyer, for this example. 3

4 read -n 1 -s -p $'Control-M leaves cursor at beginning of this line.Pre Enter.\x0d'

#当然,'0d'就是二进制的回车. 6 echo >&2

# '-s'参数使得任何输入都不将回显出来

#+ 所以,明确的重起一行是必要的. 8

9 read -n 1 -s -p $'Control-J leaves cursor on next line.\x0a' 10 echo >&2

# Control-J 11

12 ### 13

是换行.14 read -n 1 -s -p $'And Control-K\x0bgoes straight down.' 15 echo >&2

# Control-K 是垂直制表符.16

17 # 关于垂直制表符效果的一个更好的例子见下边: 18

19 var=$'\x0aThis is the bottom line\x0bThis is the top line\x0a' 20 echo "$var" 21 #

这句与上边的例子使用的是同样的办法,然而: 22 echo "$var" | col 23 #

这将造成垂直制表符右边的部分在左边部分的上边.24 #

这也解释了为什么我们要在行首和行尾加上一个换行符-- 25 #+ 来避免一个混乱的屏幕输出.26

27 # Lee Maschmeyer 的解释: 28 # --------------------- 29 #

In the [first vertical tab example] ...the vertical tab 29 #

在这里[第一个垂直制表符的例子中] ... 这个垂直制表符

30 #+ makes the printing go straight down without a carriage return.31 #

This is true only on devices, such as the Linux console, 32 #+ that can't go "backward." 33 #

The real purpose of VT is to go straight UP, not down. 34 #

It can be used to print superscripts on a printer.

34 #

它可以用来在一个打印机上打印上标.35 #

col 的作用,可以用来模仿 VT 的合适的行为.36

37 exit 0

####End Script

###### Ctl-Q Ctl-S Ctl-U Ctl-V

Ctl-W

Ctl-Z

继续(等价于 XON 字符),这个继续的标准输入在一个终端里

挂起(等价于 XOFF 字符),这个被挂起的 stdin 在一个终端里,用 Ctl-Q 恢复 删除光标到行首的所有字符,在某些设置下,删除全行.当输入字符时,Ctl-V 允许插入控制字符.比如,下边 2 个例子是等价的 echo -e '\x0a'

echo Ctl-V 在文本编辑器中十分有用,在 vim 中一样.删除当前光标到前边的最近一个空格之间的字符.在某些设置下,删除到第一个非字母或数字的字符.终止前台工作.空白部分

分割命令或者是变量.包括空格,tab,空行,或任何它们的组合.在一些特殊情况下,空白是不允许的,如变量赋值时,会引起语法错误.空白行在脚本中没有效果."$IFS",对于某些命令输入的特殊变量分割域,默认使用的是空白.如果想保留空白,使用引用.

注意事项: [1]

[2] shell 做大括号的命令扩展.但是命令本身需要对扩展的结果作处理.例外:在 pipe 中的一个大括号中的代码段可能运行在一个子 shell 中.1 ls | { read firstline; read secondline; } 2 #

错误,在打括号中的代码段,将运行到子 shell 中.3 #+ 所以 ls 的输出将不能传递到代码块中.4 echo "First line is $firstline; second line is $secondline"

#

不能工作

[3]

5

6 # Thanks, S.C.

换行符也被认为是空白.这也解释了为什么一个空行也会被认为是空白.第 4 章 变量和参数的介绍

======================

4.1 变量替换 ------------ 变量替换操作符 $ 只有在变量被声明,赋值,unset 或 exported 或者是在变量代表一个 signal 的时候, 变量才会是以本来的面目出现在脚本里.变量在被赋值的时候,可能需要使用"=", read 状态或者是在循环的头部.在""中还是会发生变量替换,这被叫做部分引用,或叫弱引用.而在''中就不会发生变 量替换,这叫做全引用,也叫强引用.具体见第 5 章的讨论.

注意:$var 与${var}的区别,不加{},在某些上下文将引起错误,为了安全,使用 2.具体见 9.3 节 参数替换.

Example 4-1.变量赋值和替换

####Start Script

#### 1 #!/bin/bash 2

3 # 变量赋值和替换

4

5 a=375 6 hello=$a

7

8 #-----------

9 # 强烈注意,在赋值的前后一定不要有空格.10 # 如果有空格会发生什么? 11

12 #

如果"VARIABLE =value",

13 #

^

14 #+ 脚本将尝试运行一个"VARIABLE"的命令,带着一个"=value"参数.15

16 #

如果"VARIABLE= value", 17 #

^

18 #+ script tries to run "value" command with

18 #+ 脚本将尝试运行一个"value"的命令,带着

19 #+ the environmental variable "VARIABLE" set to "".19 #+ 一个被赋成""值的环境变量"VARIABLE".20 #-----------

21

22

23 echo hello

# 没有变量引用,不过是个 hello 字符串 24

25 echo $hello 26 echo ${hello} # 同上

27

28 echo "$hello" 29 echo "${hello}" 30

31 echo 32

33 hello="A B C

D" 34 echo $hello

# A B C D 35 echo "$hello" # A B

C

D 36 # 就象你看到的 echo $hello

echo "$hello"

将给出不同的结果.37 #

^

38 # Quoting a variable preserves whitespace.38 # 引用一个变量将保留其中的空白,当然,如果是变量替换就不会保留了.39

40 echo 41

42 echo '$hello'

# $hello 43 #

^

^ 44 # 全引用的作用

45 #+ 将导致"$"变成一个单独的字符.46

47 # 注意两种引用不同的效果 48

49

50 hello=

# 设置为空值

51 echo "\$hello (null value) = $hello" 52 #

注意设置一个变量为空,与 unset 它,不是一回事,虽然看起来一样 53 # 54

55 # 56

57 #

可以在同一行上设置多个变量.58 #+ 要以空白分隔

59 #

小心,这会降低可读性,和可移植性.60

61 var1=21 var2=22 var3=$V3 62 echo 63 echo "var1=$var1

var2=$var2

var3=$var3" 64

65 # 在老版本的"sh"上,可能会有问题.66

67 # 68

69 echo; echo

^

70

71 numbers="one two three" 72 #

^

^

73 other_numbers="1 2 3" 74 #

^ ^

75 #

如果变量中有空白,那么引用就必要了.76 # 77 echo "numbers = $numbers" 78 echo "other_numbers = $other_numbers"

# other_numbers = 1 2 3 79 echo 80

81 echo "uninitialized_variable = $uninitialized_variable" 82 # Uninitialized 变量为空值(根本就没赋值).

83 uninitialized_variable=

# 声明,但是没被初始化

84

#+ 其实和前边设置为空值得作用是一样的.85 echo "uninitialized_variable = $uninitialized_variable" 86

# 还是一个空值

87

88 uninitialized_variable=23

# 赋值 89 unset uninitialized_variable

# Unset it.90 echo "uninitialized_variable = $uninitialized_variable" 91

# 还是空值

92 echo 93

94 exit 0

####End Script

###### 注意: 一个空值变量,或者是根本就没声明的变量,在赋值之前使用它可能会引起问题.但是还是可以用来做算术运算

####Start Script

#### 1 echo "$uninitialized"

# (blank line) 2 let "uninitialized += 5"

# Add 5 to it. 3 echo "$uninitialized"

# 5

4

5 #

结论: 6 #

对于一个空值变量在做算术操作的时候,就好像它的值为 0 一样.8 #

This is undocumented (and probably non-portable) behavior.7 #

这并没被文档化(可能是不可移植)的行为.

####End Script

###### 具体参考 Example 11-21

4.2 变量赋值

------------ = 赋值操作符(前后都不能有空白) 不要与-eq 混淆,那个是 test,并不是赋值.注意,=也可被用来做 test 操作,这依赖于上下文.

Example 4-2.一般的变量赋值

####Start Script

#### 1 #!/bin/bash

2 # "裸体"变量

4 echo 5

6 # 变量什么时候是"裸体"的,比如前边少了$的时候. 7 # 当它被赋值的时候,而不是被引用的时候. 8

9 # 赋值 10 a=879 11 echo "The value of "a" is $a." 12

13 # 使用 let 赋值 14 let a=16+5 15 echo "The value of "a" is now $a." 16

17 echo 18

19 # 在 for 循环中

20 echo -n "Values of "a" in the loop are: " 21 for a in 7 8 9 11

22 do 23

echo -n "$a " 24 done 25

26 echo 27 echo 28

29 # 在 read 命令状态中 30 echo -n "Enter "a" " 31 read a 32 echo "The value of "a" is now $a." 33

34 echo 35

36 exit 0

####End Script

######

Example 4-3.变量赋值,一般的和比较特殊的

####Start Script

#### 1 #!/bin/bash 2

3 a=23

# Simple case

4 echo $a 5 b=$a 6 echo $b 7

8 # 现在让我们来点小变化

9

10 a=`echo Hello!`

# 把 echo 命令的结果传给变量 a 11 echo $a 12 #

注意,如果在命令扩展结构中使用一个(!)的话,在命令行中将不能工作 13 #+ 因为这触发了 Bash 的"历史机制".14 #

但是,在校本里边使用的话,历史功能是被关闭的,所以就能够正常运行.15 16

17 a=`ls -l`

# 把 ls -l 的结果给 a 18 echo $a

# 别忘了,这么引用的话,ls 的结果中的所有空白部分都没了(包括换行) 19 echo 20 echo "$a"

# 这么引用就正常了,保留了空白 21

# (具体参阅章节"引用") 22

23 exit 0

####End Script

###### 使用$(...)机制进行的变量赋值(除去使用``来赋值的另外一种新方法).事实上这两种方法都是 命令替换的一种形式.# 来自于/ect/rc.d/rc.local R=$(cat /ect/redhat-release) arch=$(uname -m)

4.3 Bash 变量是不分类型的

------------------------ 不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串.但是依赖于上下文,Bash 也允许比较操作和算术操作.决定这些的关键因素就是,变量中的值 是否只有数字.

Example 4-4 整型还是 string?

####Start Script

#### 1 #!/bin/bash

2 # int-or-string.sh: 整形还是 string? 3

4 a=2334

# 整型

5 let "a += 1" 6 echo "a = $a "

# a = 2335

7 echo

# 还是整型

9

10 b=${a/23/BB}

# 将

23 替换成 BB

# 这将把 b 变量从整型变为 string 12 echo "b = $b"

# b = BB35 13 declare -i b

# 即使使用 declare 命令也不会对此有任何帮助,9.4 节有解释 14 echo "b = $b"

# b = BB35 15

16 let "b += 1"

# BB35 + 1 = 17 echo "b = $b"

# b = 1

18 echo 19

20 c=BB34 21 echo "c = $c"

# c = BB34 22 d=${c/BB/23}

# S 将 BB 替换成 23 23

# 这使得$d 变为一个整形

24 echo "d = $d"

# d = 2334 25 let "d += 1"

# 2334 + 1 = 26 echo "d = $d"

# d = 2335 27 echo 28

29 # 关于空变量怎么样? 30 e="" 31 echo "e = $e"

# e =

32 let "e += 1"

# 算术操作允许一个空变量? 33 echo "e = $e"

# e = 1

34 echo

# 空变量将转换成一个整型变量

35

36 # 关于未声明的变量怎么样? 37 echo "f = $f"

# f =

38 let "f += 1"

# 算术操作允许么? 39 echo "f = $f"

# f = 1

40 echo

# 未声明的变量将转换成一个整型变量

41

42

43

44 # 所以说 Bash 中的变量都是无类型的.45

46 exit 0

####End Script

######

4.4 特殊的变量类型

------------------ local variables 这种变量只有在代码块或者是函数中才可见(具体见 23.2 和 23 章) environmental variables 这种变量将改变用户接口和 shell 的行为.

在一般的上下文中,每个进程都有自己的环境,就是一组保持进程可能引用的信息的 变量.这种情况下,shell 于一个一般进程是相同的.

每次当 shell 启动时,它都将创建自己的环境变量.更新或者添加新的环境变量,将导 致 shell 更新它的环境,同时也会影响所有继承自这个环境的所有子进程(由这个命令 导致的).

注意:分配给环境变量的空间是受限的.创建太多的环境变量将引起空间溢出,这会引 起问题.关于 eval 命令,具体见第 11 章

bash$ eval "`seq 10000 | sed -e 's/.*/export var&=ZZZZZZZZZZZZZZ/'`" bash$ du bash: /usr/bin/du: Argument list too long

如果一个脚本设置了环境变量,需要 export 它,来通知本脚本的环境,这是 export 命令的功能,关于 export 命令,具体见 11 章.

脚本只能对它产生的子进程 export 变量.一个从命令行被调用的脚本 export 的变量,将 不能影响调用这个脚本的那个命令行 shell 的环境.

positional parameters 就是从命令行中传进来的参数,$0, $1, $2, $3...

$0 就是脚本文件的名字,$1 是第一个参数,$2 为第 2 个...,参见[1](有$0 的说明),$9 以后就需要打括号了,如${10},${11},${12}...两个值得注意的变量$*和$@(第 9 章有具体的描述),表示所有的位置参数.

Example 4-5 位置参数

####Start Script

#### 1 #!/bin/bash 2

3 # 作为用例,调用这个脚本至少需要 10 个参数,如

4 # ./scriptname 1 2 3 4 5 6 7 8 9 10

5 MINPARAMS=10 6

7 echo 8

9 echo "The name of this script is "$0"." 10 # 添加./是为了当前目录

11 echo "The name of this script is "`basename $0`"." 12 # 去掉目录信息,具体见'basename'命令 13

14 echo 15

16 if [ -n "$1" ]

# 测试变量被被引用 17 then 18

echo "Parameter #1 is $1"

# "#"没被转义 19 fi

20

21 if [ -n "$2" ] 22 then 23

echo "Parameter #2 is $2" 24 fi

25

26 if [ -n "$3" ] 27 then 28

echo "Parameter #3 is $3" 29 fi

30

31 # ...32

33

34 if [ -n "${10}" ]

# 大于 9 的参数必须出现在{}中.35 then 36

echo "Parameter #10 is ${10}" 37 fi

38

39 echo "----" 40 echo "All the command-line parameters are: "$*"" 41

42 if [ $# -lt "$MINPARAMS" ]

#$#是传到脚本里的位置参数的个数 43 then 44

echo 45

echo "This script needs at least $MINPARAMS command-line arguments!" 46 fi

47

48 echo 49

50 exit 0

####End Script

###### {}标记法是一种很好的使用位置参数的方法.这也需要间接引用(见

Example 34-2) 1 args=$#

# 位置参数的个数

2 lastarg=${!args} 3 # 或:

lastarg=${!#} 4 # 注意 lastarg=${!$#} 将报错

一些脚本可能会依赖于使用不同的调用名字,而表现出不同的行为,这样一般都需要 判断$0,而其他的名字都是通过 ln 命令产生的链接.(具体参见 Example 12-2)

如果脚本需要一个命令行参数,而调用的时候,没用这个参数,这就有可能造成分配一个 空变量,这样估计就会引起问题.一种解决办法就是在这个位置参数,和相关的变量后 边,都添加一个额外的字符.具体见下边的例子.

####Start Script

#### 1 variable1_=$1_ #而不是 variable1=$1 2 # 这将阻止一个错误,即使在调用时没使用这个位置参数. 3

4 critical_argument01=$variable1_ 5

6 # 这个扩展的字符是可以被消除掉的,就像这样. 7 variable1=${variable1_/_/} 8 # 副作用就是$variable1_多了一个下划线

9 # 这里使用了一个参数替换模版(后边会有具体的讨论) 10 # (Leaving out the replacement pattern results in a deletion.)

10 # (在一个删除动作中,节省了一个替换模式) 11

12

13 # 一个解决这种问题的更简单的做法就是,判断一下这个位置参数是否传递下来了 14 if [ -z $1 ] 15 then 16

exit $E_MISSING_POS_PARAM 17 fi 18

19

20 #

但是上边的方法将可能产生一个意外的副作用 21 #

参数替换的更好的办法应该是: 22 #

${1:-$DefaultVal} 23 #

具体察看"Parameter Substition"节 24 #+ 在第 9 章

####End Script

######

Example 4-6 wh,whois 节点名字查询

####Start Script

#### 1 #!/bin/bash

2 # ex18.sh

3

4 # Does a 'whois domain-name' lookup on any of 3 alternate servers:

5 #

ripe.net, cw.net, radb.net

6

7 # 把这个脚本重命名为'wh',然后放到/usr/local/bin 下

8

9 # 需要 3 个符号链接

10 # ln -s /usr/local/bin/wh /usr/local/bin/wh-ripe 11 # ln -s /usr/local/bin/wh /usr/local/bin/wh-cw 12 # ln -s /usr/local/bin/wh /usr/local/bin/wh-radb 13

14 E_NOARGS=65 15

16

17 if [ -z "$1" ] 18 then 19

echo "Usage: `basename $0` [domain-name]" 20

exit $E_NOARGS 21 fi 22

23 # Check script name and call proper server.23 # 检查脚本名字,然后调用合适的服务器

24 case `basename $0` in

# Or:

case ${0##*/} in 25

"wh"

) whois $1@whois.ripe.net;;

26

"wh-ripe") whois $1@whois.ripe.net;; 27

"wh-radb") whois $1@whois.radb.net;; 28

"wh-cw" ) whois $1@whois.cw.net;; 29

*

) echo "Usage: `basename $0` [domain-name]";; 30 esac

推荐第9篇:《网络高级编程》实验报告要求

一、实验报告为纸质报告,手写,不少于8页纸。

二、报告首页为标准实验报告封面,有课程名称、实验名称、

姓名、时间

三、报告内容为:

1、

2、

3、

4、实验目的 实验题目 实验过程步骤,详细说明实验编程的过程 实验程序的主要代码和注释说明(不需要完整的程

序!)。

5、

6、实验中遇到的问题,怎么解决的。实验心得

四、报告的得分主要根据

3、

4、5

五、三份实验报告装订在一起

六、班长将报告收齐,按照班级序号排好,交给实验老师。

推荐第10篇:MATLAB游戏编程实例(拼

MATLAB游戏编程实例(拼图)

这是一个简单的游戏,只要把数字按顺序排好就可以了。游戏方法是用鼠标点中数字,如果该数字相邻的格子为空,则自动移到到该空格。

本程序是由realghost编写,如果有问题可以与 slqinyi@163.com 联系。

附图如下:

function pintu1() A = gen()

G = [1 2 3;4 5 6;7 8 0]; drawmap(A);

while 1

[xpos,ypos] = ginput(1); col = ceil(xpos); row = 3-ceil(ypos)+1; num = A(row,col);

if row>1&A(row-1,col)==0 A(row-1,col) = num;

A(row,col) = 0;

end

if row

end

if col>1&A(row,col-1)==0 A(row,col-1) = num; A(row,col) = 0;

end

if col

end

drawmap(A)

zt = abs(A-G);

if sum(zt(:))==0

msgbox(\'ÄãÒѾ-³É¹¦Æ´ºÃͼ£¡\') break

end end

function drawmap(A) clf; hold on

line([0 3],[0 0],\'linewidth\',4); line([3 3],[0 3],\'linewidth\',4); line([0 3],[3 3],\'linewidth\',4); line([0 0],[0 3],\'linewidth\',4);

for i = 1:3

for j = 1:3

drawrect([j-1 3-i],[j 3-i],[j 3-i+1],[j-1 3-i+1],\'y\',A(i,j));

end end

axis equal axis off

function drawrect(x1,x2,x3,x4,color,num) x = [x1(1) x2(1) x3(1) x4(1)]; y = [x1(2) x2(2) x3(2) x4(2)]; fill(x,y,color) if num==0

text(0.5*(x1(1)+x2(1)),0.5*(x1(2)+x4(2)),\' \',\'fontsize\',24) else

text(0.5*(x1(1)+x2(1))-0.05,0.5*(x1(2)+x4(2)),num2str(num),\'fontsize\',24) end

function y = gen() y = inf*ones(1,9); for i = 1:9

while 1

a = randint(1,1,9);

if isempty(find(y==a)) y(i) = a; break

end

end end

y = reshape(y,3,3);

当然可以啦,其实图像就是数字矩阵,图像的拼接就是矩阵的拼接,横着拼得行数相等,竖着拼得列数相等就行

例子

clc; clear;

a=imread(\'我的图片.jpg\'); [m n t]=size(a);

b=a(1:fix(m/2),:,:);%取图像的上半部分

c=a(fix(m/2)+1:end,:,:);%取图像的下半部分

figure(1); imshow(b);

figure(2); imshow(c);

%注意,上下拼接要求两幅图的列数要相同 %左右拼行数要相同

figure(3); d=[b;c];%把b,c拼起来,若左右拼接d=[b,c]; imshow(d);

第11篇:Linux高级编程实训项目

Linux高级编程实训项目

1 熟悉英贝特ARM嵌入式开发与应用实验平台。 2 VMware Tools的安装。

3 在ARM7上建立uClinux环境。(将实验配套光盘中的CD2_EduKit_07061光盘:\\CD2_uCLinux_070615\\Binary目录下的blob.EduKit44b0.bin和zImage分别烧写到NorFlash的1-

4、5-35块)。

4在ARM9上建立Linux环境。(将实验配套光盘中的CD2_EduKit_07061光盘:\\CD3_Linux_070615\\03-Linux Flash Firmware\\amd29lv160db_2m目录下的vivi.nor、zImage和root.cramfs分别烧写到NorFlash的1-

5、6-

17、17-35块)。5 ARM7-uClinux的配置、编译和烧写。

6 ARM9-Linux的配置、编译和烧写。

7 使用串口工具进行应用程序下载。

8 使用tftp服务器进行应用程序下载。

9 使用NFS服务器进行应用程序下载。

10 ARM7-uClinux采用标准方式在内核中添加应用程序。 11 ARM7-uClinux在内核中快速添加应用程序。

12 ARM9-Linux采用标准方式在内核中添加应用程序。 13 ARM9-Linux在内核中快速添加应用程序。

14 ARM7-uClinux在内核中添加Led驱动程序和应用程序。 15 ARM9-Linux在内核中添加Led驱动程序和应用程序。

16 使用动态模块加载的方法添加Led驱动程序。 17 ARM7串口通信实验。

18 ARM9串口通信实验。

19 在uclinux内核中添加Tftp工具。

20 ARM7文件操作程序。

21 ARM7 目录操作程序。

第12篇:北邮高级程序语言Java阶段作业二

一、单项选择题(共20道小题,共100.0分)

1.下列语句执行后,z的值为() int x=3,y=4,z=0; switch(x+y) { case 3:z=x*y ;break ; case 4:z=x/y ;break; case 7:z=x-y;break; default:z=x*y-x; } A.12 B.9 C.-1 D.1 知识点: 新主题5自测 学生答案: [C;]

得分: [5] 试题分

值: 提示:

2.下列程序片段输出的是什么?( ) int a=3; int b=1; if(a=b) System.out.println(“a=”+a);

A.a=1 B.a=3 C.编译错误,没有输出 D.正常运行,但没有输出 知识点: 新主题5自测 学生答[C;]

5.0

案: 得分: [5] 提示:

3.当条件为真和条件为假时,( )控制结构可以执行不同的动作。

A.switch B.while C.for D.if…else

知识点: 新主题5自测 学生答[D;] 案: 得分: [5] 提示:

试题分

5.0

值:

试题分

5.0

值: 4.

5.在switch语句块中,哪条语句用于处理其他所有情况?(

A.default B.otherwise C.elseif D.else 知识点: 新主题5自测 学生答[A;] 案: 得分: [5] 提示:

试题分

5.0

值: 6.

7.所有的程序均可用下面几种控制类型控制结构编写。( )

A.顺序结构、选择结构、循环结构 B.顺序结构、循环结构 C.顺序结构、选择结构 D.选择结构、循环结构

知识点: 新主题5自测 学生答[A;] 案: 得分: [5] 提示:

试题分

5.0

值: 8.

9.do-while语句与while语句的区别在于先执行循环体中的语句再计算条件表达式, 所以do-while语句的循环体至少被执行1次。( )

A.正确 B.错误

知识点: 新主题6自测 学生答案: [A;]

得分: [5] 试题分

值:

5.0 提示:

10.11.下列语句执行后,输出结果是( )。 for(int i=1;i

D.以上都不对

知识点: 新主题6自测 学生答案: [B;]

得分: [5] 试题分

值:

5.0 提示:

12.13.下列语句执行后,i的值是( )。 int i=1; do{ System.out.println(“*****”); i++; }while(i

试题分

5.0

值: 14.15.应该使用什么符号分隔for语句的各个部分?( )

A.逗号 B.分号 C.圆点

知识点: 新主题6自测 学生答[B;] 案: 得分: [5] 提示:

试题分

5.0

值: 16.17.在Java中,两个连续等号(==)和一个等号(=)的意义是一样的,都是等于运算符。( )

A.正确 B.错误

知识点: 新主题6自测 学生答[B;] 案: 得分: [5] 提示: 18.

试题分

5.0

值: 19.下面哪条语句定义了5个元素的数组。( )

A.int [] a={22,23,24,25,12}; B.int a []=new int(5); C.int [5] array; D.int [] arr; 知识点: 新主题7自测 学生答[A;] 案: 得分: [5] 提示:

试题分

5.0

值: 20.21.下面哪条语句正确地声明一个整型的二维数组?( )

A.int a[][] = new int[][]; B.int a[10][10] = new int[][]; C.int a[][] = new int[10][10]; D.int [][]a = new int[10]; 知识点: 新主题7自测 学生答[C;] 案: 得分: [5] 提示:

试题分

5.0

值: 22.23.下面哪个语句(初始化数组)是不正确的。( )

A.int x[] = {1,2,3}; B.int[3] x = {1,2,3}; C.int[] x = {1,2,3}; D.int x[] = new int[]{1,2,3}; 知识点: 新主题7自测 学生答[B;] 案: 得分: [5] 提示: 24.

试题分

5.0

值: 25.什么变量用来表示数组的大小?( )

A.top B.length C.limit 知识点: 新主题7自测 学生答[B;] 案: 得分: [5] 提示:

试题分

5.0

值: 26.27.数组最适合于存放什么类型的信息?( )

A.列表

B.一组相同类型的数据 C.琐碎的东西

知识点: 新主题7自测 学生答[B;] 案: 得分: [5] 提示:

试题分

5.0

值: 28.29.下列说法中正确的是( )。

A.不需要定义类就能创建对象 B.对象中必须有属性和方法 C.属性必须是简单变量

D.属性可以是简单变量,也可以是一个对象

知识点: 新主题8自测 学生答[D;] 案: 得分: [5] 提示:

试题分

5.0

值: 30.31.下述概念中不属于面向对象方法的是( )。

A.对象、消息 B.继承、多态 C.类、封装 D.过程调用 知识点: 新主题8自测 学生答[D;] 案: 得分: [5] 提示:

试题分

5.0

值: 32.33.下面关于继承的说法正确的是( )。

A.子类将继承父类所有的属性和方法 B.子类继承父类的非私有属性和方法 C.子类只继承父类public方法和属性 D.子类只继承父类的方法,而不继承属性

知识点: 新主题8自测 学生答[B;] 案: 得分: [5] 提示:

试题分

5.0

值: 34.35.下列说法正确的是( )。

A.Java中允许一个子类有多个父类

B.某个类是一个类的子类,它仍有可能成为另一个类的父类 C.一个父类只能有一个子类 D.继承关系最多不能超过四层

知识点: 新主题8自测 学生答[B;] 案: 得分: [5] 提示:

试题分

5.0

值: 36.37.类与对象的关系是( )。

A.类是对象的抽象 B.类是对象的具体实例 C.对象是类的抽象 D.对象是类的子类 知识点: 新主题8自测 学生答[A;] 案:

试题分得分: [5] 提示:

38.

值:

5.0

第13篇:C语言高级编程及实例剖析

C语言高级编程及实例分析

第一章:内存管理

c语言对程序精心编译时,将函数中命令、语句编译成相应序列的机器指令代码,放在代码段;将已初始化的数据,如已赋值的全局变量、静态局部变量等,放在数据段;将未初始化的数据放在BBS段内;将临时数据,如函数调用时传递的参数、局部变量、返回调用时的地址等放在栈段内;而对一些动态变化的数据,如在程序执行中建立的一些数据结构,如链表,动态数组等,则放在堆结构中 。

内存管理系统是操作系统的重要部分。C语言中使用malloc()函数和free()函数来分配和释放内存。再次释放已经释放的内存和释放未被分配的内存都会造成系统的崩溃。

1.1.1 PC存储器结构

PC机存储器结构分为主存储器、外存储器和高速缓存几个部分。

1.1.4 内存编译模式

编译模式是指如何在内存中放置程序代码及数据,如何分配堆栈,并确认占用的内存大小及如何存取它们,当指定内存模式以后,语言编译程序将按事先选择好的内存模式编译组织程序。C语言提供了6种编译模式,分别是:微模式,小模式,紧凑模式,中模式,大模式和巨模式。

1.1.5 堆概念和结构

堆是一种动态的存储结构(存储链表,动态数组等),实际上就是数据段的自由存储区。

1.1.6 堆管理函数

1.malloc()函数

用来分配内存。函数原型为void *malloc(unsigned size)

如:int *p;

P= (int*)malloc(sizeof(int));

如果要分配100个int型的空间时,表示为:int*p=(int*)malloc(sizeof(int));

2.free()函数

用来释放内存。函数原型为void *free(指针变量)

如:int *p=(int *)malloc(4);

*p=100;

free(p);

3.realloc()函数

用来重调空间的大小,函数声明为:void *realloc(void *block,int size);

block是指向要扩张或缩小的内存空间的指针。Size指定新的大小。

4.calloc()函数

用来分配一个能容纳n个元素,每个元素长度为size的内存空间。函数声明为void *calloc(size_t nelem,size_t elsize)。该函数将分配一个容量为nelem *size大小的空间,并用0初始化该内存区域,即每个地址装入0.该函数将返回一个指向分配空间的指针。如果没有空间可用,则返回NULL指针。若在大数据模式下建立远堆,则可用farmalloc函数。

1.2.2 函数剖析

1 函数init_Heap()

实现了初始化内存分配程序的功能

2函数My_Free()

完成函数释放内存的功能

3 函数Allocate()

实现了分配按指定大小分配内存块的功能

第三章:文件高级操作

字符型(文本型)文件和二进制文件{有什么区别?}

标准库函数

①文件打开(fopen)

函数原型FILE *fopen(char *filename,char *mode)

②文件关闭(fclose)

函数原型int *fclose(FILE *fp)

字节(字符)读写函数fgetc和fputc

字符串读写函数fgets和fputs

数据块读写函数 fread和fwrite

格式会读写函数 fscanf和fprint

①字符串读函数fgets

Char *fgets(char *s,int n,FILE *filepointer);

②字符串写函数fputs

Int fputs(char *s,FILE *filepointer)

③数据块读函数fread

Unsigned fread(void *ptr,unsigned size,unsigned n,FILE *filepointer) ④数据块写函数fwrite

Unsigned fwrite(void *ptr,unsigned size,unsigned n,FILE filepointer)

①格式化读fscanf

Int scanf(FILE *filepointer,const char *format,[&a,&b,...])

②格式化写fprintf

Int fprintf(FILE *filepointer,const char *format,[表达式列表,...]);

文件定位操作

①rewind函数

函数原型:void rewind(FILE *filepointer);

功能:将filepointer所指向的文件的位置指针重新置回到文件的开头 ②fseek函数

函数原型:int fseek(FILE *fp,long offset,int whence)

功能:whence 基准点;offset从基准点开始移动的字节数; ③ftell函数

函数原型:long ftell(FILE *filepointer);

功能:返回文件的当前位置;

④feof函数

原型:int feof(FILE *fp);

功能:判断fp所代表的文件是否结束

Stdin 标准输入(键盘)

Stdout 标准输出(显示器)

Stdaux 标准辅助输入输出(异步串行口)

Stdprn 标准打印(打印机)

Stderr标准错误输出(显示器)

简单的来说,++i 和 i++,在单独使用时,就是 i=i+1。 而 a = ++i,相当于 i=i+1; a = i;

而 a = i++,相当于 a = i; i=i+1;

第14篇:软件专业《.NET高级编程》考试大纲

1、请为你设计的数据库定义并建立业务规则。

2、请为你所设计的数据库确定并定义所需的视图。

3、检查并改进你所设计的数据库的数据完整性。

第15篇:JD for Java

职位标签:JAVA

职位职能:软件工程师

职位描述:

工作职责:

根据项目需要参与需求分析和功能设计

进行系统的设计、编码、测试、维护和系统性能优化

提供用户支持

协助识别用户应用配置更改.

参与部署实施应用程序所要求的所有活动

报告流程中出现的问题

确保流程的实施并提出改进建议

协助高效、激励型团队的建设,培养团队建设能力

任职资格:

大专或以上学历

熟练掌握JAVA开发,J2EE开发,熟悉J2EE规范以及主流设计模式

熟悉JS、Jquery、Ajax等,熟练掌握Struts、Hibernate/iBatis、Spring等主流框架开发过程 使用一种或多种数据库– Oracle, MYSQL,SQL Server 或PostgreSQL.

熟练使用Eclipse等开发工具,熟练使用SVN/GIT等代码管理工具

掌握软件开发生命周期.

两年以上相关工作经验

能力要求:

良好的团队合作精神

快速学习能力

在压力下独立工作的能力

在解决问题的环境中表现出工作的创造性、系统性

主动灵活的工作方式

良好的沟通技巧和协调能力

良好的时间管理能力

第16篇:沙盘游戏咨询师试题《高级》

人力资源和社会保障部中国职工教育和职业培训协会PAT项目专业能力测试

沙盘游戏咨询师(高级)课程测试试卷

考 生 注 意 事 项

1. 本试卷满分为100分,考试用时120分钟,

分数:_________ 2. 答卷前,考生务必用黑色签字笔将自己的姓名、性别、年龄、证件类型、证件号码、考试所在地、培训单位填写清楚。

考试地点:培训单位:

考生姓名:考生性别:考生年龄:考试日期: 证件类型:证件号码:

一、填空题(30分,每空3分)

1、假如把自我、本我与超过的关系比作赛马,那么是自我、是本我,是超我。

2、对于心理咨询工作来说,所有的心理问题都是源于与的不协调、不统一。

3、作为荣格学派的创始人,荣格的理论为沙盘游戏疗法起了至关重要的作用。

4、日本的心理学家将沙盘游戏疗法带到日本,创立了疗法。

5、沙盘游戏疗法实施的必要设施包括、和。

二、单项选择题(30分,每题3分)

1、佛洛伊德对沙盘游戏疗法起了影响作用的著作是。

A 《梦的解析》

B 《性学三论》

C 《治愈心灵的花园》

D 《日常生活的心理病理学》

2、荣格认为,集体无意识的内容是。

A 象征意义

B 原型

C 玩具

3、沙盘游戏疗法是卡尔夫根据劳恩菲尔德的创立的。A 自由联想

B 催眠疗法

C 世界技法

D积极想象

4、面对来访者,治疗师充分相信来访者的。

A 自我治愈力

B 自我有限性

C 限定性

D 自由与受保护的

5、在箱庭治疗过程中,治疗师要为来访者营造的空间。

A 自由与受保护的空间

B 限定性的空间

C 积极想象的空间

6、荣格认为,原型中的阿尼姆斯代表着。

A 男性心理中的女性特质

B 女性心理中的男性特质

C 智慧老人

7、沙盘游戏疗法源自世界技法,最早用于的治疗。A 心理障碍儿童

B 心理障碍成人

C 留守老人

第1页 人力资源和社会保障部中国职工教育和职业培训协会PAT项目专业能力测试

8、团体箱庭疗法不适用于。

A 自闭症儿童

B 具有同样心理问题的成人 C 儿童社交恐惧症患者

9、在团体箱庭的游戏过程中,假如有成员退出,我们应当遵循原则。A 积极挽留

B 强制留下

C去者不追

10、在沙盘游戏中使用的沙箱底色为。A 绿色

B 红色

C 白色

D蓝色

三、简答题(40分,每题10分)

1、团体箱庭的操作过程?

2、沙盘游戏治疗(箱庭疗法)的作用?

3、箱庭疗法的设施要求?

4、什么是箱庭疗法?

第2页

第17篇:Jsp&Servlet(Java)总结

Jsp&Servlet(Java)总结

一、Jdbc中核心类

1.将Driver对象注册到DriverManager

//注册驱动

Cla.forName(\"com.microsoft.jdbc.sqlserver.SQLServerDriver\");

2.DriverManager:

//得到连接 Connection con=DriverManager.getConnection(\"jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs;selectMethod=cursor\",\"用户\",“密码”);

3.Connection:

//一个连接会话,可以得执行sql的对象 PreparedStatement ps=con.preparedStatement(\"insert into student values(?,?,?)\"); -执行

ps.setString(1,\"张三\");

ps.executeUpdate();

-查询

PreparedStatement ps=con.preparedStatement(\"select * from student\");

ResultSet rs=ps.executeQuery();

Statement st=con.createStatement();

-查询

st.executeQuery(\"select * from student\");

-执行

st.executeUpdate(\"insert into student values(\'cc\',\'cc\',\'x\',\'s\')\");

4.PreapredStatement、Statement的区别

PreparedStatement: 动态传参,在得到PreparedStatement实例时,要给定sql,所以sql是预编译,重复执行时效率高。

Statement 不可以动态传参,在得到Statement实例时,不给定sql,sql不预编译,重复执行时效率低。

二、实现servlet?

1、继承于HttpServlet,实现doGet及doPost方法

//form中的method=get时或超链时调用doGet方法,doGet的信息写在请求的url中,不安全,传输的信息少

//如果是表单一般用doPost方法

实现代码:

public cla MyServlet extends HttpServlet

{

public void doGet(HttpServletRequest request,HttpServletResponse response)

{

//request:客户的请求及表单域信息

String userName=request.getParameter(\"表单域名\");

String like[]=request.getPrameterValues(\"重复的表单域名\");

//在request中加入对象,转发到另一页面时可以重用

request.setAttribute(\"名称\",\"对象\");

request.getAttribute(\"名称\");

//转发到另一个servlet或jsp页面,会通过参数将当前servlet或jsp中的request

request.getRequestDispatch(\"a.jsp\").forward(request,response);

//得到seion

HttpSeion seion=request.getSeion();

//response:是响应信息.得到输出流,向客户端打印文本

PrintWriter pw=response.getWriter();response.getOutputStream();

pw.println(\"helloworld\");

//跳转:下一个页面或servlet不保留上一个页面的request、respose对象。

response.sendRedirect(\"a.jsp\");

}

//form中的method=post时调用,doPost的信息写在http请求的正文中,安全,传输的信息大,如果是表单一般用doPost方法

public void doPost(HttpServletRequest request,HttpServletResponse response)

{

}

}

web.xml部署

myServler

servlet.MyServlet

myServler

*.do

三、转发、跳转、提交、超链的区别

转发:运行在服务端,下一页面保留当前页面的request、response

跳转:运行在服务端,下一页面不保留当前页面的request、response

提交:运行在客户端,向服务器发送请求,提交表单域的内容

超链:运行在客户端,向服务器发送请求,提交超链信息

四、jsp中的九大内置对象

request:HttpServletRequest,转发到下一个页面时可以重用对象

response:客户端响应

seion:HttpSeion,一个用户多个页面共享同一变量。

application:ServletContext,多个用户多个页面共享同一变量。

pageContext:jsp页面的运行环境,在自定义标签中用的很多,

--可以得到另外8大对象

pageContext.getRequest();

pageContext.getApplication();

--转发到另一个页面

pageContext.forword(\"a.jsp\");

request.getRequestDispatch(\"a.jsp\").forward(request,response); out:向客户端打印文本

out.println(\"\"); exception:只在异常页面中,正常页面出错时跳到异常页面,通过异常

页面显示错误。

异常页面(error.jsp)

<%@page isErrorPage=\"true\"%>

exception.getMeage();

正常页面(common.jsp):

<%@page errorPage=\"error.jsp\"%>

page:当前页面定义变量当前页面有效,作用域最小

config:ServletConfig的实例

五、servlet的体系结构

Servlet接口

GenericServlet通过用Servlet可以跨协议

HttpServlet:只适用于http协议

自定义Servlet,必须继承于HttpSerlvet

六、servlet生命周期

1、单例模式

2、3个方法

init:初始化时调用,只调用一次

service:每请求一次调用一次

doGet

doPost

destroy:销毁时调用,只调用一次

七、JSP动作

//转发到另一个页面

//导入另一个页面的运行结果

//有则用已有的,没有则产生一个新的

//向一个对象的一个属性设值

//打印一个对象的属性值

八、JSP指令

isErrorPage=\"false/true\" errorPage=\"error.jsp\"/> //引入标签库

//将两个页面个在一起形成一个文件,编译成

cla运行。

九、model2(MVC)的处理过程

MVC

M(model):

Persistent(Dao)

V(view)

jsp

c(control)

Servlet

请求处理过程:

jsp--->serlvet-->Persistent

Persistent -->servlet—jsp

十、model2的作用:

让模型与视图强制解藕,相当到旅店的服务员,提高了

代码的可扩展、可维护

十一、el语言及jstl标签

显示信息

${requestScope/seionScope/applicationScope.user.userName} 循环

${user.userName}

判断:

在jsp页面中不出现任何的%,只有el及标签,这样页面没有任何逻辑

只有显示作用。

十二、过滤类的作用 是一个拦截器可在拦截所有的请求,在调用jsp或servlet之前执行,jsp或serlvet执行完后过滤再次过滤处理。相当于门,进与出时都可过滤处理。

public cla MyFilter implements Filter

{

public void doFilter(HttpServletRequest request,HttpServletResponse response,Filter filte)

{

request.setCharactorSet(\"utf-8\");

filter.doFilter(request,response);//给真正的处理者

System.out.println(\"Hello Word!\");

}

}

code

aa.MyFilter

code

/*.do

第18篇:java程序员职业规划

java程序员职业规划第一步:

1、基础必备:至少看过2本语言基础书和一本领域技术书。

2、部分参与项目1-2个。

java程序员职业规划第二步:

1、行业知识领悟、扩展相关应用知识。

2、完整参与项目1-2个。

3、可以指导新人完成工作。

java程序员职业规划第三步:

1、深刻理解面对对象知识。熟悉常用架构,对公司采用的架构能提出改善意见。

2、参与需求讨论并能提出简化方案。

3、能为决策提出一些建议。

java程序员职业规划第四步:

1、能够对整体需求方案做出精确描述。

2、运用一种架构对项目、产品进行设计。

3、评估项目风险、以及预留方案。

4、实现核心组件、技术难关。

5、行业技术指导。

(二)java程序员职业规划要点

(1)只会编程是不够的

仔细思考在哪个商业领域投入时间。软件工程师(软件工程培训)不能只会开发软件,应该要成为这个业务领域的专家。你的行业经历应该成为你的重要才能。有机会多与公司行业内人士接触,选择一本与你公司行业有关的杂志,找一个行业网站。只有了解了一个行业后,你才能创造性地有所建树。学习行业是如何运转的,了解一些财务基本知识。

(2)在思维上投资

要学会抓住机遇。

多学习新的技术,编程语言,可以改变你的思维方式。

(3)做一名通才

你的技术水平应该超越技术平台。

经常学习一些新技术。

(4)成为一名专家

不仅应该会处理高端抽象,同时也应该了解实现高端抽象的低端细节。

第19篇:Java 正则表达式总结

正则表达式大全

正则表达式大全

匹配中文字符的正则表达式: [u4e00-u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^x00-xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行

匹配HTML标记的正则表达式:]*>.*?|

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂 的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s*|s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制 表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+ ([-.]w+)* 评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划 线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用

匹配国内电话号 码:d{3}-d{8}|d{4}-d{7}

评注:匹配形式如0511-4405222或021-87888822

匹 配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]d{5} (?!d) 评注:中国邮政编码为6位数字

匹配身份证:d{15}|d{18}

评注:中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+ 评注:提取ip地址时有用

匹配特定数字:

1 正则表达式大全

^[1-9]d*$

//匹配正整数

^-[1-9]d*$

//匹配负整数

^-?[1-9]d*$

//匹配整数

^[1-9]d*|0$

//匹配非负整数(正整数 + 0)

^-[1-9]d*|0$

//匹配非正整数(负整数 + 0)

^[1-9]d*.d*|0.d*[1-9]d*$

//匹配正浮点数

^-([1-9]d*.d*|0.d*[1-9]d*)$

//匹配负浮点数

^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$

//匹配浮点数

^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$

//匹配非负浮点数(正浮点数 + 0) ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$

//匹配非正浮点数(负浮点数 + 0)

评注:处理大量 数据时有用,具体应用时注意修正

匹配特定字符串:

^[A-Za-z]+$

//匹配由26个英文字母组成的字符串

^[A-Z]+$

//匹配由26个英文字母的大写组成的字符串

^[a-z]+$

//匹配由26个英文字母的小写组成的字符串

^[A-Za-z0-9]+$

//匹配由数字和26个英文字母组成的字符串

^w+$

//匹配由数字、26个英文字母或者下划线组 成的字符串

在使用RegularExpreionValidator验证控件时的验证功能及其验证表达式介绍如下:

只能 输入数字:“^*0-9+*$”

只能输入n位的数字:“^d,n-$”

只能输入至少n位数字:“^d,n,-$”

只能输入m-n位的数字:“^d,m,n-$”

只能输入零和非零开头的数字:“^(0|*1-9][0-9+*)$”

只能 输入有两位小数的正实数:“^*0-9]+(.[0-9+,2-)?$”

只能输入有1-3位小数的正实数:“^*0-9]+(.[0-9+ ,1,3-)?$”

只能输入非零的正整数:“^+?*1-9][0-9+*$”

只能输入非零的负整数:“^-[1-9] [0-9+*$”

只能输入长度为3的字符:“^.,3-$”

只能输入由26个英文字母组成的字符串:“^*A-Za- z++$”

只能输入由26个大写英文字母组成的字符串:“^*A-Z++$”

只能输入由26个小写英文字母组成的字符 串:“^*a-z++$”

只能输入由数字和26个英文字母组成的字符串:“^*A-Za-z0-9++$”

只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”

验证用户密码:“^*a-zA-Z+w,5,17-$”正确格式为:以字母开头,长度 在6-18之间,

只能包含字符、数字和下划线。

验证是否含有^%&”,;=?$”等字符:“*^%& “,;=?$x22++”

只能输入汉字:“^*u4e00-u9fa5+,,0,-$”

验证Email地址:“^w+ *-+.]w+)*@w+([-.]w+)*.w+([-.+w+)*$”

验证InternetURL:“^http://(*w-]+.)+[w-]+(/[w-./?%&=+*)?$”

验证电话号 码:“^((d,3,4-)|d,3,4--)?d,7,8-$”

正确格式为:“XXXX-XXXXXXX”,“XXXX- XXXXXXXX”,“XXX-XXXXXXX”,

2 正则表达式大全

“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。

验证身份证号(15位或18位数字):“^d,15-|d,-18$”

验证一年的12个月:“^(0?*1-9]|1[0-2+)$”正 确格式为:“01”-“09”和“1”“12”

验证一个月的31天:“^((0?*1-9])|((1|2) [0-9+)|30|31)$”

正确格式为:“01”“09”和“1”“31”。

匹配中文字符的正则表达式: [u4e00-u9fa5]

匹配双字节字符(包括汉字在内):[^x00-xff]

匹配空行的正则表达式:n[s| ]*r

匹配HTML标记的正则表达式:/.*|/

匹配首尾空格的正则表达 式:(^s*)|(s*$)

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

第20篇:JAVA培训宣传单

诚合Java软件开发训练营

招新 在百度文库中搜索“JAVA程序员就业前景”我们可以得到以下信息:

※根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%。同时,Java工程师的薪水相对较高。Java软件工程师一般月薪范围在4000-10000元,远远超过了应届毕业生月薪2500元的平均水平。通常来说,有一年工作经验的Java高级软件工程师的薪酬大致在年薪10—13万左右。但是目前,虽然Java人才的薪水很高,但是对该类人才需求旺盛的IT企业却很难招聘到合格的Java软件工程师。其中,最根本的原因就是许多计算机相关专业的毕业生在读期间没有掌握实用的技能与经验,距离企业的实际用人要求有较大的差距。 因此,计算机相关专业的大学生欲成为Java软件工程师,最便捷的一条路就是参加以实战项目为主要教学方法的Java职业技能培训,从而有效地缩短同企业具体用人要求之间的差距。※

现诚合JAVA软件开发训练营正是以软件企业的模式运作,以实战项目为主要教学方法,以服务学生就业为导向,老师担任项目经理、系统架构师、系统评审员角色,主要从事项目管理、系统分析、总体设计等;学生担任需求分析员、程序员、测试员等角色,主要从事需求分析、详细设计、代码编写、系统测试等。

招新承诺:

1.我们有资历高的JAVA行内老师及学长给大家手把手授课,我们以实战项目为主要教学方法,让大家亲身感受项目开发的整个过程;

2.我们拥有专门的学习场地与授课老师共处一室学习办公,供学员课余时间学习和交流,为学员提供了一个互动互助的良好学习氛围;

3.培训周期过后考核优秀者可以留在诚合工作室继续深造,提升到一定开发能力时便可参与工作室的实际项目开发,并能得到相应报酬。

招新要求:

1.遵守管理制度,爱护公共财产,按时参加培训;

2.有吃苦精神,有服务意思,有协调能力。

(报名信息在背面)

java游戏高级编程
《java游戏高级编程.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题
点击下载本文文档