a82613035
|
分享:
▼
x1
|
[Basic][求助] 如何在(記事本) AAA.TXT,裡座標排序 (Q4)由大排小 (Q2)由小排大(Q3)由大排小 (Q1)由小排大
X13.50Y1096.00T210 X32.50Y13.00T210 X13.50Y42.00T210 X32.50Y38.00T210 X13.50Y1056.00T210 X13.50Y13.00T210 X523.50Y1096.00T210 X521.50Y36.00T210 X33.50Y1096.00T210 X53.50Y1096.00T210 X538.50Y1081.00T210 X13.50Y1076.00T210 X538 .. 訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容
|
|
x0
[樓 主]
From:台灣中華電信 | Posted:2010-09-25 13:33 |
|
|
ebolaman
級別: 副版主
版區: 程式設計
x38
x458
|
分享:
▲
▼
大致上了解,這是第二次修改
不過還是搞不懂到底要依照何種標準來排序
假如要修改,只要調 CmpPos 函數裡的東西即可 Form1:複製程式
Option Explicit
Private Sub Command1_Click()
Dim S As String
Dim Arr() As String
Dim i As Long, k As Long, XYInd As Integer
Dim B As Boolean
Dim CmpMethod1 As Integer, CmpMethod2 As Integer
'------------ Ini. Var. ------------
CmpMethod1 = IIf(Option1(0).Value = True, 1, 0) 'Sort By Y or not
CmpMethod2 = IIf(Check1.Value = 1, 2, 1) 'Increasing or not
'--------- Put Datas Into Array -----------
S = Trim(Text1.Text)
Do While Right(S, 2) = vbNewLine
S = Left(S, Len(S) - 2)
Loop
Arr = Split(S, vbNewLine)
k = UBound(Arr)
ReDim Pos(k, 1) As Double
For i = 0 To k
Pos(i, 0) = GetUserVal(Arr(i), 0) 'X
Pos(i, 1) = GetUserVal(Arr(i), 1) 'Y
Next i
'-------- Sort ----------
'Bubble Sort
For XYInd = 0 To 1
Do
i = 0
B = False
Do
If CmpPos(Pos, i, CmpMethod1, CmpMethod2, XYInd) Then
ExcgPos Pos, i
B = True
End If
i = i + 1
Loop While i < k
Loop While B
Next XYInd
'---------- Show Result ---------
S = ""
For i = 0 To k
S = S & "(" & Pos(i, 0) & ", " & Pos(i, 1) & ")" & vbNewLine
Next i
Text2.Text = S
End Sub
Public Function GetUserVal(ByVal S As String, ByVal Typ As Byte) As Double
Dim m As Long, m2 As Long
'Kill Str T...
m = InStrRev(UCase(S), "T")
If m <> 0 Then S = Left(S, m - 1)
'''
m = InStr(1, UCase(S), "X")
m2 = InStr(m + 1, UCase(S), "Y")
GetUserVal = IIf(Typ = 0, Mid(S, m + 1, m2 - m - 1), Right(S, Len(S) - m2))
End Function
Public Sub ExcgPos(ByRef P() As Double, ByVal i As Long) 'Exchange Two Pos.
Dim tempk As Double, tempk2 As Double
tempk = P(i, 0): tempk2 = P(i, 1)
P(i, 0) = P(i + 1, 0): P(i, 1) = P(i + 1, 1)
P(i + 1, 0) = tempk: P(i + 1, 1) = tempk2
End Sub
Public Function CmpPos(ByRef P() As Double, ByVal i As Long, ByVal Mtd1 As Integer, ByVal Mtd2 As Integer, ByVal Ind As Integer) As Boolean
Dim FixedMtd As Integer
If Ind = 0 Then
If Mtd2 = 2 Then
CmpPos = (P(i, Mtd1) > P(i + 1, Mtd1))
Else
CmpPos = (P(i, Mtd1) < P(i + 1, Mtd1))
End If
Else
FixedMtd = Mtd1
Mtd1 = CByte(Not CBool(Mtd1 * 255)) / 255 'Reverse 0 & 1
If Mtd2 = 2 Then
CmpPos = (P(i, Mtd1) > P(i + 1, Mtd1)) And (P(i, FixedMtd) = P(i + 1, FixedMtd))
Else
CmpPos = (P(i, Mtd1) < P(i + 1, Mtd1)) And (P(i, FixedMtd) = P(i + 1, FixedMtd))
End If
End If
End Function
[ 此文章被ebolaman在2010-09-30 04:33重新編輯 ]
此文章被評分,最近評分記錄財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!! | |
|
|
|
|
ebolaman
級別: 副版主
版區: 程式設計
x38
x458
|
分享:
▲
▼
下面是引用 a82613035 於 2010-09-30 07:46 發表的 : ebolaman你好 : 我有一個 長( X )552. 寬(Y)1109. 座標分為四個角落,四個角設定為Q1,Q2,Q3,Q4 為四個角落 Q1為 (X0. Y0.) , Q2為(X552. Y0.) , Q3為(X0. Y1109.) , Q4為( X552. Y1109.) 1: 首先開啟 入徑C:\ XXX \AAA.TXT (記事本),把( T210 或是T313或是T235或是T304等)無排序座標重新排列座標,把四個角落Q1,Q2,Q3,Q4,由外面排到裡面,例如座標分佈再Q4位置座標外面排到裡面,座標分佈再Q2位置座標外面排到裡面,座標分佈再Q3位置座標外面排到裡面,座標分佈再Q1位置座標外面排到裡面,由Q4角落排到---Q2角落排到--- Q3角落排到--- Q1角落排到 下面是座標無排序 ....... 所以我先歸納一下規則: Q1 : Y 主遞增、X其次 Q2 : Y 主遞增、X接著遞減
Q3 : X 主遞增、Y接著遞減 Q4 : Y 主遞減、X其次是嗎? 我另做了一個圖來展示以上意義: 不過有幾點我搞不太清楚: 1. 真的是照以上規則嗎? 不是照與某點距離? 2. 字串後面的 TXXX 是做什麼的 3. 輸出格式必須保持與原本相同嗎? 例如: X123Y345T6784. 輸入來源有 Q1, Q2... 等字樣嗎? 歸納出以上規則後,相信會比較好了解排序之最終目的 我已把大致上的 VB 程式碼打好了,或許你先行修改看看
[ 此文章被ebolaman在2010-09-30 20:20重新編輯 ]
|
|
|