博文
参省(2007-04-07 00:24:00)
摘要:
根据我现在学习的情况从新来参省自己。现在我学习老是喜欢到论坛里去看别人的文章。其实很多的人也有这样的情况。也喜欢问一些很低级的问题。我现在认为论坛里面是一些高手去的地方,自己那些基础的东西还没有学完整。还是少去一些论坛。最主要的是先把自己要学的基础的重要的课程学完了,才到那里去。觉得自己是高手再去那里效果可能好些。因为你这时已经经过了系统的学习了。看别人的问题就能系统的了解问题的根源。否则东学一点西一点。 似乎觉得自己已经也学了很多东西了。但是还是没有系统知道这个学科的知识都是很片面的。这样会自己的基础知识很不扎实。到头来什么似乎都懂却什么都不会。
现在的我要要求自己少去那些地方。多多的学习自己的课程。学扎实才去那里看一些别人的问题。就能发现自己的不足。而不是到那里纯粹的去学习。这样学的知识也不是很正确。因为你也不知道别人说的到底是不是正确。你只是接受知识。要自己真正成了高手了。才能分辨别人的问题及回答是对是错。
其实我觉得自己经常到也些网站论坛。也会使自己变的很浮。我不知道别人是不是这样的。反正我是觉得自己变的很浮了。真正要学自己理论很课......
微软的面试题集变态中有机智(2007-04-05 22:25:00)
摘要:第一组 1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢? 2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻? 3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水? 4.一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问? 5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑) 6.在9个点上画10条直线,要求每条直线上至少有三个点? 7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的? 8.怎么样种植4棵树木,使其中任意两棵树的距离相等? 第二组 1.为什么下水道的盖子是圆的? 2.中国有多少辆汽车? 3.将汽车钥匙插入车门,向哪个方向旋转就可以打开车锁? 4.如果你要去掉中国的34个省(含自治区、直辖市和港澳特区及台湾省)中的任何一个,你会去掉哪一个,为什么? 5.多少个加油站才能满足中国的所有汽车? 6.想象你站在镜子前,请问,为什么镜子中的影象可以颠倒左右,却不能颠倒上下? 7.为什么在任何旅馆里,你打开热水,热水都会瞬间倾泻而出? 8.你怎样将Excel的用法解释给你的奶奶听? 9.你怎样重新改进和设计一个ATM银行自动取款机? 10.如果你不得不重新学习一种新的计算机语言,你打算怎样着手来开始? 11.如果你的生涯规划中打算在5年内受到奖励,那获取该项奖励的动机是什么?观众是谁? 12.如果微软告诉你,我们打算投资五百万美元来启动你的投资计划,你将开始什么样商业计划?为什么? 13.如果你能够将全世界的电脑厂商集合在一个办公室里,然后告诉他们将被强迫做一件事,那件事将是什么? 第三组 1.你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条。如果只允许你两次......
在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); /* 调用自定义涵......
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门课成绩,此例是对多维数组指针和多维数组 的指针作为涵数参数传递的总结,认真联系和体会可以很好的了解多维数组......
少走弯路:学习编译原理的相关建议(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文法,只说”理解理论就可以了”.虽然这种方法回避了对于难点的学习......
几种必学的编程语言(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++ 不好,你不应该学。相反我觉得......
用C++模板描述的链表、栈、队列(声明与实现(2007-04-02 06:46:00)
摘要:主要参考书是《数据结构(用面向对象方法与C++描述)》殷人昆等编著,清华大学出版社。原书看起来很费事,显而易见的把教学目的和提供实例的目的搞混了,结果是个四不象:作为教科书,条理不清晰;提供各个方法的实现,也不是很实用,相反,重复建设太多。但是,这是清华的考研参考书目,一定有许多人和我一样在研读此书。我把我重新定义的类和实现发表出来,就是希望和我一样的人,或者是打算学习数据结构而选择了这本书的人,能更好的理解和学习。当然,如果你想使用这些数据结构,又不想学STL,这些类也能帮你达成目的。
我照着原书的类名和对应的函数名,写下了如下的类的定义,部分代码采用了原书的。把成员函数的实现写在类定义里,完全是为了将就VC++6的ClassView,不然一双击一个成员函数,就蹦出来“我找不到它的实现”,而实际上,一般我们都看的是ClassView显示的类的接口,很少去看类的定义。这是第一部分,马上我会完成树等结构。我只测试了int类型各个成员函数的正确性,并且也没做什么“极端测试”,欢迎测试。另外,欢迎反映这样的定义是否好看些,容易懂些。
#ifndef Node_H#define Node_H
template <class Type> class Node //单链节点类{public: Type data; Node<Type> *link; Node() : data(Type()), link(NULL) {} Node(const Type &item) : data(item), link(NULL) {}};
#endif说明:因为数据结构里用到这个结构的地方太多了,如果用原书那种声明友元的做法,那声明不知道要比这个类的本身长多少。不如开放成员,事实上,这种结构只是C中的struct,除了为了方便初始化一下,不需要任何的方法,原书那是画蛇添足。
一点重要的修改:原书的缺省构造函数是这样的Node() : data(NULL), link(NULL) {} 。我原来也是照着写的,结果当我做扩充时发现这样是不对的。当Type为结构而不是简单类型(int、……),不能简单......
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......
数据结构学习(C++)——线性链式结构总结(代后记)【2】(2007-04-02 06:23:00)
摘要:在开始写这些文章之前,我曾经有个想法,能不能以单链表为基础,完成所有的线性链式结构?实践证明,是可以的,就像你看到的这样。我做这个尝试的起因是,看不惯现在教科书凌乱的结构:罗列了一大堆ADT或者是templat class,好像这些都要你去记似的。殊不知,只有提取共性,突出个性,才能更明显的表现出各种数据结构的差异,显示数据结构的进化发展的过程,看出变化的内在需求。借用《C++沉思录》作者的一句话,“避免重复”。在以后的应用中,你可能需要单独的写出一个class——打个比方,为了实现栈,你没有必要先写一个线性表,然后再继承得到栈;但假如你已经有了一个线性表了,你还需要另起炉灶再重写一个栈吗?对于一本书来说,本来就是假定读者在看后面的章节的时候,已经对前面的章节有所了解;即使象《C++沉思录》这样的从以前发表在杂志上的文章整理出的书,也能看到循序渐进的影子。如果在后面的章节又把前面的东西重复一遍,我只能认为他是在骗稿费。
我把以前的代码总结一下,列表如下(因为我画不好图):
单链表(List<Type>)
多项式节点
表达式节点
修改部分操作
添加向前指针域
限制操作
多项式
表达式
循环链表
双向链表
栈和队列
我们从单链表出发,通过对应的变化,得到了绿色的一行。突然之间我觉得自己很可悲,看了100多页书,最后得到竟然只是这么一个表。不管怎么说,这也是我看了这么多页书的结晶,让我们看看能从这表里得到什么。
首先,单链表是一个容器,他是为了存取数据而存在的。如果里面存的是多项式的节点,那么他就是一个多项式;如果里面存的是表达式节点,那么他就是一个表达式。这让我想起了以前曾经困扰我的语义问题:多项式究竟是一个存了多项式节点的单链表呢,还是包含了一个存了多项式节点的单链表?现在我的想法是,这并不重要,怎么理解都行。
其次,循环链表、双向链表、栈和队列也是容器,只是具体的操作实现或者对外的行为和单链表有所差别。但是内在的存取机制是相同的,或者还有更多的地方相同,我们应当最大限度的利用这些相同之处。
上面的提法好像很无聊——他们当然是容器,还用你小子废话吗——请注意我下面的问题:数组是容器吗?你做过仅针对数组里的元素操作的练习吗?你做过数组应用的练习吗?现在请你把数......
数据结构学习(c++)——二叉树(2007-04-02 06:23:00)
摘要:注:本文只是对学习清华殷人昆《数据结构(用面向对象方法与c++描述)》的人有些微帮助,其他人就没有必要浪费时间看了。因为老实说这本书里的代码实现的确不怎么样。
我的目的,就是努力实现和书里的代码相同的接口,尽最大可能和原代码一摸一样。因为这样的话,一则自己以后看起来比较方便,只要对着课本翻翻就行了;二则这样可能对别的学这本书的人有一定的好处。由于自己的习惯,我在原书的类名前加了_。
/* Name: _BinaryTree.h Copyright: Author: elmar Date: 19-07-03 23:43 Description: */
#ifndef _BinaryTree_H#define _BinaryTree_H
#include <iostream>#include <deque> //用于Insert中的层次遍历 using namespace std;
template <class Type> class _BinaryTree;template <class Type> class _BinTreeNode{ friend class _BinaryTree<Type>; public: _BinTreeNode():data(Type()), leftChild(NULL), rightChild(NULL){} _BinTreeNode(Type item, _BinTreeNode<Type>* left = NULL, &......
