博文

[置顶] 数据结构(C)(2006-01-09 14:56:00)

摘要:  第一章 概论 1.数据是信息的载体,是能够输入到计算机中,并被计算机识别,存储和处理的符号的集合. 2.数据元素是数据中具有独立意义的个体.一个数据元素可以由若干各数据项(称为字段,域)组成. 3.数据类型是具有相同性质的计算机数据的集合及再这个数据集合上的一组操作. 4.数据结构是指组成数据的元素之间的结构关系.它一般包括以下三个方面的内容:
(1)数据元素之间的逻辑关系,也称为数据的逻辑结构.
(2)数据元素及其关系再计算机存储器内的表示,称为数据的存储结构.
(3)数据的运算,即对数据施加的操作. 5.算法分析:
主要是考虑算法的时间性能.
(1)算法的总时间复杂度是由所有语句的执行次数相加来计算的.
(2)通过相同的级别可以求出算法的数量级,比如O(1),O(n),O(n2)等等.
(3)如果算法的时间复杂度并不只是由N来决定的,比如还有条件等等,就要求出算法的最坏时间复杂度.有时候也需要求平均时间复杂度.

第二章 线性表
 
线性表这里主要讨论的就是顺序表,链表和串(其实也就是前两种).
 
这一章的习题超多,做的很痛苦,大约做了3天才做完,现在都弄指针弄的走路都不知道指哪儿了:)
所有的习题都写的全部完整,直接在TC下运行检测成功了,终于完成了.
 
奋发图强,下午继续第三章!
  第三章 栈、队列和数组
 
一、栈
栈是只能在一端进行插入和删除的线性表。
(别看只是个定义,非常重要,已经道出了运算方法:只能在一端插入和删除。)
 
栈的特征:后进先出,先进后出。
 
插入和删除元素的一端称为栈顶。(说明了我们在栈顶操作)
另一端称为栈底。
插入元素和删除元素的操作称为入栈和出栈。
 
1.顺序栈
结构:(top总是指向数组最后的元素,比如data[n],而不是前面)
#define MAXSIZE 100
typedef struct
{
    elementtype data[MAXSIZE];
&nb......

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

计算机网络缩略语解释(2006-04-03 15:19:00)

摘要:缩略语解释
  A AAL  ( ATM Adapter Layer ) ATM适配子层 ADSL ( Asymmetrical Digital Subscriber Loop )  非对称数字用户环路 API ( Application Program Interfacet )  应用程序编程接口 ARCNET ( ) 令牌总线网 ARP ( Address Resolution Protocol ) 地址解析协议  ARQ  ( Automatic Repeat reQuest ) 反溃重传法 ATM ( Asynchronous Transfer Mode ) 异步传输模式
  
B BRI ( Basic Rate Interface ) 基本速率接口 BSC ( Binary Synchronization Communication ) 二进制同步通信规程 B-ISDN ( Broadband ISDN ) 宽带ISDN 
 
C CERNET ( China Education and Research Network )  中国教育科研网 CCITT   国际电报、电话咨询委员会 ChinaDDN   中国公用数字数据网 ChinaPAC   中国公用数据网 CO/DEC ( Coding and Decoding )  编码/解码 CRC ( CYC redundance checkout )  循环校验码 CS  ( Convergence Sublayer ) 传输会聚子层 CSMA/CD ( Carrier Sense Multiple Access with Collision Detection )  载波侦听多重访问/冲突检测 C/S  ( Client/Server ) 客户/服务器  
 
D DCE ( Data Circuit-terminal Equpment ) 数据电路终接设备 DDN ( Digital Data Ne......

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

一个合格的程序员每天该做的事(2006-03-21 00:32:00)

摘要:程序员每天该做的事  (选自Mailbomb 的blog) 1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢 4、考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍 5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态 闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示 6、记住一位同事的名字及其特点 你认识公司的所有同事吗?你了解他们吗? 7、清理自己的代码 今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗? 8、清理自己的桌面 当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净 程序员每月该做的事 1、至少和一个同事一起吃饭或喝茶
不光了解自己工作伙伴的工作,还要了解他们的生活 2、自我考核一次
相对正式地考核自己一下,你对得起这个月的工资吗? 3、对你的同事考核一次
你的同事表现怎么样?哪些人值得学习,哪些人需要帮助? 3、制定下月的计划,确定下月的工作重点 4、总结自己工作质量改进状况
自己的质量提高了多少? 5、有针对性地对一项工作指标做深入地分析并得出改进的方案
可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。 6、与老板沟通一次
最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点 程序员每年该做的事 1、年终总结
每个公司都会做的事情,但你真正认真地总结过自己吗? 2、兑现给自己、给家人的承诺
给老婆、儿子的新年礼物买了没有?给自己的呢? 3、下年度工作规划
好好......

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

各种排序算法小结(2005-12-22 23:44:00)

摘要:转帖: 排序算法小结
排序小结
    排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。
    而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。     对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。
    我将按照算法的复杂度,从简单到难来分析算法。
    第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。
    第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。
    第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。
    第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。
   
    现在,让我们开始吧:
   
一、简单排序算法
由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境
下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么
问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:
#include void BubbleSort(int* pData,int Count)
{
    int iTe......

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

软件高手的几个忌讳(2005-12-22 12:15:00)

摘要:成为软件高手的几个忌讳 正文内容:
1) 不会英语:CS(computer science)源于美国,重量级的文档都是英文的。不会英语,那么你只能忍受拙劣的翻译和大延迟的文档(翻译出来的文档几乎都是很久以前出版的东西)。
2) 急于求成:什么都没学习就开始编程是最大的机会。写C++程序语法都能错,数据结构连线性表都不知道,数据库不知道关系模型,TCP编程不知道socket,还是先坐下来学习几年再说(如果说工作急需,我只能说:早干嘛去了)
3) 过于好问:勤学好问是一种很好的品质,但是如果把勤学丢了,只留下好问,就是一个恶劣的素质了。事无巨细都去请教别人,一则会让人厌烦,二则由于没有系统学习过程,也是不可能学习好的。
4) 只会羡慕别人和说别人不该拿那么多钱,而自己却收入微薄:老实说,绝大多数情况下,收入的高低和你的水平是有正相关关系的。不是否认有关系的存在,但是绝对不会10个人中9个人有关系而独独你没有。少抱怨一些多学习一些,提升自己才是最重要的。
5) 过于不求甚解和过于求甚解。了解为什么是很重要的,但是要学习的东西很多,如果什么都弄明白,那么估计头发白了还没有找到所有答案。当然如果什么都不想细致了解,那么只能去做蓝领了。
6) 过分崇拜他人:我想信很多人都是很厉害的,值得大家崇拜,但是如果过于崇拜,把他们的话当成圣经就没有必要了。你需要突破他们,而不是崇拜他们。
7) 不想吃苦:IT业高收入和高竞争是联系在一起的。没有付出永远别想进步。
8) No gains without pains 第2条:急着动手做,开始是基础不好但一个项目做下来,再重新学习的话,事半功倍。比一直在看书,而不做项目的人学习的快多了。
第3条:如果边上有高手达人的话,多问又有何不可呢,既节省时间又可以学习他人的思想。
其他的都还不错,但这2条我觉得应该提倡
成为软件高手的几个忌讳
我觉得学习方法很重要,而且好好学习,能够吃苦也不一定天天向上
你学一样东西,学一年,不一定比人家学一个月强
成为软件高手的几个忌讳
要成为我们这样的高手,忌讳的还远不止这些呢。
兄弟姐妹们,努力吧。别把你的悟性和联想能力给丢了,千万别眼高手低嗷。 成为软件高手的几个忌讳
感受颇深!以前以为自己的智商......

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

成为编程高手的五个阶段(2005-12-22 11:26:00)

摘要:                         成为编程高手的五个阶段 第一阶段 此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。
第二阶段
此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。
第三阶段
此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。
第四阶级
此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。
这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想变不过来。
第五阶级
此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。
第六阶级
此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。
此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。
每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。
要......

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

编码风格 (2005-12-22 01:18:00)

摘要:  改善编码风格 -------------------------------------------------------------------------------- 应该说,我们中的许多人,编程的历史并不短,但很多时候,我们对自己编写出来的代码却毫无自信,有时候自己见了都怕,尽管这段代码实现了要求的功能。归其原因,往往是代码风格差导致的代码凌乱没有美感,本文的目的就是要讲解一般的良好风格,帮助读者写出“美丽”的代码,事先要说明的是文中所涉及到的语言有C、C++、JAVA及BASIC,我之所以用了三种语言而不是只用一种语言是为了向读者表明风格对语言的通用的。
 
    1)标识符(命名规则)
    标识符应当直观且可以拼读,可望文知意,最好采用英文单词或其组合,便于记忆和阅读,切忌使用汉语拼音来命名。长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪,例如:
    好的命名  int student_age,teacher_age;
    坏的命名  int age1,age2;
    但名字是否越长越好呢?不是的,请看下面的例子:
    struct student
           {
            int student_age;    /* 坏的命名 */
            char *student_name;
           ......

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

怎样成为优秀的软件模型设计者(2005-12-20 00:06:00)

摘要:怎样成为优秀的软件模型设计者?
我们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢? 将下列原则应用到你的软件工程中,你会获得立杆见影的成果。 1. 人远比技术重要 你开发软件是为了供别人使用,没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平,因为他们那时侯将主要精力都集中在技术上。显然,构件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的东西。但是对于用户来说,如果你设计的软件很难使用或者不能满足他们的需求,后台用再好的技术也于事无补。多花点时间到软件需求和设计一个使用户能很容易理解的界面上。 2. 理解你要实现的东西 好的软件设计人员把大多数时间花费在建立系统模型上,偶尔写一些源代码,但那只不过是为了验证设计过程中所遇到的问题。这将使他们的设计方案更加可行。 3. 谦虚是必须的品格 你不可能知道一切,你甚至要很努力才能获得足够用的知识。软件开发是一项复杂而艰巨的工作,因为软件开发所用到的工具和技术是在不断更新的。而且,一个人也不可能了解软件开发的所有过程。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事软件开发的人来说,每天可以学习很多新东西(如果愿意的话)。 4. 需求就是需求 如果你没有任何需求,你就不要动手开发任何软件。成功的软件取决于时间(在用户要求的时间内完成)、预算和是否满足用户的需求。如果你不能确切知道用户需要的是什么,或者软件的需求定义,那么你的工程注定会失败。 5. 需求其实很少改变,改变的是你对需求的理解 Object ToolSmiths公司(www.objecttoolsmiths.com)的Doug Smith常喜欢说:“分析是一门科学,设计是一门艺术”。他的意思是说在众多的“正确”分析模型中只存在一个最“正确”分析模型可以完全满足解决某个具体问题的需要(我理解的意思是需求分析需要一丝不苟、精确的完成,而设计的时候反而可以发挥创造力和想象力 - 译者注)。 如果需求经常改动,很可能是你没有作好需求分析,并不是需求真的改变了。 你可以抱怨用户不能告诉你他们想得到什么,但是不要忘记,收集需求信息是你工作。 你可以说是新来的开发人员......

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

写给想当程序员的朋友(2005-12-19 20:19:00)

摘要:写给想当程序员的朋友
软件以程序员为本(《程序员》) 谨以此文献给所有想当程序员的朋友 (一) 文章由来及个人经历 我是一名计算机专业的本科毕业生,毕业已经1年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友想从事软件编程工作,向我请教如何,因为我自觉涉行不深,不敢信口开河,无奈朋友信任,我不得不郑重考虑一下这个问题了,来帮助朋友选择和回报朋友的信任。 这也就是此文的由来。 还是先谈谈我个人的经历吧。(是不是有点俗套,但我觉得了解我的经历,有助于理解我话的含义;我一向认为不了解古龙的生活经历的,不会真正读懂古龙的作品和古龙笔下的英雄的)我本科就读于南方一所著名的高校(因为自己的不成气,愧谈母校名谓),学的就是计算机专业。上本科时,几乎没有认真的听完一门专业课程,上课看报纸睡大觉,下课看录像看小说看球赛,临考抱佛脚,每次考试和课程设计都是蒙混过关。(于之相对是,我选修的工商管理和经济贸易方面的课到是听得不亦乐乎,考的分数颇高,也许这才是我的真正兴趣所在。) 总而言之,大学是混过来了,对专业的理解和掌握程度,应该没有达到毕业要求的合格水平。(也很后悔,但是有什么用呢,当时不知道珍惜;如果上天再给我一次机会的话,我一定会抓住,多看点美国大片少看点港片;现在,重回校园是我的一大理想)但是大学的学习使我有了一个简单的知识框架(总算学费没白交),我对一个朋友这样形容过我的这个知识框架,“它不是钢筋铸的,是稻草扎的”,哈哈哈,不要笑,真的,我敢说很多本科毕业的朋友的本专业的知识框架也只不过是“稻草扎的”。直到现在,我一直觉得自己的基础知识还是很薄弱,一直想抓点时间,把基础书本好好的温习一下。(此项任务正在计划和实施中) 毕业后,分配到某研究所工作。当领导让我选择自己以后的工作方向时,我毫不犹豫的选择了软件(也不知道到底是对还是错,但我决不后悔)。此研究所主要是以硬件为核心搞通信控制设备的研发生产;软件是辅助,所以也不受什么重视,很多搞软件的人都跳槽走了,留下来的大都是一些已经废掉和行将废掉的“伪/萎”程序员(名副其实的“软件人员”)。在这里感觉不到什么高紧张和高技术程度的研究和开发;软件开发的技术含量极低,以致于大部分人只有半年的学习和开发经验,以后都是这些知识和经验的重复利用。(我问过其他到研究所工作的同学,他们说都一样,呜呼,我们的国防科研开发呀)对......

阅读全文(2770) | 评论:1

如何成为一名优秀的程序员 (2005-12-19 19:57:00)

摘要:如何成为一名优秀的程序员 一位仁兄说的“程序员写的程序不是算法+语法 ,而是要能够满足用户需求的工 具”我非常赞同,要想达到用户需求就必须从各个方面来考虑如业务、人机交互 、效率等方面,而不只是一个语言(语法)的问题,语言(语法)只是工具,只 知语法不知其他那就真是编程机器了! 编程机器在印度高中生经过几个月培训,按照严谨的软工方法,加上较高的管理 ,就可以胜任了!大家相信吗,我是相信的!谈到这里我就不禁说到了国内教育 界最近在探讨的问题“计算机科系的毕业生特别是本科大专生到底出来干啥、如 何适应社会要求”,大家也看到了很多计科系大学生说精通N种语言,熟悉N种工 具,不知道学校里的其他知识到那里去了,甘愿做编程机器,浪费了人民的纳税 ,干高中生能干的事,比较可惜吧!在国内现在就是这样了,看过一则帖子:清华的计科系毕业声在建筑院里搞开发还不如建筑专业的毕业生。说着说着就岔道 了,国内的软件开发业到底是需要那些人:如果仅仅是编码机器,那我估计中国 硅谷还是做梦去吧!
社会似乎也需要编码机器,翻翻招聘广告,做应用开发的都要求精通某某语言, 熟悉某某工具,很少需要懂管理懂软工的人。以我个人一点偏激的想法,民族软 件产业要腾飞,更需要的是能管理使用编码机器的人,即管理人员、国内软件产 业编码机器已经很多了。希望不要惹怒了那些编程高手! system develop与Application develop在国内到底哪个能养活你,能赚钱,诸位 仁兄想必也知道,况且俺也没发现几家水平高的公司招这方面的人,毕竟OS,DB MS,COMPILER都被国外做了、另外也别跟我谈LINUX,毕竟还是少数烧钱的人做的 事情,我先喂饱肚皮再说。我手下的很多搞4GL语言的程序员都想转行学VC等所谓 的更低级的语言,我总是说“在XX城市,先用4GL工具生存,以后再学习VC吧!” ,说的简单一点先解决肚子问题。如何判断自己是否是编程机器?
1、面对需求不考虑用户,只是考虑用那些程序技术展示自己的语言语法技巧 .
2、学习了N种语言 .
3、从来不学习或实践软工 .
4、语法语言水平在众人中遥遥领先、特别是一些稀奇古怪的语法 凭着兴趣和创造力去干,却重复繁琐的劳动。 做着没有意义-唯一意义是赚钱,而且真是出了半斤力, 拿不足八两。 终日劳累,却不能学自己想学的。最终结果......

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