博文
[置顶] 送给英语学习者的十句经典名言(2007-08-16 16:44:00)
摘要:、What is language for? some people seem to think it’s for practicing grammar rules and learning lists of words——the longer the words the better. that’s wrong. language is for the exchange of ideas, for communication.
(语言到底是用来干什么的呢?一些人认为它是用来操练语法规则和学习一大堆单词——而且单词越长越好。这个想法是错误的。语言是用来交换思想,进行交流沟通的!)
2、The way to learn a language is to practice speaking it as often as possible.
(学习一门语言的方法就是要尽量多地练习说。)
3、A great man once said it is necessary to dill as much as possible, and the more you apply it in real situations, the more natural it will become.
(一位伟人曾说,反复操练是非常必要的,你越多地将所学到的东西运用到实际生活中,他们就变得越自然。)
4、Learning any language takes a lot of effort. but don't give up.
(学习任何语言都是需要花费很多努力,但不要放弃。)
5、Relax! be patient and enjoy yourself. learning foreign languages should be fun.
(放松点!要有耐性,并让自己快乐!学习外语应该是乐趣无穷的。)
6、Rome wasn’t built in a day. work harder and practice more. your hardworking will be rewarded by god one day. god is equal to everyone!
(冰冻三尺,非一日之寒。更加努......
[置顶] C语言高效编程的的四大绝招(2007-04-06 14:42:00)
摘要:
第一招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。
例如:字符串的赋值。
方法A:通常的办法:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is a example!!");
方法B:
const char string2[LEN] ="This is a example!";
char * cp;
cp = string2 ;
使用的时候可以直接用指针来操作。
从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下:
方法C:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) \
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
#define b......
带通配符的字符串匹配分析(2009-12-22 17:08:00)
摘要:在字符串匹配问题中,我们期待察看串T中是否含有串P。
其中串T被称为目标串,串S被称为模式串。
2 朴素匹配算法
进行字符串匹配,最简单的一个想法是:
public class SimpleMatch {
public int StringMatch(String target,String patten) {
int tl = target.length();
int pl = patten.length();
int i = 0 ;
int j = 0 ;
while (i < tl - pl && j < pl) {
if (patten.charAt(j) == target.charAt(i + j))
j ++ ;
else {
&n......
由auto_ptr想到的(2009-09-28 19:59:00)
摘要:由一份auto_ptr源代码所引发的思考
Kyle
CPPCN 版权所有
如果我问你,auto_ptr最关键的地方,或者说它与一般指针最不一样的地方在哪里,你一定会说它是一个对象,它与自己所占有的资源密切相关,当自己消亡的时候,它也会将自己所拥有的资源一同释放。很好,它之所以会拥有这一特性,全都要归于析构函数的功劳,在析构函数中,它会进行善后处理,这样也就很好的避免了资源泄漏。当然,引入auto_ptr的原因还不至于这么简单,因为许多资源泄漏的问题主要是由于我们的粗心大意所致,所以只要我们细心一些,还是会避免一些不该发生的资源泄漏问题。那究竟是什么原因让我们引入auto_ptr呢?对了,你一定也想到了,就是在异常处理的时候。Ok,来看下面这个例子:
void foo()
{
ClassA *ptr=new ClassA;
try
{
/* 此处放置可能抛出异常的操作 */
}
catch(…)
{
delete ptr;
throw;
}
delete ptr;
}
上面这个例子使用了一般的指针,你会发现它防止发生资源泄漏的处理是多么复杂,必须在每个catch中进行资源的释放,而且有可能会有许多的catch。天哪,这简直就是灾难,它会使我们的代码很长,不易维护,如果忘记其中的一个,就会产生莫名其妙的错误。既然一般的指针防止资源泄漏会如此的繁琐,那有没有一个办法可以使我们不必操心资源的释放呢,由于在异常发生的时候,会进行堆栈解退,所以我们不必担心作为局部变量的指针本身不被销毁,既然这样,我们干脆建立一个指针对象,好比下面这样:
template<class T>
class auto_ptr1
{
private:
T* ap;
public:
……..
~auto_ptr(); //资源释放
}
当指针被销毁的时候,必然会执行析构函数,那就在析构函数中进行资源的释放不就ok了,呵呵,怎么样,是不是很简单呢?的确,整个逻辑的确很简单,但是如果我们在深入思考一下这个指针对象......
qt+vs2003安装(2009-02-05 23:45:00)
摘要:本来一直用开源版的,配合mingw也不错,该死的xp崩溃了,重装mingw觉得比较麻烦,正好手上的vs2003光盘一直没用过,就装了个vs2003,既然vs是d版,干脆使用d版的qt好了.我哭,兴致冲冲的打开传说中qt.tttxp.ru显示Site was closed according to request of Trolltech ASA company.好后悔当初没down下来~~
不过这世界上还有google,在一个国外网站上找到了种子。我需要qt-win-commercial-src-4.3.1.zip,qt-vsintegration-1.3.1.exe,还有一个license.txt文件.下载完后,进入vc的控制台环境,编译源代码才能用,照着附带的readme做就是了。安装qt-vsintegration,他是VC的插件,装上后就能创建QT的VC项目,比用一般的编辑器来写QT程序要方便许多。还要记得把把 license.txt 存成 .qt-license :
命令行下copy license.txt .qt-license
ok,最后虚伪的说一句,支持Qt,商业应用请购买正版,现在qt归诺基亚了,不知道前途如何!
这里还是把步骤及下来:
1.我的电脑上右键->属性->高级->环境变量
在环境变量path中添加;D:\qt\bin (;是用来和其它环境变量分开的)
新建环境变量:QMAKESPEC值win32-msvc.net
2.解压qt-win-commercial-src-4.3.1.zip到d:\qt
3.检查d盘空间
ntfs下占用空间为949 MB (995,687,822 字节) , 带文件压缩的情况下
fat32下大小为1.96 GB (2,108,853,199 字节) , 实际占用空间会更多
另外考虑到盘上需要留一定的空间出来,
4.把d:\qt下的.LICENSE文件复制到系统盘的用户目录下
如C:\Documents and Settings\Administrator
5.开始->所有程序->Microsoft Visual Studio 2003->Visual Studio .NET 2003 Command......
ant详解(2008-11-10 14:42:00)
摘要:Ant基本使用指南
1 Ant是什么?
Apache Ant 是一个基于 Java的生成工具。
生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本
2下载、安装Ant
安装Ant
下载.zip文件,解压缩到c:\ant1.3(后面引用为%ANT_HOME%)
2.1在你运行Ant之前需要做一些配置工作。
·将bin目录加入PATH环境变量。
·设定ANT_HOME环境变量,指向你安装Ant的目录。在一些OS上,Ant的脚本可以猜测ANT_HOME(Unix和Windos NT/2000)-但最好不要依赖这一特性。
·可选地,设定JAVA_HOME环境变量(参考下面的高级小节),该变量应该指向你安装JDK的目录。
注意:不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序,而lib/ext目录是为JDK扩展使用的(如JCE,JSSE扩展)。而且通过扩展装入的类会有安全方面的限制。
2.2运行Ant
运行Ant非常简单,当你正确地安装Ant后,只要输入ant就可以了。
没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。
可以指定执行一个或多个target。当省略target时,Ant使用标签<project>的default属性所指定的target。
命令行选项总结:
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
......
jndi学习(2008-11-10 11:52:00)
摘要:JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?
要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。
没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:
Java code
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver",
true, Thread.currentThread().getContextClassLoader());
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
......
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) {}
}
}
这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。
没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改......
ant入门(2008-11-08 21:34:00)
摘要:1. Ant是一种基于Java的Build工具.基本特性:
(1)基于Java的实现。具有良好的跨平台性,同时可以通过增加新的Java类来扩展Ant的功能,而无需去了解不同平台上不同的脚本语言。
(2)基于XML的配置文件。Ant以XML树来描述Target/Task的关系,文件结构清晰、易读易写,并且利用XML对格式的控制来避免由于配置文件的错误造成的Build操作失败。
2. 建立工程的目录
常用目录:
(1)bin 公共的二进制文件,以及运行脚本
(2)build 临时创建的文件,如类文件等
(3)dist 目标输出文件,如生成Jar文件等。
(4)doc/javadocs 文档。
(5)lib 需要导出的Java包
(6)src 源文件
(7)web web应用
3. 编写Build文件
Build.xml 由三层标记表示,一层包一层。
第一层project,描述整个项目,也就是ant要做的事情整个过程概括。
第二层target,目标,对象,你可以理解成一个任务单元,或者任务集,因为它就是把一些任务包括到一起。
第三层task,也就是任务了,ant定义了很多任务标记,这个可以在ant的doc里面找到
下面以Tomcat 5.0环境下的一个简单应用为例看一下ant 的使用
建立目录结构:
helloapp
|- src
|- web
|---|- WEB-INF
|---|---|- classes
|---|---|- lib
lib 下放这个应用的所有需要的jar文件
src 下就是我们的原代码了
classes 是代码编译后存放的位置
web 就是我们常用的webapp的目录结构
我们要做的是:
(1)把所需的jar文件考到lib下,在web下编写jsp,html页面,在src下编写java源文件和properties文件,把web.xml,struts-config.xml,tld文件放入WEB-INF
(2)编译src下的java源文件,放入classes
(3)把src下的所......
教你短信和女生说的24句话(2008-09-29 12:33:00)
摘要:1.听人家说,男人找老婆要爬三座大山,看在你我这么有缘的份上,可不可以,让俺少爬两座呀,让俺早点追到你,等待你的回答,如果同意请回复:我同意,如果不同意,请回复:我就是同意。不回复,俺就默认你无条件同意了。
2.男:问你一个问题好吗?你睡觉的时候喜欢睡那一边。
女:右边,怎么了。
男:那我从今天开始就睡左边,把右边给你留着。
女:你……
3.听说你手机没有短信功能,所以发这条短信试验。如你收到,证实有短信功能并是我的短信,请给我回复:我有了,是你的!
4.喜欢,就是淡淡的爱。爱,就是深深的喜欢。我希望以后可以不用送你回家,而是我们一起回我们的家。
5.第一眼见到你,我就对自已说:你就是我今生的奋斗目标,我要追求你,拥抱你。我要宣布:我爱你……人民币。
6.没有你的曰子,生活变得难受,我恨那个可恶的第三者将你抢走,你和他是否有了新感情?好想你回到我身边——钱包。
7.害羞的我有一句话一直都不敢向你表白,但是今天我终于鼓起勇气:你什么时候请我吃饭?
8.一个机缘认识你,两次见面留意你,三番四次约会你,七上八下挂念你,九成应是喜欢你,十分肯定我爱你。百年修到遇真爱,千年成全你和我,万事具备愿意吗。
9.你这个小妖精,令我中了你的爱情毒却不肯......
递归实现八皇后(2008-09-28 20:12:00)
摘要:
1.引子
中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。通过这样的波浪式前进方法,最终达到目的地。当然整个过程需要很多往返,这样的前进方式,效率比较低下。
2.适用范围
适用于那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题。
3.应用场景
在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突。国际象棋的棋盘如下图所示:
4.分析
基本思路如上面分析一致,我们采用逐步试探的方式,先从一个方向往前走,能进则进,不能进则退,尝试另外的路径。首先我们来分析一下国际象棋的规则,这些规则能够限制我们的前进,也就是我们前进途中的障碍物。一个皇后q(x,y)能被满足以下条件的皇后q(row,col)吃掉
1)x=row(在纵向不能有两个皇后)
2) y=col(横向)
3)col + row = y+x;(斜向正方向)
4) col - row = y-x;(斜向反方向)
遇到上述问题之一的时候,说明我们已经遇到了障碍,不能继续向前了。我们需要退回来,尝试其他路径。
我们将棋盘看作是一个8*8的数组,这样可以使用一种蛮干的思路去解决这个问题,这样我们就是在8*8=64个格子中取出8个的组合,C(64,80) = 4426165368,显然这个数非常大,在蛮干的基础上我们可以增加回溯,从第0列开始,我们逐列进行,从第0行到第7行找到一个不受任何已经现有皇后攻击的位置,而第五列,我们会发现找不到皇后的安全位置了,前面四列的摆放如下:
第五列的时候,摆放任何行都会上图所示已经存在的皇后的攻击,这时候我们认为我们撞了南墙了,是回头的时候了,我们后退一列,将原来摆放在第四列的皇后(3,4)拿走,从(3,4)这个位置开始,我们再第四列中寻找下一个安全位置为(7,4),再继续到第五列,发现第五列仍然没有安全位置,回溯到第四列,此时第四列也是一个......