欢迎访问我的博客!此博客以自娱为主,希望能够与大家有所交流,如文章有何不适及对文章有何看法请与我联系,任何问题我都将在第一时间回复。文章未注明原创则为转载,不代表本人观点。
NET命令的另类用法
递归实现Hanoi塔问题
//自己写着玩的,其实一点意思也没有
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
int c=0;
void move(char x,int n,char z)
{
// printf("%i.move disk %i from %c to %c\n",++c,n,x,z);
cout<<++c<<" move disk "<<n<<" from "<<x<<" to "<<z;
cout<<endl;
}
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,y,z);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
void main()
{
int n=0;
char a,b,c;
printf("%s","please input one digit and three char\n");
scanf("%d,%c,%c,%c",&n,&a,&b,&c);
hanoi(n,a,b,c);
}
我的第一次面试
今天在东软的面试终于彻底结束了!
虽然最终结果明天才能出来,但不论结果如何,在东软的面试注定只能成为我锻炼的一次机会。
人的第一次总是让人发出许多感慨,无论是成功还是失败。
回想起在东软面试的经历,一下子就让我明白了很多。
九月一号
刚回到学校几天,就已经听说东软要到我们院来招人了,当时有点惊讶,没有想到这么快就来了,还以为十一以后才开始呢!但是没有怎么注意,因为没有想到要到一个公司去,我当时还一心一意想考国家公务员来着,但是觉得这是一个不错的机会,能参加的话,一定去试一试。
九月四号
今天正式开学了,下午接到通知,五号晚上7:00院103教室举行东软笔试,辅导员说希望大家都去看一看,因为东软也是一个很不错的IT企业,而且第一次到我们学校来,希望大家要给别人一个好印象。
晚上我和老喻早早来到103,等待东软的笔试。其实我们院绝大部分人都是打算来考研的,来笔试的,都是考研决心不是很坚决的,而那些考研决心很坚决的,学习超棒的,根本就没有来。但是来的人不算少吧,来了200多人,占毕业生总人数的二分之一了,居然还有几个04级的!
七点多的时候,投影仪、扩音器等等终于什么都准备好了,人也来了,30岁左右吧,相貌平平。来人自称徐老师,他解释说因为东软是东北大学的,所以东软称呼上司一律为老师,还算比较有特色。
然后就开始先做宣传了,这人演讲水平不怎么样,太普通了,没有激情,或者根本说就是差,开始半天不说一个字,一开口讲的有点不自信的样子,反正很不好,接下来就是照本宣科了,看着幻灯片说。真不知道东软咋找这样的人做宣传,难道不知道这样会影响形象么?不用说,下面的听众情绪很不高,当时就有人离开了。
但总算听明白了,不欢迎考研的同学,考东北大学和东软PL班的除外(东北大学计算机那么牛,谁敢考啊,我现在也不知道PL班是什么,估计也是研究生班吧),先笔试,后面试,然后确定录用后先在本校由专人进行培训,然后明年直接进入公司,很可能去大连。呀,一听说去大连,我太兴奋了,整个中国让我梦寐以求的地方也就是青岛和大连,这两个地方不仅气候环境好,软件业也很发达,又靠近大海,这不正是我的理想么?
如果我没有改变注意打算考研的话,我相信如果东软选择我,我一定会去的!
宣传完毕,那位徐老师告诉大家明天晚上7:00在这个地方举行笔试,希望大家都能参加,他还说即使打算考研也可以参加笔试和面试,只要不签合同就行,我当时认为他肯定看到我们情绪不高,害怕明天笔试人太少,所以想让我们都参加笔试,后来发现他是高明的,本来有的同学下定决心考研的,后来都一心一意想进东软了。
然后他就问我们是否有问题提问,啊,场面很尴尬,没有一个人提问,然后老喻问我不知道他准备招多少人,干脆我就站起来提问:“徐经理,你好,请问你准备在我们学校招多少人啊?”。他说二三十个左右,但是他觉得如果我们很优秀的,他会多招的。
接下来开始有人提问了几个问题,就结束了。
九月五号
晚上7:00,老早在103等好了,来的人还不少,120多人,然后那个徐经理和辅导员就搂了两摞试卷过来,一摞试题,一摞填写个人资料。考试之前,辅导员特别叮嘱,不要作弊,呵呵,搞笑。
添完个人资料,就开始做题了。啊,这题还是很有个性的,第一大题是分析数字测智商的,第二大题分辨图形测反应速度,第三大题数学,第四大题专业课,第五大题职商(孤陋寡闻,以前没有听说过),第六大题专业英语。
考的我很崩溃,第一大题有的不会做,第二大题看的我眼睛好疼,第三题我蒙了三个选择,计算题根本不会(就这还想考研?),第四题我还有点自信,第五题没有分数,想怎么选就怎么选,第六题英译汉还行,汉译英就快给我累坏了。
到交卷的时候我根本没有写完,但不管了,交上得了!
接下来就是等待了,漫长的等待!
九月十四号
晚上在考研自习教室,团支书让我把东软录取名单中咱班男生名单抄下来。
还好,有我,考了70分,第一名叫屈世富,80分,真没有想到,还凑合吧。这一轮刷掉了一半,录了63个参加面试,我们班就有22个,应该是最多的了。
九月十五号
本来说早晨十点开始面试,但不知道为什么耽误了,下午才三点开始。面试前发下上次考试成绩单,第二题还不错,数学三个选择题都蒙对了,英语最好,差点满分,其他都一般。
面试分单双号,单号到三楼,双号到四楼,一个人大约20多分钟吧,很慢,先面试的回来说很简单,就一个人面试,就是问问JAVA和数据库知识。五点的时候,我和一个女孩上三楼去了,她居然是个04级的,她先进去,五点25的时候才出来,然后我就敲门进去了。里面一个矮矮的有点胖的人,一个笔记本,他很客气的让我坐在他旁边,很和蔼,真好,我一点也不感到拘束,后来我跟我女朋友说,考官就应该这样。
我把自己的笔试成绩单给他看,他就问我,六级过了吗,我说,过了,英语竞赛三等奖,我说,是的,他说,那你听力怎么样,我说,还行吧,他就说,那口语应该也不错吧,我说,这个不太清除,本来打算参加口语考试的,忙其他的,没有来得及参加,他就笑着说,那肯定不错。我就想,这个人真奇怪,我口语根本就不好,我女朋友就说我口语差。他接着问我JAVA,我说我JAVA还行吧,因为大一没有学好C++,所以后来拼了命的学JAVA,考试拿了全班第一名。他就问我,考了多少分,我说考了98分(其实我记错了,是96分),他很惊讶,也很高兴,又问我有没有做过项目,我说,做过,一个教务管理系统,用JBuilder做的,是本地应用程序,有学生、教师、排课管理等等。他又问,几个人做的,你担任组长吗?我说,四个人做的,我担任组长。他问,你主要干什么呢,我说,我承担绝大部分代码编写。他很高兴,又问我平时怎么了解新技术,我说,我喜欢看电脑报和计算机世界,还有其他的计算机杂志,当然也通过网络。他说,挺不错的,你对日本态度怎么样?我之前听过东软的大部分业务是日本的,我就说,虽然整体上,舆论反日情绪严重,但应该就事论事,不能一概而论。他点点头,又问,你考研吗?我说,未有此打算。呵呵,这是我惟一的一句谎话,其实我是要考的。他就说,很好,挺不错的,就这样吧,你先会去吧。我出来一看表,天啊,整个面试还不到五分钟!心里真有点发毛,不会被刷了吧!
出来一问他们为什么面试了那么长时间,原来那个考官问他们JAVA基础知识来着,而他根本没有问我,后来我跟我女朋友说,她说,大概是怕他自己JAVA没有你好吧。呵呵,我估计他也饿了,也想早点结束吧。
然后就听说二十号举行第二轮面试,好麻烦!
九月二十号
老早等着,突然通知,明天面试,毛病!
九月二十一号
第一轮面试出来了,初步确定录用了30个,外加还要考察的10个,我在被录用之列,好高兴啊!十一点二十开始面试,我是下午一点开始第二轮面试,中午回去吃饭,然后跟女朋友说了一下,就征求她的意见,她要说那你去吧,我也许就打定主意走了。没有想到她居然哭了起来,弄的我比她还难受,就下定决心不和东软签合同了。
刚到教室,辅导员就告诉我说,轮到我了,才知道是小组发言式面试,七个人一组。于是我就和他们一块上去了,有一个女生。考官也是河南的,是人力资源部的,相貌平平,但能力还不错吧,也很和蔼。然后我们就开始做自我介绍,他们都表达了打定主意去东软的意向,轮到我的时候我就说,我比较喜欢大连,环境优美,很适合人生活。我说的时候很轻松,因为没有压力。然后考官说,可能不去大连,我说,去沈阳是吗?沈阳也好啊,有世博会呢?考官居然说我比较活泼,不知道是夸还是贬。反正听其他人说觉得有些人比我牛多了,都在实验室待了两三年了,遗憾,我没有进实验室,当然不是因为进不去。
考官又说了一些话吧,工资最高开到3000,好心动啊!
面试完我就给女朋友打电话,跟她说我不去。然后我就直接回宿舍了,懒得看结果。
晚上11点多,才知道结果早出来了,我被录取了,我们班录取了11个,一共29个,我们班比较多吧。我当时就说我不去了,他们就说我不拉屎还占茅坑,我说难道那十个都去吗,结果很让我吃惊,他们都去,唯独我。那十个其中有很牛的人,有下定决心考研的,真没有想到!
体育委员告诉我说,不想签合同的话,明天亲自和辅导员解释。
九月二十二号
过一会就去和辅导员解释了,其实没有啥说的,不就不去呗。
我和东软也就此告一段落了。
百度,赶上!
CDMA(码分多址)蜂窝移动通信——功率控制
论文格式
1、毕业论文的写作顺序是:标题、作者班级、作者姓名、指导教师姓名、中文摘要及关键词、英文摘要及英文关键词、正文、参考文献。
2、附表的表头应写在表的上面,居中;附图的图题应写在图的下面,居中。按表、图、公式在论文中出现的先后顺序分别编号。
3、参考文献的书写格式严格按以下顺序:序号、作者姓名、书名(或文章名)、出版社(或期刊名)、出版或发表时间。
4、字体:各类标题(包括“参考文献”标题)用粗宋体;作者姓名、指导教师姓名、摘要、关键词、图表名、参考文献内容用楷体;正文、图表、页眉、页脚中的文字用宋体;英文用Times New Roman字体。
5、字号:论文题目用三号字体,居中;一级标题用四号字体;二级标题、三级标题用小四号字体;页眉、页脚用小五号字体;其它用五号字体;图、表名居中。
6、论文正文打印页码,下面居中。
7、打印纸张规格:A4 210×297毫米。
8、在文件选项下的页面设置选项中,“字符数/行数”选使用默认字符数;页边距设为 上:3厘米;下:2.5厘米;左:2.8厘米;右:2.8厘米;装订线:0.8厘米;装订线位置:左侧;页眉:1.8厘米;页脚1.8厘米。
9、在格式选项下的段落设置选项中,“缩进”选0厘米,“间距”选0磅,“行距”选1.5倍,“特殊格式”选(无),“调整右缩进”选项为空,“根据页面设置确定行高格线”选项为空。
10、页眉用小五号字体打印“XX大学XX学院XX级XX专业学年论文”字样,并左对齐
大三必读手册:2007年考研复习规划(1)
大三必读手册:2007年考研复习规划(2)
JDBC学习笔记——JDBC性能优化
JDBC介绍
JDBC优化数据库连接
六大代码问题检验你的Java知识
1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try { // ⑸
4 Statement stat = conn.createStatement();
5 ResultSet rs = stat.executeQuery(
6 "select uid, name from user");
7 while (rs.next())
8 {
9 out.println("ID:" + rs.getString("uid") // ⑹
10 ",姓名:" + rs.getString("name"));
11 }
12 conn.close(); // ⑶
13 out.close();
14 }
15 catch(Exception ex) // ⑵
16 {
17 ex.printStackTrace(); // ⑴,⑷
18 }
作为一个Java程序员,你至少应该能够找出两个问题。但是,如果你不能找出全部六个问题,请继续阅读本文。
本文讨论的不是Java异常处理的一般性原则,因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”(anti-pattern)的违背优秀编码规范的常见坏习惯,帮助读者熟悉这些典型的反面例子,从而能够在实际工作中敏锐地察觉和避免这些问题。
反例之一:丢弃异常
代码:15行-18行。
这段代码捕获了异常却不作任何处理,可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看,它也许可以和C/C++程序的一个恶名远播的问题相提并论——不检查缓冲区是否已满。如果你看到了这种丢弃(而不是抛出)异常的情况,可以百分之九十九地肯定代码存在问题(在极少数情况下,这段代码有存在的理由,但最好加上完整的注释,以免引起别人误解)。
这段代码的错误在于,异常(几乎)总是意味着某些事情不对劲了,或者说至少发生了某些不寻常的事情,我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错,调用printStackTrace对调试程序有帮助,但程序调试阶段结束之后,printStackTrace就不应再在异常处理模块中担负主要责任了。
丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档,可以看到下面这段说明:“特别地,虽然出现ThreadDeath是一种‘正常的情形’,但ThreadDeath类是Error而不是Exception的子类,因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是,虽然ThreadDeath代表的是一种普通的问题,但鉴于许多应用会试图捕获所有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子类,因为Error类代表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常这一坏习惯是如此常见,它甚至已经影响到了Java本身的设计。
那么,应该怎样改正呢?主要有四个选择:
1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。
2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。
3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。
4、不要捕获异常。
结论一:既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。
反例之二:不指定具体的异常
代码:15行。
许多时候人们会被这样一种“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上,在绝大多数情况下,这种做法不值得提倡。为什么呢?
要理解其原因,我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生,catch(Exception ex)就相当于说我们想要处理几乎所有的异常。
再来看看前面的代码例子。我们真正想要捕获的异常是什么呢?最明显的一个是SQLException,这是JDBC操作中常见的异常。另一个可能的异常是IOException,因为它要操作OutputStreamWriter。显然,在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说,catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类。
另一方面,除了这两个特定的异常,还有其他许多异常也可能出现。例如,如果由于某种原因,executeQuery返回了null,该怎么办?答案是让它们继续抛出,即不必捕获也不必处理。实际上,我们不能也不应该去捕获可能出现的所有异常,程序的其他地方还有捕获异常的机会——直至最后由JVM处理。
结论二:在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。不要试图处理所有可能出现的异常。
反例之三:占用资源不释放
代码:3行-14行。
异常改变了程序正常的执行流程。这个道理虽然简单,却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally。
finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。
当然,编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常——这是执行清理任务的最后机会,尽量不要再有难以处理的错误。
结论三:保证所有资源都被正确释放。充分运用finally关键词。
反例之四:不说明异常的详细信息
代码:3行-18行。
仔细观察这段代码:如果循环内部出现了异常,会发生什么事情?我们可以得到足够的信息判断循环内部出错的原因吗?不能。我们只能知道当前正在处理的类发生了某种错误,但却不能获得任何信息判断导致当前错误的原因。
printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。
因此,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。
结论四:在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。
反例之五:过于庞大的try块
代码:3行-14行。
经常可以看到有人把大量的代码放入单个try块,实际上这不是好习惯。这种现象之所以常见,原因就在于有些人图省事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子,虽然东西是带上了,但要找出来可不容易。
一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明Exception,而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难,因为一大段代码中有太多的地方可能抛出Exception。
结论五:尽量减小try块的体积。
反例之六:输出数据不完整
代码:7行-11行。
不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行——就这些,再也没有其他动作了。已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。
较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。
结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。
改写后的代码
根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点啰嗦,但是它有了比较完备的异常处理机制。
OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select uid, name from user");
while (rs.next())
{
out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
}
}
catch(SQLException sqlex)
{
out.println("警告:数据不完整");
throw new ApplicationException("读取数据时出现SQL错误", sqlex);
}
catch(IOException ioex)
{
throw new ApplicationException("写入数据时出现IO错误", ioex);
}
finally
{
if (conn != null) {
try {
conn.close();
}
catch(SQLException sqlex2)
{
System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连接: " + sqlex2.toString());
}
}
if (out != null) {
try {
out.close();
}
catch(IOException ioex2)
{
System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文件" + ioex2.toString());
}
}
}
本文的结论不是放之四海皆准的教条,有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心,务必加上详细、全面的注释。
一方面,不要笑话这些错误,不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途,原因很简单,因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔,它们美丽动人,无孔不入,时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事,不足挂齿,但请记住:勿以恶小而为之,勿以善小而不为。