怎么怎样才能写一手好字把程序写的更好?

更好的寻找质数的方法,你能把它写成程序吗 | Python ObjC类比学习小组 | 果壳网 科技有意思
738人加入此小组
其实这是有一次我和 比赛写算法的时候想出来的。我们偶然发现如果只用2,3,5,7检查,和正常的检查方法对比,看到的第一个出错的数是121,正好11的平方,于是我们想方设法证明了它的合理性,写出了更好的算法。我们比赛的内容是用最快的速度找出200000内所有质数。一开始我们用的是依次检查每个数的算法,用时很可悲第二次改进为只用质数检查,用时提升到0.6s第三次使用了上面的算法,只用0.06秒就得到了正确的结果。所以有时间可以和一起学编程的小伙伴一起比一比,多思考,对编程能力和思维的提升都是很大的哦
+ 加入我的果篮
...怎么感觉这是学编程的常识...可以取sqrt(a)的取整为质数的上限...如果你储存质数表的话...
万有青年养成计划入围选手
引用 的话:...怎么感觉这是学编程的常识...可以取sqrt(a)的取整为质数的上限...如果你储存质数表的话...真是自己想出来的-_- 我看的书上没有讲过
好吧...想法挺不错的...
請問在Xcode下如何查看計算所用的時間?找了半天都沒找到。。。。。。
万有青年养成计划入围选手
引用 的话:請問在Xcode下如何查看計算所用的時間?找了半天都沒找到。。。。。。c语言的话,include一个stdlib.h里面有一个函数叫clock它会返回从一个函数被调用开始到调用clock函数所用的时间举例:void func(){for(int i=0;i&10;i++){printf("hello\n");}printf("%d",clock());}它会打印出从func被调用开始,到调用clock所用的时间返回的时间的单位是微秒1秒=1,000,000,000微秒
引用 的话:c语言的话,include一个stdlib.h里面有一个函数叫clock它会返回从一个函数被调用开始到调用clock函数所用的时间举例:void func(){for(int i=0;i...谢谢!还有一个问题,如果输入一个大范围就会出现内存错误,如图。这是为什么?
万有青年养成计划入围选手
引用 的话:谢谢!还有一个问题,如果输入一个大范围就会出现内存错误,如图。这是为什么?内存不够用了。学习指针以后,就能根据需要灵活的分配内存,就可以解决你的问题了
引用 的话:真是自己想出来的-_- 我看的书上没有讲过曾经准备比赛的时候特地学习过数论的知识,这种方法貌似叫埃拉托斯特尼筛法,曾经写过pascal的代码。整体思想首先将数都标记为true,然后从2开始将它的倍数标记为为false,并将2标记为确定的素数,再用其余标记为true的最小的数重复上述过程,选取次数应该为根号n次,n为要检查的范围,比如你说的200000不知道您说的是这种方法吗?还有,要是依次检验每个数其实只要检验到根号n就可以了,这样运行次数也会少很多。ps:lz是准备什么比赛?noi吗?
万有青年养成计划入围选手
引用 的话:曾经准备比赛的时候特地学习过数论的知识,这种方法貌似叫埃拉托斯特尼筛法,曾经写过pascal的代码。整体思想首先将数都标记为true,然后从2开始将它的倍数标记为为false,并将2标记为确定的素数...以前没有听过,是随便乱写了一个,只用2,3,5,7检查整不整除,发现它输出的第一个合数是121,就思考它为什么能对到这一步,然后证出了它的合理性。我没参加竞赛,不过自学过一点数论,主要参加物理竞赛来自
引用 的话:以前没有听过,是随便乱写了一个,只用2,3,5,7检查整不整除,发现它输出的第一个合数是121,就思考它为什么能对到这一步,然后证出了它的合理性。我没参加竞赛,不过自学过一点数论,主要参加物理竞赛哈,楼主好厉害,可以考虑参加一下计算机竞赛嘛,noip联赛也支持c++,如果不是类似江苏浙江之类的强省其实拿一个奖还是很容易滴。
(C)2013果壳网&京ICP备号-2&京公网安备吉安法律咨询
请您选择相应地区
找回我的咨询
问题编号手机号码
一对一咨询
一对一咨询
上一条下一条
我的咨询提醒
您当前位置: &>&&>&&>&
今日律师风向标:
股权转让协议书怎么写能更好保障双方利益?
股权转让协议书怎么写能更好保障双方利益?能帮我起草一模板吗?
 问题来自: 悬赏:0分 咨询时间: 12:45 咨询人:law30882b
法律快车温馨提示:
您还可以输入5000字
温馨提示:使用组合键Ctrl+Enter可快速提交!发布问题、回复咨询,更加方便、及时。
法律快车律师回复共3条回复
找律师代书
回复时间: 16:11
您好,此处仅限于对于律师的回复作评论。
没有模板。找律师根据实际情况来起草吧
回复时间: 16:31
您好,此处仅限于对于律师的回复作评论。
委托律师根据实际情况代为起草。
回复时间: 14:32
您好,此处仅限于对于律师的回复作评论。
相关法律咨询
把您的困惑告诉律师吧您还可以输入50个字
问题分类:
公司法律-股权转让
请在此输入所需问题的内容,问题说明越详细,回答也会越准确!
请在这里输入您要提问的标题!
问题内容应尽可能陈述清楚,详细的描述事情的经过,有利于律师对整个事情的了解,便于更精确的回答您的问题!
法律帮助指南
知识栏目推荐
知识热门文章
法律经验推荐:
吉安热心律师
[江西-吉安]
解答问题数:3202
江西庐陵律师事务所
咨询热线:
法律快车 版权所有 2005- 增值电信业务经营许可证(ICP证)粤B2-
(注:此客服QQ不进行法律咨询!) 流量统计如何编写高质量的程序
学习任何编程语言都会有一个基本的过程,开始的时候学习基本的语法,然后学习各种库,框架,开始做各种项目。在做项目的过程中,随着代码量的增加,我们会渐渐感到失去对程序的掌控能力,bug开始增加,牵一发而动全身,顾此失彼。这充分说明了编写高质量程序的重要性,这里的“高质量”主要指程序的正确性,可读性,可维护性。
什么是高质量的程序
程序正确性的重要程度无需多言,尤其在一些特殊领域,例如芯片制造业,航天业,武器制造业,对程序正确性往往有着极其严格的要求,因为一旦程序出错,代价往往是巨大的。在这些领域,需要使用形式化方法(formal methods)来自动验证程序的正确性,也就是说你需要证明程序的正确性,而不仅仅保证程序在大多数情况下是正确的。在其它领域,对正确性没有这么高要求,形式化方法也不适用,但是我们还是需要使用其它手段,例如测试,code review等等来保证软件的正确性。
可读性可以帮助程序作者理清思路,思路清晰后,程序不容易出错。另外,其它程序员在维护你的代码时,更容易理解你的意思,方便修改bug,方便扩展。
不要浪费自己的时间,更不要浪费别人的时间。
这里的可维护性主要指程序应对变化的能力。程序在完成基本功能后,可能会发生各种改变:用户需求变了,性能达不到要求需要重新实现算法,等等。一旦程序的一个点发生改变,其它点如果也需要同时手动改变,那么程序会变的不可控制,出bug的机会会增加。想像一下,我们的程序是一个盒子,在添加新功能时,如果只需要把新模块插到一个地方,新模块就可以被系统使用,这样的程序可维护性是很高的。但是如果添加新功能时,需要把原来的程序盒子拆开,其它模块也需要相应修改,才能加入新模块,这样的程序可维护性就很差。
提高程序质量的重要措施
Code Review
为代码做复查,是保证程序质量的有效手段,复查时需要检查代码风格,一致性,安全,是否正确实现了需求等方面。
为什么强调先编写测试用例,再实现程序?先编写测试用例的意义在于,让编写程序的人对程序本身有更好的理解。因为你首先得明白什么样的程序是正确的,然后才能写出正确的程序。测试用例其实是对程序正确性的一种描述。
为什么强调自动化测试,而不是手动测试?因为自动化测试可以增加测试的便捷度,而人们通常会更多地使用那些便捷度高的东西。我在做个人项目的时候就发现,在编写了自动测试的脚本后,我每改动一点程序,就会自动运行一下脚本,在此之前,我明知道测试很重要,但是还是不会测试的如此频繁。这样的好处是可以方便定位bug,否则在系统经过了大量改动之后,出了bug都不知道可能在哪里。
在对程序进行重构时,很重要的一点就在于,一定要先写好测试用例,然后每改动一点,就自动测试一下,保证程序始终保持在可控状态。
良好的编程风格
良好的编程风格,可以增强程序的可读性,一个结构清晰的程序,你会更容易从中发现错误。另一方面,当程序发生变化时,很可能引入新的bug,良好的编程风格可以减少这种bug的出现。下面是与编程风格相关的一些措施。
风格指南
找一份你使用的编程语言的风格指南,例如Google的编程语言风格指南系列,Python的PEP8,并一直遵守这份指南的内容,如果有自动化工具帮助你保持这种风格,那再好不过。
寻找你所使用语言的最佳实践,他们可读性强,经过了大量实践的考验,被广泛接受,所以尽可能多地使用他们。
例如Python 的
起一个好名字
变量,函数名,类名,都需要一个好名字。程序本身是对解决方案的一种描述,一个好的名字会增强这种描述性,也会让你的思维集中于解决方案,同时让其它人更容易理解你的解决方案。
不要直接使用常量
在程序中直接使用的常量,一般被称为 Magic Numbers, 一方面它不利于其它程序员对程序的理解,因为没有人知道这个常量代表什么。另一方面,多个常量之间可能是有关系的,直接使用常量根本反应不出这种关系。
同一变量名不要有多种含义
首先这种做法降低了可读性,一个变量前面一个含义,后面一个含义,这会给阅读程序的人带来困扰。
尽可能保证变量作用域小
尽量减少变量定义的点与变量最后一次使用的点之间的跨度,这样可以使变量与其相关代码变得紧凑,提高可读性,不用在使用变量时再去很多的地方查看其它引用。
保证函数短小精悍
过长的函数会让读者陷入细节的泥潭,还需要前后来回看才能明白前面一大段和后面一大段代码的关系。将函数分解,然后给函数起一个好名字,读者马上就能明白这段代码在做什么。
提高应变能力
程序应对变化的能力强,可扩展性就强,也更容易在变化时保证正确性,这样的程序可维护性强。下面是一些提高程序应变能力的措施。
不要使用常量
不要使用常量的另一个原因在于常量可能变化,如果程序中多次引入了这个常量,那么一旦这个常量要发生变化,就需要同时改动许多地方,这时候,如果有些地方没有改,就会使程序不一致,可能引入bug。
同一变量名不要有多种含义
同一变量名不要有多种含义另一个原因在于,多种含义之间可能会相互影响,第一次写程序时你可能记得这些影响,但是以后对程序进行改动的时候,你可能就忘记了。例如函数内一段代码执行后,索引i&的值等于一个长度,但是这段代码后,你没有将i赋值给另一个变量len,而是直接使用它。等过一段时间后,你或者其它人修改这段程序时,很可能忘了这段代码执行后i的值需要等于一个长度,因为这是一种隐式的约定,所以很容易被忽视。
尽可能保证变量作用域小
保证变量作用域小也有利于重构。当一个函数变得很长时,你可能需要将它分解成多个函数,这时候,如果变量跨度小,就可以很方便地提取函数,不用来回查找与此函数相关的变量的引用。
减少代码重复
如果有一段代码在很多地方重复,这就告诉你,需要把他们提取成一个函数。因为代码的重复意味着这是一块独立的逻辑,独立的逻辑可以抽象成一个函数。另一方面,一旦这段逻辑需要发生变化,只需要修改这个函数就可以了,不需要把所有地方都手动修改一遍。
数据驱动的意思是用数据表示来代替程序逻辑。例如,我们需要一个程序,判断某个月有几天,在实现时,最好用一个数组表示各个月的天数,需要哪个月直接查询就好,而不要使用大量的if语句来作逻辑判断。这只是一个小例子,它提醒我们,如果程序中含有大量判断语句,就应该想一想,能不能用数据来驱动逻辑,这样需要修改的时候,我们直接修改数据就好,而不用修改程序逻辑。
我曾经接手过一个项目,这个项目其实是一个工具集,根据用户的选择,调用不同的工具。原始的代码里,就使用了大量if语句,并且每个工具其实调用方式和代码都很相似。这样,我每次添加新工具时,就需要找到多个if语句块,作相应修改。如果用数据驱动的话,我们完全可以去掉这些if语句,在用户的选择与工具之间建立对应关系,这样每当新添加工具时,只需要把工具加到系统里,系统会根据这个表直接找到这个工具。这其实和之前举的盒子的例子很相似,添加新工具时,只需要把工具插到盒子上的槽上,根本不用打开盒子。这就大大提高了程序的可扩展性。
控制复杂度
要保证软件的高质量,很重要的一方面在于控制复杂度。控制复杂度的一个很重要的手段在于分解复杂的事物。我们之所以觉得一个事物复杂,是因为同一时间需要关心的事情太多,把复杂事物分解后,每次我们只需要关心很少的事情,这样就控制住了复杂度。
不要使函数或类过大
如果一个函数或类过大,他们会变得过分复杂,你同一时间需要关心许多细节。将函数或类变小之后,你的思维在一段时间内可以集中在同一个抽象层次,而不必过于深入其细节,这样更容易发现程序中的缺陷,因为你每次只需要关心很少的事情。在最高层,你只需要关心模块之间的关系,关心算法的流程,不必关心模块内部的事情。在最低层,你只需要关心一个模块内部的事情,而不必关心其它事情。
不要使函数参数过多
函数参数过多可能说明这个函数负责了太多的事情,你需要将这个函数分解。另一方面,你需要从逻辑上考虑,这些参数是不是一个整体,如果是一个整体,那么直接传过来一个结构体,或者传过来一个对象,是不是更合适?
不要使抽象层次过多
如果一个函数或类被分解为过多的抽象层次,在模块内部,你确实只需要关心很小的事情,但是这时候,由于模块过多,抽象层次过深,他们之间的关系又使复杂度增长起来。
使用自动化工具
自动化工具迫使我们养成良好的编程习惯,而且不容易出错。再次强调:
工具越是使用方便,你越会频繁使用它。
所以,尽可能地让你的工具使用便捷。 例如:
使用一些静态检测工具在编辑时自动帮助你检测程序的不良风格使用静态检测工具检测程序常见错误使用重构工具帮助你重构使用自动化测试工具在保存时自动运行测试
没有什么事情是一成不变的,所有的法则都需要考虑具体的情况。如果你要用一个法则,需要真正明白自己为什么要用,需要去权衡,而不要为了能用上这个法则而生搬硬套。
好好问问自己:
变化真的存在么?真的需要抽象么?真的需要面向对象么?真的xxx么?
这篇文章是我这段时间阅读过一些书后的想法,书目有
代码大全(Code Complete)重构——改善既有代码的设计(Refactoring Improving the Design of Existing Code)程序设计实践(The Proactice of Programming)
在阅读这些书的同时,我还在维护其它人的代码,做自己的个人项目。在阅读的过程中,我会不断地想到我做的项目哪里有问题,可以用书中提到的方法去修改,因此印象深刻。这些书单纯读也非常有好处,但是如果可以结合到自己的项目中,会有更大裨益。因为只有产生了强烈的共鸣,才能保证真正理解了一个东西。
上面提到的一些措施,都是我遇到过的,所以印象比较深刻,这几本书中还有大量提高程序质量的方法,我这里只是一个引子,希望给有心人打开一扇窗户。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:109138次
积分:2072
积分:2072
排名:第7239名
原创:83篇
译文:11篇
评论:40条
/minixalpha
文章:13篇
阅读:4560
(2)(6)(5)(5)(6)(2)(2)(2)(3)(1)(2)(2)(1)(11)(29)(1)(2)(2)(1)(2)(3)(4)如何更好的搭建Visual C++环境_百度知道
如何更好的搭建Visual C++环境
提问者采纳
先写测试能强迫程序员给出完整清晰的类接口,还能在每次建立系统时自动测试。1.Visual C++环境适用预处理#define定义一个或多个调试标记,在代码中把调试部分使用#ifdef 和#endif 进行管理。当程序最终调试完成后,只需要使用#undef标记,调试代码就会消失。常用的调试标记为DEBUG, 语句序列:2.运行期间调试标记在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。例如下面代码:#include&iostream& #include &string& bool debug = int main(int argc,char*argv[]) { for(int i=0;i&i++) if(string(argv[i])==“--debug=on“) debug = bool go= while(go) { if(debug) { 调试代码 }else {} } } 3.把变量和表达式转换成字符串可是使用字符串运算符来实现转换输出定义#define PR(x) cout&&#x”=”&4.c语言的assert()该宏在中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。#include& assert&int main(){int i=100;assert(i!=100); //Fails}当调试完毕后在#include前加入#define NDEBUG即可消除红产生的代码}C++代码和调试本部分教程主要介绍了良好的Visual C++环境风格、如何书写安全的代码以及在Visual C++环境下的程序调试技术,这些内容对于新员工从学生成长为真正的程序员,逐步参与实际项目的开发工作,以及阅读第三方代码非常重要。1 规范易懂的代码现阶段软件开发,都要依靠团队的合作。程序员不再是个人英雄主义的代名词,程序员一方面要依赖大量其他程序员完成的代码,一方面又提供大量代码给其他人使用,代码实际上具备了两个要素:首先是可靠的提供某种功能,其次是清楚地表达作者的思想。任何交流都必须有一定的规范才能进行,体现在代码中就是规范易懂。另外,规范易懂的代码才是可重复使用的,规范的代码具有更长的寿命,具有更好的可维护性,也更方便后期的扩展。1.1 好代码的几个特征怎么样的代码才算规范易懂,体现在细节上会有无数的争论,实际上无论风格和习惯如何,好的代码具有几个共同的特征:
1. 良好的命名:好的变量名和函数名,让阅读代码的人马上就知道该变量或者函数的作用,很容易就能理解程序的大概结构和功能。程序员有必要理解匈牙利命名法。
2. 一致性:一致性带来更好的程序,一致的代码缩进风格能够显示出代码的结构,采用何种缩进风格并不重要,实际上,特定的代码风格远没有一致的使用它们重要。
3. 注释:注释是帮助程序读者的一种手段,程序作者也是未来的程序读者之一。最好的注释是简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序;但如果注释只是说明代码已经讲明的事情,或者与代码矛盾,或者以精心编排的形式迷惑干扰读者,那就是帮了倒忙。1.2 养成好习惯前面已经提过,特定的代码风格远没有一致的使用他们重要,所以,把过多的精力放到A or B的选择上是浪费时间,你要做的是坚持。如何书写规范易懂的代码,如何养成良好的习惯,下面是一些提示。1. 按照匈牙利命名法给变量和函数命名。
2. 遵循国际流行的代码风格。
3. 写代码的同时就遵循你的命名规范和书写风格,千万不能事后补救。
4. 利用工具(Parasoft C++ Test)检查你的代码,评估一下自己形成良好的习惯没有。
5. 坚持不懈直到养成习惯。2 编写安全可靠的代码在大型应用软件系统中,各个代码片段共同构成完整的系统,Visual C++环境间的交互非常频繁,程序崩溃往往并不在错误发生的时候就发生,而是延迟了一段时间,经过数个函数之间的中转后才发生,此时定位和查找错误非常费时费力,如何才能及时反映程序中的错误。如何在代码中避免一些幼稚的语义错误呢?一个函数往往会被其他程序员拿来使用,但是他怎么能够正确的使用其他人编写的函数呢?这部分内容能够(部分)帮助解决这些问题。2.1 契约编程
契约编程(Design by Contract)的思想在C++圣经级的著作,C++之父Bjarne Stroustrup的《C++程序设计语言》中略微提到过,OO领域的圣经级著作《面向对象软件构造》以大篇幅阐释了契约编程,现在越来越多的软件开发人员认识到契约编程的重要性,并逐步地在实际工作中采用契约编程。对契约编程简单的解释是:对实现的代码块(函数、类)通过规定调用条件(约束)和输出结果,在功能的实现者和调用者之间定义契约。
具体到我们的工作,开发人员应该对完成的每个函数和类,定义契约。契约编程看似平淡无奇,对程序开发没有什么具体的帮助,实际上,契约编程在开发阶段就能够最大程度的保证软件的可靠性和安全性。解读Visual C++ 2005具体实例高手指点VC++ 2005 Express配置问题C++之父:面向对象的进化与实现如何更好的设置Dev C++说明浅析C++编译器的使用与学习在实际工作中,每当你需要使用其他程序员提供的模块,你并不知道如何调用,也不知道你传入的参数是否合法,有时候对于功能模块的处理结果也不敢相信。这些本来应该很明显的信息因为模块提供者没有显式的提供,造成了调用者只能忐忑不安的摸着石头过河,浪费了大量时间,而且为了让自己的代码更安全可靠,在代码中做了大量的判断和假设,造成代码结构的破坏和执行效率的损失,最后,调用者依旧不能确保自己的调用是正确的。而契约编程通过严格规定函数(或类)的行为,在功能提供者和调用者之间明确了相互的权利和义务,避免了上述情况的发生,保证了代码质量和软件质量。Visual C++环境主动调试
主动调试指在写代码的时候,通过加入适量的调试代码,帮助我们在软件错误发生的时候迅速弹出消息框,告知开发人员错误发生地点,并中止程序。这些调试代码只在Debug版中有效,当经过充分测试,发布Release版程序的时候,这些调试代码自动失效。主动调试和契约编程相辅相成,共同保证软件开发的质量。契约编程相当于经济生活中签订的各种合同,而主动调试相当于某方不遵守合同时采取的法律惩罚措施。
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 写程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信