📄 subject_63285.htm
字号:
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:由零开始 回复日期:2003-12-10 20:11:21
<br>内容:<BLOCKQUOTE>引用“第6楼”所言<BR><Q>1、把问题的逻辑搞清晰 2、在文档上划流程或在大脑中形成流程 3、查对流程有没有错 4、动手</Q></BLOCKQUOTE><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:LOVEYUAN 回复日期:2003-12-12 13:00:48
<br>内容:先好好学学《数据结构》,然后你再去编程就没那么痛苦了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:红苹果 回复日期:2003-12-13 14:51:38
<br>内容:刚开始都有这个过程,随着自己编写的代码量的增加,经验慢慢丰富就好了。<BR>可以多看看一些优秀的源代码,特别是大师级的作品很有好处。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-12-13 23:52:32
<br>内容:我觉得算法是算法! 数据结构不过是存放数据的容器!是我们存取数据的方式和顺序。而算法是一种逻辑控制。当然有些特定算法是依托于特定的数据结构的。数据结构模块化了一些逻辑控制!不过,我感觉<BR> 程序整体逻辑控制>算法>数据结构里的逻辑控制 <BR> 所以,数据结构要学,算法要学,逻辑控制也要学(这不应该算是一门学科,我所说的就是这种能力,我好象有点欠缺)!<BR> 个人观点,请高手指教!<BR><BR> 飞刀不怕! 统统来吧!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2004-02-01 13:37:42
<br>内容: 推荐大家看一篇东西! 这篇东西简直和我的感受一模一样!强烈希望大家别跟我和作者一样走入歧途!<BR><BR>引自下面的联接:<BR>http://www.pconline.com.cn/pcedu/empolder/gj/vc/10312/249510.html<BR> 这几年各种新的技术井喷一样的涌现出来。身处这样一个时代的我们,难免就有一种拔剑四顾,心下茫然的感觉。在某一方面的做到精专已属不易,全才似不可能,那么究竟又该何去何从?这篇文章目的是探讨编程过程中一些本质的东西,已期对大家的学习有所帮助。<BR> 个人以为,从编程这一职业诞生开始一直至今,其本质就没有改变过。对概念的抽象对逻辑的描述始终都是编程过程中最核心的东西。<BR> 程序为解决某一问题而存在。而问题可拆分成某些概念和逻辑关系。而结构化程序设计和面向对象程序设计不过是对概念和逻辑进行表达的不同方式。而程序中逻辑关系的复杂程度随程序的规模而增加。<BR> 程序的本质不是各种技巧。就算你把EffectiveC++,MoreEffectiveC++中的每一条款都应用到了你的C++程序中,如果没有对逻辑关系的良好组织,你的程序也可能糟不可言。可能高耦合低内聚,可能不可扩充―――。<BR> 上面这段文字提到了四个概念,他们分别是:问题、概念、逻辑和技巧。<BR> 我来举个例子来说明这四个概念都代表些什么。<BR> 现在假设我们需要根据已知的一个文件名产生一个临时文件名。如果输入为 prog.dat,mydir,hello.,oops.tmp,end.dat那么相应的输出为<BR> prog.dat=>prog.tmp<BR> mydir=>mydir.tmp<BR> hello.=>hello.tmp<BR> oops.tmp=>oops.xxx<BR> end.dat=>end.tmp<BR> (这里使用了TheC++StandardLibrary中第11章的例子)<BR> 什么都不做的程序是不存在的,程序总要解决客观世界中的某些问题。这里的问题就是要为一个已知的文件名产生相应的临时文件名。<BR> 解决这个问题时涉及的概念主要有两个:字符串和扩展名。扩展名可以用字符串进行表示。<BR> 解决这个问题的逻辑之一可用下面的伪代码来表述:<BR> if(输入文件名没有扩展名)<BR> {<BR> 用输入文件名、'.'号和"tmp"生成临时文件名;<BR> }<BR> else<BR> {<BR> 得到输入文件名的扩展名;<BR> if(扩展名为空)<BR> {<BR> 用输入文件名和"tmp"生成临时文件名;<BR> }<BR> elseif(扩展名为"tmp")<BR> {<BR> 把"tmp"替换为"xxx";<BR> }<BR> else<BR> {<BR> 把文件名'.'以后的部分替换为"tmp";<BR> }<BR> }<BR>当然你还可以有其他的实现逻辑,而这种逻辑总是可以独立于语言、操作系统的。至于你是用C++标准库、还是MFC的Cstring类或者.net中的相应类或者不依靠类库自己用某种语言来表述这种逻辑那就是技巧。<BR> 上面虽然是个小例子,但我认为完成任何程序:从上层应用直到底层驱动,都会涉及到这四个概念,。<BR> <BR> 上面所说编程时必须的四个要素中,我个人认为逻辑和概念是编程中更本质的东西,直接的原因是他们在更大的程度上决定着程序的质量。不要忘了评价软件质量的几个指标:<BR> <BR> 健壮性、可重用性、易扩充性、容错性等。 <BR> 而这些指标并不是你选择了某个语言或者某个框架他们就达到了。而要通过对解决的问题的逻辑进行提炼和精化才可能达到。不要说这是系统分析的责任,程序每一部分都有自己要解决的问题,怎么可能每一部分程序质量的保证都是系统分析的责任。此外当你要把原来用软件实现的功能换做用硬件来实现的时候,这点就分外的明显--软件其实就是一组逻辑关系。但眼下主流意识形态似乎并不认同这点,各种招聘广告可为明证。<BR> 下面是一个招聘软件工程师的广告:<BR> 1.BSdegreeoraboveincomputerscience.<BR> 2.Atleast2yearsofdriverdevelopmentexperience.<BR>3.ExperienceinC,C++,windowsSDK/DDKorLinuxsystemdevelopment.<BR> 4.Familiarwithcomputernetworkingortelecommunication802.3,802.11,TCP/Ipprotocolisaplus<BR> 5.Familiarwithembeddedsystemdesign.<BR> 6.FamiliarwithBluetoothisaplus.<BR> 如果把编程与磨刀砍柴做类比的化,那么<BR> 当某个人熟悉某种语言、某个框架、某个IDE、某个协议某个开发包的时候我们可以认为这个人拥有一把较锋利的柴刀。但这和这个人最终擅不擅长砍柴并没有必然的关系。夫欲善其事,必先利其器。但利其器了未必就会善其事。所以说上面的广告一定程度上相当于想找一个会砍柴的人,但看人的时候却更注重他有没有一把锋利的刀子。(更可悲的是挣扎在生存边缘的我们,纵然不愿却也不得不迎合这种要求)<BR> 未避免矫枉过正,这里要强调一点,不是说基本技能不重要,没有对语言、框架、IDE的一定认识,根本就产生不了有用的程序。但当我们执迷于对不同语言、框架、IDE的优缺点进行比较的时候,不要忘了他们并不对程序的健壮性、可重用性、易扩充性、容错性等最终衡量程序优劣的诸多方面起决定作用。起决定作用的是你对概念的定义方式和对各种复杂逻辑关系的描述方式。<BR> 语言是什么?语言是逻辑的载体和描述的工具。当你试图表述逻辑关系的时候大多语言应该是满足这一要求的,要不然他早被淘汰了。框架是什么?框架是对逻辑和概念的一种封装。框架把某一领域通用的概念和逻辑封装起来,进而使程序员不必做一些重复性的工作。而实际上对这个领域的这些通用概念并不只有这么一种表述方式,也就是说并不只有一种逻辑表述。你选择某个框架的同时也就意味这你从n种方式中选择了一种,舍弃了其他。没有那个框架是完美的,选择的同时自然也就继承了这种不完美。所以善用他们,他们很重要,但不会再重要了。<BR> 当我意识到这点时,我发现虽然编程许久,但在对逻辑表述方面的能力却没有寸进,因为把90%以上的时间都投在了技巧的提升上了。JeffreyRichter和MattPietrek两位堪称Windows编程界中的技巧大师。可我现在敢说即使你把《Windows核心编程》、《ProgrammingServer-SideApplicationforMicorsoftWindows2000》还有MSDN杂志的UndertheHood专栏倒背如流,你可能还是写不出高质量的程序。这些东西是必须的,但远不是全部。<BR> 林锐写过一本《高质量C++/C编程指南》,此书在网上流传甚广,我想原因有二:一是此书对C/C++语言中的容易造成模糊的地方进行了详细说明(真的很有用);二是林锐笔法不错。但也正因其流传甚广,我觉得在这里必须指出,此书严重的文不对题。按照书中所说那些就能设计出高质量的C/C++程序么?那些都是编程所需要的技巧,不过是告诉你怎么能磨出一把锋利的刀而已。如果读过此书的人都把这些技巧和高质量的程序相等价,那么学习时恐怕就难免会误入歧途了。<BR> 这个题目太大,我是姑妄言之。这里不过是刚刚开始一种探讨而远非结论。欢迎大家一起讨论,还望诸君有以教我!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2004-02-03 11:50:41
<br>内容:“编程的本质是问题模型到编程语言的映射! ”<BR>“语言是逻辑的载体和描述工具”<BR>“使用不同的语言解决相同的问题,他们的逻辑是不同的”<BR>“编程的本质应该是以编程语言的思想来描述、解决现实问题”<BR><BR> 上面这些话是我在一些文章看到的,觉得很有道理。可见逻辑对于程序设计的重要性。在问题的逻辑描述上,脑子思索起来经常感到很累。我以前把大量时间都浪费在那些所谓的技术上了,可真正编写一些函数时候,把问题以语言形式逻辑的描述出来的时候,感觉很累。<BR><BR> 比如说,让你编写一个函数,我随便举个例子,比如说二叉树用C语言来建立的话可以有三种方法表示。1 数组表示法 2 结构数组表示法 3 链表表示法。 现在要求你编写一个函数要求用二叉树结构数组表示法来创建一个二叉树。<BR> 编写这个函数,我们得考虑第一个问题,函数中的变量一般都是临时性的,我们肯定都不想多申请这些空间,而是重复利用以有的变量。第二个问题,描述时问题肯定会有大量的循环,条件判断, 当这些东西堆积在一起的时候,问题描述的逻辑性就难把握了。<BR> 有什么好方法能让人不再累脑?<BR> 似乎用流程图来描述问题,能好点?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2004-02-03 18:13:43
<br>内容:用来写算法的方式一般有四种:<BR>1 条列式<BR>2 流程图<BR>3 伪玛<BR>4 直接以程序语法描述<BR> 书上说,以图形符号来描述问题,仅适用于小问题。<BR>但我看,上面几种方法中,只有流程图可以清楚的看到数据的流向和逻辑。 <BR> 但是有些东西用符号不好描述,请问一下,for循环用什么符号描述? 还有多重循环也不太好用符号来描述吧?想到这我就想用 伪码了! <BR> 讨厌的逻辑!!! 我脑袋疼了! 你们接着谈,有好方法别吝啬啊!<BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2004-02-03 20:32:49
<br>内容: 用流程图来表示,条件判断、while、do while 循环这些我都知道,我不太清楚for循环用什么符号来表示?谁知道告诉我一下,有精彩笑话送给您啊!<BR> “书上说用流程图来描述问题,只能解决小问题” 这个问题,你们是怎么看的??<BR> 我权且相信了,又由于我不清楚for的图形符号,所以,给了我一点启发。 我于是干脆用伪码和图象符号结合着来对问题进行逻辑描述。感觉还不错。<BR> 对于编写一些函数,比如十四楼那个问题,我们可以先用伪码的形式把整个函数的逻辑描述出来。这是大的框架,其中,有个for循环要把数组中的数正确的插入到二叉树的数组中。这个插入规则需要几个判断,这时候我们就采用流程图给画出来。<BR> 最后再以代码形式给写出来! <BR> 我们脑子中的逻辑不能总在脑子里,必须得分开解决。不然整个逻辑在你的脑子里时间长了,就会加重你的负担。<BR> 我目前只有这个办法,欢迎大家提意见! <BR> 另外,我十四楼的那个函数你们谁有兴趣做一下? 过两天,我把答案贴出来!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -