说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

深度解析:清理烂代码

HTML文档下载 WORD文档下载 PDF文档下载
烂代码不一定是问题,只要它们没有出错,没有人会对它嗤之以鼻。但不幸的是,它们没被发现的概率太小了。错误会被发现。需要新的功能,新系统发布了。现在你不得不面对这堆恐怖的代码,试着去清理它们。

猜猜看怎么了!你正”继承“(接收)了一堆混乱的旧代码。恭喜你!现在都是你的了。混乱的代码可能来自任何地方。中间件,网络,可能来自你自己的公司。

你知道在一个角落里有一个家伙,没有人过去管他在做什么。猜猜看他一直在做什么?辛辛苦苦写出了代码,却是一堆烂代码。

你还记得这个模块是一个家伙几年前写的,在他离开公司之前。这个模块已经有20个不同的人加过补丁,进行过代码修复,而且他们也并不理解代码到底是做了什么。是的,就是这样的代码。

或者你从网上下载下的开源的软件,你知道它非常的可怕,但是它解决了一个非常专的并且对你来说非常棘手的问题,解决这个问题你可能要花上几年。

烂代码不一定是问题,只要它们没有出错,没有人会对它嗤之以鼻。但不幸的是,它们没被发现的概率太小了。错误会被发现。需要新的功能,新系统发布了。现在你不得不面对这堆恐怖的代码,试着去清理它们。这篇文章为这种不幸的情况提供了一些建议。

0. 值得清理么?

第一件你需要问问自己的事情就是代码值得清理么。我不是说当问到是否要清理代码时,你一定要回答是或者一定回答不是。是你对代码负有责任,也是你需要一直面对它们直到最终写出的代码是你乐意维护的,也是你很自豪的放入代码库的。

如果你觉得就算代码看起来很可怕,也不值得浪费你本来就很紧张的时间来修复它们。所以你仅仅做了最最微小的调整解救燃眉之急。

换句话说,你也可以将代码看作自己的,也可以看作是别人的。

两种情况都有优缺点。优秀的程序员看到烂代码时会觉得很难受。他们会拿出火把和叉子并且高呼:“太乱了,太乱了”。这是一种优秀的品质。

但是清理代码是一个繁杂的工作。很容易就低估了时间。甚至有时候和从头开始写代码一样的耗时。并且短期并没有带来任何的短期效应。两个星期的时间清理代码并不会带来任何新的功能,但有可能引入一些新的错误。

另一方面,如果长时间不清理代码可能会带来灾难性的毁灭。混乱是代码的杀手。

所以,这并不是一个容易做出的决定。需要考虑一些事情:

● 你期望对这段代码做多少改变?你是希望仅仅修改这个小错误呢,还是这段代码还要使用多次,所以你希望将它“调教”的好些,并且加上新的功能。如果仅仅是修复一个错误,那么最好是别打草惊蛇。然而,如果这个模块你需要长期折腾的话,那么现在开始花点时间来清理它吧,之后会省掉很多烦恼。

● 你需要或者是你想引入上游的更新吗?它是一个正在开发当中的开源项目吗?如果是的话,并且你想做改变的是上游的代码,那么你不能对代码有大的改动否则当你每次pull代码的时候都会经历一场merge的噩梦。所以你需要做一个友好的团队合作者,接受这个错误,将带有你修正的代码补丁发给代码的维护者。

● 要做多少工作?你一天内实际上能清理多少行代码?我们估计多于100行,少于1000行,好,我们假设是1000行。所以如果一个模块有30,000行代码的话,你可能需要一个月的时间。你有那么多时间吗?值得这么做么?

● 它是你核心的功能吗?如果这个模块只是边缘的模块,譬如字体渲染或者图像渲染,你可能并不在意它是否是乱七八糟的。你可能全盘不要,将来用另外的东西来代替,谁知道呢。如果这段代码关乎核心的性能,你需要慎重对待。

● 这段代码有多糟糕?如果代码仅仅有一点点糟糕,那么可能你还是可以忍受的。如果它是不可理喻的,令人崩溃的话,那么我们就必须对它下手了。

1. 建立测试用例

要认真清理一段代码意味着花一段时间来彻底清理它。你可能会毁坏它们。

如果你有一个比较好的测试用例,有一定的覆盖率,你将会很容易知道什么已经损坏了,并且你能够很快的知道你犯了什么愚蠢的错误。想要节省建立测试用例的时间在整个的清理代码的过程中是可笑的。建立测试用例吧。这是你第一件需要做的事情。

单元测试是最好的,但是所有的代码并不适应单元测试。如果单元测试过于繁琐,就换用集成测试吧。譬如,一个游戏关卡中需要一个人物完成一系列的动作和你清理的代码有关。

这样的测试更加耗时,所以不可能在每一次更改之后都测试一次,虽然这是最理想的情况。因为你将每一次改变都放到了版本控制系统中,所以情况还不是那么糟糕。所以每一段时间(比如,五个更改)就测试一次。当你发现了一个问题时,你可以通过二进制搜寻最近的几次commit中找到什么地方导致了问题的发生。

如果你发现了测试没有发现的问题,确保将这个也加入到测试中,以便将来可以测试它。

2. 使用代码版本控制系统

还有人需要被告知要使用代码版本控制系统吗?我希望没有。

清理工作是很关键的。你可能要做很多很多小的修改。如果什么地方出错了,你想回顾版本历史,你可能找到它错在哪。

如果你和我一样,你可能有时重构(清理愚蠢的类)的时候会出错,并且后来意识到这并不是个好的点子,或者这是个好点子,但是如果先做了什么之后所有的一切会变得更简单。所以你想快速的恢复一切到原状并且重新开始。

你的公司应该已经有代码控制系统了,你可以在不同的分支进行修改,在不打扰别人的情况下随意的commit。

就算情况不是这样的,你也应该使用版本控制。下载Mercurial(或Git),创建新的仓库,将代码从你们公司的愚蠢的系统中签出并放在这里。在库中commit你的更改。当你完成了之后你可以将所有的一切merge到那愚蠢的系统中。

拷贝库到一个代码控制系统中仅仅需要几分钟。很值得这么做。如果你不懂Mercurial,花一个小时学习它。你会为你这么做感到高兴的。如果你愿意的话,花30个小时学习下Git(我是开玩笑的!并不用这么久。现在是“nerd”战斗的时候了!)

3. 每次仅仅做一个小小的改动

有两种方法改进坏的代码:革命和改革。革命是用火把一切都烧掉,从新写一遍。改革是在不破坏的基础上每次只进行一点小小的改变。

这篇文章是关于改革的方法。我不是说革命的方法从来不是必要的。有时代码太糟糕了,需要用革命的方法。但是那些觉得改革的进度太慢的人们往往会鼓励改革,然而经常没有意识到问题的复杂性,并最终并没有比现存的系统更好。

Joel Spolsky写过一篇经典的文章,他没有掉入到这个紧张的争论的陷阱中。

改革的最好的方法就是一次只做一个小的改变,测试它,并且commit它。当一个改变很小时,它更容易理解改动的后果以及确保改动不会影响现有的功能。如果什么地方出错了,你仅仅需要核查很少的一部分代码。

如果你开始做更改并且意识到改得很糟糕,那么你恢复到上一次的commit,不会损失太多的无用功。如果你过了一段时间才发现什么地方有细微的差错,你可以在版本历史中使用二进制搜找到导致问题的更改。

最常见的错误就是一次进行多处更改。譬如,当去除不必要的类层次的势后,你发现API的方法并不是像你喜欢的使用方法,而你打算重新组织它们。不要这么做!先去除层次结构,commit之后再更改API。

聪明的程序员懂得组织,所以他们也不需要太聪明。

试着找一个途径,沿着这个途径你可以把代码变成你想要的模样,每次只有一点点改动。譬如,第一步你重命名方法,使之名字更合理。下一步,你可以将成员变量变成方法的参数。然后将算法变得更清楚些,等等。

如果你开始做更改,并且发现比你原先设想的改变要大,不要害怕又退回去,使用更小的更简单的步骤去完成同样的事情.。

4. 不要同时清理代码和修正代码

这是(3)的结果,但是仍然很重要。

这是一个常见的问题。你开始察看一个模块,是因为你想加入某个新功能。然后你发现这个代码相当的糟糕,所以你开始重新组织它并且加入新的功能。

问题在于清理代码和修正错误是完全不同的目标。当你清理的势后,你想让代码看起来更好,而没有改变它的功能。当你修正错误时, 你想改变功能。如果你同时清理代码和改正错误,很难保证清理不会改变什么。

先清理代码,然后再在一个干净的基础上,加入新的功能。

5. 删除你没有使用的功能

清理的时间正比于代码的数量,复杂性和糟糕的程度。

如果代码的功能你目前没有使用,而且在可预见的将来也不会使用,那么就删除它,这会减少你浏览的代码数,降低复杂度(删除不必要的概念和依赖)。你会清理的更快的,而且最后的结果会更简单。

不要留着代码仅仅因为“谁知道呢,你可能某一天需要它”。代码是有代价的 – 它需要被移植,修正错误,被阅读以及被理解。你有更少的代码,就更好。就算在最不可能的情况下,你需要这个旧代码,你也能从代码库中找到它。

6. 删除大部分的注释

烂代码很少会有好的注释。它们通常是这样的:

// Pointless:    // Set x to 3    x = 3;// Incomprehensible:    // Fix for CB (aug)    pos += vector3(0, -0.007, 0);// Sowing fear and doubt:    // Really we shouldn't be doing this    t = get_latest_time();// Downright lying:    // p cannot be NULL here    p->set_speed(0.7);

看看整个代码。如果一个注释对你来说不再有意义,也对你理解代码没什么帮助,那么就删除它。否则你只会浪费你的脑力去理解一堆对你理解代码没帮助的注释。

同样的删除那些已经被注释掉的代码。如果你还需要它的时候,它还在你的代码仓库中。

甚至如果注释是正确而且有用的,记住你还可以重构你的代码。可能当你完成重构后,这些注释不再正确了。这个世界上还没有一个单元测试能够告诉你注释是否已经损坏了。

好代码需要很少的注释因为代码自己已经自说明了而且很容易理解。拥有好名字的变量不需要注释去解释它们的用途。函数如果有好的输入输出,没有特殊情况时是不需要说明的。简单的写得很好的算法在没有注释的情况下也是容易理解的。而断言记录了条件和预测。

大部分情况下,最好的做法是删除所有旧的注释,专注于让代码变得干净和具有可读性,然后再在需要的地方添加代码 – 这些注释反应新的API的用途以及你对代码的理解。

7. 避免共享的可更改的状态

共享的可更改的状态是理解代码的最大阻碍,因为它允许隔一段距离的行动,一段代码可以改变另一段完全不同的代码的行为。人们常说多线程是困难的。事实上,是由于线程共享了可更改的状态,才导致了问题。如果你能避免它们的话,多线程并不复杂。

如果你的目标是写高性能的软件,你应该不能避免一切可更改的状态,但是你的代码仍然可以从减少它而获益。为了“大部分功能完善”而努力吧,确保你确切的知道什么状态在什么地方改变了,并且知道原因。

共享的可更改的状态来自不同的地方:

● 全局变量。最经典的例子。现在每个人都知道全局变量的坏处。但是要注意(有时人们会忘记),全局变量是唯一的会造成问题的共享的可更改状态。全局常量并不糟糕,Sprintf也不糟糕。

● 对象 – 装有乐趣的大袋子。对象能够集合很多方法,无疑可以共享很多可变的状态(成员)。如果一个懒惰的程序员需要将一些信息在方法之间传递的话,她可以建立一个新成员,所以可以依照需要来读它和写它。这非常像全局变量。多么有意思!当一个对象有越来越多的成员时,问题就越来越严重。

● 巨大的函数。你可能已经听说它们了。这种神秘的产物栖息在最黑暗的代码洞穴的最底层。心眼坏的程序员在阴暗的酒吧里谈论它们,他们的理智被他们遇见的代码摧毁了:“我不停地向下翻向下翻,我不能相信自己的眼睛。居然有12,000行。”当函数足够长的时候,它们本地变量将和全局变量一样糟糕。我们不可能知道改变2000行之后的一个局部变量会有什么效果。

● 引用和指针参数。引用和指针参数没有被声明为const被传进函数时,可以在被调用者,调用者以及任何能被传递相同的指针的对象之间充当共享的可变的状态。

这里有一些避免共享的可更改的状态的建议:

  • 将较大的函数切分成较小的函数。
  • 将较大的对象切分成较小的变量,将相关的成员放在一起。
  • 将成员变成private。
  • 将函数声明const,返回结果,而不是可更改的状态。
  • 将函数声明static,从参数获得值,而不是从共享状态那里取值。
  • 避免完全使用对象,实现纯净的功能,不要引入副作用。
  • 将本地变量声明const。
  • 将指针和引用声明const。

8. 避免不必要的复杂性

不必要的复杂性通常是过度工程化的结果 – 支持的结构(如序列化,引用计数器,虚拟接口,抽象工厂,访问者等等)会拖慢真正有实际功能的代码。

有时候过工程化是因为一些项目开始的时候有一些更大的野心,多于实际完成的。更多的情况,我想是因为程序员读了关于设计模式的书之后和瀑布模型之后的想法,他认为过工程化会形成更“坚固”和“高质量”的产品。

通常,这个笨重的,僵化的,过度复杂的模型不能适应功能需求,而这是设计师不期望的。那些功能可能之后用hack的方式来实现,成了在象牙塔最顶上的螺栓和后门,变成了神经错乱的混合结构。

治愈过度工程化的方法就是YAGNI(you are not gonna need it)-你不需要它!只有当需要一个东西的时候才建造它。当你需要它的时候才建立更复杂的东西,而不是在你需要之前。

避免不必要的复杂性的一些实际的方法:

  • 移除你没有用到的东西(就像上面建议的一样)。
  • 简化必要的概念,避免不必要的概念。
  • 移除不必要的抽象,用实际的实现来替代。
  • 移除不必要的虚拟化,并且简化对象的结构。
  • 如果一个设置曾经使用过,那么就避免在用另外的配置来运行这个模块。

9. 就这么多了

现在开始清理你的“房间”吧!

来自:伯乐在线

SDN解决方案总结:OpenFlow、虚拟机、OpenStack和VXLAN/NVGRE 第六届中国云计算大会将于5月20-23日在京隆重召开 大数据实战:站在JMP分析平台上的FIT足迹识别技术 首届SAP d-code大会在上海举办 【OSTC讲师专访】ZoomQuiet:因商业化而开源是中国开源界最大的囧处 亿元资金扶持+联手100家VC,腾讯的雄心壮志 美国史上最大IPO 能给阿里巴巴带来什么? 买Windows平板而非iPad或Android的十大理由 Framework7:不会Objective-C,也能开发iOS7应用 CocoaChina开发者大会 全新引擎Cocos 3d-x开源 Oracle和微软的抱团,以及对抗Amazon霸主的5个可用点 Agile已死 Agility长存? 论程序员的自我修炼 Github女员工因遭性别歧视离职 继七年iPhone、四年iPad后,苹果的下一城:Healthbook 普元CTO焦烈焱:专注于基础软件 在Spark上的深入实践 Python 3.4.0正式发布 未添加任何新语法特性 谷歌受困邮件挖掘丑闻,企图抹掉庭审记录 Python 3.4.0发布,增加了多个功能模块 美的+阿里,“云端”战略第一把火是智慧家居 对产业互联网战略的战术思考——争夺企业信息入口的战争 加入Cassandra,OpenStack发力DBaaS生态圈 死磕Google Keep,微软正式发布Mac免费版OneNote 《近匠》安管云CTO石磊:降维安全的开放平台 2014 Unity亚洲开发者大会·中国站讲师名单议题全部出炉 【独家专访】红旗Linux元老:猎猎红旗永飘扬 借助三大技巧 助你提升API状态页面 集成GemFire,Hadoop生态圈的又一把火 次世代光照体验:Unity 5面世,功能系统全升级 深入浅出,以咖啡店为例演示Web应用程序扩展 百度Clouda:可依赖的实时JavaScript开发框架 不用数据库怎么实现用户注册! 大家能问点有深度的问题吗? sql中创建视图有什么用,怎样创建?请教 支持国产软件——海威数据仓库前台工具Hdc3.x下载 救救我的linux啊?它快不行了。 回答“一个动态创建孔件时的错误,请大家指点”贴后请到这里面领分(共700分)(六) 怎么在Applet中定时显示一数值? 受不了啦,有谁在上班时间在CSDN泡上一天的?? COM、DCOM、COM+有何区别? 该死的缓冲:document.all("pb").innerText="fas"; 这个问题,我不会!你呢??来看看! 请问如何用ASP同时上传多张图片? 哪位大侠能提供关于"资源文件(*.rc)"在BCB5中使用的系统、详细的资料? 菜鸟问题:我想用一个win32 api函数但是不懂得如何使用。 listview与数据库的一系列联系,重点!!! 请教!!!帮帮小弟!!! 两周了--还是不行 怎样取得本机的名称? 我想听网络广播, 怎样做呢? 一个小问题 ????? 回答“一个动态创建孔件时的错误,请大家指点”贴后请到这里面领分(共700分)(七) 计算机知识大赛 我的问题很简单,可是我不会! 回答“一个动态创建孔件时的错误,请大家指点”贴后请到这里面领分(共700分)(八) 这样的游戏一个值多少钱?请报价。 高手快进!小弟有一事不明!!告急! 取ADO的recordset对象的recordcount属性总是 -1,如何解决? 这样的网络游戏一个值多少钱?请报价。 软件发布:《加密樵夫》 软件发布:《加密樵夫》 谁有Dreamweaver4.0的注册码,我晕,555555555…~~~~~~~~~ 我曾在本论坛看到一篇“用纯ASP代码实现图片上传并存入数据库中”的文章,可是怎样实现一个页面上传多幅图片呢,高手能否帮忙看一下? 如何检测一个超链接是不是死链接 软件发布:加密专家系统 只要点一下,妹妹我就以身相许 谁有Dreamweaver4.0的注册码,我晕,555555555…~~~~~~~~~11 请问只要是线程就有消息队列,还是此线程产生window后才有消息队列?在控制台程序中,在消息循环中,当受到一wm_timer消息时,此消息将发送给那一window procedure? 软件发布:三维几何画板 CSDN有徐州的朋友吗 请教高手一个关于图像格式的问题 高手清帮忙:如何获得一个控件的电子签名认证?急,急,急! 觅有时间有经验用MAPINFO开发GIS的高手? IE 能不能同时浏览2种以上不同设置的网页? 初级asp问题 询问-----上海在哪里有软件考试报名? 怎样用SDK的方法改变文本框的前景色和背景色?(内空) 能推荐几个有关COM、ActiveX技术的网站吗?每个10分不够再加。 请问ljhua,ASP网页怎样调用*.bat文件,是服务器上的还是客户机上的bat? ****************** 先散掉点分,省得走的时候累赘 ****************** UNICODE和WinMain 一个空战游戏,附源程序! 1-9个数字填入81个小方格内用1-9个数字填入81个小格内,横 竖不能出现任何一个重复数,不用计算.第一行横的第一个格是8,第二个格是2,第九个格是7.第二行横的第一个格是9,第四个格是1,第七个 第8-10题) 关于音标的几道题……根据相应的音标补全单词1./əu/ h_le thr__t g__t b__t2./ɔi/ b__ t__let t__ s__l3./ai/ b_k_ m_ k_t_ fl__4./eə/ p___ ch___ b____ h_____5./au/ h__se h__ n__ gr__nd6./ei/ c_k_ d__ m__k__ pl__7./iə 将1-9共九个数字填入方格中将1-9这九个数字填入空中,使三个等式成立 (不能重复)①( )+( )=( )②( )-( )=( )③( )*( )=( ) 初中数学,这道题是怎么算出来的?第8题 图为一台电热水器的电路示意图.当开关S闭合时,电热水器处于加热状态,功率为440W;当S断开时,电热水器处于保温状态.整个电路的功率为22W.求:(1)当S闭合时,电热水器工作5min消耗的电能为 一、用修改符号修改短文星期六我们全家去了颐和圆.上午,一进门就看见了有白的,黄的,紫的,色彩鲜艳的蝴蝶花,非常美丽.有几只漂亮的蜜蜂,正在这些花上辛勤采蜜.妈妈说:"公园多美呀 ""能 反比例函数y=k/x图像经过点(3,2014/3)p为其图像上一个整点(注:整点表示很坐标纵坐标均为整数的点),那么x+y的最大值是 四年级下册的口算练习题,一定是乘除法的.20道比如:0.5×10= 最好有答案. 点C在以AB为直径的半圆上,∠CAB的平分线AD交BC于点D,⊙O经过A D两点,且圆心O在AB上.1:求证:BD是⊙O切线.2:若AC/AB=1/4 BC=4√5 求⊙O面积(这题没有图) (第22章第三单元测试卷答案)(第23章第二单元答案)(第23章第三单元答案) 一个长6dm、宽5dm、高8dm的长方形容器内装满水.这个容器内水的体积是( )立方分米.把一根24dm长的铁丝折成一个最大的正方形,它的面积是( )平方分米.把一根24dm长的铁丝折成一个最大的 毛纺厂男职工人数是女职工的3分之4因工作调走33名男职工现在男女人数比是4:9问女职工有多少人 初中数学七年级下人教版基础训练第39页第8题答案 流域自然侵蚀速率是反映流域地貌形态变化的重要指标.据研究,南美洲亚马孙河流域自然侵蚀速率远低于南亚恒河流域,其最主要的影响因素是A.地形 B.降水量 C.植被类型 D. 城市化水平 想找个问题问都这么难,没有问题问怎么办? 新课标人教版二年级【下】语文单元测试卷【4】 问几道数学题急这用!1.一个数的5倍再加上5正好是100这个数是多少?(方程解)2.一个数的8倍与它4分之1的和是66,这个数是多少?(方程解)3.甲乙两个工程队同修一条公路,它们从两端同时施工. 可是我现在没有问题该怎么办? 七年级英语报刊急练习题 问几道数学题:具体过程要讲清楚点哦,例如表示什么的~1.一堆煤,第一天运走1/4,第二天运走剩下的一半,第三天又运了剩下的2/3,最后剩下的煤比第三天运走的3/4少10吨.三天一共运了几吨?2.一项 将1,2,3,4,5,6,7,8,9这九个数字填入3*3方格中,要求每一列的三个数 我没有问题想问,怎么办啊 七年级英语练习题报刊 把1.2.5.6.6.8.9.9分别填在方框里,使每一边三个数的和都相等口——口——口| |口 口| |口——口——口 我想问问题,怎么办呢 七年级英语报刊练习题急 将0,1,2,3,7,8,9填入下面的方框内,使算式成立:□+□=□□-□=□□ 数字不得重复使用 问到没有问题又想问问题怎么办! 英语报纸习题,初一上一.根据所给句子完成下句,是两句意思相同或相近.每空一词1. He reads English for thirty minutes every morningHe __ __ __ __ __ English every morning2. I don't know the answer to the question.I don't kn 把1、1、1、2、2、2、3、3、3 这9个数字分别填在横3格、竖3格的方格里,使得方格里横行、竖斜、斜行上的3个数的和都等于6.请问怎么填 新起点 初中数学同步单元测试卷七(上)(十)26题怎么做啊? 平方根报纸练习题初一下1.一房间的地面恰好由64块正方形地砖铺成,共16平方米,求每块地砖的边长.2.已知2a-1的平方根是+3,-3,b+14的平方根是+4,-4,求a+2b的平方根. 9乘9方格填数怎么做496,8,5,9,7,6,15,6,7,4,,1,5,7,,3,1,2,69,4,2,6,1,5,362怎么能让横竖填上1-9后没有重复数字. 说废话的别来.算了自己做好了随便找个人说句话啦要分的快啦 七年级英语报纸U7——U9练习题1.根据首字母及句意提示,完成单词.My sister most of his time on his work every day.2.句型转换Peter isn’t doing his homework now.(用last night 作时间状语改写句子)3.用介词填空.1.< 把1——9这9个数填入一个横竖都3格的方格中,使横.竖.斜行的数和相等,怎么填?把1——9这9个数填入以下格中,使横.竖.斜行的数和相等()()()()()()()()() 二期课改配套教辅读物2011-2012学年度 修订本光明日报?出版社 七年级上学期英语报纸13期频度副词练习题请快点谢谢我爸爸总是很忙. my father ______ _______ busy. 2.玛丽经常帮她妈妈打扫房间 mary ______ ______ her mother clean the room. 3.我通常早上七点吃早餐. i 2.3.6.7.8.9这六个数填入方框里使等式成立,每个数字只能用一次 ()+()=()()-()=1() 二期课改配套教辅读物 试卷7, 高中生订阅哪些报纸、杂志来提高英语阅读能力?最好有中文翻译的,或者后面有练习题可以检测是否读懂? 在1--13这十三个自然数中选出十二个填入右图的小方格中,使每横行的四个数之和相等,每竖列的三个数之和也相等,那么横行竖列的和各是多少?(4*3的小方格) 初中数学 同步练习与测试 的答案 急需 西游记练习题西游记每回合出三个问题 谢. 将九个不同的自然数填入下列方格中,使横行,竖行,对角线的三个数的积相等. 1、已知(x+my)(x+ny)=X的平方+2xy-6y的平方,求(m+n)mn的值.2、已知:a的平方+a的平方分之一=3,求a-a分之一的值.3、若4x的平方-3(a-2)x+25是完全平方式,求a的值.4、当x为何值时,x的平方+6x-15有最值.5、求 西游记的练习题读完西游记后,哪些练习题可以出?要多而且精,最好不要选择和填空,多些理解性的题,如:孙悟空是个怎样的人物等等. 将-4,-3,-2,-1,0,1,2,3,4这九个数分别填入九个方格内,使横,竖,斜三个数相加得0 初中数学 第八题 西游记的相关练习题要有答案的! —18,—15,—12,—9,—6,—3,0,3,6填入一个3乘3的方格,使横,竖,斜,对角的三个数字和都相等 初中数学!第八题,谢谢! 西游记试题是要提问题的,就是帮我写一些西游记的问题,是关于每一章回提问的,我只要第70~100章的,每回提2个问题,一共60个,至少40个,如果我采用了,会追加很多分的~不对,我的意思是关于每回 123456789填入81个方格中,每一行和每一列和为45.其中全部9个小方格中的每一行和每一列(有三个数)和为15.请各位说说,我有急用.也就是说每一行每一列都要有123456789,就是由9个九宫图组成, 如图,在△ABC中,AB=AC,以AB为直径的○O分别交BC,AC于点D,E,连接EB交OD于点F.(1)求证OD⊥BE(2) 若DE=√5/2,AB=5/2,求AE的长. 西游记的习题越那难月好 在25乘25方格纸中,将1到9九个数字填入没的小方格,求他们的和 某铁桥长1000米 现有一列火车要从桥上过 火车完全通过桥需要60秒 整列火车在桥上的时间是40秒 求火车的速度和长……列出方程组并说明理由就行了 比如 火车的长度等于. 一道物理题,(双选)一个物体底面积为0.1平方米,桌子的底面积为1平方米,物体重200N,那么桌子所受物体压强为A.可能是200pa B.可能是2000PaC.可能是4000Pa D.可能是1000Pa双选双选!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn