c程序关于浮点出现错误.doc
文本预览下载声明
摘 要:讨论了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看
成是一个一维数
显示全部