主题:一条简单而又难解决的VF问题
hngnba
[专家分:0] 发布于 2011-12-01 11:26:00
题目是找出表中年龄最大的记录号
set talk off
max=年龄
j=reccount()
fori=1 to j
if max<年龄
max=年龄
endif
skip
endfor
use
?rec
我的问题是我不明白程序里面的这几个程序: max=年龄 ,if max<年龄 max=年龄。你能帮我解答一下吗
其中年龄是数值型变量了,请哪位扫盲心人士解答一下,谢谢
回复列表 (共16个回复)
沙发
moz [专家分:37620] 发布于 2011-12-01 19:04:00
你从一个队伍中,随便抽了一个人出来。
然后又从队伍中从头到尾的抽人,跟这个人比高矮。
遇到比这个人矮的,或者一样高的,不理他。
遇到比这个人高的,把那个人抽出来,把原来的这个人扔掉。
这个时候,你手上的这个人,是比较过的人群里面最高的。
一直比较到队伍的最后,你就得到了最高的人了。
或者把上面段落里面的高矮,换成老嫩。
板凳
hngnba [专家分:0] 发布于 2011-12-02 11:48:00
谢谢,你的回复很有意思,现再次感谢,不过我我还有一个不明白,那就是SKIP是对什么进行跳跃的?
3 楼
hngnba [专家分:0] 发布于 2011-12-02 11:49:00
随便抽一个人出来,但是事先不知道这表里的任何一个具体数值的怎么办
4 楼
martine [专家分:4950] 发布于 2011-12-02 16:11:00
skip 用在for 循环?
应该用
z=0
gotop
Do while !eof()
a=年龄
if a>z
z=a
endif
skip
enddo
gotop
loca for 年龄=z
?recno()
5 楼
moz [专家分:37620] 发布于 2011-12-02 16:36:00
[quote]向前或向后移动表中的记录指针。
SKIP [nRecords] [IN nWorkArea | cTableAlias]
参数
nRecords
指定记录指针要移动的记录数。发出不带 nRecords 的 SKIP 将使记录指针指向下一条记录。如果 nRecords 的结果是一个正数,则记录指针向文件尾移动 nRecords 条记录。如果 nRecords 的结果是一个负数,则记录指针向文件头移动 nRecords 条记录。如果记录指针已指向表的最后一条记录,且执行不带参数的 SKIP 命令,则 RECNO( ) 返回比表中记录数大 1 的值,EOF( ) 返回真(.T.)。如果记录指针已指向表的第一条记录,且执行 SKIP –1 ,则 RECNO( ) 返回 1 ,BOF( ) 返回真(.T.)。
IN nWorkArea | cTableAlias
在一个指定的工作区中移动表中的记录指针。nWorkArea 指定工作区编号,cTableAlias 指定表或工作区别名。
说明
如果表存在一个主控索引标识或索引文件,则 SKIP 命令将使记录指针移动到索引序列决定的记录上。
[/quote]
“事先不知道这表里的任何一个具体数值的怎么办”
事先不知道,那就随便取一个,代码中的第二行“ max=年龄 ”就是取值的,照理说,应该取的是第一条记录。
程序只是告诉你最基本的数值比较顺序,现在谁还会这样取最大值了?
基本上都会用 select max( ) 了。
6 楼
hngnba [专家分:0] 发布于 2011-12-02 23:32:00
1:引用“代码中的第二行“ max=年龄 ”就是取值的....”
我这样一运行的话,它会提示:找不到变量‘MAX=年龄’。
2。如果我把SKIP去掉的话,将上面的,即第一个MAX=年龄写成是MAX=0值的话,我运行这个程序,就会提示说找不到变量RES。如下写法:
set talk off
max=0
j=reccount()
for i=1 to j
if max<年龄
max=年龄
res=recno()
endif
endfor
use
? res)
7 楼
qjbzjp [专家分:8830] 发布于 2011-12-03 12:50:00
set talk off
max=0
USE 表名
j=reccount()
FOR i=1 to j
GO i
IF max<年龄
max=年龄
rec=recn()
ENDIF
NEXT
USE
?rec,max
8 楼
moz [专家分:37620] 发布于 2011-12-03 14:43:00
[quote]1:引用“代码中的第二行“ max=年龄 ”就是取值的....”
我这样一运行的话,它会提示:找不到变量‘MAX=年龄’。[/quote]
这里的“年龄”,默认是指表中的某个字段,字段名就是“年龄”。
你的代码里面确实没有打开表的命令行,如果有打开表的话,这个“年龄”指的就是(表中)(当前记录)(“年龄”字段的值)。如果你还没有打开表,又没有定义过使用过“年龄”的变量,那就是找不到变量了。
[quote]2。如果我把SKIP去掉的话,将上面的,即第一个MAX=年龄写成是MAX=0值的话,我运行这个程序,就会提示说找不到变量RES。如下写法:[/quote]
上面有说过了,SKIP的作用是定位到下一条记录去,你把它去掉了,一直在当前记录上,再怎么循环都是没用的。
在你的程序中,甚至不知道是否已经打开表了,也不知道在哪条记录上,也无法知道年龄的值是怎么变化的,也不知道循环体是否有执行,也不知道IF条件是否有成立,所以更不知道RES这个变量到底有没有赋过值。如果没有执行过这一句赋值语句,那当然就是找不到变量RES了。然后不知道是不是你的笔误,后面的?RES)不应该有右括号。
这个变量RES的目的是要记录最大值所在的记录序号的。
9 楼
cqcxy [专家分:60] 发布于 2011-12-03 21:10:00
set talk off
max=0
scan
if max<年龄
max=年龄
rec=recn()
endif
ends
?,max,rec
10 楼
hngnba [专家分:0] 发布于 2011-12-03 23:03:00
回复moz1:我去掉SKIP的话,但是程序里有FOR I=1 TO J,它就会自动的会从1增加到J值后才停止,在我的理解里,这个1会自动扫描到表的第一个记录,然后一直扫描到第J个记录,所以我觉得SKIP是多余的不知我的理解有没有错?
回复moz2:首先向你表示道歉,那个确实是笔误[em2]。
你说我的表没有打开,那么我应该怎么样去写这个程序才能打开,才能不会提示说找不到变量,你能不能在我的那个程序上帮我修改一下你要表达的完整程序呢,谢谢
我来回复