| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1281 人关注过本帖, 1 人收藏
标题:3点排序问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你有两种方法:
1.把坐标数据储存到数据表中,利用数据库本身的排序功能进行排序;
2.使用下面的类库(你可以自己把它扩展到多维空间,或加上别的功能)。

程序代码:
* 坐标数据,可从数据表或外部数据文件中获取
DIMENSION aList[3,2]
aList[1,1] = 1.0
aList[1,2] = 5.0
aList[2,1] = 3.0
aList[2,2] = 3.0
aList[3,1] = 2.0
aList[3,2] = 4.0

* 建立坐标数组
CLEAR
? "排序前"
?
nNumber = ALEN(aList,1)
DIMENSION aCoords[nNumber]
FOR nIndex = 1 TO nNumber
    aCoords[nIndex] = CREATEOBJECT("Coord", aList[nIndex,1], aList[nIndex,2])
    ? aCoords[nIndex].ToString()
NEXT
?

Sort_Coord(@aCoords)        &&@符号表示以传递地址方式传递参数

* 输出结果
? "排序后"
?
FOR nIndex = 1 TO nNumber
    ? aCoords[nIndex].ToString()
NEXT
?

RETURN 

*------------------------
* 自定义坐标类
*------------------------
DEFINE CLASS Coord AS Custom 

    HIDDEN x, y        && 内部数据,不允许外部直接修改x,y的值
    x = 0              && 横坐标
    y = 0              && 纵坐标
   
    *------------------------
    * 直接初始化,若不输入参数,则默认为(0,0)
    *------------------------
    PROCEDURE Init(tnX, tnY)
        IF PCOUNT() == 0
            This.x = 0
            This.y = 0
        ELSE
            IF (VARTYPE(tnX) == "N") .AND. (VARTYPE(tnY) == "N")
                This.x = tnX
                This.y = tnY
            ELSE
                This.x = 0
                This.y = 0
            ENDIF
        ENDIF
    ENDPROC
   
    FUNCTION GetX
        RETURN This.x
    ENDFUNC
   
    FUNCTION GetY
        RETURN This.y
    ENDFUNC
   
    *------------------------
    * 将另一坐标赋值给本坐标
    * 参数:toCoord -- 源坐标
    *------------------------
    FUNCTION SetFromCoord(toCoord AS Coord)
        This.x = toCoord.GetX()
        This.y = toCoord.GetY()
    ENDPROC 

    *------------------------
    * 比较本坐标与另一坐标的关系
    * 参数:toCoord -- 比较的坐标
    *       tnFlag  -- 比较横坐标抑或纵坐标,0是横坐标(默认),1是纵坐标
    * 返回:小于等于比较坐标,则返回真,否则返回假
    *------------------------
    FUNCTION Compare(toCoord AS Coord, tnFlag AS Integer) AS Boolean
        IF (PCOUNT() < 2) .OR. (VARTYPE(tnFlag) != "N")
            tnFlag = 0
        ENDIF
        IF tnFlag != 0
            tnFlag = 1
        ENDIF
        RETURN IIF(tnFlag == 0, This.x <= toCoord.GetX(), This.y <= toCoord.GetY())
    ENDFUNC 

    *------------------------
    * 将坐标转换为字符串形式
    *------------------------
    FUNCTION ToString() AS Character
        RETURN "(" + TRANSFORM(This.x) + "," + TRANSFORM(This.y) + ")"
    ENDFUNC
   
ENDDEFINE 

*------------------------
* 用冒泡排序算法对坐标数组进行排序
* 参数:taCoords -- 需排序的坐标数组,在原数组中返回排序结果
*       tnFlag   -- 坐标比较标志,0是横坐标(默认),1是纵坐标
*------------------------
PROCEDURE Sort_Coord(taCoords AS Coord, tnFlag AS Integer)
    LOCAL i, j, n, loCoord
   
    loCoord = CREATEOBJECT("Coord")
    n = ALEN(taCoords,1)
    FOR i = 1 TO n - 1
        FOR j = 2 TO n
            IF !taCoords[i].Compare(taCoords[j], tnFlag)    && taCoords[i] > taCoords[j]
                loCoord.SetFromCoord(taCoords[i])
                taCoords[i].SetFromCoord(taCoords[j])
                taCoords[j].SetFromCoord(loCoord)
            ENDIF
        NEXT
    NEXT 

ENDPROC 


[ 本帖最后由 TonyDeng 于 2012-6-10 03:37 编辑 ]

授人以渔,不授人以鱼。
2012-06-10 02:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 10楼 FUNFUNHO
看不懂你的意图
这跟你程序是怎么运作的有关,无从了解。看代码没用的,要文字叙述。

[ 本帖最后由 TonyDeng 于 2012-6-10 03:23 编辑 ]

授人以渔,不授人以鱼。
2012-06-10 03:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用VFP的內置函數ASORT()對多維數組直接排序也是可以的。

授人以渔,不授人以鱼。
2012-06-10 10:27
快速回复:3点排序问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037325 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved