博文

关于计算机科学知识体系结构课程表(2007-04-16 11:39:00)

摘要:             这是清华大学的课程表样式.希望可以帮助那些自学的同学.   ......

阅读全文(4035) | 评论:0

 程序员少走弯路的十条忠告 (2007-04-12 13:18:00)

摘要:刚刚走上社会的年轻人,充满了蓄势待发的豪情、青春的朝气、前卫的思想,梦想着丰富的待遇和轰轰烈烈的事业。可是,社会毕竟是一所包罗万象、喧嚣复杂的大学校,这里没有寒暑假,拒绝虚假和肤浅,更拒绝空想和庸碌,难以预告何时开课何时放学。   如何在涉世之初少走弯路,有一个好的开端,开始一番成功的事业?以下是一些先行者积累的10条有益的涉世忠告。好好地遵循、把握这些忠告和建议吧,比起所学的课堂课程来,它毫不逊色! 1. 买个闹钟,以便按时叫醒你。贪睡和不守时,都将成为你工作和事业上的绊脚石,任何时候都一样。不仅要学会准时,更要学会提前。就如你坐车去某地,沿途的风 景很美,你忍不住下车看一看,后来虽然你还是赶到了某地,却不是准时到达。“闹钟”只是一种简单的标志和提示,真正灵活、实用的时间,掌握在每个人的心 中。 2. 如果你不喜欢现在的工作,要么辞职不干,要么就闭嘴不言。初出茅庐,往往眼高手低,心高气傲,大事做不了,小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞,不带伞又怕淋雨,处处表现出不满的情绪。记住,不做则已,要做就要做好。 3. 每个人都有孤独的时候。要学会忍受孤独,这样才会成熟起来。年轻人嘻嘻哈哈、打打闹闹惯了,到了一个陌生的环境,面对形形色色的人和事,一下子不知所措起 来,有时连一个可以倾心说话的地方也没有。这时,千万别浮躁,学会静心,学会忍受孤独。在孤独中思考,在思考中成熟,在成熟中升华。不要因为寂寞而乱了方 寸,而去做无聊无益的事情,白白浪费了宝贵的时间。 4. 走运时要做好倒霉的准备。有一天,一只狐狸走到一个葡萄园外,看见里面水灵灵的葡萄垂涎欲滴。可是外面有栅栏挡着,无法进去。于是它一狠心绝食三日,减肥 之后,终于钻进葡萄园内饱餐一顿。当它心满意足地想离开葡萄园时,发觉自己吃得太饱,怎么也钻不出栅栏了。相信任何人都不愿做这样的狐狸。退路同样重要。 饱带干粮,晴带雨伞,点滴积累,水到渠成。有的东西今天似乎一文不值,但有朝一日也许就会身价百倍。 5. 不要像玻璃那样脆弱。有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。没有苦中苦,哪来甜中甜?不要像玻璃那样脆弱,而应像水晶一样透明,太阳一样辉煌,腊梅一样坚强。既然睁开眼睛享受风的清凉,就不要埋怨风中细小的沙粒。 6. 管住自己的嘴巴。不要谈论自己,更不要议论......

阅读全文(1742) | 评论:0

IT精英完美的七种生活方式(2007-04-12 13:02:00)

摘要:新年之后,IT精英们又要开始为工作而忙碌了。每天工作10多个小时、一周工作六七天、饮食不规律、睡眠质量不高,IT精英的工作和生活状态严重破坏了他们的健康状况。      针对IT从业人员经常要面对的电脑辐射、熬夜加班、腰酸背痛、睡眠缺乏、饮食结构不合理等现状,武警总医院体检中心主任王春秋教给他们七招“自救”方法。      1.按生物钟作息。一个人的生物钟,是其体内各个器官所固有的生理节律。人们应当按照自身的生理节律来安排作息。如果反其道而行之,晚上熬夜,三餐不定时,自然整天昏昏沉沉,疲惫不堪。       2.强化三餐营养。一日三餐食物要品种多样,各品种之间的比例要均衡,不可偏废某些品种。蔬菜、禽肉、豆类、鱼类、水果、酸奶等不可或缺。      3.学会主动休息。身处IT界若不想“挨踢”,就得勤奋工作。但持续的高强度工作会加重疲劳,要消除疲劳也需要更长的时间。如果等到累了再休息,效果往往不明显,因此要学会主动休息。      4.定期检查。无论年轻年老,不论工作性质如何,人们最好每年体检一次。体检项目不可缺少有关心脏的项目,以及对高血压、高血脂、高血糖的筛查,以便发现隐情及时治疗。      5.善于劳逸结合。人人都要学会调节生活,短期旅游、定期锻炼、听音乐、聚会聊天,都是解除疲劳、放松心情的有效方法。      6.坚持合理运动。IT人士的工作状态多处于静态,这极易使人疲惫。应坚持每天散步半个小时,或每周进行3-4次温和的户外活动,每次30分钟。      7.保持心情舒畅。失望、焦虑、恐惧、沮丧等不良情绪可使人心力交瘁。有了烦恼应及时排解,努力保持乐观向上的生活态度,有助于提高工作效率。......

阅读全文(1775) | 评论:0

在c/c++中利用数组名和指针进行排序的例子(2007-04-02 07:30:00)

摘要:以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址! /*程序作者:管宁 站点:www.cndev-lab.com 所有稿件均有版权,如要转载,请务必著名出处和作者*/ #include <stdio.h> void main(void) { void reversal(); static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */ int i; for (i=0;i<10;i++) { printf("%d ",a); } printf("\n"); reversal(a,10); /* 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x */ for (i=0;i<10;i++) { printf("%d ",a); } printf("\n"); } void reversal(x,n) int x[],n; /* 定义形式参数 */ { int m=(n-1)/2; /* 计算10个数需要循环几次,因为是两两调换第一个数组是x[0]故应该是int(9/2) */ int temp,i,j; /* 建立零时变量temp用于每次交换处理时零时存储x的值 */ for (i=0;i<=m;i++) { j=n-1-i; /* 反向计算出被调换的数组下标,例如x[0] 对应的x[n-1-i]就是x[9] */ temp=x; x=x[j]; x[j]=temp; } } /* 次题需要注意的是:这里由于a[10]和x[10]是共同享内存地址位的所以进行交换后a[10]的实际值也就发生了改变 */ /*程序作者:管宁 站点:www.cndev-lab.com 所有稿件均有版权,如要转载,请务必著名出处和作者*/ #include <stdio.h> void main(void) { void reversal(); static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一个数组并初始化 */ int i; for (i=0;i<10;i++) { printf("%d ",a); } printf("\n"); reversal(a,10); /* 调用自定义涵......

阅读全文(2423) | 评论:0

C/C++中多维数组的指针作为函数参数传递(2007-04-02 07:28:00)

摘要:*程序作者:管宁 站点:www.cndev-lab.com 所有稿件均有版权,如要转载,请务必著名出处和作者*/ #include <stdio.h> main() { void search_score(); /* 定义自定义涵数类型为不返回型 */ void count_avg(); /* 定义自定义涵数类型为不返回型 */ static float a[3][4]={{97,45.5,66,77},{88,92.5,78.5,66},{83,74.5,92,100}}; /* 输入3个学生的各自4门课的成绩 */ search_score(a,0); /* 调换自定义涵数显示其中一个同学的各门课成绩 */ count_avg(*a,12); /* 调换自定义涵数显示3个同学各门课的平均成绩成绩 */ /* 注意上面的*a其实也就莂[0]或者是&a[0][]0将这行改写成count_avg(a[0],12);或者count_avg(&a[0][0],12)也都是对的 */ } void search_score(p,n) float (*p)[4]; /* 定义一个指针变量p,说明它是一个指向一个包含4个整型变量一维数组的指针 */ int n; /* 定义形式参数n为整形 */ { int i; /* 定义用于循环的变量i */ for (i=0;i<4;i++ ) /* 这里循环4次用于打印一个同学的4门课成绩 */ { printf("%7.2f",*(*(p+n)+i)); } printf("\n"); } void count_avg(p,n) float *p; int n; { float *p_end; float sum = 0; float avg; p_end = p+n-1; /* 计算出最后一个数组元素的地址 */ for (;p<=p_end;p++) /* 循环到最后一个元素地址就停止 */ { sum += *p; } avg = sum/n; printf("avg=%7.2f\n",avg); } /* 注意此题的意思在于输入3个同4门课的成绩,计算出平均值和显示其中一个同学的4门课成绩,此例是对多维数组指针和多维数组 的指针作为涵数参数传递的总结,认真联系和体会可以很好的了解多维数组......

阅读全文(2606) | 评论:0

少走弯路:学习编译原理的相关建议(2007-04-02 07:19:00)

摘要:编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的。 从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及. 编译原理究竟难在哪里?笔者的体会,主要在这几点: 1.错误认识: 很多人以为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高.而且可能觉得写编译器就必须完全手工来写. 2.自动机理论: 象NFA,DFA之类,比较抽象,要费些脑子,特别如果学离散数学时没有学自动机理论的话,更是需要多花点时间. 3.集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力. 4.LR文法: 主要是又引入了自动机 不管哪本编译教材,即使是绝对经典”龙书”也不例外,都要涉及到这几个难点.由于这些内容本身不好懂,作者有再大的本事,也很难把书写得象小说那么流畅好懂. 明确了难点,接着想对策.大致有这么几种: 1.端正认识: 编译原理在静态文本处理上有广泛的应用,举个简单的例子,把HTML文件转化为纯文本,利用编译原理来实现”非常”简单.理解了编译原理的实用性,大概可以提高学习兴趣. 2.反复看书: 这个办法看起来最笨,却是基本的方法.忘了是哪位名人说过,书只要多看,总能看得懂的. 3.结合源码来看: 这是经典教材Compiler Design in C的作者Allen Hollub建议的方法.这本教材的特色就是包含了大段yacc,lex的代码.这也是个好方法,而且,只有看懂了代码,才能说在根本上理解了理论.当然,要完全看懂yacc的代码,工作量是很大的,而且同样要先理解理论. 4.删繁就简,避重就轻.网上流传较广的一篇《编译原理学习导论》(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了递归下降和LL文法及相应的源码,而对LR文法,只说”理解理论就可以了”.虽然这种方法回避了对于难点的学习......

阅读全文(1483) | 评论:0

几种必学的编程语言(2007-04-02 07:18:00)

摘要:我自己在学习编程的过途中有的几个疑问,1)什么编程语言我需要学。2)学多少种才算可以。最后通过我自己学习感受和对其他编程高手(主要是新闻组)的请教,我认为找到了满意我的答案。抛砖引玉,做个参考吧。   对于初学者,我建议从 python 开始学。因为它在语言设计上很整洁,帮助文件也很全面。而且也是object-oriented(O-O),尽管我把它作为一个初学者开始的语言,并不代表它的用处和功能不强大。实际上它是个功能强大,可以用来做大的编程工程的语言。   我知道国内对python可能还不了解,因为它相对来说也比较新(1990),到现在有12年的历史了,但是它在国外已经被广泛接受和认同,快速发展。不过我知道邮电出版社最近刚出了一本介绍python编程的书,大家可以查询。python 的主www.python.org   Java 也是个很好的语言来开始学编程。不过它比 python 复杂。国外的大学现在都采用java作为电脑专业的凯时语言。总之我觉得除了 python 之外,它也可以作为一个极好的初学者语言。   不过,会了这两种语言,并不代表你就是一个编程员了。学会编程的关键就是 -- “ 编程思想“ 。 学会怎样用一种很“广泛的思维“去考虑“编程问题“,也就是这种思维是可以放之于任何一种编程语言都可以解决问题的,而不是局限于单纯的一种语言。这样当你需要学习一种新的语言时,你只要学习他的语法等等就可以了,至于怎样用这种语言解决编程问题不是早就在你的脑子里了吗。所以,这也就是为什么很多程序员可以拿到一种语言,一两个星期就可以使用的很熟练了。这,也同样要求你去学几种完全不同的语言。   C 语言是非常有效率的,很多时候你都需要考虑内存的管理等底层的东西。很可惜这些都需要你去花很多的时间去做,问每一个C/C++的程序员,用 C/C++编程是不是一个很头疼的事。好消息是,现在的机器都已经很高级,运算的很快,在很多时候我们是不用考虑用C/C++去做,忽略它所带来的好处,当然除非这个工程真的很需要处理底层的东西(象 内核的编辑,3-D 图形等)。很多时候python, java等都可以实现。另外在现在很多工程所要求的时间都不是足够充裕来用 C/C++去做,所以在商业上时间就是金钱,这个代价谁也付不起。   我这里并没有说 C/C++ 不好,你不应该学。相反我觉得......

阅读全文(1604) | 评论:0

C++中的预处理(下)(2007-04-02 06:27:00)

摘要:其他预编译指令    除了上面我们说的集中常用的编译指令,还有3种不太常见的编译指令:#line、#error、#pragma,我们接下来就简单的谈一下。    #line的语法如下:      #line number filename    例如:#line 30  a.h     其中,文件名a.h可以省略不写。    这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C++源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。    #error语法如下:        #error  info    例如:#ifndef UNIX             #error This software requires the UNIX OS.           #endif    这条指令主要是给出错误信息,上面的这个例子就是,如果没有在UNIX环境下,就会输出This software requires the UNIX OS.然后诱发编译器终止。所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。    至于#pragma,我们在《解析#pragma指令 》一文中有过介绍,我们在这里再补充几句,#pragma是非统一的,他要依靠各个编译器生产者,例如,在SUN C++编译器中:   &n......

阅读全文(1546) | 评论:0

如何系统地学习Linux(转)(2007-03-24 22:33:00)

摘要:linux太难用了!(一通鼠标点击,进入/etc)学习linux,你忘记windows的思维方式了吗?怎么安装软件阿?那一堆文件是干什么的阿?学习linux,你还在浮躁吗?进入linux,随便按了几下.赶紧重启进入win学习linux,你用心了吗?.......你我共勉之linux太难用了!(一通鼠标点击,进入/etc)学习linux,你忘记windows的思维方式了吗?怎么安装软件阿?那一堆文件是干什么的阿?学习linux,你还在浮躁吗?进入linux,随便按了几下.赶紧重启进入win学习linux,你用心了吗?.......你我共勉之作者:GuCuiwen email:win2linux@163.com版权声明:本文档可以在网络上在非商业范围内自由转载,转载请注明出处如果转载版面包含商业广告,请向作者支付至少每千字100园的稿费以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费首先,我想引用一下别人说过的一句话:除非在过去的十年你一直生活在山洞里,否则你一定听说过linux.是的,现在听说过linux,会一点linux基本操作的人多如牛毛,然而真正能用linux做一点事情的确少之又少,这就造成了现在的状况:各大 linux论坛十分热闹,但我国linux人材却还十分紧缺.到底是什么原因造成了这样的状况? 纠其原因,只有两个字:浮燥!如果在论坛里来一次调查投票,看一下在论坛里的人到底有多少人手头有一本以上的正规linux教材.我想这个数字不会超过30%. 如果再问一下,有多少人完整的读过各发行版自带的入门文档,系统定制文档,系统管理文档和系统安全文档,恐怕这个数字不到10%. 如果进一步再调查一下究竟有多少人静下心来学习过操作系统和计算机网络等和linux学习十分密切的专业课程,那么恐怕只有3%的数字都不到了.这让我想到了98年前后IT泡沫时代的中关村.在中关村的大街小巷,到处是一个个意气分发牛哄哄的IT精英.他们戴着默镜,剔着小平头,张口闭口都是网络, 安全,信息,黑客,代码,产业.T恤背后写着三个字:别惹我! 然而最后IT泡沫一过,只有那些真正肯安安心心静心学习的人在IT界存活了下来.现在国人学习linux的状况也是这样,学linux的人个个都意气分发,以为学习linux会用linux是多么了不起.学了一点皮毛就认为很牛了.但是那些企业用......

阅读全文(1618) | 评论:0

代码演示如何生成动态二维数组(2007-01-13 16:57:00)

摘要:程序代码 #include <stdio.h>#include <string.h>#include <stdlib.h>int main(){    int **p;    p=(int **)malloc(sizeof(int *)*3); //双指针存指针    *(p+0)=(int *)malloc(sizeof(int)*10);//单指针存数据    *(p+1)=(int *)malloc(sizeof(int)*10);    *(p+2)=(int *)malloc(sizeof(int)*10);    //可以直接当双下标数组使用了    for(int i=0;i<3;i++){        for(int j=0;j<10;j++)            p[i][j]=i+j;    }        printf("%d\n",p[2][9]);//测试为11    //清除数据,C++不自动回收malloc的内存    for(int s=0;s<3;s++){        delete [] *(p+s);    } &......

阅读全文(3017) | 评论:0