主题:几个小小问题:
蓝色的水晶
[专家分:90] 发布于 2007-11-04 16:39:00
问题1:
我在验证数组下标不为整数时,数组的下标会四舍五入,我却发现0.5的四舍五入情况不正常。
cls
a(0)=1
a(1)=2
a(2)=3
print a(0.4),a(0.5),a(0.6)
print a(1.4),a(1.5),a(1.6)
随意输入一小段程序,出现结果如下:
1 1 2
2 3 3
其中的a(0.5)不是四舍五入后成为a(1)结果为2,而是为1,为什么呢?
回复列表 (共6个回复)
沙发
蓝色的水晶 [专家分:90] 发布于 2007-11-04 16:55:00
问题2:
数组一旦被说明以后,则:
A、数组各元素下标是连续的 B、数组元素的下标可以是实型
C、同一数组各元素类型可以不相同 D、数组元素的个数可以增加也可以减少
C,D答案排除后,哪一个最确切些?
如果B正确:数组被定义后,如dim a(10) 我感到是可以出现数组元素a(5.6)即a(6),5.6不就是下标且实型的吗。
如果A正确:如定义dim a(10),则有数组元素下标为0——10,可以是连续的,或觉得是有序的更好一些。
想知道选A,还是B。此题虽然幼稚些,可有时觉得是个问题时,如果武断是不科学的。
板凳
蓝色的水晶 [专家分:90] 发布于 2007-11-04 16:58:00
问题3:
语句dim a(1,1) 定义的数组各元素在内存中的排序顺序是:
a(0,0),a(0,1),a(1,0),a(1,1) 对吗?
我认为是对的,请明白人肯定一下!
3 楼
moz [专家分:37620] 发布于 2007-11-04 18:08:00
[color=0000ff]问题一:[/color]
不是完全的四舍五入,
因为在单精度的数值取整过程中,
总是存在那么丁点的误差。
在QB里,也就习惯了,但还是有那么丁点的规律的,
一般来说:
当小数部份是.5
而整数部份是奇数的话,那么就会进一,
如果整数部份是偶数的话,那么就舍去。
其中的原理是跟数的储存以及运算过程有关的。
[color=0000ff]问题二:[/color]
作为题目来说应该选A
但作为编程来说,不能没有想像力。
B所述有点误会,实际编程中是可以使用实型(也就是精度浮点数),
而在处理的时候依然会转换成整形来运算。
所以这只是一个概念问题,并不是一个编程限制问题。所以不能选B
[color=0000ff]问题三:[/color]
这个问题我们可以通过实践来验证一下:
defint a-z '定义为短整形,一个变量占两个字节
dim a(1,1) '默认以0为基准起
a(0,0)=69
a(0,1)=70
a(1,0)=71
a(1,1)=72
def seg = varseg(a(0,0)) '以数组a( )的地址来定义段地址
aa=varptr(a(0,0))
for i=aa to aa+6 step 2
print peek(i), '虽然短整形都是双字节,但实际上我们四个数值都
next '小于128,只检查前面的字节就可以了,后面的0可以忽略
def seg '恢复系统默认段地址
结果是 69 71 70 72
由此可见,数组在内存中的排列顺序是先行后列的,排在前面的下标是先变化的:
a(0,0) a(1,0) a(0,1) a(1,1)
所以你的判断是错的。
隐约记忆中QB先行后列的方式是与C语言先列后行相反的,但具体是不是我就不记得了。
4 楼
蓝色的水晶 [专家分:90] 发布于 2007-11-05 15:55:00
看来有许多问题,不能认为它小,简单而去想当然,需要不断去科学论断!
5 楼
蓝色的水晶 [专家分:90] 发布于 2007-11-05 16:18:00
问题一:
我尝试
dim a as integer
a=2.5
print a
a=2.51
print a
end
第一个输出是2,第二个输出是3
就是前面分析的仅限有一位小数且小数位上为5的情况,如果是两位及以上,不论何数据都是按原来的规律解决问题.
这些问题出现,是由于误差造成的,但和数学科学有混淆,我感到QBASIC源程序应改变或想法弥补,使其和我们的数学或其他科学一致,不要让我们发现问题,然后绞尽脑汁寻求解释的理由。
6 楼
moz [专家分:37620] 发布于 2007-11-05 18:16:00
学习,需要有接受新事物新观念的能力.
我来回复