注册 登录
编程论坛 VB6论坛

求个VB思路

yuma 发布于 2022-11-04 19:58, 5065 次点击
已知:

张三 23
李四  26
王二 34
……

如何按年龄从小到大的顺序输出姓名?
43 回复
#2
kissis2022-11-05 09:10
order by 年龄
#3
cwa99582022-11-05 09:50
这要看你的数据结构是怎么样的,是数据库还是数组
#4
kings123332022-11-05 16:33
高手呢...
#5
yuma2022-11-05 18:49
回复 3楼 cwa9958
数组应该如何操作?
#6
风吹过b2022-11-05 22:09
数组,拆分为二个元素,
然后按年龄排序,不会写排序,就用 冒泡法 。

连 冒泡法 也不会的话,
拉一个 listbox ,开自动排序,
组合,年龄放前面,然后加到 listbox 中,再按顺序取出,分解,按原样组合。听说过这种的方法。

分解,有分隔符的,可以使用 split 函数
无无隔符的,如果年龄有规定长度的,使用 mid 和 right 函数
无规定长度的,如年龄有2位,有1位的,那么先right再判断。

组合,如果是数组,如split 分解出来的就是数组,可以使用 join 函数再组合
 否则使用 & 手动组合

#7
yuma2022-11-05 23:09
回复 6楼 风吹过b
我也想到过这个方法,用二维数组。

例:
a(1,1) = 张三      a(2,1) = 23
a(1,2) = 李四      a(2,2) = 26

这种,像坐标一样。

排序时,就是a(2,1)、a(2,2)排序。对应的姓名是:a(2-1,1)、a(2-1,2)

但有两个难题:

1、二维数组声明后,是无法增加数组的(这和一维数组不同,一维数组可临时增加数组)。比如遍历文件,存文件名和文件修改时期。
2、a(2,1)、a(2,2)不能赋值到其它变量中进行排序,要不然就对应不上a(1,1)、a(1,2)了。

应该怎么办?

[此贴子已经被作者于2022-11-6 05:03编辑过]

#8
风吹过b2022-11-06 10:20
那好办,使用结构体数组

程序代码:
Option Explicit
Private Type RYTYPE
    姓名 As String
    年龄 As Long
End Type

Dim a() As RYTYPE

Private Sub Command1_Click()

ReDim a(1)
a(1).姓名 = "张三"
a(1).年龄 = 23

ReDim Preserve a(2)
a(2).姓名 = "李四"
a(2).年龄 = 24

Cls
Print a(1).姓名 & a(1).年龄
Print a(2).姓名 & a(2).年龄

'比较后的交换,可以直接整个元素赋值
Dim at As RYTYPE
at = a(1)
a(1) = a(2)
a(2) = at

Print
Print a(1).姓名 & a(1).年龄
Print a(2).姓名 & a(2).年龄

End Sub


[此贴子已经被作者于2022-11-6 10:23编辑过]

#9
kings123332022-11-06 11:18
回复 8楼 风吹过b
版主,这样按年龄怎么排序。。
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#10
yuma2022-11-06 18:19
'比较后的交换,可以直接整个元素赋值
Dim at As RYTYPE
at = a(1)
a(1) = a(2)
a(2) = at

这是什么意思,if 都不用的。
#11
风吹过b2022-11-06 18:41
以下是引用yuma在2022-11-6 18:19:03的发言:

'比较后的交换,可以直接整个元素赋值
Dim at As RYTYPE
at = a(1)
a(1) = a(2)
a(2) = at

这是什么意思,if 都不用的。


你看了注释吗?这只是交换的示例。
完整是
Dim at As RYTYPE
if a(1).年龄 > a(2).年龄 then
   at = a(1)
   a(1) = a(2)
   a(2) = at
end if
#12
风吹过b2022-11-06 18:44
以下是引用kings12333在2022-11-6 11:18:30的发言:

版主,这样按年龄怎么排序。。


看了我8楼的示例代码吗?
结构体这样定义
Private Type RYTYPE
    姓名 As String
    年龄 As Long
    性别 as string
    国籍 as string
    籍贯 as string
End Type
每一行如何拆分放数组元素里自己动动脑筋想想
比较代码示例看 11楼。

#13
yuma2022-11-06 18:52
结构体数组是个好东西,网上找不到资料。

看明白了11楼的代码,交换了变量的值。

[此贴子已经被作者于2022-11-6 18:58编辑过]

#14
kings123332022-11-06 19:03
回复 13楼 yuma
不会的是怎么把TXT中的数据赋到数组
#15
yuma2022-11-06 19:51
回复 14楼 kings12333
这个好办,读取文件内容,切分为数组即可。

大致是这样切分的。

Private Sub Form_Load()
s = "11 22 33 44 55 66 77 88 99"
arr = Split(s, " ") '以空格为分隔符
For i = 0 To UBound(arr)
MsgBox arr(i)
Next
End Sub
#16
yuma2022-11-06 20:04
回复 14楼 kings12333
第8楼的代码,可以写一个 查找计算机中最新的文件,TOP100 是没有问题的。
#17
kings123332022-11-06 20:48
回复 15楼 yuma
这是一维数组,但多维的我就不会怎么表达了,像我给的那个附档
#18
风吹过b2022-11-06 21:10
以下是引用kings12333在2022-11-6 20:48:46的发言:

这是一维数组,但多维的我就不会怎么表达了,像我给的那个附档


8楼的代码就是把你这种的 二维数组转变为一维数组来处理。
其实结构体数组,元素里还可以再包含 可变/固定 数组 的。

#19
jklqwe1112022-11-06 23:04
把记录拆分,写入数组,然后排序,最后再组合为原记录,为什么这么做呢,排序必须要拆分吗,没有必要吧,把需要比较的字段,提取出来作为键值进行排序不是很正常的吗。
#20
wmf20142022-11-07 08:07
如果每个记录里只有一个年龄是数字且年龄为整数的话,可以不用拆分,可以不需要使用传统排序手段,一次扫描就可以排序完成,反正不会有人超过150岁。如果把年龄写在姓名前面就更简单,只需要用val函数就可以直接提取年龄,不在前面,可以自己写一个提取年龄的函数。
#21
yuma2022-11-07 17:48
以下是引用kings12333在2022-11-6 20:48:46的发言:

这是一维数组,但多维的我就不会怎么表达了,像我给的那个附档


张三,23,男,中国公民,广东省
李四,12,女,美国公民,河南省
王五,68,女,中国公民,河北省

逐行读取,切分为一维数组,每行的内容分别对应 a(0)、a(1)、a(2)、a(3)、a(4),赋值给B版所说结构体数组即可。
#22
kings123332022-11-07 19:03
回复 21楼 yuma
大哥,数组不会呀,麻烦你个例子参考一下
#23
cwa99582022-11-08 10:16
回复 22楼 kings12333
给一个例子

Private Sub Command1_Click()
    Dim 数组() As String '定义一个动态数组
    Dim i As Integer
   
    Open App.Path & "/文件.txt" For Input As 1#   '打开输入文件
    Do While Not EOF(1)
        ReDim Preserve 数组(i)  '分配数组,保留原来的数据
        Line Input #1, 数组(i)  '读入数据
        i = i + 1
    Loop
    For i = 0 To UBound(数组)
        Print 数组(i)
    Next
    Close #1    '关闭文件
   
End Sub

#24
kings123332022-11-08 18:52
回复 23楼 cwa9958
#25
kings123332022-11-09 10:05
回复 23楼 cwa9958
版主给的那个排序的套不上啊..你帮忙一起套一下怎么个排序吧兄弟
#26
jklqwe1112022-11-09 15:19

供参考
Public Sub sort(sName As String, limit As String, dName As String, Lst As ListBox)

  'sName 原文件名
  'dName 存放结果文件名
  'limit 原文件分隔符,注意中英文标点
  'Lst 列表框,借助其排序功能,要在设计状态设置 sorted = true 如果数据量很大,运行缓慢,就要重新排序方法了
  Dim str  As String
    Dim age As Long
   
    Dim k As Long
    Dim i As Long
   
    i = 0
    Open sName For Input As 1#
    Do While Not EOF(1)
        
        Line Input #1, str
        k = InStr(str, limit)
        age = Val(Mid(str, k + 1, Len(str)))
        Lst.AddItem age & i & "," & str
        i = i + 1
    Loop
   
    Close #1
    Open dName For Output As 2#
    For i = 0 To Lst.ListCount - 1
      str = Lst.List(i)
      k = InStr(str, ",")
   
      Print #2, Mid(str, k + 1, Len(str))
      Next
    Close #2
     Lst.Clear
End Sub
#27
kings123332022-11-09 21:45
回复 26楼 jklqwe111
这个方法也不错喔,谢谢,如果排序方式要倒序排怎么改?
#28
kings123332022-11-09 21:46
回复 26楼 jklqwe111
针对负数这种方式就不行啊
#29
jklqwe1112022-11-09 22:25
倒序,正序只是个方向问题,在向文件写入时,列表框从最大号向小的方向循环输出就可以了,年龄会有负数吗,如果非要有负数参与,进行简单的变换就可以实现。如果不等式a<b 成立 那么a+k <b+k 同样成立,根据这个道理,把所有数值都加上一个较大的数,使得所有数值为正数,但数据的大小关系并没有改变,再进行排序就行了
#30
kings123332022-11-09 23:08
回复 29楼 jklqwe111
#31
yuma2022-11-12 18:42
排序不能把变量名搞丢了,是个难题。
#32
jklqwe1112022-11-12 21:54
提取出用于比较的键值,只对键值做处理,原来的值管它干嘛,原样写入文件就行。
#33
yuma2022-11-13 18:22
回复 32楼 jklqwe111
排序之后,原来的变量和排序后的值照样对应不上。

排序后,值被赋值给了新的变量。
#34
cwa99582022-11-22 09:55
回复 33楼 yuma
排序,只是对数据进行重新排列,不关变量名的事。
变量名只是一个代号,用完了就没用了。
你要把数据值与名字对应起来,跟着排序,这个就不是普通的排序了,比如数据库,有不同的字段,对一个字段排序,其余的字段值也会跟着变化顺序。
你要的数据排序,一个变量对应的就不只是一个数据了。就要用type语句定义自定义数据类型,参加排序的就是一组数据了。
比如定义以下数据:
Type 人员   '创建用户自定义的类型。
   ID As Integer   
   姓名 As String * 20
   年龄 As integer
   电话 As string * 11
End Type
然后用ID进行排序,或者用年龄排序,这样名称就不会乱了。
#35
yuma2022-11-23 16:41
回复 34楼 cwa9958
Private Type 人员   '创建用户自定义的类型。
   ID As Integer
   姓名 As String * 20
   年龄 As Integer
   电话 As String * 11
   End Type
   Dim a() As 人员

Private Sub Form_Load()

   '-------------------
   '数据如下:
   '张三 27 13555555555
   '李四 23 18777777777
   '王二 36 19099999999
   '-------------------
   

   '张三 27 13555555555
   ReDim Preserve a(1)
   a(1).ID = 1
   a(1).姓名 = "张三"
   a(1).年龄 = 27
   a(1).电话 = "13555555555"

   '李四 23 18777777777
   ReDim Preserve a(2)
   a(2).ID = 2
   a(2).姓名 = "李四"
   a(2).年龄 = 23
   a(2).电话 = "18777777777"
   
   
   '王二 36 19099999999
   ReDim Preserve a(3)
   a(3).ID = 3
   a(3).姓名 = "王二"
   a(3).年龄 = 36
   a(3).电话 = "18777777777"
   
   'Debug.Print a(1).年龄
   'Debug.Print a(2).年龄
   'Debug.Print a(3).年龄
   
   
   '-------------------------
   '冒泡排序,升序排列算法
   '-------------------------
   
   '定义变量
    Dim arr1
   '数组赋值
    arr1 = Array(a(1).年龄, a(2).年龄, a(3).年龄)
    For m = 0 To UBound(arr1)
      For i = m + 1 To UBound(arr1)
          k = arr1(m)
          If arr1(m) > arr1(i) Then
               arr1(m) = arr1(i)
              arr1(i) = k
         End If
     Next
     MsgBox arr1(m)
    Next

End Sub


年龄是排序出来了,但是却对应不上姓名了,如何根据年龄输出姓名呢?求教。

[此贴子已经被作者于2022-11-23 16:43编辑过]

#36
jklqwe1112022-11-23 18:48
程序代码:


 arr1 = Array(a(1).年龄, a(2).年龄, a(3).年龄)
    For m = 0 To UBound(arr1)
      For i = m + 1 To UBound(arr1)
          k = arr1(m)
          If arr1(m) > arr1(i) Then
               arr1(m) = arr1(i)
              arr1(i) = k
         End If
     Next
     MsgBox arr1(m)
    Next


年龄放错位置了
程序代码:


 arr1 = Array(a(1), a(2), a(3))
    For m = 0 To UBound(arr1)
      For i = m + 1 To UBound(arr1)
          k = arr1(m)
          If arr1(m).年龄 > arr1(i).年龄 Then
               arr1(m) = arr1(i)
              arr1(i) = k
         End If
     Next
     MsgBox arr1(m)
    Next


特意的抛弃原值进行排序很没有意思
#37
yuma2022-11-23 20:13
回复 36楼 jklqwe111
编译错误

只有本站会员才能查看附件,请 登录
#38
jklqwe1112022-11-23 21:21
我的意思是 arr1 = Array(a(1).年龄, a(2).年龄, a(3).年龄)这句代码抛弃了原来的数据的信息,以后对对数组的排序变得毫无意义,arr1 = Array(a(1), a(2), a(3))就是要保留原数据,当然还有许多方法保留原数据的信息,至于编译错误,你还是自己寻找原因加以解决吧。
#39
风吹过b2022-11-24 09:20
   Dim a() As 人员
    arr1 = Array(。。。)
a() 已是数组,为啥还要重定义为数组呢?
直接对 A排序不行吗?  重定义为 数组后,原数组又没有排序,那有什么意义。



#40
yuma2022-11-24 10:19
回复 39楼 风吹过b
B哥能不能给点代码,脑子一团糟理不清逻辑。
#41
wmf20142022-11-24 11:17
你的原代码修改如下:
程序代码:
   '定义变量
    Dim arr1 as 人员
   '数组赋值
'
注释掉    arr1 = Array(a(1).年龄, a(2).年龄, a(3).年龄)
    For m = 0 To UBound(a)
      For i = m + 1 To UBound(a)
          arr1 = a(m)
          If a(m).年龄 > a(i).年龄 Then
               a(m) = a(i)
              a(i) = arr1
         End If
     Next
     MsgBox a(m).年龄
    Next
#42
yuma2022-11-24 11:39
回复 41楼 wmf2014
妙,成功了,非常感谢!
#43
lalawo2022-11-24 12:47
回复 42楼 yuma
你应该是新手吧,6楼的看看,冒泡法也可以网上搜一下不就秒懂,难道还要人一步一步教。。。。。。。。

[此贴子已经被作者于2022-11-24 12:53编辑过]

#44
yuma2022-11-24 14:28
回复 43楼 lalawo
多谢教诲,定将铭记在心。
1