文档详情

c程序关于浮点出现错误.doc

发布:2017-07-05约5.54万字共14页下载文档
文本预览下载声明
摘 要:讨论了C 语言中使用Scanf()对二维数组浮点数操作出现异常的情况分析了异常产生的原因给出 多种的解决方法并对每种方法进行了评价 关键词:浮点数;二维数组;scanf 中图分类号:TP312 文献标识码:A 文章编号:1671 - 2153(2006)02 - 0026 - 02 在C语言中提供了格式输入函数scanf()可以 从键盘上对数据进行格式化的输入其一般形式是 scanf(格式控制地址列表)[1] 在TC2.0 的编译环 境下学生在应用这个函数读数时经常会出错这 其中大部分的错误是由于对scanf()这个函数的格式 不熟悉引起的语法错误仔细检查语法和拼写就可 以解决但用这个函数对二维数组的浮点数进行存 储时出现的错误就令人难以理解如下面的简单 例子:从键盘读10个数存在二维数组a[2][5]中 main() {floata[2][5]; int i,j; for (i=0;i2;i++) for(j=0;j5;j++) scanf( %f ,a[i][j]); } 以上程序编译通过,运行的时候却出现了:scanf: floating point formats not linked, Abnormal program termination!的错误 上述的程序如果单纯地从语法方面去考虑是没 有错误的编译通过也证明不是语法的问题但运 行时会出错从错误的提示信息可以知道是没有链 接浮点格式库这个问题有人认为是TC2.0 编译系 Scanf 对二维数组浮点数操作异常的研究 龚成清 (广东女子职业技术学院 计算机系 广东 广州 511450) 1 问题的提出统的一种优化技术有人认为是TC2.0 的一个Bug 本文认为TC2.0 的优化技术带来的一个Bug 众所周知TC2.0 产生于资源紧缺的DOS 时 代而浮点数运算占用系统的资源是比较大的[2] 因 此TC2.0 在编译时尽量不加入无关的部分在没 发现需要浮点转换程序时在链接外部函数库的时 候就不安装浮点格式库以达到节约资源的目的 当然这样做在很多时候都是有效的但有时TC2.0 又不能正确识别实际上确实需要做浮点转换出现 误判的情况因此就会出现上述错误根据笔者的 测试TC2.0 可以识别单个变量一维数组的浮点 数操作但却不能识别二维数组和多维数组以及结 构体等复杂结构内的浮点数操作从而引发上述的 错误 根据错误产生的原因要解决这个问题就是要 让TC2.0 知道程序在运行中用到了浮点库把浮 点库链接进来以下给出几种参考的解决方法 3.1 增加一个浮点变量 TC2.0 可以识别单个变量的浮点数操作因 此可以增加一个简单的浮点变量来解决这个问题 程序修改如下: main() {float a[2][5],tmp;//tmp是增加的浮点变量 int i,j; 收稿日期:2005-11-28 作者简介:龚成清(1979-) 男广东增城人广东女子职业技术学院计算机系助教 2 原因分析 3 解决办法 JOURNAL OF NINGBO POLYTECHNIC 2 0 0 6 年4 月宁波职业技术学院学报 第10卷第2期 Ap r , 2 0 0 6 Vol. 10 No.2 2006 年第2 期. 26 . 万方数据 for (i=0;i2;i++) for(j=0;j5;j++){scanf( %f ,tmp);a[i][j] =tmp;} } 这种方法增加了一个变量和在循环体内增加了 一条赋值语句当读数量不大的时候是很有效的 但如果数据量很大无疑就增加了程序运行的时间 降低了程序的效率因此可以把对这个方法进行 改进把单个变量的浮点数操作提前程序如下: main() {float a[2][5],tmp; int i,j; scanf( %f ,tmp); for (i=0;i2;i++) for(j=0;j5;j++){scanf( %f , a[i][j]);} } 这种方法仅仅增加了一条语句不管数据量的 大小对程序的运行时间几乎没有影响但这种方法 却要输入一个多余的数破坏了程序的本意稍不 小心就会造成结果的错误为此对程序进一步改 进可以把这个浮点变量指向一个浮点函数的值 程序修改如下: main() {float a[2][5],tmp; int i,j; tmp=cos(0.0);// 调用了cos()函数告诉编 译系统程序在运行过程中存在浮点运算 for (i=0;i2;i++) for(j=0;j5;j++){scanf( %f , a[i][j]);} } 3.2 把二维数组转换成一维数组 TC2.0 可以识别一维数组的浮点数操作而二 维数组可以看成是一个特殊的一维数组只不过是 其元素又是一维数组而已[3] 如float a[3][3],把a看 成是一个一维数
显示全部
相似文档