博文
《系统化思维导论》摘录(2007-01-16 21:43:00)
摘要:
《系统化思维导论》摘录内容精简编辑: Huiwen Ru 先把要学的看成一个黑箱,它的内部结构是什么先不去管,而是搞清楚它的输入输出是什么?具体说就是学习这门课程需要哪方面的技巧和预备知识,以及这门课的目的是什么?学了它能解决什么样的问题?把这些问题基本搞清楚了以后再尝试打开这个黑箱。打开黑箱的方法也不是一步完成的,而是一种灰色的认识反复迭代的过程,让黑箱一点一点的由黑变灰由灰变白。也就是第一次不求搞懂里面所有的内容而是有一个大致了解,接下来再展开下一步迭代,这时候可以根据第一步所掌握的信息有选择的较详细的了解黑箱的内容,这样反复循环直到你能大致掌握这门学科为止。 什么叫大致掌握这门学科?如果我们把一门学科比喻成一棵树,那么只要你能明确的指出这棵树的主干脉络是什么就叫大致掌握了。而至于这棵树的树叶你可能一点也不知道,那也没关系。传统的学习方法之所以无聊并且没效率是因为老师们一下子就让你从掌握这棵树的枝叶开始而不注重主干的把握。 在这个过程中可能会遇到各种各样的困难。首先一个困难可能是由于这门课程需要一些预备基础知识,而你并没有掌握它们你可以先跳过它,不去理会,把预备知识看成黑箱,直接掌握现在的学科。也有可能预备知识一点没有的话整个过程就进行不下去了,这个时候再去用同样的方法掌握预备知识还有一个困难可能是在你学习的过程中有一个环节想不明白,这时候你可以选择先跳过,如果发现跳过这个环节无论如何不能理解后面的东西了,那你不得不花费经历去搞懂它了。这个时候需要的是毅力和想象力,没有毅力,你遇到困难后就不会再去思考,没有想象力,你就很难在自己的大胆猜想和横向对比中解决这个问题另外一个可能遇到的困难是可能前面学过的东西记不住因为你学习的过程不是一次,而是反复好几次,所以一遍记不住的东西还有后面几遍,慢慢的就会记住了。 再一个要强调的是思考与学习应该相结合不能总是捧着书本看,要在积累到一定程度以后放下书本思考思考,想想都已经学到了什么东西?所学的东西与其他东西是什么关系?运用了灰色系统的方法,能让你一下子就从宏观入手掌握全局,同时可以根据需要动态的掌握具体的细节知识。 第一步把微积分看成一个黑箱,不管它讲什么呢,先看看它需要一些什么预备知识,以及用它能解决什么样的问题。如果没有好老师指导,要获得这样的信息唯一的方法是先大致翻一下教科书。先看目录和前言,......
谈谈我对攻读计算机研究生的看法(2007-01-13 18:00:00)
摘要:My Thoughts on Doing Advanced Computer Science Degree 回复CSDN和KAOYAN诸位网友的几点看法,(为避免吵架,郑重声明,本人不是高手,只是有感而发的一点个人陋见,欢迎指正,事先感谢): 就我自己的理解,谈谈我对读研和软件学院的看法,不妥之处一笑了之即可。 如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择。因为计算机学院才能让你在理论上 更上一层楼。软件学院从教学计划上就没有把你往这方面带。当然能不能更上一层楼最终还是完全取决于你自己。需要特别说明的是,工作经验并不一定等于开发经 验,我见过很多工作2-3年的人,但是没有一点开发经验。 你说:“他们都有很强的开发能力,只是不太喜欢读书,也只是希望混个学历对今后在岗位上晋升有好处”,我可以向你保证,你所说的人绝对不是开发能力很强的人。因为,1)高手不可能不喜欢读书;2)高手不可能想去混一个学历;3)高手不可能认为晋升是因为学历的原因。 还需要说明的是,考计算机的人未必个个都是高手,严格来说,大部分都不会编程序。也就是说,庸庸碌碌之辈仍然占绝大多数。研究生毕业的师兄只拿2500 元左右的比比皆是,所以不要寄希望于拿一张研究生文凭出去赚高薪。但是,对于有实际开发工作经验的人,要想自己在3年之中有一个真正的提高的话,计算机学 院提供了广阔的平台。就我所知,每一个月拿2万以上的也有(上海育碧,图形特效算法设计)。所以,同为研究生毕业,能力的差距是极大的。所以,不要去问 “研究生毕业能拿多少?”,要问“像我这种水平的人,研究生毕业能拿多少钱?”这样人家才能够准确地回答你。 所谓“有实际开发工作经验”是指 你目前已经具备下列能力:1)你已经认为C++和汇编语言都是很简单的语言,并能够自如地运用;2)你能够在30分钟之内想到正确的五子棋AI算法设计思 路和方向;3)你完全理解STL为什么这么重要;4)你能够独立地解决所有的编译与链接问题,哪怕你从来没有遇到的问题,你也不需要询问任何人;5)英文 网站是你的首要信息来源;6)能够读懂英语写成的国际标准,比如NTFS磁盘格式标准。7)你经常站在集合论的角度思考算法问题;8)能够理解一个简单的 驱动程序,能够理解一个简单3D交互程序;9)你能够认识到线性代数和概......
How To Become a good Programmer?(2007-01-13 17:58:00)
摘要:How To Become a good Programmer?首先问你一个问题:你们在学校都学些什么课程?问这个问题的原因是,我认为学校的计算机科学基础课很重要。如果你所在学校的课程设置 合理,那你应该先把主要精力花在这些基础课上。很多学生看到基础理论就茫然,不知道这些图表,符号,甚至硬件的知识对将来的软件开发有什么用。用处大得很 哪。比如,操作系统课里讲到的多线程的东西在系统编程里很有用。又比如,尽管你将来不会去涉及电脑的硬件,计算机架构里的知识对分析算法的性能(快慢等 等)很有用。可以把计算机语言和开发工具比作文字,而把计算机科学的知识比做思想。只有思想,不会行文,不行;但是,行文流畅,思想空洞,也不行。大学的 阶段正是打好基础,丰富思想的年代。成为一名好的程序员,不是简单地通过学几门课程就能做到的。我个人认为成为一名好的程序员的要素有:1。扎实的基础知识;2。很强的解决问题的能力;3。熟练的编程调试能力;4。创新能力;5。团队合作能力;6。持续的自学能力;7。好奇心这些能力和品质(甚至可以说是习惯)都应该从大学阶段就着手培养,并且从身边的小事开始培养。比如,很多中国的大学毕业生都缺乏编程和调试经验。学习C语 言,考试过关就算学会了。课题项目中,只要程序能够编译,运行,并且输入输出满足要求就了事了。但是,写程序的时候是否想过如何把程序写得更加精炼,高 效,高质量?对程序调试中出现的问题是否刨根问底知道原因,还是不求甚解搪塞过去算数?还有,很多中国的大学毕业生对于知识的掌握肤浅,机械,没有好奇 心,不会刨根问底。比如,学会了C++,有没有看过一个object在编译后,在汇编代码中是如何被初始化的?这个object的各个成员在内存中是如何 放的?在一个成员函数被调用的时候编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到。但是,你是否有过好奇心去知道?最后,一些中国学生的大问题就是死记硬背,没有学到某种算法技术的根 本原理,没有应变和创新的能力。比如,有个问题是如何在不用额外内存的情况下把一棵树的同一层节点都连起来。很多学生都能够回答这是一个广度遍历的问题。 但是,课本上说了广度遍历是一定要有额外数据结构辅助的(队列)。所以,不给额外内存怎么行?请看,课本上说的用队列的方法记住了,但是就是不知道为什......
代码演示如何生成动态二维数组(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); } &......
C/C++数组名与指针区别深入探索(2007-01-13 16:00:00)
摘要:引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作! 魔幻数组名 请看程序(本文程序在WIN32平台下编译):1. #include <iostream.h>2. int main(int argc, char* argv[])3. {4. char str[10];5. char *pStr = str;6. cout << sizeof(str) << endl;7. cout << sizeof(pStr) << endl;8. return 0;9. } 1、数组名不是指针 我们先来推翻"数组名就是指针"的说法,用反证法。 证明 数组名不是指针 假设:数组名是指针; 则:pStr和str都是指针; 因为:在WIN32平台下,指针长度为4; 所以:第6行和第7行的输出都应该为4; 实际情况是:第6行输出10,第7行输出4; 所以:假设不成立,数组名不是指针 2、数组名神似指针 上面我们已经证明了数组名的确不是指针,但是我们再看看程序的第5行。该行程序将数组名直接赋值给指针,这显得数组名又的确是个指针! 我们还可以发现数组名显得像指针的例子:1. #include <string.h>2. #include <iostream.h>3. int main(int argc, char* argv[])4. {5. char str1[10] = "I Love U";6. char str2[10]; 7......
我的单词(2006-12-06 19:27:00)
摘要:1.alter v. 改变,改动,变更2.burst vi.,n. 突然发生,爆裂3.dispose vi. 除掉;处置;解决;处理(of)4. blast n. 爆炸;气流 vi. 炸,炸掉5.consume v. 消耗,耗尽6.split v. 劈开;割裂;分裂 a.裂开的7. spit v. 吐(唾液等);唾弃8. spill v. 溢出,溅出,倒出9.slip v. 滑动,滑落;忽略10.slide v. 滑动,滑落 n. 滑动;滑面;幻灯片11.bacteria n. 细菌12.breed n. 种,品种 v. 繁殖,产仔13.budget n. 预算 v. 编预算,作安排14.candidate n. 候选人15.campus n. 校园16.liberal a. 慷慨的;丰富的;自由的17.transform v. 转变,变革;变换18.transmit v. 传播,播送;传递19.transplant v. 移植20.transport vt. 运输,运送 n. 运输,运输工具21.shift v. 转移;转动;转变22.vary v. 变化,改变;使多样化23. vanish vi. 消灭,不见24.swallo......
传说中的100句英语可以帮你背7000单词(2006-12-03 16:39:00)
摘要:
1. Typical of the grassland dwellers of the continent is the American antelope, or pronghorn.
1.美洲羚羊,或称叉角羚,是该大陆典型的草原动物。
2. Of the millions who saw Haley’s comet in 1986, how many people will live long enough to see it return in the twenty-first century.
2. 1986年看见哈雷慧星的千百万人当中,有多少人能够长寿到足以目睹它在二十一世纪的回归呢?
3. Anthropologists have discovered that fear, happiness, sadness, and surprise are universally reflected in facial expressions.
3.人类学家们已经发现,恐惧,快乐,悲伤和惊奇都会行之于色,这在全人类是共通的。
4. Because of its irritating effect on humans, the use of phenol as a general antiseptic has been largely discontinued.
4.由于苯酚对人体带有刺激性作用,它基本上已不再被当作常用的防腐剂了。
5. In group to remain in existence, a profit-making organization must, in the long run, produce something consumers consider useful or desirable.
5.任何盈利组织若要生存,最终都必须生产出消费者可用或需要的产品。
6. The greater the population there is in a locality, the greater the need there is for water, transportation, and disposal of refuse.
6.一个地方的人口越多,其对水,交通和垃圾处理的需求就会越大。
......
如何成为高手(2006-12-02 23:02:00)
摘要:中国人大都喜欢用武侠小说来比较软件开发,但是在实战武功中,只有葵花宝典才是最厉害的,也只有掌握了葵花宝典,才能称为“不败”。 但什么才是软件开发的葵花宝典? 让我们先从一些现象出发。我们的前提是,软件开发是一项智力密集型劳动。对于智力密集型劳动,我们观察到的现象是,个体的表现差异很大,团队的表现差异很大,组织的表现差异很大,国家的表现差异很大。这不象体力占主要的劳动,象百米王跑百米的速度也仅比我快50%。但在棋类运动中,一个高手可以车轮战数位低手,而且毫无例外地将他们一一击败! 这些智力运动员表现出的特点是,计算精确而且速度快。其行为很象东方不败。虽然关于葵花宝典的传说很多,但最准确的描述只有一个字“快”。东方不败已经快到了吓人的地步。就象卡斯帕罗夫已快到了深蓝的地步。 有一则关于物理学家玻尔的轶事,有一次玻尔在普林斯顿大学听两个年青教授演讲他们的工作成果。期间玻尔突然发言说,如果照你们的研究算下去,会得到一个很有意思的推论。结果两个年青教授回去计算了两天,果然得出了同样的结论。玻尔是如何做到这样快的? 在软件开发中,我们同样注意到这样一种高手,他们可以每天写出一千行左右的高品质代码。他们可以运用已有的一些软件包,迅速完成一个新的产品。他们可以在很短的时间内,学会一项新的程序语言或是新技术。他们表现出一种神奇的速度。 在武侠小说中,所有的高手都有一些凡人不能企及的表现。象张无忌学太极,用龙爪手击败龙爪手名家;乔峰用太祖长拳击败天下英雄;姑苏慕容以其人之道还治其人之身,令狐冲一剑剌瞎十几双眼睛等等。我认为,之所以他们能做到这样,关键是在于他们快。 快并不意味着不准或品质差。快与品质并不矛盾。 高手的快,其实包含着很高的品质在其中。如果你因为高手的快,就质疑其品质,那就相当于在问:东方不败出手那么快,会不会刺不准?东方不败并不满足于刺死对手,他会在对手身上刺朵花。他把杀人变成了艺术。准确来说,他真正的兴趣不在杀人,而在于艺术。 退一步说,就算东方不败第一击有点偏差,他稍作修正后,马上跟上的第二第三击,也会击中他想击中的地方。在武功差的对手剑还没拨出来的时候,他已杀死对方并刺上了一朵花。 所以真正的软件高手,他并不满足于他的代码能有效......
我的C练习题(2006-11-26 14:02:00)
摘要:
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不 D F G 同字母。编程求出这些数字并且打出这个数字的 + D F G 算术计算竖式。 ─────── X Y Z D E 2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些 人参加了竞赛: (1)A参加时,B也参加; (2)B和C只有一个人参加; (3)C和D或者都参加,或者都不参加; (4)D和E中至少有一个人参加; (5)如果E参加,那么A和D也都参加。 3. 打印一个 N*N 的方阵,N为每边 &nbs......
计算圆周率 Pi (π)值, 精确到小数点后 10000 位(2006-11-24 22:59:00)
摘要:Victor Chen, (C++ 爱好者)
大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题。现在有了电脑, 这个问题就简单了。电脑可以利用级数计算出很多高精度的值, 有关级数的问题请参考《高等数学》,以下是比较有名的有关π的级数:
其中有些计算起来很复杂, 我们可以选用第三个, 比较简单, 并且收敛的非常快。因为计算π值, 而这个公式是计算π/2的, 我们把它变形:π = 2 + 2/3 + 2/3*2/5 + 2/3*2/5*3/7 + ...
对于级数, 我们先做个简单测试, 暂时不要求精度:用 C++ Builder 新建一个工程, 在 Form 上放一个 Memo1 和 一个 Button1, 在 Button1 的 OnClick 事件写:
void __fastcall TForm1::Button1Click(TObject *Sender){ double x=2, z=2; int a=1, b=3; while(z>1e-15) { z = z*a/b; x += z; a++; b+=2; } Memo1->Text = AnsiString().sprintf("Pi=%.13f", x);}
按Button1在Memo1显示出执行结果:Pi=3.1415926535898
这个程序太简单了, 而且 double 的精度很低, 只能计算到小数点后 10 几位。把上面的程序改造一下, 让它精确到小数点后面 1000 位再测试一下:在 Form 上再放一个按钮 Button2, 在这个按钮的 OnClick 事件写:
void __fastcall TForm1::Button2Click(TObject *Sender){ const ARRSIZE=1010, DISPCNT=1000; //定义数组大小,显示位数 char x[ARRSIZE], z[ARRSIZE]; /......
