Дан указатель Р1 на корень непустого генеалогического дерева - VB

Узнай цену своей работы

Формулировка задачи:

Дан указатель Р1 на корень не пустого генеалогического дерева. Для двух дальних родствеников найти ближайшего общего предка.

Решение задачи: «Дан указатель Р1 на корень непустого генеалогического дерева»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Type Node
  4.     Name        As Long
  5.     Parent      As Long
  6.     ChildCount  As Long
  7.     Child()     As Long
  8. End Type
  9.  
  10. Dim Names()     As Variant
  11. Dim Tree()      As Node
  12. Dim maxw        As Long
  13. Dim maxh        As Long
  14.  
  15. Private Sub Form_Load()
  16.     Dim i1 As Long, i2 As Long, r As Long
  17.    
  18.     Randomize
  19.    
  20.     AutoRedraw = True: FillStyle = vbSolid: FillColor = vbWhite: ScaleMode = vbPixels
  21.     Names = Array("ÀëåêñГ*Г*äð", "ГЂГ*Г*òîëèé", "Âèêòîð", "Àëåêñåé", "Äìèòðèé", "Г‚Г*ñèëèé", "ГЏГҐГІГ°", "ÈâГ*Г*", _
  22.                   "ÍèêîëГ*Г©", "Ôåäîð", "ГЊГЁГµГ*ГЁГ«", "Ãðèãîðèé", "ËåîГ*ГЁГ¤", "ГЌГЁГЄГЁГІГ*", "Èëüÿ", "ÑòåïГ*Г*", _
  23.                   "ÑòГ*Г*ГЁГ±Г«Г*Гў", "ÐîìГ*Г*", "Ñåðãåé", "ГЂГ*ГІГ®Г*")
  24.     Create -1, 4
  25.     Draw 0, 5, 5
  26.     Me.Width = (Width - ScaleWidth * Screen.TwipsPerPixelX) + (maxw + 10) * Screen.TwipsPerPixelX
  27.     Me.Height = (Height - ScaleHeight * Screen.TwipsPerPixelY) + (maxh + 10) * Screen.TwipsPerPixelY
  28.     Show
  29.    
  30.     Do: i1 = Val(InputBox("Ââåäèòå Г*îìåð Г¤Г*ëüГ*ГҐГЈГ® ðîäñòâåГ*Г*ГЁГЄГ* В№1", "0")): Loop While i1 > UBound(Tree)
  31.     Do: i2 = Val(InputBox("Ââåäèòå Г*îìåð Г¤Г*ëüГ*ГҐГЈГ® ðîäñòâåГ*Г*ГЁГЄГ* В№2", "0")): Loop While i2 > UBound(Tree)
  32.    
  33.     Caption = Format(i1, "00") & " " & Names(Tree(i1).Name) & " - " & Format(i2, "00") & " " & Names(Tree(i2).Name)
  34.     r = Search(i1, i2)
  35.    
  36.     If r = -1 Then MsgBox "ГЌГҐГІ îáùåãî": Exit Sub
  37.    
  38.     MsgBox "ГЋГЎГ№ГЁГ© ïðåäîê: " & Format(r, "00") & " " & Names(Tree(r).Name)
  39. End Sub
  40. ' Ïîèñê
  41. Private Function Search(ByVal i1 As Long, ByVal i2 As Long) As Long
  42.     Dim ti1 As Long, ti2 As Long
  43.     ti1 = i1
  44.     Do Until Tree(ti1).Parent = Tree(i2).Parent
  45.         ti1 = Tree(ti1).Parent
  46.         If ti1 = -1 Then ti1 = i1: i2 = i2 - 1: If i2 = -1 Then Exit Do
  47.         DoEvents
  48.     Loop
  49.     Search = Tree(i2).Parent
  50. End Function
  51. ' ÎòðèñîâêГ*
  52. Private Sub Draw(ByVal i As Long, ByVal x As Long, y As Long)
  53.     Dim n As Long, h As Long, w As Long, idx As Long, cap As String, ly As Long
  54.     cap = Format(i, "00") & " " & Names(Tree(i).Name)
  55.     ly = y: h = TextHeight(cap): w = TextWidth(cap)
  56.     Line (x - 1, y)-Step(w + 2, h), &HF08020, B
  57.     CurrentX = x: CurrentY = y: Print cap
  58.     For n = 0 To Tree(i).ChildCount - 1
  59.         Line (x + w + 2, ly + h \ 2)-(x + 100, y + h \ 2), &H808080
  60.         idx = Tree(i).Child(n): Draw idx, x + 100, y
  61.         If n < Tree(i).ChildCount - 1 Then y = y + h + 3
  62.     Next
  63.     If x + w > maxw Then maxw = x + w
  64.     If y + h > maxh Then maxh = y + h
  65. End Sub
  66. ' ÑîçäГ*Г*ГЁГҐ äåðåâГ*
  67. Private Sub Create(ByVal Parent As Long, ByVal Level As Long)
  68.     Dim i As Long, n As Long, c As Long
  69.     c = Int(Rnd * 3)
  70.     If Parent = -1 Then
  71.         ReDim Tree(0): Parent = 0: Tree(i).Name = Int(Rnd * (UBound(Names) + 1))
  72.         Tree(i).Parent = -1
  73.     End If
  74.     ReDim Tree(Parent).Child(c): Tree(Parent).ChildCount = c + 1
  75.     For n = 0 To c
  76.         i = UBound(Tree) + 1: ReDim Preserve Tree(i)
  77.         Tree(Parent).Child(n) = i
  78.         Tree(i).Name = Int(Rnd * (UBound(Names) + 1)): Tree(i).Parent = Parent
  79.         If Level Then Create i, Level - 1
  80.     Next
  81. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы