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