[工学]南京大学软件学院计算系统基础讲义第5章.ppt

[工学]南京大学软件学院计算系统基础讲义第5章.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]南京大学软件学院计算系统基础讲义第5章

正确编程 在错误还没成为错误之前,就能被捕获到。 明确规格说明 很多错误都源于不完善的程序规格说明。规格说明有时不能涉及所有可能的运行场景,因此就留下一些情况需要程序员来解释。 需求 模块化设计 把简单的、预先测试过的和可以运行的组件构建为程序,函数和库 设计 防御性程序设计 写注释 写注释能让程序员对他写的代码进行思考。 在这个过程中,可能会发现一个特别的情况或是一个最后会让代码崩溃的运行条件被忽略。 采用一致的编码风格 对齐左右大括号能够识别出那些缺少括号的简单的语义错误。 避免假设 假设输入的数据总是在某个范围内。如果这个假设不在这个程序的规格说明里,那么出现错误的可能性就产生了。 写避免假设的代码,或者至少使用断言,并抽样调查说明假设何时不成立。 避免全局变量 依赖编译器 检查程序中可疑的代码 警告信息 第五章 测试和调试 系统缺陷 1994年,美国数学家托马斯·奈斯利,发现Pentium处理器计算浮点数除法存在缺陷(FDIV Bug) 3145727?4195835/3145727的计算结果是4195579,而不是4195835。 Intel大量回收1994年12月之前生产的第一代Pentium产品,4.75亿美元的赔偿款 千年虫 二十世纪六、七十年代,存储设备非常昂贵的 采用两位而不是四位数字表示年份。 一个图书馆计算机系统 一位读者在1999年12月1日借了一本书,99 2000年,这位读者还书时,系统判断是否超期? 关于日期的运算发生错误,系统运行出现问题。 “2000年问题”、“千年虫”。据统计,全世界为解决“2000年问题”花出的费用超过数亿美元。 缺陷、测试、调试 程序中的错误,缺陷(bug) 找出缺陷的过程,测试 去除错误的过程,调试(debug) 在程序被投入使用之前,必须尽可能的进行彻底测试和调试。 几乎每个大型程序都存在一些缺陷 测试工作往往会带来很高的时间和经济成本。 有调查显示:一个熟练的程序员花在调试代码上的时间和花在写程序上的时间一样多。 许多大型软件项目开发都会延期,并且严重超出预算,其中一个重要原因就是软件中的缺陷。 需要一些构建程序的更好的办法,使得在测试之前就能避免问题或者发现问题。 15-* 错误类型 语法错误 违反了编程语言有关规则 编译器能够精确指出错误出现在哪一行 语义及逻辑错误 是指代码没有语法错误,可以运行,但是得不到正确的结果。 需要跟踪程序的运行过程才能发现。 15-* 语法错误 编译器报告的错误位置,有时会有偏离。 编译器常常会针对某个错误,发出一系列的错误信息报告。 常见的语法错误 语句末尾漏写分号; 使用未经声明的变量; 括号不匹配; 字符串没有结束符; 赋值运算符左面不是变量… … main () { int i int j; for (i = 0; i = 10; i++) { j = i * 7; printf(%d x 7 = %d\n, i, j); } } missing semicolon 语义及逻辑错误 当程序在语法上是正确的,可以运行,却得不到正确的结果 语义错误,程序的运行结果与程序员的期望不同 逻辑错误,程序按照程序员所设计的有缺陷的算法运行,运行结果与程序员的期望相同。 15-* 语义错误 往往由于对程序中的语义的理解与编译器理解的不同造成的。 常见的语义错误 赋值运算符与相等运算符用错; 无限循环; 在if、while或for结构后面使用多余的分号; 错误地使用了关系运算符; 计算或将一个大类型的数转换成小类型时,数据的值超出了表示范围; 运算符优先顺序错; else搭配不当; off-by-one(偏一)错误,通常指for循环的次数多或少一次; 将无关代码放到循环体中; 使用整数除法。 main () { int i int j; for (i = 0; i = 10; i++) j = i * 7; printf(%d x 7 = %d\n, i, j); } missing braces, so printf not part of if 15-* 逻辑错误 不正确的程序设计的结果。 程序本身准确的按照程序员所设计的算法运行了,但是这种设计本身有缺陷。 这种错误非常隐蔽,需要经过多次运行程序才会被发现。 当它们被检测到并且被隔离后,仍然很难修复。 在编写代码之前的设计阶段,通过规划,这种错误经常能够被减少甚至消除。 “2000年问题” 15-* 逻辑错误 #include stdio.h int main() { int year; printf(“Input a year (i.e., 1996): ”); scanf(“%d”, year); if(y

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档