回 帖 发 新 帖 刷新版面

主题:一条简单而又难解决的VF问题

题目是找出表中年龄最大的记录号
     set talk off
     max=年龄
     j=reccount()
     fori=1 to j
        if max<年龄
        max=年龄
       endif
       skip
    endfor
    use
    ?rec
我的问题是我不明白程序里面的这几个程序:  max=年龄  ,if max<年龄 max=年龄。你能帮我解答一下吗
其中年龄是数值型变量了,请哪位扫盲心人士解答一下,谢谢 
         

回复列表 (共16个回复)

沙发

你从一个队伍中,随便抽了一个人出来。
然后又从队伍中从头到尾的抽人,跟这个人比高矮。
遇到比这个人矮的,或者一样高的,不理他。
遇到比这个人高的,把那个人抽出来,把原来的这个人扔掉。
这个时候,你手上的这个人,是比较过的人群里面最高的。
一直比较到队伍的最后,你就得到了最高的人了。

或者把上面段落里面的高矮,换成老嫩。

板凳

谢谢,你的回复很有意思,现再次感谢,不过我我还有一个不明白,那就是SKIP是对什么进行跳跃的?

3 楼


随便抽一个人出来,但是事先不知道这表里的任何一个具体数值的怎么办

4 楼

skip 用在for 循环?
应该用
z=0
gotop
Do while !eof()
      a=年龄
     if a>z
       z=a
     endif     
    skip  
enddo 
gotop
loca for 年龄=z
?recno()

5 楼

[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 楼


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 楼

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 楼

[quote]1:引用“代码中的第二行“ max=年龄 ”就是取值的....”
我这样一运行的话,它会提示:找不到变量‘MAX=年龄’。[/quote]
这里的“年龄”,默认是指表中的某个字段,字段名就是“年龄”。
你的代码里面确实没有打开表的命令行,如果有打开表的话,这个“年龄”指的就是(表中)(当前记录)(“年龄”字段的值)。如果你还没有打开表,又没有定义过使用过“年龄”的变量,那就是找不到变量了。

[quote]2。如果我把SKIP去掉的话,将上面的,即第一个MAX=年龄写成是MAX=0值的话,我运行这个程序,就会提示说找不到变量RES。如下写法:[/quote]
上面有说过了,SKIP的作用是定位到下一条记录去,你把它去掉了,一直在当前记录上,再怎么循环都是没用的。
在你的程序中,甚至不知道是否已经打开表了,也不知道在哪条记录上,也无法知道年龄的值是怎么变化的,也不知道循环体是否有执行,也不知道IF条件是否有成立,所以更不知道RES这个变量到底有没有赋过值。如果没有执行过这一句赋值语句,那当然就是找不到变量RES了。然后不知道是不是你的笔误,后面的?RES)不应该有右括号。
这个变量RES的目的是要记录最大值所在的记录序号的。

9 楼

set talk off
max=0
 scan
  if max<年龄
  max=年龄
  rec=recn()
  endif
 ends
?,max,rec

10 楼

回复moz1:我去掉SKIP的话,但是程序里有FOR I=1 TO J,它就会自动的会从1增加到J值后才停止,在我的理解里,这个1会自动扫描到表的第一个记录,然后一直扫描到第J个记录,所以我觉得SKIP是多余的不知我的理解有没有错?

回复moz2:首先向你表示道歉,那个确实是笔误[em2]。
    你说我的表没有打开,那么我应该怎么样去写这个程序才能打开,才能不会提示说找不到变量,你能不能在我的那个程序上帮我修改一下你要表达的完整程序呢,谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册