Wednesday, January 20, 2016

විෂුවල් බේසික් (Visual Basic .net) පාඩම : ශාකීය දත්ත ආකෘතිය (binary tree).

  
 විෂුවල් බේසික් පිළිබඳ ලිපි පලකරන ලෙස ලද ඉල්ලීමකට ප්‍රතිචාරයක් ලෙස මෙය පලකිරීමට තීරණය කලෙමි.
   (මම විෂුවල් බේසික් ගැන විධිමත් ලෙස හැදෑරීමක් කර නැති නිසා මෙම ලිපියේ ඇති සමහර කරුණු සහ වචන වල දෝශ තිබිය හැකි බව සලකන්න. එසේම මෙම ලිපිය මුල සිට සරලව ඉගැන්වෙන්නක් නොවන බවත් යමු මූලික දැනුමක් අවශ්‍ය බවත් සලකන්න. මුල සිට සරලව කරන්නට ගියහොත් කිසිවක් කරගැනීමට නොලැබෙන බව අත්දැක ඇත.)
    උදාහරණ සකසා ඇත්තේ vishual studio 2015 යොදා ගෙනය. ඔබ පාවිච්චි කරනුයේ වෙනත් සංස්කරණයක් නම් කේත කොටස් notepad වැනි මෘදුකාංගයකින් විවෘත කර copy paste කිරීමට සිදුවිය හැක.
***************************************
   ලිපියේ මාතෘකාවට එලැඹීමට පෙර පරිගනක බාශාවල ඇති class නම් සංකල්පය ගැන හැඳින්වීමක් කල යුතුයැයි සිතමි.
class නමින් හඳුන්වන්නේ මෘදුකාංග කොටසක් ලෙස සැලකිය හැක. සංකීර්ණ මෘදුකාංගයක් ලියන විට එහි කේත class කිහිපයකට බෙදා ලිවීම මඟින් කේතනය වඩා පහසු වන අතර මෘදුකාංග සංවර්ධනය ශිල්පීන් කිහිප දෙනෙක් යොදාගෙන කරනවිට එක් එක් ක්ලාස් එකක් සංවර්ධනය එක් එක් ශිල්පියාට පැවරිය හැක. මේ ක්ලාස් වලින් ගතහැකි එක් ප්‍රයෝජනයකි. ඊට අමතරව තවත් ප්‍රයෝජනද තිබේ (මේ පාඩමේ අරමුන එවන් වෙනත් ප්‍රයොජනයක් ගැන සඳහන් කිරීමයි.)
විෂුවල් බේසික් වලින් ක්ලාස් තැනීමේදී
 Class "ක්ලාස් එකේ නම"
End Class
ආකාරයට සටහන් කර එම ක්ලාස් එකට අයත් අනෙක් කේත කොටස් එම පේලි අතර සටහන් කල යුතුය.
   සාමාන්‍යයෙන් ක්ලාස් යොදා ගැනීමේදී ක්ලාස් එකකින් ඔබ්ජෙක්ට් යනුවෙන් දෙයක් තනා ගනියි. මෙය උපමාවකින් දක්වන්නේ නම් ක්ලාස් එකක් ජනාධිපති ධූරයටත්, ඔබ්ජෙක්ට් එකක් ජනාධිපති වරයාටත් සමකල හැක.
විෂුවල් බේසික් වලින් ඔබ්ජෙක්ට් එකක් තැනීමේදී මෙසේ සඳහන් කරයි.
  Dim "ඔබ්ජෙක්ට් එකේ නම" As New "ක්ලාස් එකේ නම"
New වදන නොමැතිව
 Dim "ඔබ්ජෙක්ට් එකේ නම" As "ක්ලාස් එකේ නම"
 ලෙස සටහන් කලහොත් ලැබෙනුයේ ඔබ්ජෙක්ට් එකක් සෑදීම සඳහා ඉඩක් වැන්නකි. එය උත්සවයක ජනාධිපති සඳහා වෙන්කල පුටුව වැන්නකි.
 Dim "ඔබ්ජෙක්ට් එකේ නම" As "ක්ලාස් එකේ නම"
"ඔබ්ජෙක්ට් එකේ නම" = new "ක්ලාස් එකේ නම"
ලෙස සඳහන් කලහොත් එය මුලින් පුටුව වෙන්කර පසුව එහි ජනාධිපති වාඩිකරවීමට සමකල හැක. (මෙහිදී පොයින්ටර් නම් සංකල්පයක්ද පාවිච්චි වුවත් එය විස්තර කිරීමට ගියහොත් ලිපිය මාතෘකාවෙන් පිට යනු ඇත.)
ජනාධිපතිට වෙන්කල පුටුව තුල ජනාධිපති ධූරය දරන ඕනෑම අයෙක් වාඩි කරවිය හැක. ඒ ආකාරයටම ඕනෑම ඔබ්ජෙක්ට් එකක් ඔබ්ජෙක්ට් ඉඩ තුල  තැම්පත් කල හැක. එනම්
Dim "ඔබ්ජෙක්ට් එකේ නමA" As New "ක්ලාස් එකේ නම"
Dim "ඔබ්ජෙක්ට් එකේ නමB" As New "ක්ලාස් එකේ නම"
Dim "ඔබ්ජෙක්ට් එකේ නමC" As New "ක්ලාස් එකේ නම"
Dim "ඔබ්ජෙක්ට් එකේ ඉඩ" As "ක්ලාස් එකේ නම"
"ඔබ්ජෙක්ට් එකේ ඉඩ" ="ඔබ්ජෙක්ට් එකේ නමA"
"ඔබ්ජෙක්ට් එකේ ඉඩ" ="ඔබ්ජෙක්ට් එකේ නමB"
"ඔබ්ජෙක්ට් එකේ ඉඩ" ="ඔබ්ජෙක්ට් එකේ නමC"
ඉහත අවසන් පේලි තුන සලකන්න. එයින් මුල් පේලියේදී "ඔබ්ජෙක්ට් එකේ ඉඩ" කරන වෙනස් කම් "ඔබ්ජෙක්ට් එකේ නමA" බලපායි. ඒ ආකාරයටම අනෙක් අවස්ථාවල අනෙක් ඔබ්ජෙක්ට දෙකට බලපායි.
Class "ක්ලාස් එකේ නම"
 Sub New()
 End Sub
End Class
ලෙස කේතනය කලහොත් නව ඔබ්ජෙක්ටුවක් සෑදෙන විට
Sub New()
 End Sub
අතර කේත කොටස ක්‍රියාත්මක වේ.
Sub New()
 End Sub
Sub New(ByRef a As branch, l As branch_)
End Sub
ලෙස New ක්‍රියාවලි කිහිපයක් ලිවිය හැක. එවිට ක්‍රම කිහිපයකින් ඔබ්ජෙක්ට් සෑදීම කල හැක.
***************************************
   පරිගනක මතකය තුල දත්ත විශාල ප්‍රමාණයක් තැන්පත් කිරීම සඳහා සාමාන්‍යයෙන් array, queue, stack, list යන දත්ත ආකෘති පාවිච්චි කරයි. (නම වෙනස් වුවත් මේවායේ මහා ලොකු වෙනසක් නැත) නමුත් මෙහිදී දත්ත එකිනෙක අතර සම්බන්ධයක් ඇති නොවේ. විභාගයකට සහභාගිවූ සිසුන් ලක්ෂයකගෙන් වැඩිම ලකුනු ගත් සිසුවා තේරීම වැනි ගැටලුවක් විසඳීමේදී ඒ සඳහා ඉහත ආකාරයේ දත්ත අකෘතියක් යොදාගෙන සිසුන්ගේ දත්ත තැම්පත් කලවිට ලැයිස්තුව මුලසිට අගටම කියවා අවශ්‍ය දත්තය සෙවීමට සිදුවේ.
   ශාකීය දත්ත ආකෘතිය මෙවැනි ගැටලු සඳහා පහසුවෙන් යොදාගත හැකි විකල්පයකි.
   ශාකීය දත්ත ආකෘතිය උදාහරණයක් මඟින් මෙසේ පැහැදිලි කල හැක.
   ආයතනයක "සේවකයෙක්ට" ඔහු යටතේ සේවකයන් දෙදෙනෙක් (ඔවුන් A,B ලෙස ගනිමු) තබාගත හැකියැයි සිතමු. A සහ B යනු "සේවකයන්ම" බැවින් ඔවුන්ටද එකිනෙකාට "සේවකයන්" දෙදෙනා  බැගින් තබාගත හැක මෙසේ දිගටම කිරීමේදී ගොඩනැගෙන පිරමිඩාකාර ව්‍යුහය ශාකීය දත්ත ආකෘතියකට උපමාකල හැක.
   විශුවල් බේසික් වලින් ශාකීය දත්ත ආකෘතියක් තැනීමේදී class සංකල්පය යොදා ගත යුතුය.
   ඉහත උදාහරණයේදී ‍දැක්වූ ව්‍යුහයේ මූලික ඒකකය









ලෙස දැක්විය හැක. මෙම ඒකකයක් node ලෙස හඳුන්වයි. ඉහත එකකය පහත දැක්වෙන පරිදි ක්ලාස් එකකින් නිරූපනය කල හැක.
Class සේවකයා
 Dim A As new සේවකයා
Dim B As new සේවකයා
End Class
විභාගයකට සහභාගිවූ සිසුන් ලක්ෂයකගෙන් වැඩිම ලකුනු ගත් සිසුවා තේරීම වැනි ගැටලුව සැලකීමේදී ඒ සඳහා ශාකීය ආකෘතියක් යොදා ගැනීමේදී මූලික ඒකකය මෙලෙස සැකසිය හැක.
Class සිසුවා
 Dim සිසුවාගේ_නම As  string
 Dim සිසුවාගේ_ලකුණු As  integer

Dim වැඩි As  සිසුවා
Dim අඩු As  සිසුවා
End Class
මුල් සිසුවාගේ තොරතුරු ඇතුළත් කිරීමේදී ඔහුගේ නම සිසුවාගේ_නම  තුලත් ලකුණු සිසුවාගේ_ලකුණු තුලත් ඇතුළු කලහැකි ලෙස සැකසිය යුතුය.
නව සිසුවෙකුගේ ලකුණු ඇතුලත් කරන විට ඔහුගේ ලකුණු මුල් සිසුවාගේ ලකුණු වලට වඩා වැඩිනම් වැඩි තුලත්, අඩුනම් අඩු තුලත් නව සිසුවාගේ දත්ත ඇතුළු කල යුතුය. ඒ සඳහා පහත පරිදි ‍කේතනය කල යුතුය.
Public Class Form1
    Dim a As සිසුවා
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        a = New සිසුවා("", 0)

    End Sub

    Dim b As සිසුවා
    Friend Sub brancing(name As String, mark As Integer)
        b = a
     
        If b.සිසුවාගේ_ලකුණු < mark Then
            b.වැඩි = New සිසුවා(name, mark)
        Else
            b.අඩු = New සිසුවා(name, mark)
        End If
    End Sub

End Class
Class සිසුවා
    Friend is_end As Boolean = False
    Sub New(name As String, mark As Integer)
සිසුවාගේ_නම =name
    සිසුවාගේ_ලකුණු =mark
    End Sub


    Friend සිසුවාගේ_නම As String
    Friend සිසුවාගේ_ලකුණු As Integer

    Friend වැඩි As සිසුවා
    Friend අඩු As සිසුවා

End Class
මෙම ක්‍රියාවලිය ස්වයංක්‍රීයව කරවීමට පහත පරිදි කේත ලිවිය යුතුය.
Public Class Form1

    Dim a As සිසුවා
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        a = New සිසුවා("", 0)
    End Sub
   Dim b As සිසුවා
     Sub add_data(name As String, mark As Integer)
        b = a

        search(mark)
        brancing(name, mark)
    End Sub

    Friend Sub brancing(name As String, mark As Integer)

        If b.සිසුවාගේ_ලකුණු < mark Then
            b.වැඩි = New සිසුවා(name, mark)
        Else
            b.අඩු = New සිසුවා(name, mark)
        End If
    End Sub

    Sub search(mark As Integer)
        Dim c As සිසුවා = b
        Do
            If c Is Nothing Then
                Exit Sub
            End If
            b = c
            If b.සිසුවාගේ_ලකුණු < mark Then
                c = b.වැඩි
            Else
                c = b.අඩු
            End If
        Loop
    End Sub
End Class
Class සිසුවා

    Sub New(name As String, mark As Integer)
        සිසුවාගේ_නම = name
        සිසුවාගේ_ලකුණු = mark
    End Sub


    Friend සිසුවාගේ_නම As String
    Friend සිසුවාගේ_ලකුණු As Integer

    Friend වැඩි As සිසුවා
    Friend අඩු As සිසුවා

End Class
මෙහි සම්පූර්ණ කේතය මෙතනින් ලබා ගන්න. මෙවැනි කේතනයකදී කරන කාර්යය ගැන සිතා දත්ත ආකෘතිය සකසා එය හැසිරවීමට අවශ්‍ය ක්‍රියාවලි සුදුසු පරිදි ලිවිය යුතුය.
**************************
ශාකීය දත්ත ආකෘතියයක් යොදාගෙන කලහැකි සුන්දර කටයුත්තක් නම් ෆ්‍රැක්ටල් (factal) මෝස්තර සෑදීමයි. ෆ්‍රැක්ටල් මෝස්තර සෑදීමේදී ඒ සඳහා යොදාගත හැකි සරලම ක්‍රමය වන්නේ ශාකීය දත්ත ආකෘතියක් හරහා එය කරගැනීම විය යුතුය.
උදාහරණ 1:
මෙහිදී  මූලික ඒකකය ලෙස යොදා ගන්නා ක්ලාස් එක ලෙස branch ක්ලාස් එක සාදා ඇත. එය තුල ෆ්‍රැක්ටල් මෝස්තරය සඳහා යොදා ගන්නා හැඩ තලයේ (මෙහිදී එය රේඛා ඛණ්ඩයකි) ආරම්භක ලක්ෂයේ ඛණ්ඩාංකය, දිග, ඝනකම, සහ කෝණය ඇතුලත්කර ඇත. එයට අමතරව    Friend l_b, r_b, m_b As branch ලෙස ශාකා ක්ලාස් 3ක් සඳහා ඉඩ ඇතුලත්කර ඇත.
draw() ක්‍රියාවලිය මඟින් හැඩ තලය ඇඳිම සිදු කරයි. මෙහිදී විෂුවල් බේසික් වල ග්‍රැෆික් ක්‍රියාවලි ගැන යම් අවබෝධයක් තිබිය යුතුය. නමුත් මෙහිදී අඳින්නේ රේඛා ඛණ්ඩයක් නිසා එම කේතය පහසුවෙන් අවබෝධ කරගත හැකියැයි සිතමි.
brancing() ක්‍රියාවලිය මඟින් ඔබ්ජෙක්ටුවේ ශාකා තුන නිර්මාණය කෙරෙයි.
සාමාන්‍යයෙන් ගණිතයේදී පාවිච්චි කෙරෙන්නේ මෙවන් ඛණ්ඩාංක තලයක් වුවත්,

විෂුවල් බේසික් වල ග්‍රැෆික් කටයුතු වලදී පාවිච්චි කරන්නේ මෙවැනි ඛණ්ඩාංක ක්‍රමයකි.

 එමනිසා මෙහිදී අක්ෂ පරිවර්තනයක් කල යුතුය.
මුලින්ම මුල් ඔබ්ජෙක්ටුව සාදා එයට අවශ්‍ය දත්ත ඇතුළු කරයි. ඉන්පසු එහි ඇති draw() සිදුකර brancing() ක්‍රියාවලිය ආරම්භ කරයි.
නව ඔබ්ජෙක්ටුවක් සෑදෙන හැම විටම එම ඔබ්ජෙක්ටු‍ව මව් ඔබ්ජෙක්ටුවේ වම, දකුණ හෝ මැද ශාකා වලින් කුමක්ද යන කරුණ මත නව ඔබ්ජෙක්ටුවේ රේඛා ඛණ්ඩයේ කෝණය වෙනස් කිරීමත්, එහි දිග අඩු කිරීමත් සිදු කරයි. ඉන්පසු draw() සිදුකර brancing() ක්‍රියාවලිය ආරම්භ කරයි. මෙය level විචල්‍යය තුල දක්වා ඇති වාර ගණන නැවත නැවත කෙරෙයි. මෙමඟන් ගසක හැඩය ඇති ෆ්‍රැක්ටල් මෝස්තරයක් සෑදේ.
උදාහරණ 2:
මෙය කලින් උදාහරණයට බොහෝ සමාන කේතයකි. එකම ප්‍රධාන වෙනස ක්‍රියා වලිය සිදුවන්නේ ශාකීය දත්ත ආකෘතියේ අග්‍රය නියෝජනය කරන ඔබ්ජෙක්ටුව සෑදෙන විට පමණක් වීමයි. මෙහි branch ක්ලාස් එක වෙනුවට branch1, branch2 පාවිච්චි කිරීමෙන් වෙනස් මෝස්තර සෑදිය හැක.

No comments:

Post a Comment