483除以64与的差,一个数减8再乘8再除以862与16的和?

在 2021 年 6 月 28 日 17:31 utc+8,我总算是通关了地灵殿 ex 关卡,这次的文章就使用小五和小石头的图吧。顺便推荐一些好看的视频:3D 东方地灵殿 ex,恋恋超萌,通关了再看这个视频感觉神还原 【3D东方】Brambly Boundaries和 You may know "Dream" 同一系列的 眼睑和光和恋爱之歌再来个顺便搜到的 远古视频,歌还挺好听的(正文从这里开始,希望上面的东西没有引起你的反感)本文是我在阅读了 elisp debugging 文档后的一些思考,当然也不一定说得上是思考,只能说在用了这么久的 debugger 后我终于对什么是 debugger 有了一些兴趣。对 debugger 的认识是本文的主要目的(话虽如此,还是不可避免偏离了最初的目的,不过好在各小节的顺序不影响阅读)本文的主要内容不是介绍 emacs 中的 debugger 的用法,而是结合我自身体会以及各种各样的资料,从各个方面来谈一谈 bug,debugging 和 debugger。当然和 emacs 相关的内容肯定是有的。本文的内容包括:alpha.什么是调试beta.关于 bug 的进一步介绍gamma.调试的流程、思路和方法delta.什么是调试器epsilon.emacs 中的调试本文中使用的 emacs 环境为 emacs on windows 27.1alpha.什么是调试(debugging)要想知道什么是调试器,那应该从认识什么是调试开始。调试(名词)的英文单词是 debugging,英文中 bug 是虫子的意思,de 前缀表示取反的意思,相应的例子有 buff 和 debuff。debug 直译为中文就是“消除虫子”,它在计算机领域最初的使用应该是在 Admiral Grace Hopper 女士的日志中。那是在十九世纪四十年代,Admiral Grace Hopper 在哈佛大学进行 Mark II 计算机相关的开发工作,她的同事发现一只蛾子卡在了继电器中,阻碍了操作,她将这件事记录在了日志中,并描述为他们在“为系统除虫”。在日志中她这样写到:First actual case of bug being found,日志还附上了虫子的尸体。这称得上是计算机发展史中的一段逸闻。debugging 这个词因为 Grace Hopper 女士的使用而流行了起来,不过根据维基百科上的说法,在此之前 debugging 似乎已经作为术语在航天领域中使用了【1】。Grace Hopper 本人也在一次采访中表示这个词不是她创造的。Grace Hopper 是一个传奇人物,她参加过第二次世界大战,开发了计算机程序语言 COBOL,因为连续被返聘而退修了三次,官至海军准将,于苏联解体 6 天后逝世,享年 85 岁【2】。老实说,在查到这一段历史之前我一直将她和另一位叫作 Augusta Ada King-Noel, Countess of Lovelace 的女士记为同一人。Ada 是著名诗人拜伦的唯一婚生子女,是最早的程序员之一。程序语言 Ada 就是以她的名字命名的。Ada 的笔记据称对计算机的发展起到了非常重要的作用【3】。不得不说,这两位程序员的画像或照片挺不错的(笑):12扯的稍微远了一点,现在让我们回归主题:什么是调试。维基百科上是这样描述的: In computer programming and software developmet, debugging is the process of finding and resolving bugs(defeats or problems that prevent correct operation)Debugging tactics can involve interactive debugging, control flow analysis, unit testing, integration testing, log file analysis, monitoring at the application or system level, memory dumps, and profiling. Many Programming languages and software developmet tools also offer programs to aid in debugging, known as debuggers.在软件开发中,bug 指导致程序出现错误的问题或原因。debugging 就是寻找和解决 bug 的过程。debugging 技术包括交互式调试,控制流分析,单元测试,集成测试,日志文件分析,应用级或系统级监控,内存转储,以及性能分析。许多程序语言和软件开发工具提供了叫作调试器的工具以协助调试。说到调试,我还挺想提一提测试(testing)和调优(profiling),但是我还没有系统地学过软件工程,没有做过正规的测试工作,我对测试的概念还不是很清楚,这个东西留到我有了相关经历后再说吧。这里说下我对于测试的理解:凡是能发现 bug 的行为都能称为测试。下文中我使用的“测试” 这个词都是这个意思。更加准确客观的定义可以参考一些权威的书籍或网站。在维基百科中测试的定义是“软件测试是一项调查,它旨在提供软件产品或服务的质量信息”。beta.关于 bug 的进一步说明考虑到本文和调试相关,而调试的对象正是 bug,这里对 bug 多做一些说明是有必要的。Software bug 指程序或系统中导致出现错误或未预期结果的 error(错误),flaw(缺陷) 或 fault(故障)。大多数的 bug 的来源都是程序设计、程序代码、程序使用的组件或操作系统中的错误或失误。少数是由编译器产出不正确的代码导致。如果一个程序中有许多 bug,或者它的功能严重受到 bug 的影响,那么就称这个程序是 buggy 的。bug 翻译为中文的话就是错误,software bug 即软件错误,这没什么好说的。不过我在维基百科【5】上看到了这样的说法:许多人建议放弃使用 “bug” 这个词来指程序错误。某个观点是这样的:“bug” 这个词背离了“问题是人造成的”的意思,反而隐含了“缺陷是自己产生”的意思。某些人建议使用“defect”来代替“bug”,不过收效甚微。从 1970 年代以来,Gray Kildall 有点幽默地建议使用“blunder”(篓子)一词。1.一些著名的 bug这里纯粹是我自己想给自己来点科普,有兴趣的读者可以看看,或者搜索一下相关内容。其实到这里为止本文已经提到过了一个著名的 bug,那就是 Grace Hopper 贴在日志上的那一只,接下来我会介绍几个著名的 bug。一、千年虫(Y2K)(此处的内容来自【6】)Y2K 也被叫做 Year 2000 problem,the Millennium bug,the Y2K glitch 等等。这是一个由于程序设计不当导致的问题,它的“作俑者”正是我们上面提到的 Grace Hopper 女士。在 1960 年代,由于计算机内存和外存的成本很高,Grace Hopper 在 Harvard Mark I 上使用 6 位数字来存储时间,即 YY:MM:DD,年月日各两位。这个习惯在她发明的 COBOL 中继承了下来,并传播到了整个计算机界。使用两位来表示月份和天数是没有问题的,因为月份和天数最大也只有 12 和 31,但是年份就不一样了,在 20 世纪它就已经是一个四位数了,使用两位数只能表示一个世纪内的年份。也就是说,到了 21 世纪时 YY 会变成 00,这样是没法区分时间是 1900 还是 2000 的。如果在 1999 年 12 月 31 日之前人类文明毁灭的话这个问题就不存在了,但显然这样的事情没有发生。由于计算机系统无法正确地区分时间,这可能会导致一系列的问题,具体的严重性可以自行搜索。不过好在随着 2000 年的接近,公众领域开始逐渐重视起这个问题,在各方努力下,千年虫问题最终平稳渡过。与之相似的还有 2038 年问题,这也是设计的问题,使用 32 位来表示时间,导致它所能时间范围为 1970 年到 2038 年。二、The Patriot Missile Failure(这里就是对参考资料【7】的翻译)Patriot Missile 即“爱国者导弹”的意思。1991 年的 2 月 25 日,在海湾战争期间,位于沙特阿拉伯的达兰的美国爱国者导弹未能跟踪和拦截伊拉克的飞毛腿导弹,导致飞毛腿导弹击中美军军营,造成 28 名士兵死亡和约 100 人受伤。事后的分析报告显示:是由于软件问题导致拦截失败,由于浮点运算的不精确导致开机时间计算不准确。具体来说就是:导弹系统内部的时钟计时单位是百毫秒,即每 0.1 秒时间计数器增 1,想得到从开机到现在的秒数将时间计数值除以 10 即可。这个浮点运算是在 24 位寄存器上进行的,而 0.1(除以 10 等价于乘 0.1)在二进制下是一个循环小数,即 0.000110011001100 ......,使用 24 位寄存器即 0.00011001100110011001100,这个数的十进制表示为 0.09999990463256836,也就是说计数器增加一次就会带来约 0.000000095 秒的误差。把这个误差乘 10 再乘上 100 小时就会得到 0.34 秒的误差。导弹的速度是 1676m/s,1676 * 0.34 约为 570 米,这是一个不容忽视的距离误差。三、The Ariane 5 Disaster(此处的描述来自参考资料【8】)1996 年 6 月 4 日,Ariane 5 运载火箭首次正式发射,火箭在发射 37 秒后火箭向错误的方向翻转了 90 度,不到两秒后,空气动力将助推器从 4 千米高的主级撕开。这导致了自毁机制的出发,飞船被巨大的液态氢火球所吞噬。这个故障很快被确定为火箭惯性系统中的软件错误。火箭使用这个系统来判断它是朝上还是朝下,它被称为水平偏差(horizontal bias),或者叫做 BH 值。系统使用一个 64 位的浮点变量来表示该值。然而,软件将该变量使用 16 位的读法来读取。火箭发射后的几十秒内这个值还在 16 位值的正常范围内,但是随着火箭速度的提高,这个值在某个时刻超过了 65535 从而无法使用 16 位来表示。从这里开始处理器就出现了运算数(operator)错误,从而引发了这次事故。2.对 bug 的分类bug 的种类非常之多,根据不同的视角可以有很多不同思路的分类。我看了看维基百科上面的分类,感觉有点杂,这里我尝试着能不能改进一下。以下的分类参考的是【9】。一、根据 bug 特性进行分类根据 bug 的特性分类的话可以分为功能缺陷(functional defect),性能缺陷(performance defeat),可用性缺陷(usability defect),兼容性缺陷(compatibility defect)和安全缺陷(security defect)Functional defects。功能缺陷是软件行为不符合功能要求的情况下识别出的错误。这样的错误是通过功能测试发现的Performance defects。性能缺陷是和软件速度、稳定性、相应时间以及资源消耗相关的问题。它们通过性能测试被发现Usability defects。可用性缺陷会让软件用起来不舒服,从而影响了用户的软件体验Compatibility defects。有兼容性问题的应用在特定类型的硬件、操作系统、浏览器和设备上或某些网络配置下运行时可能不会表现一致。一般通过兼容性测试来发现发现这样的问题Security defeats。安全缺陷会导致软件受到潜在的安全攻击的威胁。一般通过安全测试来发现问题二、根据 bug 严重性进行分类这可以分为四类:Critical defects。关键缺陷通常阻碍了整个系统或模块的正常功能。如果不修复这个问题的话将不能进行进一步的测试High-severity defects。高严重性缺陷影响应用的关键功能,并且会使应用的行为和需求所述完全不同Medium-severity defects。中等严重性缺陷是通过次要功能块不能正常工作来识别的Low-severity defects。低严重性缺陷对应用总体正常工作影响很小,例如应用的 UI 缺陷三、根据优先级的分类bug 的优先级也分为 4 级:紧急、高优先级、中等优先级和低优先级:Urgent defects。这样的 bug 应该在被报告的 24 小时内修复。一般来说高严重性缺陷都属于这一类。不过低严重性的缺陷也可能被归为这一类,比如公司的名字在应用主页上写错了,从功能上来说没有太大问题,但是在商业上有很大影响High-priority defects。这样的错误应该在应用的下一个发行版中被修复,来满足退出标准(exit criteria,指完成某项任务必须被满足的需求)。例如用户无法从登入界面进入用户主页面,计时用户成功登录Medium-priority defects。这样的错误可以在下一个发行版发布后,或是随后的一些发行版中修复Low-priority defects。这样的错误不需要被修复来满足退出标准,但是需要在程序变得普遍可用之前得到修复。这样的例子有:错别字、对齐、元素大小、和其他通常的 UI 问题3.导致 bug 的常见错误(error)在上面我提到过这样一句话:大多数的 bug 的来源都是程序设计、程序代码、程序使用的组件或操作系统中的错误或失误。少数是由编译器产出不正确的代码导致。我在上面也或多或少地提到了一些设计问题导致的 bug,这一小节主要是对编程中导致 bug 出现的常见错误的一些总结和归类。注意:我在这里称呼它们为“导致 bug 的错误”,而不是叫它们“bug”。我是这样理解的:例如“算数错误”就叫做“bug”,那么除以 0 就是“导致 bug 出现的错误”;编译失败叫做“bug”,语法错误叫做“导致编译失败的错误”,等等。。。。。。对导致 bug 出现的错误的寻找正是 debugging 要做的事。不过老实说,我之前也没在意过“bug”和“bug 原因”之间的区分,碰到程序崩溃了就知道要“找 bug 了”,现在看来称之为“寻找导致 bug 出现的错误”可能更好一点,不过这都不是什么大问题,混用的情况也很普遍。(也有可能是我的理解出了问题,谁知道呢)下文中我用“错误”和“error”来表示“导致 bug 出现的错误”,用“缺陷”和“bug” 指“表现出错误”。非要说的话,这两者可能是所谓的“里子”和“面子”的关系,或者说“基因”和“表现型”的关系。一、算数(Arithmetic)除法运算中以 0 作为除数浮点运算上溢出和下溢出浮点运算精度丢失二、逻辑(Logic)在计算机程序中,逻辑错误导致软件不能正确工作,它不会使软件崩溃。下面是两种常见的逻辑错误死循环或无限递归边界问题(差一错误,Off-by-one error OBOE),在计数时由于边界判断失误导致结果多了一或少了一的错误三、语法(Syntax)语法 bug 是出现在应用代码中的错误。它一般是简单的语法错误,比如拼错了一个符号。编译器在编译代码时会提供错误的信息,开发者可以根据编译器报错来修复错误。关于语法错误的例子,这里有一段令人吐血的 C 代码:$include {stdio.h}
void mian(void)
(
System.out.println[<Hello world>)]
retn 0
)四、资源(Resource)缓冲区溢出访问未初始化的资源,比如访问空指针多次释放同一资源在释放资源后再次访问资源泄露,例如内存泄露五、多线程相关(multi-threading)死锁,任务 A 的继续需要在任务 B 完成后,任务 B 的完成需要 A 的完成竞争冒险(race condition),任务顺序不受控制六、接口(Interfacting)使用 API 的方式不正确不正确的协议实现4.产生 bug 的原因上一节中我介绍了一些常见的导致 bug 出现的错误。这一小节想要回答的问题是:哪些因素导致了 bug 的产生。自然,所有的代码都是人写的(至少得动动手,代码块补全也算),出现 bug 的直接原因自然是程序员写出了有 bug 的代码。做一件事最快的方法当然是不要做这件事,如果没有人写代码的话,bug 自然就不会存在了。这当然是一句玩笑话,下面就为何会出现 bug 做一些简单的介绍。以下内容来自参考资料【10】1、糟糕的交流或没有交流软件的成功是离不开客户、开发和测试团队之间的良好沟通的。不明确的需求和对需求的误解是导致软件缺陷的两个主要因素。此外,如果没有向开发团队传达确切的需求,软件的开发阶段就会引入缺陷。这里有一张很有名的软件工程秋千图,它描述了沟通不到位的后果:32、软件的复杂性对于没有现代软件开发经验的人来说,当前软件程序的复杂性是难以应付的。窗口界面,客户端-服务器架构、分布式应用、数据通信、庞大的关系式数据库和庞大的应用程序规模都促成了软件/系统复杂性的指数增长。如果没有经过良好的设计,面向对象技术可能会使项目变得复杂而不是更简单。3、程序员犯错就像任何人一样,程序员也是会犯错的。并不是所有的程序员都是领域专家。没有经验的程序员在编码时可能会引入一些非常简单的错误。缺乏编码实践,单元测试能力和调试能力是程序员在开发阶段引入缺陷的普遍原因。4、需求的变更客户可能不能理解变更或以任意方式要求重新设计、重新安排对项目带来的影响。如果有许多小变更或大的变更,项目各部分之间已知或未知的依赖关系可能会相互影响并导致问题,对变更的追踪的复杂性可能会导致错误。从而对工程人员的积极性造成影响在一些快速变化的业务环境中,不断变更的需求可能已成为现实。在这种情况下,管理层必须了解由此带来的风险,QA(质量工程师)和 测试工程师必须始应和吉欢持续的广泛测试,以防止 bug 失控。杀死一个程序员不需要用枪,改三次需求就可以.jpg5、时间压力对软件项目的进度安排是及其困难的,通常需要大量的猜测。当最后期限迫在眉睫时,错误就会发生。如果没有足够的时间用来设计、编码和测试,那么引入 bug 是一件很容易的事。6、不完善的代码文档维护写的不好的或文档很差的代码是很困难的,这将会导致 bug 的出现。在许多组织中,管理层不鼓励程序员写代码文档或编写清晰易懂的代码。不过事实通常是反过来的:程序员通过快速编写代码来获取分数,如果没人能读懂的话就会有工作保障。由于项目的复杂性和不完善的文档,任何开始在此类代码上工作的程序员都会感到困惑。很多时候对有垃圾文档代码进行小的修改都需要很长的时间,因为它们的学习曲线很长很陡。7、软件开发工具带来的问题可视化工具,类库,编译器,脚本工具等等,通常都会引入它们自己的 bug 或是不完善的文档。使用它们会带来附加的 bug。对软件工具的不断变更会带来持续的版本兼容性问题。8、缺少有经验的测试人员有专业领域知识的熟练测试人员对于项目的成功是极端重要的。但并非所有公司都能找到有经验的测试人员。领域知识加上测试者寻找缺陷的能力能够产出高质量的软件。缺少其中任意一项都会导致 buggy 的软件。gamma.调试的流程、思路和方法(这一小节的标题是“流程,思路与方法”,我打算以流程为主干,中间穿插各个流程步骤中需要用到的思路和方法,如果还有剩下的东西,那就在流程之外作为补充。)不知道你听没听过过那个“把大象放到冰箱”的段子,把大象放到冰箱里面只需要 3 步,即:打开冰箱,放入大象,然后关闭冰箱。这个描述是没有问题的(what to do),只是太笼统了一点,毕竟我们可能不知道到哪里去找到能放入大象的冰箱(how to implement)。我们先简单描述一下调试的过程(what),再逐步细化(how),下面是我找到的一些文章里面的说法:【11】中是这样描述的:第一步,重现发现的 bug。第二部,对 bug 进行描述,尝试从用户那里得到足够多的输入以获得确切的原因。第三步,捕获 bug 出现时的程序快照(snapshot),尝试获取此时程序的状态和所有的变量值。第四步,根据状态和变量值对快照进行分析,基于此找到 bug 出现的原因。第五步,修复存在的 bug,并保证修复没有引入新的 bug。【12】中则将调试过程分为简单的三步,即:观测错误,定位错误和修复错误。【13】中则是:识别错误,确认错误位置,分析错误,证明分析正确性,覆盖横向缺陷(Cover Lateral Damage),修复并验证我参考的多数资料中列出的调试步骤和【13】中的差不多,下面我们以它为基础来分步骤介绍调试:Identify the error(识别错误)Find the error Location(定位错误)Analyze the error(分析错误)Prove the Analysis(证明分析)Cover lateral Damage(擦屁股)Fix & Validate(修正和验证)对于以上 6 步的具体描述,我在很大程度上参考了【14】中的内容。0.调试之前的准备在寻找调试与测试的相关资料时,我浏览了不少的“调试 vs 测试”的文章,原先我准备在本文中加上调试与测试的对比关系,但是在实际操作过程中发现和测试相关的知识非常的多,遂放弃。下面是我找到的关于调试的一些特点:调试一般在发现程序不能正常进行时进行,并以解决问题和成功测试软件结束。调试一般都是通过人力一步一步地找出和删除特定的 bug,自动化调试是不可能实现的,而且这个过程没有固定的思路,使用的方法也不一定可靠。对程序的调试需要理解程序,它需要在源代码层次对 bug 进行定位和清除。如果没有理解程序的设计思路和使用的算法的话,调试过程将会变得相当困难,因此调试由开发团队内的开发者或程序员来进行。鉴于此,在开始调试之前,我们应该准备好相应的调试工具,并且我们至少应该对需要调试的代码有一定的了解,参考资料【12】中给出的建议是:阅读一下文档阅读一下每个函数的函数头浏览一遍源代码,并问自己几个问题:这个类/方法是干什么的函数的参数类型和返回值是什么我能够对每一行代码都解释清楚吗运行一下,看看会发生什么1. Identify the error(识别错误)识别错误这一步骤旨在获取和 bug 相关的信息,对造成 bug 的错误的类型和性质做出一个大致的判断。做个类比的话,和中医讲究的“望闻问切”很像。如果对中医那一套不感兴趣的话,更加现代一点的说法就是医院里面的分诊台。分诊是指对来院急诊就诊病人进行快速、重点地收集资料,并将资料进行分析、判断、分类、分科,同时按照轻重缓急来安排就诊顺序。上个学期某天晚上我感觉略有胸闷,就去了最近的医院,分诊台听了我的症状描述后引导我去了内科急诊,来进行进一步的治疗。(所幸屁事没有,原因可能是体测时测肺活量用力过度)错误识别是在发现 bug 后应该首先进行的步骤。如果这一步做的不好的话会浪费许多的开发时间(如果我胸痛却被分到了妇科急诊,那我完蛋的可能性岂不大增)。通常来说,由用户报告的生产错误是很难弄清楚的,有时候从他们那里获得的信息带有误导性(就好比病人告诉医生的可能并不是主要症状,头痛非得说是脚气,或者是因为一些难以启齿的事情而可能会隐瞒一些病情)正好我用了医疗上的例子来类比错误识别,这里不妨来点中医豆知识:关于“望闻问切”的解释“望”指观色气,观察病人的发育情况、面色、舌苔、表情等;“闻”指听声息,听病人的说话声音;“问”指询问症状,询问病人自己感受的症状,以及患病史;“切”指摸脉象,用手诊脉或按压腹部检查有无痞块。【15】中关于望闻问切给出了常见症状和对应内因,比如面色发白主虚主寒主失血,面色发送主热,面色发黑主肾虚等等。至于这些经验判据是否有效我这里不置可否,毕竟这都是几千年来的中医通过非科学方法得出的结论。(注意,非科学与伪科学是完全不同的概念,关于中医的科学化,有兴趣的可以看看【16】)古人云:“望而知之谓之神,闻而知之谓之圣,问而知之谓之工,切而知之谓之巧”。据说,厉害的老中医可以根据望闻问切直接看出病人的病症,并对症下药,药到病除。同样这里我还是不置可否,我把这段话拿过来只是为了类比一下调试。但是,厉害的程序员可以根据程序的表现看出程序的问题,这句话我是认同的。就算不怎么厉害,随着经验的积累也会对一些常见的 bug 产生直觉。例如:当一个 C 语言编写的简单程序崩溃了,对 C 语言略有经验的人至少可以想出以下几种可能出现的错误:(1) 空指针解引用(2)悬挂指针解引用(3)堆栈溢出(4)内存分配失败,等等。进行进一步的调查可以缩小范围(比如查看 core 文件),从而找到真正的问题。识别错误首先需要对 bug 进行观察。如果是身为开发者的你发现的 bug 的话,那么发现即查看;如果是用户报告的 bug,那可能需要用户发给你几张屏幕截图或者通过远程连接来进行查看。其次要能够复现 bug,如果无法复现的话那你就不应该认为 bug 被修复了。在发现了软件的错误后,你还需要知道软件在该错误存在下的预计行为。对于复杂的软件,判断某个错误导致的预期行为是很困难的,但是这些知识是解决问题的基础。要做到这一点我们需要与产品所有者交流,检查文档以获取信息。最后,还需要对这个识别进行验证。与应用负责人确认这个错误确实存在的,并且在错误下的预期行为和实际情况是一致的。经过验证你可以会发现修复这个错误是不必要或者不值得的(错误下的某些行为带来的影响很小)。2.Find the error location(找到错误位置,或者叫错误定位)一旦我们识别出了是什么错误,那就是时候在代码中找出错误的准确位置了。这个时候我们并不在乎对整个错误的理解,我们只关注找到它发生的位置。举个最简单的例子,假如你的程序功能是显示一张图片,然而图片却没有正常显示,那么造成这个 bug 的直接错误就很可能是在调用显示函数时出现了问题。至于是图片未能正确读入内存还是显示函数参数错误我们并不关心(实际上也分析不出来),我们找到错误的“案发现场”即可,即调用函数的代码位置。最直接的方法就是打开调试器一路单步执行下去。这方法听起来有点楞,但是在代码规模不大,代码依赖关系不复杂的情况下是非常有效的,当调试器嘀嘀叫的时候就说明你找到了问题。如果存在多个错误的话,可能还需要费点力气分辨出出直接导致问题的那一个,多个错误指向同一 bug 也不是不可能的事情。写到这里,我想了想自己的调试经历,好像用的最多的的还是 print 调试法(菜)。确定好错误后,在可能出现错误的地方临时加上一些 print 函数,观察一下打印的值是否是有问题的。有人觉得 print 方法挺低级的,但这确实是一种简单而有效的方法,几乎所有的编程语言的标准库中都会提供控制台输入输出功能,因此它非常通用。但是它的缺点也很明显,标准输出可能会因为多线程抢占出现输出无序的问题,如果是内存中的问题的话,print 基本用不上。而且标准输出的终端并不一定有,比如服务器环境。比 print 调试和单步调试更好的是打 log(logging),也就是通过日志文件来判断错误的发生位置。在参考资料【18】中作者这样说到: 单步调试最重要的作用不是让你看清程序逻辑,它最大的好处是可以在断点的地方查看所有的内部状态,从而在很复杂的逻辑中找到引发问题的条件语句。如果在某个单元测试上 fail 了,显然单步跟踪进去是发现问题的最简单的方法。单步调试的问题在于限制条件太多了:1、很多 bug 是跟运行数据相关的,这些 bug 很可能只能在部署了软件的那一个环境里能复现,别的环境里运行数据不同就复现不了,你能在生产环境里打开调试日志,但你能在生产环境里挂调试器吗2、很多问题无法单步调试,或者单步调试的时候不复现,最典型的就是网络相关的应用,你进到单步里面,远端服务就超时了,逻辑都不一样了。还有并发性的问题,只有两个过程同时执行的时候才会思索,你单步进去,根本遇不到死锁的问题。3、根本不知道应该在哪里设断点,通常也是多线程当中的情况,一个线程被一个信号量阻塞了,根本不知道这个时候用这个信号量的是哪个线程,怎么设断点。。。。。。而相比起来日志在这种时候就有很多优势了:1、不受环境限制,最多就是重新部署一个带调试日志的版本2、基本不会影响运行逻辑,真是运行情况是怎样,打出的就是怎样的日志3、可以在所有怀疑的地方同时打上日志,逐个排除要说的话,print 调试也算是打 log 的一种,但它只能算是最基础的打 log。日志能够提供更加格式化的消息,良好的日志格式和日志类型分类有助于更快地找到错误点。关于如何打 log 已经有了很多很好的教程和很多好用的库,这里就不展开了。3.Analyze the error(分析错误)这是调试过程中的关键一步,使用自底向上的方法从发现错误的地方开始分析,这样你就能够看到错误发生的深层原因了。除了找出错误发生原因外,错误分析的另一个重要任务是错误发生点周围没有其他的错误(冰山理论),以及确定在修复过程中引入其他缺陷的风险是什么。这一步和上一步并不是分开的,调试器和日志都是有用的。4.Prove your analysis(证明分析)在对原始错误进行分析后,你应该根据你的分析来编写一些自动化测试,测试该错误可能导致的其他问题。如果你的测试都失败了,那就证明你的分析是正确的。(这就是所谓的演绎法)5.Cover lateral damage(覆盖横向损伤)在这一阶段,你几乎已经准备好开始修复错误了,但是你还必须在修改代码之前擦干净你的屁股。你需要创建或集合代码的所有单元测试,这些单元测试围绕你将要修改的位置进行,这样你可以确保在修改完成后不会对代码的其他部分造成破坏。这些单元测试应该全数通过。打个比方的话就是医生做完手术之后应该检查一下,不会因为不小心把钳子或纱布留到患者的身体里。(我听说过这样的新闻)6.Fix & Validate(修复和验证)现在可以修复这个错误了,修复后再运行所有的测试脚本检查是否全都通过。x.关于单步调试和日志调试的讨论在上面我引用了知乎用户“灵剑”的一篇回答。在回答所述的问题上还有其他讲的不错的回答,和该问题同类型的问题也是存在的【19】,可以前去浏览。上面我只引用了使用日志文件的优点,现在把另外一半补上【18】: 实际上调试日志用得越多也就越会觉得调试日志也有很明显的局限性:1、打印得太多!看不过来!2、有的时候不清楚究竟什么原因导致了问题出现,也不知道该打什么日志有些时候需要监控的对象不能有效地打印出来,比如说需要观察一个对象的属性的变化,然而这个对象的属性太多了,可能还有内部级联的对象,全部打印出来需要写很多代码。还有些对象表现为一个数据结构,比如说链表,比如说树、图,很难有效地打印出来。3、有时候bug自然触发的概率很低,需要用一些人为的手段来帮助触发(比如故意在某个原本比较快的过程中增加sleep,模拟压力大时延迟增加的现象),需要增加一些额外的代码。调试日志也不是终极的解决方案,它还差得远,当你需要解决更加复杂的问题的时候,你会开始发明一些新的调试方式,比如说使用监控系统提交监控数据,比如说交互式的Admin Console。在实践中,程序的调试方法并不局限,一个有经验的程序员会选择当前条件下最为善巧方便的方法。【19】(作者:Aman)delta.什么是调试器(debugger)在充分地介绍了 bug 和 debugging 后,我们终于可以来看一看 debugger 了。这一节的目的是简单介绍调试器的功能和工作原理。本来我想着展示一些实际调试例子,但是调试本身就是一个非常跳跃的过程,其中的思路通常都是非线性的,gif 录制时间过长的话加载起来还是挺费事的,我会在下面给出一些一些调试示例的资料。(调试的展示我会在本文的 emacs 部分进行,但也仅仅是使用相当简单的代码展示基础功能而已。)在写下这一句话的时候,我用过的调试器只有 VS 中的调试器和 gdb(gnu debugger)(我甚至只使用过断点功能),而且大多数时间我都是 print 走天下。调试器使用经验的缺乏必然会导致下文中某些低级错误的出现,请在我没有注明引用来源的地方谨慎阅读,因为其中会不可避免地带有我的个人偏见,它们不一定是正确的。先给出根据维基百科【21】的说法,调试器的定义如下: A debugger or debugging tool is a computer program used to test and debug other program(the "target" program). The main use of debugger is to run the target program under controlled conditions that permit the programmer to track its operation in progress and monitor changes in computer resource (most often memory areas used by the target program or the computer's operating system) that may indicate malfunctioning code. Typical debugging facilities include the ability to run or halt the target program at specific points, display the contents of memory, CPU registers or storage devices (such as disk drives), and modify memory or register contents in order to enter selected test data that might be a cause of faulty program execution.翻译即:调试器或调试工具是一种计算机程序,它被用来测试或调试其他的程序。调试器的主要用途是在受控条件下运行目标程序,以此允许程序员跟踪正在进行的操作,和监视可能导致故障的计算机资源(最常见的是被目标程序或计算机系统使用的内存区域)。一般的调试功能包括能够在指定的位置运行或停止目标程序、显示内存内容,CPU 寄存器或存储设备,以及修改内存或寄存器内容来输入可能导致程序执行错误的数据。一般来说,调试器会在 top level 提供一个查询处理器(query processor)、符号解析器(symbol resolver)、表达式解释器(expression interpreter)和调试支持界面(debug support interface)。调试器也提供了一些更加复杂的功能,比如单步运行程序,在某个地方停止(断点功能),和跟踪某个变量值的功能。一些调试器还有在程序运行时修改程序状态的能力,还可以在程序的不同位置继续执行,以绕过崩溃(crash)或逻辑错误。1.调试器应该具有的功能关于调试器的详细功能,我貌似找不到一个比较权威的说法,这里就主要参考了 gdb【23】 和 VS 中调试器【22】提供的功能。由于 GUI 演示起来方便直观,这里就使用 VS 上的调试器来录制 gif。一、单步执行(single-stepping)顾名思义,单步执行就是一下只执行一步。在调试过程中一步一步跟踪程序执行的流程,根据变量的值来找出错误的原因。在 VS 的 C++ 调试中,按下 F11 就进入调试模式,此时程序会停在 main 函数开头等待下一步指示。继续按下 F11 的话,每按一次,程序就会执行一次语句,然后在语句结束的地方停住(或者说是下一条语句的开始处),就像这样:4如果语句中含有函数调用的话,单步执行会跳到最深处的函数的开头,然后在你的指令下顺序执行该函数。如果你不想一步一步调试内层函数的话,可以使用跳出指令来一次性完成该函数的调用,它的快捷键是 SHIFT + F11。如果不关心内部函数调用的话还可以使用逐过程指令 F10,它将每个语句视为一个整体,不会因为语句中的函数调用而跳转到被调函数的开头,而是完整执行完当前语句后等待后续指令。一般来说是不会这样从头到尾单步调试的,单步调试需要配合断点使用。二、断点(breakpoint)这大概是我在写这篇文章前唯一使用过的调试器功能(是的,我之前没用过单步执行的功能,我一般先靠 print 猜出错误发生点,然后在这个点打上断点.......)。断点的意思就是在程序中插入一个中断点,当程序执行到这个地方的时候就暂停,等待下一步的指令。通过打断程序的执行,程序员可以通过检查程序当前状态来判断程序是否存在错误。在 VS 中打断点的方法是:在代码行的左边单击左键。点击后你可以看见一个红点,再次点击可以将它去掉,就像这样:5按下 F5 开始执行的话,代码就会在断点处暂停,并等待其他指令继续执行。到达断点后就可以使用工具观察当前状态了。此外还可以通过设置各种条件来控制断点的行为,比如断点命中次数,条件变量等等。在断点触发时,还可以定义一些操作,比如输出一些调试信息。三、检查数据(Inspect data)调试器应该提供监视当前数据的能力,这些数据可以是:局部变量和全局变量寄存器和内存调用堆栈线程VS 调试器关于这方面的使用说明汇总在这个页面,可以前往参考。由于内容过多这里就不进一步展开了。上面的三个功能应该是调试器最显著的功能。2.调试器的原理由于能力不够且已经有人写出了很好的文章,这里我先贴上一些网址:how debugger worksHow debuggers work: Part 1 - BasicsHow debuggers work: Part 2 - BreakpointsHow debuggers work: Part 3 - Debugging information下面是上面后三篇的中文翻译:调试器是怎样工作的: Part 1 – 基础调试器是怎样工作的: Part 2 – 断点调试器是怎样工作的: Part 3 – 调试信息英文原文作者是:Eli Bendersky,他的网站是: http://godorz.info中文译者是 ripmu,他的网站是: https://eli.thegreenplace.net这里还有另一位翻译了上述文章的博主: https://hanfeng.ink ,不过时间已经是 2019 年了。原作者的博客从 2003 年到现在居然没断过,属实有毅力。跟着这些文章过一遍是很有好处的,但是并不是每一个人都有装了 Linux 的机器,而且这些文章对汇编知识有一定的要求。下面这一片文章是我能看懂的类型:调试原理(上面这些文章我只留了个网址,之后的有效性还真不好说。如果你觉得某些文章值得收藏可以去原网址保存一份,网址失效了可以搜索文章标题。不过好的东西总是存在的,所以也不用太担心找不到相关的优质资源,i just let it go ~ 2021-07-03)epsilon.Emacs 中的调试写了这么多,总算是介绍完了 bug,debugging 和 debugger 三大内容。接下来就是 Emacs 相关了,我会介绍一些 Emacs 提供的调试机制。1.对变量和函数的追踪对变量的追踪主要和 add-variable-watcher,remove-variable-watcher,get-variable-watchers 三个函数有关。add-variable-watcher 函数接受一个符号和函数,它的功能是在符号值即将发生改变前调用参数函数。符号参数就是要监视的变量名,参数函数需要接受 4 个参数:symbol, newval, operation, where。其中 symbol 是将要发生改变的变量符号,newval 是变量即将变成的值(在这个时候,变量中保存的值还是之前的值),operation 是一个表示变量改变方式的符号,它的值可以是 set, let, unlet, makunbound, defvaralias,where 是 buffer-local 值被修改的 buffer,如果变量不是 buffer-local 的,那么这个参数为 nil。remove-variable-watcher 接受符号和函数,它的作用是移除符号的 watch 函数。get-variable-watchers 函数接受符号,并返回符号上挂载的 watch 函数表。下面的代码演示了 variable-watcher 的用法:(首先需要创建一个叫做 yy 的 buffer)(defun easy-watcher (syn nv op where)
"just display it"
(with-current-buffer "yy"
(goto-char (point-max))
(insert (format "val: %s, newval: %s, operation %s, where %s\n" syn nv op where))))然后执行以下命令:(add-variable-watcher 'abc 'easy-watcher)
(setq lexical-binding nil)
(let ((abc 1)) 1)
(setq abc 2)
(makunbound 'abc)这样就可以在 yy buffer 中看到以下消息:val: abc, newval: 1, operation let, where nil
val: abc, newval: nil, operation unlet, where nil
val: abc, newval: 2, operation set, where nil
val: abc, newval: nil, operation makunbound, where nil对于函数的追踪和变量很相似,它是通过 trace-function,trace-function-background,untrace-function 和 untrace-all 四个函数来进行的。trace-function 是 trace-function-foreground 的别名,它接受一个固定参数和两个可选参数。固定参数就是需要追踪的函数,两个可选参数是 BUFFER, CONTEXT,BUFFER 就是写入追踪信息的 buffer,CONTEXT 要求是一个无参函数,调用它时返回的值会被插入 BUFFER 中。一般来说,后面两个参数是不用管的。在开始追踪后,每当调用函数时就会在 BUFEER 中插入 Lisp 风格的追踪消息,消息中包含函数的参数和返回值。如果 CONTEXT 返回值不为 nil 的话也会被插入 BUFFER 中。每当函数被调用时,BUFFER 都会弹出。与 trace-function-foreground 不同的是,trace-function-background 在函数调用时不会将 BUFFER 弹出。untrace-function 会取消对函数的追踪,untrace-function 会取消对所有函数的追踪。下面是一个简单的例子:6如果使用一些被频繁调用的函数的话,效果可能会非常惊人:(这个时候就应该用 trace-function-background)72.Elisp 的内置调试器Lisp 调试器提供了暂停(suspend)求值的能力,当求值被暂停时(一般被称为中断),你可以检查运行时堆栈,检查局部和全局变量,或者对它们进行修改。这个调试器的显示效果和 Python 出现了未处理的异常很像,就像这样:8从上图可以看到,从调用函数 a 开始,Traceback 一直回溯到了出问题的函数 c。用 elisp 来做一遍的话,效果是这样的:9可以看到,它和上面 python traceback 显示的内容相似,只是顺序反过来了,c 出现在了最上面。从我按下 C-x C-e 调用 eval-last-sexp 到出现除零错误,调用栈在 *Backtrace* buffer 中显示的顺序是从下到上的,逐步到达最里层的函数调用。当出现错误时,调试器就会弹出,不过也可以通过设置一些开关变量来控制,比如 debug-on-error ,如果它的值被置为 nil 的话,当我调用上面的函数 a 时就不会出现 backtrace ,而是在底部栏显示: Arithmetic error。不过想要设置该变量为 nil 的话还需要注意 eval-expression-debug-on-error 的值,如果它为 t 的话,在你设置通过 eval-last-sexp 将 debug-on-error 设为 nil 后,debug-on-error 的值依然为 t。其他的一些选项可以参考这里。除了等待错误找上门来,我们也可以主动点,在函数调用发生时就调用调试器。这里涉及到两个函数:debug-on-entry 和 cancel-debug-on-entry ,两者都接受一个函数名字来作为参数。使用 debug-on-entry 标记过的函数被调用时就会触发调试器。与之相似的,可以使用 debug-on-variable-change 和 cancel-debug-on-variable-change 来使标记过的变量在被修改时调用调试器。这个功能我感觉用来演示调用栈的变化是十分生动形象的:10在上面的调试过程中,由于它是一个递归过程,所以每当开始下一层递归时,函数调用自身使调用栈增长,直观的表现就是 *Backtrace* buffer 的拉长,如果改成迭代的话就没有这个效果了。我在这个过程中一直在摁 c 键,它是一个调试快捷键,表示“继续执行”的意思,每当遇到 yy-fact 函数调用时调试器就会使程序停下来,从而就有了上面的效果。除了显式标记函数入口的方法可以主动调用调试器外,我们还可以直接调用调试器。这可以通过在想要调试的地方加上 (debug) 函数调用。就像这样:(defun a ()
(if (debug) 1 2)11从上面的 gif 中可以看到,第一次 echo area 显示了 t1,第二次显示 nil2,根据 if 分支的不同值,可以发现 (debug) 表达式的值影响了分支走向。在上面我使用快捷键 r 来指定 (debug) 的返回值,从而控制了函数行为。如果没有使用 r 的话,(debug) 默认会返回 nil。不过上面这种玩笑式的用法是官方文档所不推荐的,因为这样用改变了原有代码的逻辑,(debug) 的返回值最好是被忽略掉,不对原有代码造成影响比较好。文档建议在像是 progn 顺序执行的地方使用 debug,这样可以避免返回值造成影响。除了我上面提到的 c 和 r ,还有许多其他的按键命令,它们可以通过在 *Backtrace* buffer 中按下 h 或 ? 来显示,或者参考这里和这里。我毕竟不是来抄文档的,关于快捷键我就说这么一点。在我使用这个 debugger 的时间里,我几乎就没有主动调用过它,不看文档的话我还以为这就单纯是个调用栈回溯器。它里面还有很多有意思的东西,不过我的介绍就到此打住了。3.edebugedebug 是一个源代码级别的调试器,关于它的功能,文档上是这样说的:提供单步调试和能力可以设置有条件或无条件断点可以在某一全局条件满足时停止快速/慢速的跟踪显示变量和表达式的值出错时停住显示 backtrace等等......Elisp 内置的调试器主要是起辅助作用,相比之下 edebug 就是个非常完整的调试器了。鉴于我是在学习而不是了解这个玩意儿(说不好真的用得上),下面我会尽可能按照比较自然的顺序覆盖文档中的大部分内容。3.1.一些基础知识首先是如何让代码能够变得被 edebug 调试,这就需要对代码进行调校(instrument)。在调校之后,函数中会插入一些额外的代码(这不会修改源代码),以便于在合适的地方触发 edebug。通过快捷键 C-M-x 可以对定义求值,带上前缀的话就可以在定义函数之前完成对函数的调校,即 C-u C-M-x。这个快捷键按起来还是有点麻烦的,不过这也正好与通常的求值区分开来。如果当前主要目的是调试,那可以将 C-M-x 作为调校的快捷键,这可以通过修改 edebug-all-defs 选项来达到目的,当它的值为非空时,C-M-x 就会进行调校,其他的一些函数比如 eval-region,eval-current-buffer 和 eval-buffer 也会进行调校。除了通过 setq 来设置变量外,emacs 也提供了 edebug-all-defs 命令来翻转这个选项的值。上面提到的都是对函数的调校功能,如果把选项 edebug-all-forms 设置为非空的话,任意的代码都可以被调校,即使是非函数的代码。这个选项可以通过 edebug-all-forms 来翻转值。使用 edebug-eval-top-level-form 会调校所有的 top-level 形式,它的行为不受 edebug-all-defs 和 edebug-all-forms 的影响。如果想要在调试过程中对某个还没有被调校的函数进行调校的话,可以使用 I (edebg-instrument-callee)来对某个被调函数进行调校。不过要做到这一点需要这个函数对 edebug 是可见的,edebug 需要知道这个函数的位置。因为这个原因。在载入 edebug 后,调用 eval-regin 会记录每个经它求值的函数的位置,即便没有进行调校。要想取消对某个函数的调校的话,可以对函数进行重新求值。除此之外也可以调用 edebug-remove-instrumentation 命令。其次就是一些调试过程中的注意事项了。当调用某个被调校过的函数时就会激活 edebug,并进入调试模式,在进入调试后,源代码的 buffer 会暂时变为只读的。edebug 的在进入调试后暂停并等待下一步的指令(默认模式下)。在调试模式中,光标所在的位置就是当前的执行位置(在你没有自己易懂光标的情况下)。除了光标外,在执行的当前行的最左边还会有一个标识(小箭头),表示当前的执行位置在源代码中的行位置。在 edebug 中,凡是能够停止的点被称为 stop point(下面使用”停止点“这个词来表示)。对于表来说,表的表头和表尾都是停止点,就像对于 (+ 1 2) 它的停止点就是下面表达式打点的地方 .(+ 1 2).。对于变量来说,停止点只有一个,那就是变量的后面,比如对于变量 n ,它的停止点就是 n.。以一个简单的 fac 函数为例,它所有的停止点为:(defun fac (n)
.(if .(< 0 n.).
.(* n. .(fac .(1- n.).).).
1).)面对平行关系的表达式,比如 (progn (print 1) (print 2)) 中的两条打印表达式,执行过程应该是从第一表达式的首停止点执行到尾执行点,然后再到达第二表达式的首停止点,再执行第二表达式到达尾停止点,如此继续下去。对于嵌套关系的表达式,比如 (+ a (+ b c)) ,执行是从外部表达式的首停止点,到内部表达式的首停止点,再到内部表达式尾停止点,再到外部表达式尾停止点。多重嵌套也是这个规则,即由外到内再到外。(记住变量只有尾停止点)下面我以 fac 函数为例来展示一下单步执行的过程。它与上面的 fac 定义一致,可以对照观察(这里使用的是 t 命令,它以一定的时间间隔来单步执行,仔细看的话可以在图片的最左边看到黑色的小三角,这就是当前执行行标识,看不见也没关系):12上面的 gif 时间太长了,看个十几秒你就应该清楚所谓的停止点的意思了,下面我把 t 命令的时间间隔调短一点,方便观察全部过程(这里也可以使用 T 命令,不过又太快了点):13算了,还是放上使用 T 命令的 gif 吧(下面的代码说明它的间隔时间和 edebug-sit-for-seconds 没什么关系):14在命令式的语言中(比如 C),代码一般是以语句为单位的,一般来说一行就是一个语句,这样加断点的话以行为标识是很方便的,但是在 elisp 这样的以表达式为单位的语言中,由于表达式通常是组合在一起的,所以很难根据行来加断点,我猜这是引入停止点的必要所在。3.2.edebug 中的单步执行在上面我演示了 edebug 的自动单步模式,也就是 t 命令(在 edebug 中它被叫做 trace 模式)。同时我也提到了 T 模式(Rapid trace),它的速度真的是非常快。那么有什么办法来自己一个一个的执行呢?那就是使用 n 模式 和 SPC 模式。SPC 就是键盘上的空格,每按一下,程序就从当前停止点跳到下一个停止点,光标也是跟着跳动。与 SPC 模式不同的是,n (next)模式是从上一个结束停止点(也就是尾停止点)跳到下一个结束停止点,它所使用的函数是 edebug-next-mode。对于 t 模式和 T 模式,只要按下按键,代码就会开始执行而不需要其他指示了。如果想让它的执行在中途停下来的话可以使用 S (stop)模式,也就是按下大写的 S 键,这样调试器使代码暂停执行并等待下一个指令。以上就是和单步执行相关的全部内容了,不过在开始下一小节之前我们还是先来看看 edebug 的初始模式(edebug initial mode)。默认情况下它是 step 模式,也就是开始是暂停状态并等待指令,它还可以是 next ,go,Go-nonstop,trace,Trace-fast,continue 和 Coutinue-fast 。要指定初始模式的话,可以使用 C-x C-a C-m 并输入每个模式的首字母即可(step 模式得用空格)。各种模式对应的效果可以参考官方文档。举例来说的话,如果我把初始模式设置为 t ,那么我调用函数进入调试器时就会开始间隔时间执行,而不必等待我的指令。其他的模式你可以亲自试一试。还需要说明的一点就是,初始模式就是指一开始的模式,如果按下其他模式对应的按键的话,模式就变了。3.3.edebug 中的断点除了使用单步执行外,我们也可以让调试器一直执行,直到碰到了什么条件或断点使它停下来为止。下面我们先从介绍怎么打断点开始。我们现在已经知道了停止点的概念,而断点就是打在停止点上的点。使用 b 模式和 u 模式可以为在光标所在的停止点上打断点和取消断点。如果在使用 b 时还加上前缀 C-u 的话,这个设置的断点只会生效一次,随后就自动取消了。使用 U 模式的话可以取消所有的断点。使用 D 模式可以对当前光标所在停止点的断点进行翻转(没有则加上,有则取消)。要找多设置的所有断点,可以使用 B 模式,每按一次 B,光标就会从一个断点跳到下一个断点,或者从非断点为止跳到断点为止。下面是对使用 b 模式设置断点的演示:15这里我是用的执行指令是 c(continue) 模式,它与单步连续执行的 t 模式很相似,不过它不是在停止点暂停,而是在断点暂停等待固定时间间隔后继续执行。C (Rapid continue)和 T 模式很相似,速度飞快。而 g (go)和 SPC 对应,表示执行到断点后暂停。G (Go non-stop)模式表示的就是直接执行,忽略断点。使用 S 也可以使上面的过程停下来。除了无条件断点外,还可以通过 x 模式加上条件断点,就像这样:16加入条件断点后我按下 c,在 n 等于 0 时暂停了一秒钟,然后就完成了函数调用,这是符合预期的。如果将 conditon 设置为 t 的话,那么这个断点和普通断点是一样的。在循环次数很大的时候,使用条件变量是很有好处的。除了普通的条件断点,你还可以设置全局的条件断点(global break condtion),当条件满足时断点就会被触发,这个触发位置不是人为设置的。在每一个停止点 edebug 都会对这个全局条件进行求值,如果得到一个非空值,代码的执行就会根据当前模式暂停。这个全局条件表达式被存放在 edebug-global-break-conditon 中,你可以在 edebug 被激活时使用 X 模式来设置它,或者在任何时候使用 C-x X X 来进行设置。全局断点条件是对事件进行调试最简单的方法,但是它会使代码的执行速度变慢很多,在不使用的时候最好把它设置为 nil。通过 b,x 设置的断点在程序被重新调校之后就会消失,如果想要保存打断点的位置的话,可以在源代码上写出断点的位置,这可以通过调用 (edebug) 办到,就像这样:(defun fac (n)
(if (= n 0) (edebug))
(if (< 0 n)
(* n (fac (1- n)))
1))如果代码没有被调校的话,对 edebug 的调用就是调用 debug。3.4.在 edebug 中观察数据当 edebug 处于暂停状态时,你可以通过对一些表达式求值来说去想要的变量的状态。除了 edebug 显式保留的数据外,对导致副作用的表达式求值会得到想要的后果。求值可以通过 e 或 M-: 来进行,前者调用的是 (edebug-eval-expression) ,后者则是 (eval-expression),它们的求值环境在 edebug 的上下文中。除了这两种方法,使用 C-x C-e 也是可以的,它会调用 (edebug-eval-last-sexp)。以下是具体的例子:17前几次求值我使用了 e 和 M-: ,并通过 setq 将 n 的值改成 10,使得结果发生了变化。除了使用上面这种简单的求值方法来获取变量或表达式的值外,我们还可以使用求值表 buffer(evaluation list buffer),该 buffer 的名字是 *edebug*,使用它可以交互式地对表达式进行求值。你还可以在它里面设置表达式让它在 edebug 更新时自动对表达式求值。在 edebug 调试模式中按下 E 即可进入该 buffer,使用 C-c C-w 可以回到原 buffer。在其中你可以使用 lisp-interaction-mode 中的常用快捷键,比如 C-j ,C-x C-e 之类的。除此之外,它还可以在 buffer 中保留求值表,一旦代码更新了某个值就可以在 buffer 中体现出来。使用 C-c C-u 可以根据 buffer 中的内容建立求值表,使用 C-c C-d 可以删除求值表中的一些项。求值表是通过求值表组(group)建立起来的,每个求值表组都由一个或多个 Lisp 表达式组成,组之间通过注释分隔。下面是使用示例:18你可能感到有些奇怪,上面明明在对 (+ n 1) 和 (+ n 2) 加入求值表组时已经加了注释,在使用 C-c C-u 时它们却没能加入到求值表中,只有 n 在求值表中。经过分析我发现,这是 emacs 注释对齐搞的鬼,如果注释只有一个; 的话,它会被对齐到中间,通过查看 edebug 的源代码我发现它只能处理顶格的注释行,也就是满足 ^; 正则的注释。因此,一种解决方法是,在写求值表组时使用多个分号,这样注释就不会被强制对齐,而是正常地在行首,可以被识别。但是这样的组经过 C-c C-u 后还是会变成单分号形式的注释,下一次调用 C-c C-u 后它又不能正确识别了。另一种解决方式就是修改 emacs 源代码,将正则改成能够识别注释前空格的形式,就像这样:19这个函数的名字是edebug-update-eval-list。这里我将上面的正则替从 ^; 换成了 ^[\t ]*;。来看一下效果:20目前(2021/7/4)我不是很清楚这是不是 bug。(如果是的话,那我岂不是在写关于调试的文章时还顺带发现了一个 bug?)3.5.其他的一些杂项除了上面提到的几种前进方式(t,SPC,c 等等),还有一些,这里列在下面:h 模式,使用它可以执行到最近的停止点f 模式,执行一整个 s 表达式o 模式,执行程序直到最后一个 s 表达式之前i 模式,进入停止点之后的被调函数? 命令可以显式所有的帮助消息。q 可以退出 edebug 并回到 top-level。r 可以显式最近执行的表达式的值。d 显示 backtrace。w 命令可以让光标回到当前的停止点。3.6.文档中我没有介绍的我没有介绍 Views 这一小节,因为目前我对 windows configuation 一无所知我没有介绍 Coverage Testing,原文档并不长我没有介绍 Edebug and Macros,因为我很少写宏我没有详细介绍 edebug 中的选项,因为文档中比较完整和详细基本上调试器的基本功能我都讲到了,其余的可以自行查看文档。后记呼呼呼,总算是写完了。这篇文章差不多用了我一周时间。我想写一篇关于调试的文章的起因大概是在上个学期的一次课设。上个学期我做了一个数字电子电路的小课设,选题是做一个带闹钟功能的数字时钟,可校准时间,可设置闹钟时间。这个课设我和队友用了三天的时间来完成,大概是用了十几片 74 系列芯片和上百根导线。成果如下:21在搭电路的过程中,各种各样的错误都出现了,比如导线和触点接触不好,芯片放反,导线接线过于杂乱而接错,三五定时器接错无法起振,开关抖动,等等。。。。。。面对如此多的问题,我唯一能够凭借的只有手里的万用表和一对眼睛。通过这次大作业我发现了模块化的重要性,首先通过测试确保一个模块是正确的,之后就只需要关注模块与模块之间的连接关系了。这应该也属于单元测试的一种。促使我写下这篇文章的直接原因是一个让我深感挫败的 bug。本学期我在帮助朋友写科学计算题时,由于没有考虑到数据流的非单调递减性,在前后数据相除并以结果来求 sqrt(1 - ans^2) 时由于 ans 大于一使得 sqrt 返回 nan。这个错误我花了一天时间才找出来,这是我没有使用日志文件的缘故。如果使用日志的话,应该很容易在文件中看到 nan。借助学习 emacs debugger 的机会,正好把这些问题都理一遍,也算是亡羊补牢了。文章中的某些方法(比如打 log)我现在还没有掌握,只能在之后的实践中继续学习了。这里推荐一本叫做 Debug Hacks 的书,据说书里面总结了一些调试故事和调试方法。(虽然我还没看过(笑))。能看到这里的同学们辛苦了,之后的近几篇文章我会学习一些关于测试的知识,然后结合 emacs 介绍一下。用了 cnfonts 之后,终于可以用 emacs 的 markdown-mode 来写写 markdown 了,Windows 上 emacs 默认的中文字体简直不能直视。相比于使用 marktext ,emacs 我用起来更舒服一点。当然 marktext 也是相当优秀的 markdown 编辑器,现在我可以一个用疲了用另一个。(如果题图总是 cirno 的话那我岂不是发不完所有东方角色的图了,干脆之后每篇文章的结尾都放一张不同的?)(图片来源:aHR0cHM6Ly95YW5kZS5yZS9wb3N0L3Nob3cvNjczOTUy)21参考资料【1】 https://en.wikipedia.org/wiki/Debugging【2】 https://en.wikipedia.org/wiki/Grace_Hopper【3】 https://en.wikipedia.org/wiki/Ada_Lovelace【4】 https://paris-swc.github.io/python-testing-debugging-profiling/【5】 https://en.wikipedia.org/wiki/Software_bug【6】 https://en.wikipedia.org/wiki/Year_2000_problem【7】 http://www-users.math.umn.edu/~arnold//disasters/patriot.html【8】 https://www.bugsnag.com/blog/bug-day-ariane-5-disaster【9】 https://www.scnsoft.com/software-testing/types-of-bugs【10】 https://www.softwaretestinghelp.com/why-does-software-have-bugs/【11】 https://economictimes.indiatimes.com/definition/debugging【12】 https://www.cs.colostate.edu/~cs165/.Fall17/recitations/W11L2/doc/debugging.html【13】 https://www.elprocus.com/what-is-debugging-types-techniques-in-embedded-systems/【14】 https://sites.google.com/site/assignmentssolved/mca/semester5/mc0084/6【15】 https://baike.baidu.com/item/%E6%9C%9B%E9%97%BB%E9%97%AE%E5%88%87【16】 http://www.lamost.org/~yzhao/history/chinesemedicine.html【17】 https://www.cnblogs.com/luguo3000/p/3543487.html【18】 https://www.zhihu.com/question/20626825/answer/106888829【19】 https://www.zhihu.com/question/364727399【20】 https://www.scalyr.com/blog/the-10-commandments-of-logging/【21】 https://en.wikipedia.org/wiki/Debugger【22】 https://docs.microsoft.com/zh-cn/visualstudio/debugger/what-is-debugging?view=vs-2019【23】 https://sourceware.org/gdb/current/onlinedocs/gdb/【24】 https://en.wikipedia.org/wiki/Breakpoint本文依据 CC BY 4.0 许可证进行授权。

1~9这九个数字的乘方所得的结果,其个位数字是有规律的,如:2 1 =2,2 2 =4,2 3 =8,2 4 =16,2 5 =32,2 6 =64,…,由此知道2 n (n是正整数)的个位数字按2,4,8,6,2,4,8,6,…的规律变化,其它数字的乘方也有类似的规律.根据这样的规律可知,63 20 的个位数字是______. 扫码下载作业帮搜索答疑一搜即得答案解析 查看更多优质解析 根据上述一系列等式,得到结果个位数字以2,4,8,6循环,依此类推63 n ,结果是以3,9,7,1循环的,∵20÷4=5,∴63 20 的个位数字是1.故答案为:1 解析看不懂?免费查看同类题视频解析查看解答
六年级数学作文300字(精选40篇)  在生活、工作和学习中,说到作文,大家肯定都不陌生吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。那么一般作文是怎么写的呢?下面是小编收集整理的六年级数学作文300字,仅供参考,欢迎大家阅读。  六年级数学作文300字 篇1  今天,我把攒的零花钱拿出来数了数有1元的、2元的、5元的,还有10元的、20元的、50元、100元的人民币,我的零花钱还真攒了不少。我突然发现,人民币只有1、2、5这三种数额的票面,而没有其它数额。我感到很奇怪,我们几乎每天都要和人民币打交道,我却从来没有想过这是为什么。  我赶快跑去问妈妈,妈妈鼓励我说:“好好动脑筋想想算算,妈妈相信你能自己弄明白为什么的。”我定下心,仔细地想了起来。过了一会儿,我高兴地跳了起来:“我知道了,因为只要有1元、2元、5元就可以随意组成3元、4元、6元、7元、8元、9元,只要有10元、20元、50元同样可以组成30元、40元、60元……”妈妈听了直点头,又向我提了一个问题:“如果只是为了能随意组合的话,那只要1元不就够了吗?干吗还要2元、5元呢?”我说:“光用1元要组成大一点的数就不方便了呀。”这下妈妈露出了满意的笑容,夸奖我会观察,爱动脑筋,  在此,我也想告诉其他的小朋友:其实只要你多留心观察,多动脑思考,生活中还有许多有趣的数学问题在等着我们去挖掘、去探索……  六年级数学作文300字 篇2  在日常生活中,许多事都离不开数学,可见数学与我们的生活多么密切啊!  有一次,我和爸爸一起去买地毯,来到店里,爸爸选中了一种花色。这种花色的地毯有两种形状:圆形和正方形。服务员告诉我们:这两种地毯的周长是一样的,都是12.56dm。爸爸说:“反正大小都一样,你来挑吧!”我连忙喊道:“我来算算!”说完,我向服务员要了纸和笔,按老师教过的方法,全神贯注地算起了圆的面积。  算圆的面积先求圆的半径:12.56÷3.14=2dm,面积:3.14×2×2=12.56dm。正方形边长:12.56÷4=3.14dm,面积:3.14×3.14=9.8596dm。“即使圆和正方形的周长相等,它们的面积也不一定相等,买圆形地毯比买方形地毯划算。”我滔滔不绝地讲给爸爸听,爸爸听了目瞪口呆,一旁的服务员也夸我聪明,我别提有多高兴了。  数学就是要灵活运用,联系生活实际。只有掌握了数学知识,才能更好地让数学服务我们的生活。所以,我们要学好数学,让数学成为我们生活中的好帮手。  六年级数学作文300字 篇3  今天我姨在网上玩游戏时,正玩得兴高采烈时,突然,发现了网上购买衣服便宜了,然后,我姨对我说:"宁宁,快来,看网上购物一打5折,还是全?场打5折哦!还有网上购买东西够300元,还送300元,看划算不?”  我说:“姨,我没有学过打折的知识,我怎么会知道呢?”我姨说:“咦,我记得你六年级?数学书上有呀,去看看。”我说:“哦。”看过之后,我知道了几折就是原价的十分之几,也就是百分之几十。我还知道了如果想算出商品打折后的价钱,就用原价乘折扣等?于?现价。我姨问我:“这条连衣裙原价是156元,打五折,算算多少钱?”我不假思索的说:“原价是78元。”我姨惊讶道:“宁宁,你这是自学成才吗,我看是。”我说:“这很简单,用原价×折扣=现价,所以用156×0.5=78元。”我姨说:“0.5是从哪来的?”我又一次不假思索的说:“打五折就是50%,把50%化成小数是0.5呀。”?我说的头头是道。  身边的数学知识有很多,就看你留心不留心。  六年级数学作文300字 篇4  每当上数学课时,总能看到他积极踊跃的身影,他就是我们班的数学小达人――周睿远。  周睿远戴着一副眼镜,显得他更加有学问。记得有一次,戴老师提出一个很难的问题,难得我们抓耳挠腮,怎么也想不出来。就在这时,我们都目瞪口呆,小达人举起手来,心想:这可是难倒了全班55个人了耶,你能回答得出吗?我幸灾乐祸地想看他的笑话,同时也充满敬佩的心情,因为他数学成绩一直很优秀。只见他推了推眼镜,不急不慢地说:“我们可以画个图来表示烧掉的部分……”,看着戴老师脸上露出欣慰的表情,果然,他并没有答错。  当他回答完时,我们都被他思维方式惊呆了,直接是恍然大悟,茅塞顿开,并说道:“哦噢!原来是这样解的呀”,厉害,真不愧是数学小达人。  他的获奖证书有三好学生、计算小能手……,而且他也是体育小达人哦,几次在学校运动会给班级争光呢,真是文武双全啊!  他的脑筋很灵活,做题时也不是死板的。就说上次吧,做作业时,我一看题目老师在课上没讲过,我急忙跑去问周睿远他先是皱了皱眉头,然后对我说:“你把半径调个位置就行了”。我这被他这一点也看通了,我点了点头,说了声谢谢。  怎么样,数学小达人名不虚传吧!  六年级数学作文300字 篇5  数学可是门不一般的学问,它不是课本上枯燥的计算,也不是人们印象中乏味的图形;相反,它细腻而广泛地渗透在我们每个人的日常生活中。不相信吗?  早晨一睁开眼,看一看钟点,“数学一日”就开始啦!  我们在日常生活中接触的很多东西都蕴含着数学因素。比如在农民收割农作物之前,人们要准确地计算收割时间,以确保在恶劣天气到来之前把粮食收割完毕。在酿制啤酒时,酒厂的技术工需要准确地计算每一炉酒的发酵、蒸煮时间以保证成品啤酒获得最佳口感。  数学就像是个隐形的朋友伴随在我们身边,甚至在我们酣然入梦的时候,脑海中仍然有数以万计的细胞活动。  不光是我们的日常生活,在世界范围的公益活动方面,数学也发挥着无可替代的作用。在南非,平均每天有两百多名婴儿通过母婴传染的途径成为艾滋病人。对他们生活数据的精确掌握,有利于针对这一特殊人群展开救助行动。  从具体的个人,到跨越国界的拯救行动,从天文气象到地理生态,可以说,我们每个人的生活,同时也是数学的生活;生活中的数学,是真正活着的学问。  六年级数学作文300字 篇6  我们班有一个小数学专家。她是班上数学学科的代表,――罗青云!  罗青云很喜欢数学,加上先天条件,很快就成了数学老师眼中的宠儿,肚子里的蛔虫。只要你打开她那本精致好看的满是红印的作业本,你就会觉得她数学有多好。  我记得有一次,我在做作业的时候,遇到了“路障”。  正在这时,罗青云走过来问我,‘怎么了?谁欺负你了?还是遇到了“路障”?"  由于罗青云是我的好朋友,我把一切都告诉了她。她听完,拍了拍胸口,很自信的对我说:“没事,我在你不用担心!”  罗青云仔细分析了题目,告诉我解决问题的方法后,突然意识到自己太大意了,没有看清题目,不知道怎么做。后来她给我讲了其他几种解题方法,我也没觉得数学不再难了。  还有一次,数学老师让我们考。看着密密麻麻的试题,越写越烦。看看罗青云。她已经在查了。我不能让她超过我。我继续努力。  过了几天,分数出来了。她是稳100%,我比她少6分!这一刻,我忍不住尊敬她!  罗青云真不愧是我们班的小数学专家!  六年级数学作文300字 篇7  今天,数学老师出了一道关于流水行船的思考题,我不是很懂,就让妈妈给我讲了讲,可是我还没有听懂,妈妈突然给我说:“别做了,你去玩一会儿吧,下午我带你去划船。”我高兴地跳了起来!  下午,妈妈带我来到湖边划船,湖边坐着几位叔叔在等待顾客的到来。我问叔叔:“租一条船多少钱?”叔叔告诉我,一条船100元。妈妈付了钱后,叔叔拿来救生衣让我们穿上,我们就开始划船了。  我和妈妈顺着水流的方向开始划,船划的特别快,毫不费力。妈妈趁机问我:“顺水速度等于什么呢?”我突然明白了,静水速度(船速)+水流速度(水速)=顺水速度;然后,我和妈妈又逆水划了一次,船划得比较慢,而且很费力气。妈妈又问我:“逆水速度等于什么呢?”我回答:“静水速度―水流速度=逆水速度。”最后,妈妈说:“我们顺水划了一次,又逆水划了一次,是不是相当于从甲到乙,又从乙返回?”我说:“是的。”“那水流速度应该怎么求呢?”我抢着回答:“(顺水速度―逆水速度)÷2=水流速度。”妈妈夸我太棒了!  看来,数学跟我们的生活息息相关,我要努力地学习和掌握更多的数学本领,才能够学以致用,解决身边的问题。  六年级数学作文300字 篇8  你知道我为什么喜欢数学吗?因为数学有吸引力,所以我一直被它深深吸引。  今天学习了一个新知识,就是――加减的简单算法。学了简单的加减运算后,我的计算速度快多了,学计算也更容易了。举个例子吧!例如:367 498=?我就想这样想:我把498加为500,然后用367 500,发现我多加了2,于是和减去2,得到865.还有796 295?我觉得可以:796可以算800加,295可以算300。一个多加4,一个多加5,所以公式变成800 300-4-5=1091.看,多方便啊!  学完加法的简单算法,再学减法的简单算法就容易多了。比如:483-299,呵呵,稍微动一下头,就有办法了。我就拿299当300来减,因为减了1,所以只要结果加1,就是483-300 ^ 1=184,就容易计算多了。但是,我可以警告你:在计算和减法中最好不要动被减数的念头,否则会有麻烦!  现在越来越喜欢数学了,因为它让我学会了快速计算结果,数学真的让我回味无穷!  六年级数学作文300字 篇9  我的妈妈一点也不胖,却整天喊着要减肥。这不,吃饭吧,只吃一点“猫饭”;上楼吧,好端端的电梯不乘,偏要爬楼梯,要明白我家可住在14层啊。  今日,妈妈又要爬楼梯了。“你妈妈从1层爬到2层用了10秒,那么,她从1层到14层需要多少时间呢?”爸爸考我。我一听,便脱口而出:“14x10=140(秒),太简单了。”  “你上当了!你妈妈每爬一层,即一个间隔是10秒没错,从1层到14层到底有多少个间隔呢?你再好好想想。”爸爸轻轻拍着我的脑袋。  我是丈二和尚摸不着头脑,便扳起了手指头:1层到2层,1个间隔;再从2层爬到3层,又一个间隔;再从3层到4层,又一个间隔……原先从1层到14层仅有13个间隔。应当是13x10=130(秒)。  “噢!是130秒,不是140秒。因为1层不用爬,所以从1层到14层仅有13个间隔。”我尖叫起来。  “对了,层数-1=间隔数,你可要记住了。”爸爸哈哈大笑。  原先,上楼梯也有学问。  六年级数学作文300字 篇10  “叮铃铃”,随着一阵清脆的铃声,我们快马加鞭地冲进教室,以迅雷不及掩耳的速度回到了自己的座位上,因为这节课要进行一次数学考试,教室里弥漫着一种紧张的气氛。  试卷发下来了,我们顾不上写自己的名字,先迫不及待地看了看题,教室里有了小小的骚动。“糟了,这道题我没复习上。”“我的妈呀,这也太难了吧。”“哈,太简单了,小菜一碟。”……  “开始答题。”教师一声令下,教室里顿时安静了下来,连平时有名的说话大王何龙也闭上了嘴,瞧,他正认真地伏案疾书呢!教室里响起了一片写字的沙沙声,就像战场上的冲锋号。就这样,一场激烈的纸上战争开始了。进攻一,第一大题,填空。哈哈,太简单了,我三下五除二把这道题攻下了。二题,三题,很顺利嘛,看来这次我必须会得高分了。第四题,糟糕,卡壳了,一分钟,两分钟过去了,我的脑门渗出了汗珠,握着笔的手不停地抖着,我绞尽脑汁苦苦思索,仔细地回忆教师的讲解。唉,谁让我上课没好好听呢?真是报应啊!唉,还是做下一题吧。  试卷交上去了,看到有些同学兴奋得脸上都泛起了红晕,可我怎样也高兴不起来。可是,“忘羊补牢,为时不晚。”下次考试,我必须能交一份满意的答卷。  六年级数学作文300字 篇11  这学期我们要换一位数学教师,是夏教师。据我对他的了解我觉得这是一位严厉的好教师。  这位教师给我们上过两次课,一次数学公开展示课和一次心理课,仅仅这两次接触,我对他产生的第一印象就是严厉,他长得高高的,瘦瘦的,不像别的教师脸上总是挂着笑容。  他上的那节数学课令我印象深刻,(.)在那节课上,班上往日上课时的窃窃私语声不见了,大家都学得很认真,注意力全都集中在了这位教师身上,专心致志的听着他的每一句话,他还用了一个简短的小句型概括了当天数学课上所学的知识,给了我们一个不一样的感受,之后,他一喊下课,清脆悦耳的下课铃也就打响了,同学们这才回过神来。  从夏教师给家长的信息里,我就觉得这位教师应当很有职责心,还没开学就通知家长,好让我们做好准备,开学就要考试,他还创立了一个QQ群,这也许是为了更快地了解我们吧!我必须要开始好好努力了。这是一位多么认真、有职责心的教师啊!  说句心里话,我也有一点紧张和害怕,我那拖拉、马虎的坏毛病也要彻底改一改。  六年级数学作文300字 篇12  数学是一门纯粹的学科。学好数学不必须要有高智商。只要你踏踏实实打好基础,主义细节及错误,学会概括归纳错误的类型,  从而举一反三。  做数学不必须非得题海战术,只要把握规律,在脑中能拎起一个框架,在框架中的每一个环节,枢纽都有一道典型例题。我并不倡导死钻难题,做出则已,做不出来,不仅仅浪费时间,并且会产生挫败感,久而久之,妄自菲薄,会对数学失去信心不热情。做数学题目要少而精,少而频,温故知新。  我认为学好数学必须要做到以下几点:  (1)在课前必须预习教师所要讲解的资料,对于简单的要自己理解掌握,公理,公式和推论要有意识的去记忆,并划出自己不懂的地方;  (2)上课要认真听讲,绝对不能开小差,更要着重听你在预习式感到困惑的地方,并记下典型例题;  (3)课后要认真做练习,对自己把握得不好的地方要加大训练,记熟公式。  学习数学的主要方法就是加深理解,在理解上记忆。  数学它是一门严谨的学科,不许出半点差错。经过学习,发现要学好数学必须有谦虚谨慎的态度,细致慎密的思维和一丝不苟的精神。题目是千变万化的,而方法是唯一的,只要掌握好了学习数学的方法,学好数学自然就简单了。  六年级数学作文300字 篇13  在我们的生活中,处处都要用到数学。  不信?今日发生的事就证明了这一点。午时,妈妈给我二十元钱叫我到超市去买一瓶酱油和一瓶蜂蜜。到超市后,我首先挑选了一瓶“豆亨”牌酱油,需要4.40元。之后,我去买蜂蜜,钱够的仅有两种,第一种有8.60元,还有一种只要8.40元。我想:“第一种的六角和酱油的四角能够凑成一元,比较好计算,并且,第一种比第二种贵两角,说明质量也是第一种好。”于是,我拿起第一种蜂蜜和酱油,到收银台付了钱,拿着找回的7元钱高高兴兴地回家了。晚上,小伙伴们请我去滑冰,我爽快地答应了。我想:“今日我要带巧克力去,大家一起平均分了吃。”带几颗好呢?我想了想,就带十二颗。如果来二个,12÷2=6,能够平均分;如果来三个人,12÷3=4,能够平均分……照这样计算,来1、2、3、4、6、12个小朋友都能平均分。于是,我拿起十二颗巧克力出门滑冰去了。果然,来了三个人,我给每人分了四颗巧克力,正好分完。  生活中有许许多多的数学知识,粗心的同学可得不到它!  六年级数学作文300字 篇14  今天周末,是个大好日子,阳光明媚,晴空万里,非常适合跑步,于是爸爸就说带我去公园跑步。  来到公园后,爸爸说让我帮他计时,看看他跑一圈大概需要多久。计时开始,爸爸轻松跑完一圈只用了5分钟的时间。爸爸看完成绩后对我说:“铉烨,我给你多1/2的时间,你也来跑一圈。”而我顿时不服气了,说:“爸爸,我绝对不需要这么多的时间,你给我计时吧!”  我呼哧呼哧地跑完一圈,爸爸都惊讶了,说:“你太厉害了,只用了我的1/4的时间,再加上这个时间的1/2的时间,我多给你的时间都没用呢!”我急切地问:“那快告诉我成绩是多少吧?”爸爸却丢下一句:“这个只能够让你自己去算了。”  于是我算了起来,爸爸的时间是5分钟,我用了他的1/4,那就是5×1/4=1.25(分)然后再加上这个时间的1/2,那就是1.25+1.25×1/2=1.875(分)。哇!原来我可以跑这么快,真的是太开心了!  小作者们都有一双敏于发现的眼睛,一颗善于感受的心。数学源于生活,用于生活,愿所有的孩子都能做生活中的有心人,感受数学在生活中存在的价值。  六年级数学作文300字 篇15  今天,我在《小学生数学报》上看到这样一道题:甲、乙、丙、丁四人拿出同样多的钱,合伙订购同样规格的若干件货物。货物买来后甲、乙、丙分别比丁多拿了3件、7件、14件货物。最后算帐时,乙付给丁14元,那么丙付给丁多少元?  我看了题目后,感到这道题很简单嘛!便决定不看“分析与解”,自己先来做一做。于是,我三下五除二地做好了,但是,发现比“分析与解”里的答案少了几元。这下没折了,只有看看“分析与解”了:  四个人拿出同样多的钱买同样的货物,当每人分得的货物应一样多。实际上丁分得的最少,少多少?只要把甲、乙、丙三人多分的货物平均分成4份,即可发现分配时,丁少得(3+7+14)÷4=6(件)。丁少得货物的钱应由乙、丙付给。乙比4人平均分得的货物多7-6=1(件),他退给丁14元,说明1件货物货物售价14元,丁还少5件货物的钱,应由丙付,所以丙应给丁 14×5=70(元)。  看完之后,我真是惭愧极了,没想到是原来如此。看来,我们身边应该还有许多没被发现的数学,那就由我们―祖国的花朵,去探索和发现。事不宜迟,现在就要开始行动。  六年级数学作文300字 篇16  在寒假里,我和姥姥一起去买书。我们买了一本数学书,名字叫《怎样学好小学数学》。  这本书可好了,里面有“基础和拓展”、“训练测试卷”。不要看这小小的两项,里面的内容可真不少呢!  内容有“小数的认识和加减法”、“认识图形”、“小数的乘法”、“观察物体”、“小数的除法”、“游戏公平”、“认识方程”……训练测试篇里汇集了第一单元到第七单元测试AB卷至期末综合测试……  其中有一道有趣的题是这样的.:题目是《象棋游戏》,问谁先走棋最公平,我想来想去,问了很多人都没答出来。最后我一看答案,啊?!是用抛硬币来决定谁先走的方法来解决,真是出乎意料的答案。  我还联想到了生活中的游戏公平,比如篮球比赛开场时的争球,就不能你说给谁就给谁,也不能按照个人意愿将球给一方,而是由裁判将球在球场中央抛起,然后由两队各出一人争球,谁先争到球,球就落到了那一方,比赛就会正式开始。  我想如果世界上没有了公平,那么就会引起争吵;争吵就会引起战争;战争就会导致毁灭;最后有可能连国家也会没有了。  所以世界上没有公平是绝对不可能的,这种题型给了我很大启示。  六年级数学作文300字 篇17  曾经听一位奥数老师说过这样一句话:学数学如鱼网;解决问题就像捉鱼,掌握解决问题的方法,就像有网一样;所以,“学数学”和“学好数学”的区别在于你是有鱼还是有网。  数学这门课很有思想,很有逻辑,所以总给人错觉。  数学中的几何图形很有趣,每一个图形都是相互依存的,但也各有千秋。例如一个圆。计算圆面积的公式是s=r2.因为半径不同,我们经常会犯一些错误。比如“一个半径9 cm的披萨和一个半径6 cm的披萨等于一个半径15 cm的披萨”,在命题上,这个题目首先混淆了大家,给人错觉,巧妙地运用了圆的面积公式,给人一个错误的平衡。  其实9 cm半径6 cm的披萨不等于15 cm半径的披萨,因为9 cm半径6 cm的披萨面积是s=r2=92 62=117,而15 cm半径的披萨面积是s=r2=152=225,所以9 cm半径6 cm的披萨  数学就像一座山峰,直冲云霄。刚开始爬山的时候,我们觉得很放松,但是爬得越高,山就变得越陡,让人感到害怕。那时候只有真正热爱数学的人才会有勇气继续攀登。所以站在数学巅峰的人,从心底热爱数学。  记住,站在山顶脚下的人是看不到山顶的。  六年级数学作文300字 篇18  每年春节,相信大家有收到不少的压岁钱吧?现在,就让我给大家讲讲“压岁钱里的学问”吧!  妈妈告诉我:“钱存在银行里,在固定的时间内,会像妈妈生小孩似的,生出许多小钱来呢!这个小钱被大家称为利息。”我还是不理解,钱不就是钱吗,怎么还叫做利息呢?“那,什么是利息?”我继续问妈妈。妈妈解释道:“银行的存款利息都是按照年化利率计算的,假如定期存款一年期利率为,意思就是把100元钱存入银行,一年后就可以获得元的利息,总额就变成100+(元)了。”  按照家乡的习俗,上学前和学生时代都可以获得长辈的压岁钱哦!那我就来算一算,等到大学毕业时,我总共可以获得多少压岁钱吧。计算公式是:本金x年利率x存期+本金=本息。今年我共获得了5700元,那么存一年的本息是:(元)。以5700为平均每年得到的压岁钱来计算,总共会有(1+2+3+…21)+5700x22=(元)。  我刚算完,妈妈还告诉我,不同的银行,不同的存期,年利率都不一样,第一年产生的利息可以成为第二年的本金,但是这样计算起来会更加复杂。听着妈妈这样介绍,我感觉很迷惘,看来只有继续学好数学,才能把生活中的这些数学问题统统解惑了。  六年级数学作文300字 篇19  晚上,爸爸找了一道题让我算。题目是这样的:“有10个教室,每个教室又有6盏灯,现在关掉了5个教室的灯,还有几盏灯?”我听了后,心里暗暗开心,这种题目对于我来说小菜一碟,我便不假思索地回答道:“这还不好办!用6乘以10再减去6乘以5,不就算出还有30盏灯吗?”可是,出乎意料的是,我爸爸笑着摇了摇头,我有点不服,生气地问道“难道不是30盏灯吗?”  爸爸说:“你错了,问题问的是有几盏灯,并不是问亮着几盏灯,你怎么能减呢?”我听了恍然大悟,又仔细思考了一遍,“哦,原来正确的解法是6乘以10等于60盏灯!”这时,我也想到了一道智力题,便去考爸爸:“一个渔翁去钓鱼,钓了6条没头的,9条没尾的,8条半截的,问一共钓了几条鱼?”爸爸听完后,就开始算了起来,可是怎么算也算不出来,我得意洋洋地解释说:“ 6条没头的,就把‘ 6 ’的上部分去掉,成为‘ 0 ’,9条没尾的,就去掉‘ 9 ’的下半部分,成为‘ 0 ’,8条半截的,不管去掉‘ 8 ’上下任意一个部分,还是得‘ 0 ’,所以就是一条也没钓着。”  爸爸听完,哈哈大笑,连声说:“有趣、有趣。”  六年级数学作文300字 篇20  你在思考题中可能看见这样一道题目:给你一个在镜子里的钟表,要你得出实际上的时间。它看起来似乎很简单,其实做起来很费劲,还很容易搞错。首先要倒着标出1~12,然后看镜子里的钟表的时针和分针对应哪一个数字,最后再想它对应真实的时间是多少,但是几分几秒最容易搞错。  我发现一个简单的方法:如果镜子里钟表的时间是5:00,那么实际是7:00。如果镜子里钟表的时间是4:35,那么实际是7:25.如果镜子里钟表的时间是7:44:28,那么实际是4:15:32.你们发现了吗? 5:00 7:00=12:00,4:35 7:25=12:00,7:44:28 4:15:32=12:00。镜子里的时间和实际的时间的和是12时,也就是说12时减镜子里的时间等于实际的时间。为了计算简便,如果镜子里的时间到分,就可以用11:60-镜子里的时间。如果镜子里的时间到秒,就可以用11:59:60-镜子里的时间。假设镜子里的时间是8:32,那么实际上的时间是11:60-8:32的数,60-32=28,11-8=3,实际时间是3:28。还可以在验算一遍,8:32 3:28=12:00。  数学真是奇妙。  六年级数学作文300字 篇21  “哎呀,今天我们班借书。”我匆匆离开座位。“啪!”一本数学《课课通》被我碰掉在地。数学也有《课课通》?会有些什么内容呢?也像语文一样有那么多的词语意思吗?不可能!还是……来了兴致的我翻开了它,这条题目怎么看不懂?该怎么解呢?  刚想把书放回同学的位置上,耳边响起了妈妈的话语:“你呀,什么都好,就是不爱动脑筋。”我一定要解开这道题,让妈妈对我刮目相看。看她再说我不爱动脑筋,哼!一个半径9厘米和一个半径6厘米的比萨饼合起来与一个半径15厘米比萨饼是不是一样大?哎呀,原来这么简单,连幼儿园的小朋友都会,我怎么就糊涂了。还以为是什么大难题呢?我暗暗得意。这当然是一样大了,我胸有成竹地翻开答案。啊?不是。怎么会不是呢?我瞪大了双眼傻楞住了。难道答案印错了?别,等等……半径9厘米和6厘米比萨饼面积是s=9的平方乘以∏+6的平方乘以∏=117乘以∏,半径15厘米的面积是s=15的平方乘以∏=225乘以∏,所以这两个答案风马牛不相及嘛,真的好粗心。怪不得老师总说我有一个朋友叫“粗心”。  看来,要想学好数学,不仅要肯动脑筋,还要谨慎思考,不粗心才行啊!  六年级数学作文300字 篇22  我是一个不爱数学,讨厌数学的女孩,但一堂数学课改变了我。  一天,那个看起来很凶的数学老师走进了补习班,满脸不高兴的,刚走进教师就看水批评我们,说我们昨天的家庭作业做德乱七八糟,全班只有一个100分。大家听了,都不由自主的脸红了。过了一会,老师让我们猜猜这个得100分的同学是谁。同学们疑惑地眨着眼睛,晃着脑袋,叽叽喳喳地猜了。  ”要我猜呀,这个100分肯定是A。”  ”不对!应该是学习B,他的数学最好”  同学们一个说这个,一个说哪个,可老师一个劲地摇头。  ”老师,你快说是谁吧?”顿时,教师里热闹起来,大家都想等不及似的,很想快快知道谜底。  数学老师微笑着对我说;”这个100分会不会是你的呢?”  还没等我回答,教室里就议论纷纷的。  ”静一静”老师大声地说,”这个100分就是她,也许你们会很吃惊,但是当你们觉得她不可能办到的事,她越办得到。老师一边说,一边微笑着向我走来,眼睛里充满了信任。  ”以后你会有更多的100分的,老师信任你!”  ”恩。”我点了点头。这时,教室里响起了一片掌声。  从此,我发现我这个不爱数学。讨厌数学的女孩爱上了数学课!  六年级数学作文300字 篇23  我对数学一直有很大的兴趣,为什么呢?因为它就像孙悟空的七十二变化,变来变去也是围绕着基础概念题。但并不是说我在数学上是没有遇到过挫折。  有一次,数学老师出一道题目:乐乐在计算“3+□×8”时弄错了运算顺序,先算加法后算乘法了,得数是72.问正确的得数应该是多少?当时老师先给我们一点时间思考,我看了看题目,觉得不难,又看了看老师,觉得老师应该不会点到我。于是我就不认真思考了。谁知我的一举一动都被老师看在眼里。等时间到了,马老师第一个喊:“裴乐阳!”那声音就像炸雷一般。我紧张的站起来,支支吾吾地回答。老师见我回答不上来,就语重心长的说:“下次要多认真思考呀!”虽然老师没有多说什么,但是身为数学课代表的我,心就像被寒冷的冰冻住了。  回家后我仔细读题,认真思考,终于知道了答案和解题思路。第二天我把这些告诉了老师,老师还夸我是个好学生呢!  通过这件事情,让我明白没有简单的事情,只有认真对待,多思考的才能有意想不到的快乐。  六年级数学作文300字 篇24  “有种比数学!”这句牛气冲天的话,出自己班曾同学之口。偶尔说说也就罢了,这是他的口头禅。  在我看来,曾同学的数学也不咋样啊?一次测试,选择题全班就一个全对的,不是他。“有种比数学!”这句自信满满的话,曾同学对很多同学说过,是不是得罪了很多人?不知道,有心人可以调查一下。  12月26日晚修(星期四),也就是毛爷爷诞辰的日子,曾同学第一次对着我咆哮:“有种比数学!”哟呵!好嚣张!我也不是吃素的,回怼道:“哎哟哟!我怎么没种了?我两次数学测试选择题全对,你对了吗?”我知道他选择题没全对,戳到他的痛处,他脸一下就红了。我早就看不惯他了,继续怼:“有种你跟我比政治、比语文啊!”  曾同学是我班公认的小强,不会轻易服输的。他冷笑道:“可是我数学总分就比你高!”他一边说一边自嗨地鼓起了掌。  我毫不留情:“骄兵必败!”  客观来说,开口闭口“有种比数学!”也是一种自信,可我无法接受这种语气。曾同学,“骄傲使人落后,谦虚使人进步”的道理想必你也懂,我劝你还是谦虚一点的好。  六年级数学作文300字 篇25  一向,我就害怕数学,似乎就只有这门学科,让我一筹莫展,一点自信心也没有,我知道要把数学搞通,一点也不能心存侥幸,也没有一蹴可几的偷吃不可以偷懒,正因为我就是拿它没辄,我对它的恐惧与日俱增,甚至到了憎恨的境界。  只要当天有数学课,我就有很大的压力,极端不愿意这堂课的到来,果然老师滔滔不绝的把我最头大的算式和定理,毫不留情的抛掷出来,我的脑门金星直冒,接着我毫不犹豫的关上心门,开始神游,老师说的话是一阵风,一阵阵对我起不了作用,我的灵魂出窍到一个没有数学的地方。  一节粉笔扎扎实实的砸在我的额头,老师歪头看我,知道我根本进不了状况,他耐着性子,把我叫到讲台,给了我一个题目,按部就班的把解题的步骤慢慢说给我听,说也奇怪,是羞愧吗?我专心的听着,突然我竟然想笑了。  原来,一点也不难,只要我的元神乖乖听课,老师教的方法一点也不难懂,认真听,认真练习,我干嘛这么鸵鸟。这没有我想像中的困难呀!  这次的月考,我相信因为数学成绩的提升,我很有希望名列前茅哦!恐惧其实很莫名,回魂面对数学,让我走出恐惧的阴霾,让我快乐了起来。  六年级数学作文300字 篇26  今天妈妈带我去了丹尼斯超市,我们买了一些我们所需要的食物,饮料,生活用品等。  我们先到了三楼的零食区,我拿了旺旺大礼包的,发现旺旺大礼包有两种。分别是300克的每袋14.8元、580克的每袋26.5元,妈妈问我大包划算还是小包划算,我在心里想14.8约一包15元,那么100克就是大约三元;580克装的每克约2元,所以我说大包更划算。我们又去买了一些进口的饮料,我看了看单价,一大瓶果汁18元,我觉得价钱不是很贵,我让妈妈买了一瓶,妈妈说,当然可以,我要考考你,一瓶18元,买11瓶要多少钱,我脱口而出,198元,因为一个两位数和11相乘乘积,就是把两个阿拉伯数字相加的结果放在这两个数字之间,这是个简便的算法。  我们买完东西后结完帐,妈妈说我不告诉你们我花了多少钱,你来估算一下吧,我接过账单,飞快地把账单上的整数加起来,说大约160元。妈妈说真不错,我们一共花了162.5元,真的很棒呢,奖你一瓶饮料,我接过那瓶饮料,提着购买的物品开开心心地回家了。  数学真的是到处都有,无时不在,在生活中我们真的离不开这奇妙的数字,神奇的数学!  六年级数学作文300字 篇27  在生活中,我们身边许许多多的事物都和数学息息相关,例如,买东西啊,算支出和收入啊,等等,这些都与数学有着紧密联系。  数学是一门十分有趣的功课,只要你在学习中不断进取、摸索和体会,找到这里的奥秘,你就会领略到数学王国里无穷无尽的乐趣,例如,在数学中最常见的找规律、简算和最优化问题等等,你千万别小看这些数学问题,它们在生活中可一样都不能少,举个简单的例子来说吧,在日常生活中,我们经常会遇到怎样合理安排才能做到用时最少效果最佳的问题,解决此类问题时,必须用到数学统筹思想,能同时进行就尽量地同时进行。  我曾经遇到过这样的极值问题,妈妈煮饭需要20分钟,洗菜需要10分钟,炒菜需要10分钟,为了节省时间,请算出最少多少分钟?最优化问题证明,在煮饭的20分钟里同时进行洗菜和炒菜,20分钟后,饭煮好了,菜也炒好了,因此,合理安排煮饭、洗菜、炒菜的过程和次序,可以在最短的时间里完成煮饭、洗菜、炒菜工作,这就是数学的统筹方法。  类似的例子在生活中有很多很多。所以,我们一定要好好学习这门有趣的功课,为将来更好的使用数学这门工具打好基础。  六年级数学作文300字 篇28  一天,我和妈妈去买菜,来到菜市场先去买肉,妈妈买了2斤的肉,我算了一下,实在想不出,后来我回想起数学课上徐老师说的1斤=500克,那么2斤就是1000克了,妈妈也给我解释了一下,因为1斤就是500克,那么2斤不就是500克+500克吗,我明白了我们学过的克、千克。妈妈又去买了蔬菜,这回妈妈考了我一下,看看我会不会算了,她先买了30克的茄子,又买了20克的青菜,就回头问我说“茄子比青菜重多少克啊?”,我一下子就算出来了,30-20=10(克),妈妈又问我:“那么两样蔬菜加起来一共是多少克啊?”我又一下子就算出来了:20+30=50(克),妈妈听了,笑了。  妈妈又去买了烤鸭,哇!一只烤鸭就要36元,我看了一下重量,一只烤鸭1500克,这下我知道了,买东西是看单价是多少钱一斤,然后在看称出来的重量是多少,最后把单价乘以它的重量,得出的就是我们去买东西要付的钱。我又把今天买的所有的东西的重量加了起来,1000+20+30+1500=3000(克),我对妈妈说今天我们买了一共3000克的菜,妈妈夸我真棒!我学以致用,会用学过的克,千克来计算了。  六年级数学作文300字 篇29  同学们,在生活中,数学带给了我们很多好处,比如在买菜的时候可以快速算账,在数东西的时候可以快速合计。  在你们的数学学习中是否和我一样,会碰到一些有趣的发现。现在我就来介绍几个我的发现。  你会口算吗?下面我来教你几种巧妙的计算方法,第一种:如果你要算500乘以多位数时,只要把500扩大2倍再乘以被乘数,然后再把积除以2就可以了。比如算500×448628,先把500×2=1000,再把448628×1000=448628000,最后把448628000除以2=224314000。第2种:如果你遇到“头同尾合十”的计算题时,你可以这样巧算:用十位上的数字乘以十位上的数字加1的积,再乘100,最后加上个位上2个数字的乘积。例如:53×57=?怎么样?想出来了吗?其实很简单,先算(5+1) ×5=30,然后再算30×100=3000,最后3000+3×7=3021,你掌握了这个小窍门了吗?  数学真的太奇妙了!我要在以后的数学学习中更加努力,掌握更多的技巧。  六年级数学作文300字 篇30  幼儿园时,我认识了数学。那时在我心里的数学就是一首儿歌:一二三四五,上山打老虎,老虎没打到,抓到小松鼠。  一年级时,我觉得数学是一个游戏,加加减减,快乐循环。二年级时,我发现数学是一种智慧,原来1加2再加3,一直加到100,不用一步步计算。三年级时,我爱上了数学,它就像一座金字塔,吸引着我一步步地去探索奥秘……  数学的世界可真神奇!读了《可怕的数学》这套丛书,我惊叹于太多不可思议的数学故事,数学有着“可怕”的神奇!在语文书里我敬佩大禹治水三过家门而不入。在《数学大王》里我惊奇地读到大禹为了治理洪水,使江河不决流,他是应用了勾股定理因势利导才最终治水成功。还记得在《芈月传》里看到黄歇在集市上智破买鸡难题时我百思不得其解,直到读了《数学情怀》这本书,我发现我还可以像黄歇一样轻易计算出鸡兔同笼的问题。  数学是一把金钥匙,它为我开启了一扇扇奥秘的大门;数学是一艘潜水艇,让我看到了五彩缤纷的海底世界;数学是阿拉丁神灯,带我进入一个又一个神奇的境界;数学是阳光下的三棱镜,让我看到了魔幻的彩虹。  六年级数学作文300字 篇31  今天老师给我们布置了一个实践作业,用三角尺画角,你能画出多少种?  三角尺中有着90度,60度,30度和45度的角,我用三角板拼,迅速按照顺序拼出了75度、90度、105度、120度、135度和150度的角。可是,这样是不是就齐全了呢?我又拿着三角板不停地摆弄着,突然,我发现,45度的角和30度的角重叠之后还有新的角,这个角是三角板上两个角相减得到的,我迅速计算得到这个角是15度!这时候我恍然大悟,原来拼角不止是度数相加,拼在里面还可以度数相减呢!  这时候,爸爸走过来问我,你拼了这么多角!真了不起!你能告诉我这些角有什么规律吗?听了爸爸的话,我又陷入了沉思。15、30、45、60……180,这些不都是15的倍数嘛!原来,用三角板拼出的角的度数都是15度的倍数!  看来,拼角中隐藏的数学问题还真不少!经过这次实践作业,我知道了学习数学不仅仅是为了完成任务,更重要的是在实践过程中多观察、多思考,还能学到更多的知识!  六年级数学作文300字 篇32  唉!今天,老师把数学试卷发下来了,我居然只考了85分,回家一定会被骂一顿的。  正在郁闷的时候,我的同桌走过来对我说:“田浩宇,你这次数学考了多少分?”  我说:“别提了,肯定没你考的好,我只考了85分,你呢?”  “我考了100+10,全班第一!”同桌高兴地告诉我。  这个消息,让我一整天都处于紧张的状态,老是放不下心里这块大石头。  果然,晚上一回家妈妈就问:“丁丁,你这次怎么考得这么差?听王老师说,你连90分都没考到,这是怎么一回事?”  我连忙说:“老妈,您先别生气,消消气,消消气!”  妈妈甩着头说:“这么差的成绩,能不生气吗?把卷子给我看看。”  她一看卷子,脸刷地一下白了:“对你付出这么多,就次次考倒数来回报我?!”  我非常不服气,大声吼道:“我就是要次次考倒数,你能拿我怎么样?!”  妈妈听了非常伤心,但还是耐着性子给我讲了许多道理。  我决定再加把劲,把学习补起来,再也不能在上课的时候讲话了!  六年级数学作文300字 篇33  今天仿佛是数学的天下,今天我中午写了数学的每日一练,妈妈说要检查,我还信心满满的说不用检查了。结果下午就打脸了。  下午正上着阅读课,我正沉浸在鲁宾孙的历险当中,突然这安静的教室被打破了。  原来是张老师来教同学们讲题来了,老师迟迟不叫我,我本以为我是全对了,过了一会儿张老师点了我的名字,三道计算题只对了一道。完全平方公式会背吗?会。A加b的平方等于a的二次方加2ab再加b的二次方。A,减b的二次方等于a的二次方减二ab+b的二次方。但是我的平方差公式不会背了。  张老师让我去拿书再背一遍。最后终于背了出来。  后来谢老师来到班里,让我们写错的再重新一遍,我写完一遍后错了一种题型,我只好再去思考一遍了。  这种题型我百思不得其解,眼看就七点了,我真的很想打死我这个无用的脑袋。  后来张老师在我们还没有走就给我们讲了一遍,张老师这一脚终于讲到了我不懂的那个地方,那张老师让我们举一反三,又让我们写了两道题,这些题我终于把我脑子中的那一团线给它梳理开了。  我们学习就应该举义粉色,这样我们才能更好的掌握。  六年级数学作文300字 篇34  在我们日常生活中,数学是无处不在的,它贯穿我们人生的全部过程。  比如,妈妈上街买水果,买蔬菜,还有贴瓷砖……等等,都要用到数学。生活中还有很多很多有趣的数学,等我们去发现,去探索。  记得一天上午,我和妈妈去水果店买水果。来到水果店,水果店里的东西琳琅满目有香蕉?橘子?橙子?榴莲……真是五花八门。  妈妈说:“如果我买橙子15千克,差4元;如果买橘子20千克,则多20元。两种水果每千克的价格相差2元1角,两种水果的单价分的单价别是多少?”  我回答道:“橙子的单价比橘子的单价高21角。所以15千克橙子比15千克橘子贵315角,如果把15千克橙子全换成15千克橘子,钱会多出275角。又已知买橘子20千克,多200角。如果买橘子15千克,多275角。可以求出橘子的单价:(275-200)÷(20-15)=15(角),橙子的单价是15+21=36(角),所以橙子、橘子的单价分别是3元6角,1元5角。”  “分析的不错,我们回家吧!”  数学是生活中的金钥匙,是通往成功之门的桥梁,是王冠上的钻石,永远闪耀着最耀眼的光芒。  六年级数学作文300字 篇35  儿童节那天,姑姑送我一箱零食,里面都是我爱吃的。  晚上,我打开零食箱子找糖吃,妈妈一个箭步上来阻止道:“不许吃糖,糖果有害牙齿健康。”我对妈妈央求道:“妈妈,我保证只吃一颗。”妈妈有点动摇了,接着说:“我考你一道题,如果答对了就奖励吃一颗糖。”我欣然答应,接受妈妈的挑战。  妈妈开始出题:一个箱子里有苹果、橘子、牛奶三种口味的水果糖,其中有4颗苹果味、7颗橘子味、9颗牛奶味,那么至少要摸出多少颗,才能保证其中有6颗糖果口味相同?  我听完这些信息,仔细想了想,自信地告诉妈妈:“这个题可以用“倒霉蛋原则”解决也称“最不利原则”,求解方法是“最不利的情况+1”,其中最不利的情况就是无法满足题目要求且取的最多的情况,比最不利的情况再好一点(一般情况为再加“1”)即可保证满足题目的要求。根据题意,考虑最不利的情况是拿了4颗苹果味,5颗橘子味,5颗牛奶味,此时再拿1颗就可以保证其中有6颗口味相同的糖果。因此至少要拿(苹果味4+橘子味5+牛奶味5)+1=15(颗)糖果。”  妈妈听了我的思路,满意地点点头,对我竖起了大拇指,妈妈笑了,我也笑了。数学真有趣,数学使我们的生活变得更加精彩。  六年级数学作文300字 篇36  我、爸爸、妈妈、刘昊文,还有刘昊文的爸爸、妈妈、弟弟一起去肇庆玩。  原计划2小时到达,现在3小时达到。广州到肇庆路程是100千米,问:原计划平均时速是多少?现在的平均时速是多少?答:(1)100&spanide;2=50(千米),(2)100&spanide;3=33(千米)…1(千米)。  到达之后,我们一起坐船渡过西江去紫云谷游泳,包括大人4个,小朋友3个,其中我们三个小朋友想要坐在一起,大人们也坐在一起。问:座位坐法有多少种排列顺序,大人多少种?小朋友多少种?答:(1)4×3×2×1=24(种),(2)3×2×1=6(种)。对岸的水上乐园免费游玩,我们玩得太开心了!  第二天我们去了羚羊峡古栈道徒步。晚饭我们还买了饮料,一瓶饮料的价格是5.8元,一共买了1瓶可乐、1瓶雪碧、1瓶橙汁。问:买饮料一共用了多少钱?答:5.8×3=17.4(元)。实在太好喝了。  我们吃完饭的时候是下午5时40分,吃完开车的时候是晚上7时20分,问:晚饭一共用了多少时间?答:7时20分―5时40分=1时40分。  回到家里睡觉的时候已经是10时20分了。但我经过了美好的两天!  六年级数学作文300字 篇37  星期天的中午,老爸见我无所事事,便给我出了一道数学生活实践题,题目为:“我家的书房和阳台是连在一起的,总面积是18平方米,如果用30厘米×30厘米的方砖来铺地面的话,需要多少块这样的方砖?如果一块这样的方砖价格是8元,那么铺设书房和阳台一共需要花费多少元?  一听老爸说完题目,我便有了思路:先算出一块方砖的面积大小,再把总面积18平方米化成平方厘米,然后把由18平方米化成的平方厘米再除以一块方砖的面积,求出来的就是一共需要多少块方砖的块数。最把求出来的块数乘以每块方砖的价格便算出了一共需要花费多少元。算式如下:30×30=900(平方厘米)18平方米=180000(平方厘米)180000÷900=200(块)200×8=1600(元)  算完后我把答案告诉老爸,老爸说答案对不对你自己去阳台和书房的地面数一下,地砖块数是否和你计算出来的一致。我飞快跑去,认真的数了一遍,果然,和我刚才计算出来的块数是一样的。老爸夸奖了我,我真高兴,这就是数学在生活中的运用,数学真有趣!  六年级数学作文300字 篇38  今天我和奶奶一起到菜场去买菜。我们骑了五分钟左右的路程,就来到了菜场门口。刚走进菜场的大门口,一股鱼腥味就扑鼻而来,我不禁皱起了眉头。  来到鱼摊前,四五只面盘一字排开,有鲫鱼、乌鱼、鲢鱼,还有黄鳝,每只盆里都只有四五条鱼在游动。奶奶在询问价钱:“老板,今天的鲫鱼多少一斤?”“大的20元,小的12元,都是正宗河江里捕的。”鱼摊的老板中气十足地回答道。“能不能便宜点,这大大小小加在一起也不过十来条,我都拿走,你给我便宜点。”奶奶在讨价还价。“都拿去,大小不论16元。”价钱商定后,鱼老板用手熟练地把鲫鱼装进了塑料袋里,放在电子称上一称,显示器的左边显示出重量730克,中间是商定的价格32元每公斤,右边显示器显示出了鱼的金额为23.36元。“23元,老板”,“成交,你爽快我也爽快”鱼老板笑嘻嘻地说。  “现在的东西真当贵呵,介小的鲫鱼都要20多元钞票才有得吃,要是在以前5块钞票好买佬佬大的哉。”奶奶边走边嘀咕着。接着我们又在蔬菜摊前买了玉米和四季豆,分别花4.5元和3元。这次买菜总共花了30。50元,才三样东西,现在的物价真是高啊。  六年级数学作文300字 篇39  今天中午,我和妈妈一起到超市去购物。走进超市一看,哇!各种各样的食品展现在我们的眼前。……首先我们来到了饮料和牛奶区,我随手拿起了一大瓶可乐看了看,发现右下角有“净含量”800克,我问妈妈这是一瓶可乐的重量吗?妈妈笑笑点点头。然后我又拿起一袋牛奶仔细看了一下,每袋牛奶的“净含量”是200克,妈妈问我:“要想牛奶和一瓶可乐一样重,那么需要买几袋这样的牛奶呢?”我思索了一下说:“一瓶可乐是800克,一袋牛奶是200克……800除以200等于4(袋)所以我们需要买4袋这样的牛奶就和可乐一样重了对吗?妈妈微笑的说:“对的,每一个食品都有它们的净含量。”  接着我们又来到的卖面粉的地方,我观察了一下,每袋面粉的重量是1.5千克,现在我们家每次做饼是300克,那么一袋面粉要做几次饼呢?我想了想:1.5千克等于1500克,1500除以300等于5(次),所以一袋面粉要做5次饼。妈妈摸着我的头说:“真聪明”。我的心里暗自高兴着。  最后我们又买了15个鸡蛋大约1千克,一个火龙果大约550克,看着满满的收获真开心啊!让我感受到了数学中克和千克的知识,其实我们生活中也有不少关于数学的奥秘哦!  六年级数学作文300字 篇40  双11期间,许多超市都进行商品打折,我们小区边超市也不例外。  妈妈的洗头液快用完了,妈妈要去买四瓶。我们先到了佳美超市,洗头液上面标着原价90元,现价打八折。我对妈妈说:“妈妈,我们就在这儿买吧!”妈妈说:“先别急,俗话说货比三家,我们先去别的地方看一看。”我们又到了新区超市,我看中了洗头液原价也是90元,不过超市给的优惠是满80元减10元。我们到了最后一家超市,廉价超市,洗头液上标着买二送一。妈妈说:“那么就请儿子帮我算一下吧。”我心想:这太简单了。便拿起笔来算到:第一家超市是90乘80%乘4,算出来是288元。第二个超市是满80元减1O元。那么就是4乘90=360,360÷80≈4,4乘10=40,360-40=320。第三个超市是买三送一,那么妈妈要买四瓶的钱就只要付三瓶的钱,所以3乘90等于270元。270小于288小于320,所以在廉价超市买洗头液最便宜。  通过这件小事让我明白了生活处处有学问,只要我们处处留心,就能成为一个小小数学家。【六年级数学作文300字】相关文章:数学日记_六年级作文05-17六年级数学作文11-17数学竞赛六年级作文05-20数学魔术六年级作文05-06数学测验六年级作文03-10六年级数学作文05-21热爱数学六年级作文02-07关于数学的六年级作文08-09六年级数学作文11-06关于数学六年级作文04-08

我要回帖

更多关于 一个数减8再乘8再除以8 的文章