آموزش گام به گام ویژوال بیسیک6.0 - نسخهی قابل چاپ +- مشاوره خانواده آنلاین رایگان عطاملک (https://atamalek.ir) +-- انجمن: فجازی (https://atamalek.ir/forum-41.html) +--- انجمن: جهاد علمی (https://atamalek.ir/forum-45.html) +---- انجمن: فنی و مهندسی (https://atamalek.ir/forum-48.html) +---- موضوع: آموزش گام به گام ویژوال بیسیک6.0 (/thread-553.html) صفحهها:
1
2
|
آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ کار با فايل در ويژوال بيسيک - بخش اول مقدمه بعلت عدم وجود اشاره گر در ويژوال بيسيک عمليات کار با فايلها در آن نسبتاً ساده می باشد . بطور کلی فايلها بر دو نوع هستند : 1 - فايلهای متنی Text File : اين فايلها فقط شامل کاراکترهای اسکی و برخی کاراکترهای خاص مانند انتهای خط و انتهای فايل هستند . ۲ - فايلهای باينری Binary File : شامل هر نوع کاراکتری می توانند باشند و کاربردهای گسترده ای دارند مانند بانک های اطلاعاتی ، فايلهای اجرائی ، فايلهای گرافيکی و غيره ويژوال بيسيک می تواند با هر دو نوع فايل کار کند . چگونگی باز کردن فايلها قبل از اينکه بتوان عمليات ورودی/خروجی را روی يک فايل انجام داد ابتدا بايستی آنرا باز کرد . باز کردن فايلها در ويژوال بيسيک توسط دستور Open انجام می شود . فرمت کلی اين دستور بصورت زير است : Open filename [For mode] [Access access][lock] As [#]filenumber [Len=reclen]x [ پارامترهای داخل کروشه اختياری هستند . ] filename نام فايلی است که می خواهيم آنرا باز کنيم . mode حالت باز کردن فايل است . اين حالتها عبارتند از : - Input : فايل بعنوان ورودی باز می شود . - Output : فايل بعنوان خروجی باز می شود . - Binary : فايل از نوع باينری باز می شود . - Append : فايل طوری باز می شود که بتوان به انتهای آن چيزی اضافه کرد . - Random access نوع دسترسی به فايل را مشخص می کند . انواع دسترسيها عبارتند از : - Read : خواندن فايل - Write : نوشتن در فايل - ReadWrite : خواندن و نوشتن فايل lock نوع دسترسی ساير برنامه ها به اين فايل را مشخص می کند . انواع دسترسيها عبارتند از : - Shared : دسترسی اشتراکی - Lock Read - Lock Write - Lock Read Write filenumber عددی است که ويژوال بيسيک از آن برای دسترسی به فايل استفاده می کند .اين عدد بايستی برای هر فايل منحصر بفرد و بين ۱ تا ۵۱۱ باشد . برای بدست آوردن اولين شماره آزاد می توان از تابع FreeFile استفاده کرد . reclen :طول بافر فايل است . اين عدد بايستی از ۳۲۷۶۷ کو چکتر باشد . در صورتی که فايلی که توسط filename مشخص شده وجود نداشته و فايل برای Append ، Binary ، Output و يا Random باز شده باشد در اينصورت يک فايل جديد با اين نام ساخته می شود . در صورتی که فايل بصورت باينری باز شده باشد پارامتر Len ناديده گرفته می شود . چگونگی بستن فايل پس از پايان کار با فايل برای بستن آن از دستور Close استفاده می کنيم . فرمت اين دستور بصورت زير است : Close #filenumber دستور Close بدون هيچ پارامتری تمام فايلهای باز را می بندد . کار با دايرکتوری ۱ - گرفتن Dir : توسط دستور Dir می توان نام فايلهای موجود در يک دايرکتوری را بر اساس پارامترهايي که به آن می دهيم پيدا کنيم . برای مثال : Myfile=Dir$("c:\text\*.txt)"x دستور فوق نام اولين فايل موجود در دايرکتوری C:\TEXT را که پسوند آنها txt باشد در متغير Myfile قرار می دهد . اگر دستور فوق را بدون پارامتر مجدداً اجرا کنيم نام دومين فايل برگرداننده می شد و الی آخر Dir دارای يک پارامتر اختياری است که نوع فايلهای مورد نظر را نيز می توان با آن مشخص نمود . مثال : Myfile=Dir$("c:\text\*.txt",vbNormal)x مقادير ممکن اين پارامتر عبارتند از : vbNormal ، vbHidden ، vbSystem ، vbDirectory ۲ - تغيير دايرکتوری : برای تغيير دايرکتوری از دستور ChDir استفاده می شود مثال : ChDir "c:\windows\system32"x ۳ - تغيير درايو : برای تغيير درايو از دستور ChDrive استفاده می شود مثال : ChDrive "E:"x ۴ - ساخت دايرکتوری : برای ايجاد دايرکتوری جديد از دستور MKDir استفاده می شود مثال : MKDir "c:\MyFolder"x ۵ - حذف دايرکتوری : برای حذف دايرکتوری از دستور RmDir استفاده می شود مثال : RmDir "C:\MyFoler"x RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ کار با فايل در ويژوال بيسيک - بخش دوم خواندن از فايل : 1 - دستور Input : توسط دستورهای Input و Line Input می توان محتوای فايلهای متنی و باينری را خواند . دستور Input به دو صورت بکار می رود : Input #Filenumber,ReadData ReadData=Input(Charnum,Filenumber)x دستور اول کل يک فايل را خوانده و در متغير ReadData قرار می دهد . دستور دوم ، تعداد Charnum بايت از فايلی با شماره Filenumber را خوانده و در متغير ReadData قرار می دهد . اين دو دستور تمام کاراکترهای موجود در فايل را می خوانند . برای اينکه بتوان فايل را خط به خط خواند ، از دستور Line Input استفاده کنيد : Line Input #Filenumber,ReadData البته از دستور Line Input بيشتر برای خواندن فايلهای متنی استفاده می شود زيرا ممکنست در فايل باينری هيچ کاراکتر انتهای خط ( CRLF ) وجود نداشته باشد و يکباره کل فايل خوانده شود . ۲ - دستور Get : از اين دستور برای خواندن فايلهای باينری با دسترسی تصادفی ( Random Access ) استفاده میشود : Get #Filenumber,[Recordnum%],ReadData اين دستور رکورد شماره Recordnum را از فايلی با شماره Filenumber می خواند و در متغير ReadData قرار می دهد . علامت کروشه نشان می دهد که پارامتر Recordnum اختياری است و در صورتيکه ذکر نشود داده ها از رکورد بعدی فايل ( جائيکه اشاره گر فايل آنجا قرار دارد ) خوانده می شوند . نوشتن در فايل : ۱ - دستور Print : توسط اين دستور می توان اطلاعاتی را در فايل قرار داد : Print #FileNumber,WriteData دستور فوق محتويات متغير WriteData را در فايلی با شماره FileNumber می نويسد . بوسيله دستور Print می توان اطلاعات را بصورت خط به خط در فايل نوشت برای مثال : Print #1,"Hello Visual Basic"+Vbcrlf عبارت Vbcrlf نشان دهنده کاراکتر انتهای خط ( CRLF ) در ويژوال بيسيک می باشد . ۲ - دستور Put : اين دستور برای نوشتن داده ها در فايلهای باينری با دسترسی تصادفی بکار می رود : Put #FileNumber,[Recordnum],WriteData اين دستور محتويات متغير WriteData را در رکورد شماره Recordnum قرار می دهد . تعيين محل رکورد در فايلهای با دسترسی تصادفی : برای منتقل کردن اشاره گر فايل به يک رکورد در يک فايل باينری با دسترسی اتفاقی ، از دستور Seek استفاده می شود . اين دستور محل يک بايت را در فايل می گيرد و اشاره گر فايل را در آنجا قرار می دهد بنابراين دستورات Put و Get می توانند با اين رکورد کار کنند : Seek #FileNumber,RecordNumber تشخيص انتهای فايل : برای اينکه متوجه شويم به انتهای يک فايل رسيده ايم از دستور EOF استفاده می کنيم . اين دستور يکی از مقادير True يا False را بر می گرداند که نشان می دهد به انتهای فايلرسيده ايم يا نه . از اين تابع در حلقه های Do-While استفاده می شود : Do While Not (EOF(FileNumer))x . . . Loop حلقه فوق تا زمانيکه فايل موردنظر به انتها نرسيده باشد اجرا خواهد شد . بدست آوردن طول يک فايل : بوسيله دستور LOF می توان طول محتويات يک فايل را بدست آورد : FileSize=LOF(FileNumber)x بدست آوردن محل اشاره گر فايل : توسط دستور Loc می توان محل جاری اشاره گر فايل را بدست آورد . اجرا شدن اين دستور محل اشاره گر را تغيير نمی دهد : FilePosition=Loc(FileNumber)x RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ کار با فايل در ويژوال بيسيک - بخش سوم ساير عمليات کار با فايل : ۱ - حذف فايل : برای حذف يک يا چند فايل از دستور Kill استفاده می شود : Kill "C:\Temp\MyFile.txt"x Kill "C:\Temp\*.txt"x ۲ - انتقال فايل : برای انتقال يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور Name استفاده می شود . مبدا و مقصد بايستی روی يک درايو باشند . اگر دايرکتوری مبدا و مقصد يکی باشد فايل تغيير نام داده می شود : Name "C:\Temp\File1.txt" To "C:\Temp2\File2.txt"x ۳ - کپی کردن فايل : برای کپی کردن يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور FileCopy استفاده می شود : FileCopy "\File1.txt\ To "C:\Temp\File2.txt"x ۴ - بدست آوردن تاريخ و زمان آخرين تغيير فايل و يا زمان ايجاد فايل : برای اين کار از دستور FileDateTime استفاده می شود . ابتدا بايستی يک متغير از نوع Variant تعريف کرده و سپس توسط اين دستور تاريخ و زمان موردنظر را استخراج کنيم : Dim FileInfo As Variant FileInfo=FileDateTime("C:\Temp\MyFile.txt")x ۵ - استخراج طول فايل : برای بدست آوردن طول يک فايل بر حسب بايت از دستور FileLen استفاده می شود : FileSize=FileLen("C:\MyFile.txt")x ۶ - تغيير صفت يک فايل : برای تغيير صفت يک فايل از دستور SetAttr استفاده می شود . پارامترهای اين دستور عبارتند از : 0 : فايل معمولی 2 : فايل مخفی 4 : فايل سيستمی SetAttr FileNumber,FileAttrib مقابله با خطاهای کار با فايل : در زمان کار با فايلهای احتمال زيادی وجود دارد که خطا بوجود آيد . بنابراين بايستی در زمان کار با فايلها در صورت ممکن از روتينهای مقابله با خطا استفاده کنيم . شايع ترين خطاهای کار با فايل عبارتند از : ۵۲ : شماره يا نام فايل صحيح نيست ۵۳ : فايل پيدا نشد ۵۴ : حالت فايل صحيح نيست ۵۵ : فايل قبلاً باز شده ۵۸ : فايل از قبل وجود دارد ۵۹ : طول رکورد صحيح نيست ۶۱ : ديسک پر است ۶۲ : عبور از انتهای فايل ۶۳ : شماره رکورد صحيح نيست ۷۰ : دسترسی ممنوع است ۷۱ : ديسک آماده نيست ۷۶ : مسير پيدا نشد در هنگام مقابله با خطا بهتراست از يک ساختار Select-Case استفاده کنيد : Select Case Err Case 71 MsgBox "Drive is Not Ready"x . . . End Select RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول مقدمه : ساختارهاي داده اي از نظر تعداد اعضا به دو دسته استاتيک و ديناميک تقسيم مي شوند . ساختارهاي استاتيک مثل آرايه هاي يک بعدي و آرايه هاي دو بعدي ، تعداد اعضاي آنها در زمان طراحي برنامه مشخص مي شود و در طول اجراي برنامه ثابت است اما تعداد اعضاي ساختارهاي داده اي ديناميک در طول اجراي برنامه تغيير مي کند . ليست پيوندي ( LinkList ) ، پشته ( Stack ) ، صف ( Queue ) و درختهاي باينري ( Tree Binary) ، نمونه هايي از ساختارهاي داده اي ديناميک هستند . ليست پيوندي شامل مجموعه اي از عناصر داده اي است که اضافه و حذف اعضا در هر جاي ليست ممکن است . پشته يک ساختار داده اي مهم در کامپايلرها و سيستم هاي عامل است که عمل اضافه و حذف عناصر از ابتداي آن انجام مي شود . صف يک ساختار داده اي است که عمل اضافه کردن از انتها و عمل حذف کردن از ابتداي آن انجام مي شود . درختهاي دودويي براي جستجوي بسيار سريع ، ذخيره سازي داده ها و کامپايل عبارات استفاده مي شوند . نوع داده Variant : نوع داده variant براي متغيرهايي بکار مي رود که بطور صريح نوع آنها تعريف نشده است مثال : Dim value As Variant اين نوع داده مي تواند هر نوع داده اي را در خود ذخيره کند . همچنين براي ايجاد ساختارهاي داده اي مثل ليست هاي پيوندي ، صف ، پشته و درخت مناسب است . نوع داده موجود در variant مي توان توسط توابع VarType و TypeName تعيين کرد . تابع VarType يک مقدار صحيح برمي گرداند که نشان دهنده نوع ذخيره شده در variant است . مثال : Dim value as Variant value=”Hello”x در اينصورت مقدار بازگشتي ( VarType( value برابر 4 خواهد بود . تابع TypeName يک رشته برمي گرداند که نشان دهنده نام نوع داده ذخيره شده در variant است . اخذ حافظه بطور ديناميک Dynamic Memory Allocation : براي ايجاد و نگهداري ساختارهاي داده اي ديناميک بايستي در هنگام اجراي برنامه بتوان فضاي بيشتري براي نگهداري داده هاي جديد بدست آورد . با استفاده از کلمه کليدي New مي توان در ويژوال بيسيک حاقظه ديناميک گرفت : Set NewNode=New ListNode که ListNode يک شي از ساختار داده اي مورد نظر ماست . کلاسهاي خود ارجاعي : کلاس خودارجاعي نوعي کلاس است که داراي يک اشاره گر ( Pointer ) به يک شي از همان نوع کلاس باشد . براي مثال اگر کلاس ما به اسم ClistNode باشد و متغير زير را در آن تعريف کنيم ، اين کلاس يک کلاس خود ارجاعي است : Private mNextNode as ClistNode از mNextNode براي لينک دادن اعضاي يک ساختار داده اي ديناميک بهم استفاده مي شود ( بعبارت ديگر گره زدن يک شي از کلاس ClistNode به يک شي ديگر از همان کلاس ) . شي هاي خودارجاعي مي توانند به همديگر لينک شوند و ساختارهاي داده اي مثل ليست پيوندي ، صف ، پشته و درخت را ايجاد کنند . شکل زير دو شي خود ارجاعي را نشان مي دهد که بصورت يک ليست بهم لينک شده اند . عبارت NULL بدين معنا است که شي خودارجاعي به شي ديگري اشاره نمي کند ( Nothing ) و نشان دهنده انتهاي ساختار داده است RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم ليست پيوندي همانطور که گفته شد ليست پيوندي مجموعه اي از يکسري داده است که اين داده ها از نوع اشيا خودارجاعي هستند . ( هر شي خودارجاعي داراي يک متغير نوع variant براي نگهدار مقدار و يک اشاره گر به شي بعدي است ) . هر عضو ليست پيوندي را يک گره گويند . هر ليست پيوندي از طريق يک اشاره گر به اولين گره قابل دسترسي است . گره هاي بعدي از طريق قسمت لينک موجود در هر گره قابل دسترس هستند . همچنين لينک آخرين گره با Nothing تنظيم مي شود که انتهاي ليست را نشان مي دهد . مزيت اصلي ليست هاي پيوندي نسبت به آرايه اينست که تعداد عناصر ليست پيوندي قابل تغيير است . بعبارت ديگر ليست هاي پيوندي بصورت ديناميک هستند و طول آنها قابل تغيير است اما سايز آرايه ثابت است . ( البته ويژوال بيسطک از آرايه هاي با سايز متغير نيز پشتيباني مي کند اما اين عمل تغيير سايز اتوماتيک نيست .) عمل درج در ليست پيوندي ساده است و تنها بايستي دو اشاره گر تغيير يابد . ليست هاي پيوندي را مي توان به سادگي با قراردادن هر عضو جديد در محل صحيح بصورت sortشده نگهداري کرد . اعضاي ليست پيوندي در حافظه بصورت پيوسته ذخيره نمي شوند بنابراين نمي توان فوراً به هر عضو ليست دسترسي داشت ( بر خلاف آرايه ) . براي ايجاد ليست پيوندي در ويژوال بيسيک نياز به سه کلاس است : 1 – کلاس ClistNode : کلاسي است که هر گره از ليست را توصيف مي کند : private mNodeData as Variant private mNextNode as ClistNode public Property Get Data() as Variant Data=mNodeData End Property Public Property Let Dta(ByVal vNewValue as Variant)x MNodeData=vNewValue End Property Public Property Get NextNode() as ClistNode Set NextNode=mNextNode End Property Public Property Let NextNode(Byval vNewValue as Variant)x Set mNextNode=vNewValue End Property 2 – کلاس Clist براي توصيف ليست پيوندي . mFirstNode براي اشاره به اولين ClistNode و mLastNode براي اشاره به آخرين ClistNode در يک شي clist بکار می رود . زمانيکه يک Clsit ايجاد مي شود اين دو متغير با Nothing تنظيم مي شوند . روال Property Get Iterator يک شي ClistIterator برمي گرداند که مي توان از آن براي حرکت در بين اعضاي ليست استفاده کرد . Private mFirstNode as ClistNode Private mLastNode as ClistNode Public Function IsEmpty() as boolean IsEmpty=IIf(mFirstNode Is Nothing,True,False)x End function Public Sub InsertAtFront(insertItem as variant)x Dim tempNode as ClistNode If IsEmpty() then Set mFirstNode=New ClistNode Set mLastNode=mFirstNode Else Set tempNode=mFirstNode Set mFirstNode=New ClistNode MFirstNode.NextNode=tempNode End if MFirstNode.Data=insertItem End sub Public sub InsertAtBack(insertItem as Variant)x Dim tempNode as ClistNode If IsEmpty() then Set mLastNode=New ClistNode Set mFirstNode=mLastNode Else Set tempNode=mLastNode Set mLastNode=New ClistNode TempNode.NextNode=mLastNode End if MLastNode.Data=insertItem End sub Public function RemoveFromFront()x Dim removeItem as Variant If IsEmpty() then Msgbox list is empty RemoveFromFront=Null Exit function End if RemoveItem=mFirstNode.Data If mFirstNode Is mLastNode then Set mFirstNode=Nothing Set mLastNode=Nothing Else Set mFirstNode=mFirstNode.NextNode End if RemoveFromFront=removeItem End function Public Function RemoveFromBack()x Dim removeItem as Variant Dim current as ClistNode If IsEmpty() then Msgboc list is empty RemovefromBack=Null Exit function End if RemoveItem=mLastNode.Data If mFirstNode Is mLastNode then Set mFirstNode=nothing Set mLastNode=Nothing Else Set current=mFirstNode While Not current.NextNode Is mLastNode Set current=current.NextNode Wend Set mLastNode=current Current.NextNode=nothing End if RemoveFromBack=removeItem End function Public property Get Iterator() as variant Dim iter as ClistIterator Set iter=New ClistIterator Iter.StartNode=mFirstNode Set Iterator=iter End property عملکرد روال InsertAtFront : a – فراخواني IsEmpty براي تعيين خالي بودن ليست b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند . c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به اولين گره ليست و سپس اشاره دادن mFirstNode به گره New ClsitNode و سپس اشاره دادن mFirstNode.NextNode به tempNode ساخته مي شود . d – تنظيم mFirstNode.Data با مقدار مورد نظر عملکرد روال InsertAtBack : a – فراخواني IsEmpty براي تعيين خالي بودن ليست b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند . c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به آخرين گره ليست و سپس اشاره دادن mLastNode به گره New ClsitNode و سپس اشاره دادن tempNode.NextNode به mLastNode ساخته مي شود . d – تنظيم mLastNode.Data با مقدار مورد نظر عملکرد روال RemoveFromFront : a – اگر ليست خالي باشد Null برگشت داده مي شود . b – اگر ليست خالي نباشد داده mFirstNode به removeItem اختصاص داده مي شود . c – اگر ليست فقط يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود . d – اگر گره بيش از يک عضو داشته باشد mFirstNode برابر mFirstNode.NextNode مي شود . e – مقدار removeItem برگشت داده مي شود . عملکرد روال RemoveFromBack : a – اگر ليست خالي باشد Null برگشت داده مي شود . b – اگر ليست خالي نباشد داده mLastNode به removeItem اختصاص داه مي شود . c – اگر ليست يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود . d – اگر ليست بيش از يک گره داشته باشد متغير current برابر mFirstNode مي شود . سپس با استفاده از current روي گره هاي ليست حرکت مي کنيم تا به گره اي برسيم که به آخرين گره اشاره مي کند . سپس mLastNode را به گره اي که current به آن اشاره مي کند قرار مي دهيم و مقدار current.NextNode را Nothing مي کنيم تا بعنوان آخرين گزه ليست معرفي شود . e – مقدار removeItem برگشت داده مي شود . 3 – کلاس ClistIterator : اين کلاس براي حرکت روي گره هاي ليست و دستکاري هر گره بکار مي رود . از حرکت کننده ها براي چاپ ليست و يا انجام دادن عملي بر روي هر عضو Clist مي توان استفاده کرد . اين کلاس داراي دو متغير از نوع ClistNode به نامهاي mBookmark و mFirstNode است . متغير mFirstNode به اولين گره در Clist اشاره مي کند و متغير mBookmark موقعيت فعلي حرکت کننده بر روي Clist را نشان مي دهد . روال Property Let StartNode اين دو متغير را مقدار دهي اوليه مي کند . تابع NextItem اگر مقدار mBookmark برابر Null باشد ، Null برگشت مي دهد و در غيراينصورت مقدار tempData را برابر mBookmark.Data و مقدار mBookmark را برابر mBookmark.NextNode قرار مي دهد . تابع HasMoreItems اگر ليست داراي چندين عضو باشد True برمي گرداند . روال ResetBookmark حرکت کننده را به ابتداي ليست منتقل مي کند . Private mBookmark as ClistNode Private mFirstNode as ClistNode Public Property Let StartNode(Byval vNewValue as variant)x Set mFirstNode=vNewValue Set mBookmark=mFirstNode End property Public function NextItem()x Dim tempData as varaint If mBookmark Is nothing then NextItem=Null Else TempData=mBookmark.Data Set mBookmark=mBookmark.NextNode NextItem=tempData End if End function Public function HasMoreItems() as boolean HasMoreItems=IIf(Not mBookmark Is nothing,True,False)x End function Public sub ResetmBookmark()x MBookmark=mFirstNode End sub در بخش سوم نمونه برنامه ای را با استفاده از اين کلاسها خواهيم ساخت . RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم مثالی از استفاده از کلاسهای ليست پيوندی : ابتدا کلاسهايي که در جلسه قبل معرفی شد را به پروژه تان اضافه کنيد . سپس در بخش کدنويسی فرمتان ، ابتدا يک شی از نوع کلاس Clist بصورت زير تعريف کنيد : Dim list as New Clist در فرمتان سه CommandButton با نامهای AddFirst ، AddLast و ShowList و نيز يک TextBox با نام ListMember قرار دهيد . کد زير را برای رويداد کليک شدن دکمه AddFirst بنويسيد : Call list.InsertAtFront(ListMember.text)x کد زير را برای رويداد کليک شدن دکمه AddLast بنويسيد : Call list.InsertAtBack(ListMember.text)x کد زير را برای رويداد کليک شدن دکمه ShowList بنويسيد : Dim elements as New ClistIterator Set elements=list.Iterator If elements.HasMoreItems=false then msgbox ("list is empty")x Else While elements.HasMoreItems Msgbox(elements.NextItem)x Wend end if پشته : پشته نوعي ليست پيوندي است که گره هاي جديد ، فقط به انتهاي آن مي توانند اضافه شوند . بهمين دليل به پشته ، ساختمان داده LIFO مي گويند . قسمت لينک آخرين گره پشته با Nothing مقدار دهي مي شود که نشان دهنده پايين پشته است . روالهاي اصلي پشته Push و Pop هستند . Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند . در بخش چهارم کلاسی را برای کار با پشته معرفی خواهم کرد . RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم کد: کلاس پشته : همانطور که در بخش قبل گفته شد پشته نوعی ليست پيوندی است که گره هاي جديد فقط به انتهاي آن اضافه شوند . روالهاي اصلي پشته Push و Pop هستند . Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند . يک کلاس پشته را با استفاده از کلاس Clist و بصورت زير پياده سازي مي کنيم : Private list As New Clist Public Sub Push(value as Variant)x List.InsertAtFront(value)x End sub Public Function Pop As Variant Pop=list.RemoveFromFront()x End Function Public Function IsStackEmpty() As Boolean IsStackEmpty=list.IsEmpty()x End function Public Property Get Iterator() as variant Set Iterator=list.Iterator End Property در اين کلاس ابتدا يک شی از نوع کلاس Clist تعريف شده است . سپس متدهای Push توسط متد InsertAtFront و Pop توسط متد RemoveFromFront پياده سازی شده اند . يک برنامه نمونه : برای نوشتن يک برنامه برای کار با پشته ابتدا کلاس Stack را که کد آن را در بالا ديديد به پروژه تان اضافه کنيد . سپس در بخش کد مربوط به فرمتان ابتدا يک شی از نوع کلاس Stack بصورت زير تعريف کنيد : Dim mStack as New Stack سپس در فرمتان سه CommandButton با نامهای Push و Pop و ShowStack و نيز يک TextBox با نام StackMember قرار دهيد . کد زير را برای کليک شدن دکمه Push بنويسيد : mStack.push(StackMember.text)x کد زير را برای کليک شدن دکمه Pop بنويسيد : StackMember.text=mStack.Pop()x کد زير را برای کليک شدن دکمه ShowStack بنويسيد : Dim elements as New ClistIterator Set elements=mStack.Iterator If elements.HasMoreItems=false then msgbox "stack is empty"x Else While elemets.HasMoreItems Msgbox elements.NextItem Wend RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم صف : صف نوعي ساختار داده اي است که گره ها از ابتداي صف ( سر صف head ) حذف مي شوند و از انتهاي صف ( ته صف tail ) اضافه مي شوند . بنابر اين ، صف يک ساختار داده اي FIFO است . صف دارای دو متد به نامهای AddQueue و DelQueue است که اولین متد ، عنصری را به انتهای صف اضافه می کند و دومين متد ، عنصری را از ابتدای صف حذف می کند . براي ايجاد کلاس Cqueue از کلاس Clist استفاده مي کنيم : Private list as New Clist Public Sub AddQueue(value as Variant)x List.InsertAtBack(value) End sub Public Function DelQueue() as Variant DelQueue=list.RemoveFromFront End function Public property Get Iterator() as Variant Set Iterator=list.Iterator End Property درخت : ليستهاي پيوندي ، پشته ها و صف ها جزو ساختارهاي داده اي خطي هستند در حاليکه يک درخت ، يک ساختار داده اي دو بعدي با خصوصيات ويژه اي است . گره هاي درخت داراي دو يا چند لينک هستند . در اينجا در مورد درختهاي دودويي يا باينري بحث مي کنيم که در آن همه گره ها داراي دو لينک هستند . گره ريشه اولين گره در درخت است . هر لينک گره ريشه ، به يک فرزند اشاره مي کند . به فرزندان يک گره Siblings مي گويند . به گره بدون فرزند ، برگ يا Leaf گفته مي شود . درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هر گره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد . در بخش ششم يک کلاس برای پياده سازی درختهای جستجوی باينری ايجاد خواهيم کرد . RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم کلاس درختهای جستجوی باينری برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم : 1 - کلاس CTreeNode که هر ند درخت دودويي را توصيف می کند . اين کلاس دارای يک متغير به نام mNodeData از نوع Variant برای نگهداری داده هر گره است . همچنين دارای دو متغير اشاره گر به نامهای mLeft و mRight می باشد که به ترتيب به فرزند چپ و فرزند راست درخت اشاره می کنند . متد Get Data مقدار داده هر گره را بر می گرداند و متد Let Data مقدار داده هر گره را تنظيم می کند . متد Get Left آدرس فرزند چپ هر گره را برمی گرداند و متد Let Left فرزند چپ هر گره را تنظيم می کند . متد Get Right آدرس فرزند راست هر گره را برمی گرداند و متد Let Right فرزند راست هر گره را تنظيم می کند . متد Insert برای اضافه کردن فرزند به يک گره به کار می رود . اگر مقدار گره ای که می خواهيم بعنوان فرزند به درخت اضافه کنيم کوچکتر از مقدار خود گره باشد بعنوان فرزند چپ و در غير اينصورت بعنوان فرزند راست به گره اضافه می شود . اضافه شدن نيز بدين صورت است که ابتدا بررسی می شود آیا گره قبلاً فرزندی داشته است يا نه ؟ اگر نداشته باشد ( mLeft و يا mRight برابر Nothing باشد ) اين گره جديد مستقيماً به گره متصل می شود اما اگر گره قبلاً فرزندی داشته باشد متد Insert برای آن فرزند اضافه می شود و اينکار تا جايی ادامه می يابد که به گره ای برسيم که فرزندی نداشته باشد : Private mLeft as CtreeNode Private mRight as CtreeNode Private mNodeData as Variant Public Property Get Data() as variant Data=mNodeData End property Public Property Let Data(Byval vNewValue as Variant)x MNodeData=vNewValue End property Public Property Get Left() as variant Set Left=mLeft End property Public Property Let Left(Byval vNewValue as variant)x Set mLeft=vNewValue End property Public Property Get Right() as variant Set Right=mRight End Property Public Property Let Right(Byval vNewValue as variant)x Set mRight=vNewValue End Property Public Sub Insert(value as variant)x If valueIf mLeft Is Nothing Then Set mLeft=New CtreeNode MLeft.Data=value Else MLeft.Insert(value)x End if Elseif value>mNodeData then If mRight Is Nothing then Set mRight=New CtreeNode MRight.Data=value Else MRight.Insert(value)x End if End if End sub 2 - کلاس CTree : اين کلاس برای ايجاد درخت بکار می رود . اين کلاس دارای متغيری بنام mRoot از نوع CTreeNode برای تعريف ريشه درخت است . همچنين يک متغير mOutputString برای نمايش دادن اعضای درخت دارد . Private mRoot as CtreeNode Private mOutputString as String Public Sub InsertNode(value as Varaint)x If mRoot Is Nothing then Set Mnode=New CtreeNode MRoot.Data=value Else MRoot.Insert(value)x End if End sub Public PreorderTraversal()x MOutputString=””x Call PreorderHelper(mRoot)x End sub Private Sub PreorderHelper(node As CtreeNode)x If node Is nothing Then Exit sub End if MOutputString=mOutputString & node.Data & “ “x Call PreorderHelper(node.left)x Call PreorderHelper(node.right)x End sub Public Sub InorderTraversal()x MOutputString=””x Call InorderHelper(mRoot)x End sub Private Sub InorderHelper(node as CtreeNode)x If node Is nothing then Exit sub End if Call InorderHelper(node.Left)x MOutputString=mOutputString & node.Data & “ “x Call InorderHelper(node.Right)x End sub Public PostorderTraversal()x MOutputString=””x Call PostorderHelper(mRoot)x End sub Private Sub PostorderHelper(node as CtreeNode)x If node Is Nothing then Exit sub End if Call PostorderHelper(node.Left)x Call PostorderHelper(node.Right)x MOutputString=mOutputString & node.Data & “ “x End sub Public Property Get Output() as Varaint Output=mOutputString End Property در بخش بعد ، در مورد متدهای اين کلاس بيشتر توضيح خواهم داد و سپس برنامه نمونه ای را برای کار با اين کلاسها خواهيم نوشت RE: آموزش گام به گام ویژوال بیسیک6.0 - ADMIN - ۱۳۹۰-۶-۱۴ ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پايانی انواع روشهای پيمايش عناصر درخت : ۱ - روش InOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس ريشه و در آخر عناصر نيمه سمت راست درخت نمايش داده می شوند . ۲ - روش PreOrder : در اين روش ابتدا ريشه درخت ، سپس عناصر نيمه سمت چپ و در پايان عناصر نيمه سمت راست درخت نمايش داده می شوند . ۳ - روش PostOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس عناصر نيمه سمت راست درخت و در پايان ريشه درخت نمايش داده می شوند . مثال : درخت زير را در نظر بگيريد : نتيجه پيمايش InOrder درخت : 1,3,4,5,6,7,8 نتيجه پيمايش PreOrder درخت : 5,3,1,4,7,6,8 نتيجه پيمايش PostOrder درخت : 1,4,3,6,8,7,5 بررسی متدهای کلاس CTree : متد InsertNode : اگر گره ريشه برابر Null باشد value را برابر مقدار گره ريشه قرار می دهد . در غير اينصورت متد Insert مربوط به گره ريشه فراخوانی می شود . متد PreorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Preorder را فراخوانی می کند . متد InorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Inorder را فراخوانی می کند . متد PostorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Postorder را فراخوانی می کند . متد Get Output : عناصر پيمايش شده درخت را برمی گرداند . يک برنامه نمونه : ابتدا کلاسهای CTreeNode و CTree را به پروژه تان اضافه کنيد . سپس متغير زير را در قسمت کدنويسی فرمتان تعريف کنيد : Dim mTree as New Ctree سپس در فرمتان يک Textbox با نام Value و دو Command Button با نامهای Insert و Show قرار دهيد . کد زير را برای وارد کردن عنصر به درخت برای دکمه Insert بنويسيد : mTree.InsertNode(Value.Text)x کد زير را برای پيمايش InOrder درخت برای دکمه Show بنويسيد : Call mTree.InorderTraversal شي Collection : ويژوال بيسيک داراي شي پيش ساخته اي به نام Collection است که مي تواند مجموعه اي از مقادير با هر نوع داده اي را در خود ذخيره کند . در واقع عناصر موجود در يک Collection مي توانند داراي نوعهاي داده اي متفاوت باشند . شي Collection قابليت رشد ديناميک دارد . شي Collection توسط کلمه کليدي New ايجاد مي شوند . توسط متد Add مي توان به Cllection عضو اضافه کرد و توسط متد Remove مي توان عضوي را از آن حذف کرد . هر عضو از Collection توسط متد Item قابل دستيابي است . با استفاده از خاصيت Count مي توان تعداد اعضاي موجود در Collection را تعيين نمود . بصورت پيش فرض اعضاي جديد به انتهاي Collection اضافه مي شوند ولي توسط آرگومانهاي اختياري متد Add مي توان محل اضافه شدن را تغيير داد . متد Remove يک شماره مي گيرد که موقعيت عضوي را که مي خواهيم آنرا حذف کنيم مشخص مي کند . توسط دستورات زير مي توان اعضاي يک Collection را نمايش داد : Dim mCollection as New Collection Dim element as Variant . . . For Each element In mCollection Msgbox element element متغيري از نوع variant براي اشاره به هر عضو Collection مي باشد |