وبلاگ تخصصي برنامه نويسي با VB

پاسخی به يک پيام



دوست عزيزی پيام زير رو بدون اينکه ايميل شون رو وارد کنند گذاشتند . لذا مجبورم همينجا پاسخ بدم :

" با سلام و خسته نباشید و این حرفا... آقا Visual Basic گندترین و مزخرفترین و آشغال‌ترین زبان برنامه نویسی روی کره خاکی است. من بعد از مدت مدیدی سروکله زدن با این زبان دارم این حرفها را میزنم. اگر ادامه بدهید به همین نتیجه خواهید رسید.
نوشتن بازی با ویژوال بیسیک دیگر از آن حرفهاست. خوش باشيد . "

دوست عزير !
منم نگفتم که ويژوال بيسيک توپ ترين زبون دنياست و هيچ برنامه نويسی حرفه ای هم نمياد يه بازی با VB بنويسه . قصد من فقط آموزش مفاهيم برنامه نويسيه . شما چند نفر رو توی ايران ميشناسيد که بلدند با DirectX يه بازی بنويسند ؟
ولی بالاخره بايد از يه جائی شروع کرد . اگه شما مفاهيم برنامه نويسی با DirectX رو ياد بگيريد حالا با هر زبانی که قويتره می تونيد برنامتونو بنويسيد .
من چون از اول موضوع اين بلاگ رو VB انتخاب کردم ، به اين خاطر دارم تکنيکهای برنامه نويسی پيشرفته رو با VB توضيح می دم و بنظر من اين تکنيکها با کمی تغيير در زبونهای ديگه هم قابل استفاده است . بهر حال اگه دوستان می بينند که اين مباحث براشون مفيد نيست اطلاع بدن آموزش برنامه نويسی DirectX رو توی C++ Builder ياد بدم .
( من با Visual C زياد حال نمی کنم و بخاطر همين بيشتر با C++ Builder کار می کنم ) .

با تشکر از شما


+ حامد شیدائیان ; ٥:٥٢ ‎ب.ظ ; شنبه ٢۸ دی ،۱۳۸۱
comment نظرات ()

آموزش DirectX Input - مقدمه



مقدمه

در بخش مباحث برنامه نويسی DirectX Input شما می آموزيد که چگونه اطلاعات ورودی را از کاربر بگيريد . اين اطلاعات می تواند از طريق کيبرد ، ماوس ، جوی استيک يا گيم پد باشد .
بنابراين در پايان اين سلسله مباحث قادر خواهيد بود که يک بازی بنويسيد و يا يک برنامه مالتی مديا که بتواند توسط کاربر کنترل شود .
DirectInput ساده ترين و سريع ترين روش برای گرفتن داده ها از هر نوع ابزار ورودی می باشد .

مباحث اين بخش

بخش اول : چگونگی دريافت اطلاعات از کيبرد
بخش دوم : چگونگی دريافت اطلاعات از ماوس
بخش سوم : راهنمای استفاده از Action Mapping


+ حامد شیدائیان ; ۱٠:٢٥ ‎ق.ظ ; شنبه ٢۸ دی ،۱۳۸۱
comment نظرات ()

مبحث بعدی



مشغول کار روی روشهای ايجاد ارتباطات سريال در ويژوال بيسيک هستم .
همانطور که می دونيد استفاده از MSCOMM ساده ترين روش برای اين منظوره .
اگر اطلاعاتی در اين زمينه داريد خوشحال می شم بهم خبر بديد .


موضوع مباحث بعدی : " برنامه نويسی DirectX Input "


+ حامد شیدائیان ; ۱٠:۱٥ ‎ق.ظ ; پنجشنبه ٢٦ دی ،۱۳۸۱
comment نظرات ()

پورت Parallel و برنامه نويسی آن در ويژوال بيسيک


تذکر : در مقاله های قبلی بخشی تحت عنوان " برنامه نويسي سخت افزار در ويژوال بيسيک " نوشتم که در آن روشی برای دسترسی به پورتها از طريق ويژوال بيسيک ذکر شد . لازم به تذکر است که اين روش تنها در ويندوزهای ۹۵ و ۹۸ امکان پذير است .

مبانی پورت موازی ( Parallel )

پورت پارالل استاندارد کامپيوتر يک درگاه ۲۵ پينی است که ۱۲ پين آن خروجی می باشد . از اين ۱۲ خط ، ۸ خط بعنوان داده خروجی (‌ DATA Port ) و ۴ خط بعنوان خط کنترل ( CONTROL Port ) می باشند . ۵ پين نيز ورودی بوده و بعنوان خطوط وضعيت ( STATUS Port ) استفاده می شوند .
۸ پين باقيمانده نيز زمين ( GROUND ) هستند .


خطوط پورت پارالل توسط سه آدرس I/O که هرکدام متناظر با يکی از سه پورت داده ، کنترل و و ضعيت است قابل دسترسی می باشند . آدرس پايه پورت پارالل در اکثر کامپيوترها 0x378 می باشد (‌ LPT 1 ) . بنابراين آدرس I/O برای پورت داده برابر 0x378 ، برای پورت status برابر 0x379 و برای پورت command برابر 0x37A می باشد .
پورت پارالل استاندارد دارای دو حالت توسعه يافته به نامهای ECP و EPP نيز می باشد .
بوسيله پورت پارالل می توانيد مدارهای جانبی خود را به کامپيوتر متصل کنيد . تنها نکته ای که در اين بين وجود دارد چگونگی برنامه نويسی پورت پارالل و در نتيجه برقراری ارتباط با مدار جانبی است .
برای اطلاعات بيشتر در اين زمينه با من تماس بگيريد .

برنامه نويسی پورت پارالل در محيطهای مختلف ويندوز

استفاده از کتابخانه Inpout32.dll : با استفاده از اين dll می توان به پورتهای سيستم در محيطهای Win 9x/NT/2000/XP دسترسی داشت .
برای دريافت اين dll به اين آدرس مراجعه کنيد . برای استفاده از اين dll کافی است آنرا در دايرکتوری System32 ويندوزتان کپی کنيد . سپس يک ماژوال به پروژه تان اضافه کرده و عبارت زيرا را در آن قرار دهيد :

Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)x


حال برای مثال با دستور زير می توانيد اطلاعاتی را روی پينهای DATA ی مربوط به پورت پارالل بنويسيد :

Call Out(&H378, your_data)x


برای آشنايي با ساير روشهای دسترسی به پورت پارالل در محيطهای مختلف ويندوز با من تماس بگيريد .


+ حامد شیدائیان ; ۳:۱۳ ‎ب.ظ ; دوشنبه ٢۳ دی ،۱۳۸۱
comment نظرات ()

آشنايي با PacketX


مقدمه

PacketX مجموعه ای از کلاسهای اکتيو ايکس است که امکانات WinPcap را در ويژوال بيسيک و هر زبان برنامه نويسی ديگری که از تکنولوژی Microsoft ActiveX پشتيبانی کند مهيا می کند .
بطور خلاصه PacketX از WinPcap برای capture کردن و فيلتر کردن packet های شبکه استفاده می کند . علاوه بر capture استاندارد ، شما می توانيد از PacketX برای گردآوری اطلاعات ترافيک شبکه و ارسال raw packet استفاده کنيد .

دريافت PacketX

برای دريافت نسخه 1.3 اين کتابخانه به آدرس زير مراجعه کنيد :
PacketX 1.3 Download
قبل از استفاده از PacketX بايستی WinPcap 2.3 را که آدرس آن در بخش قبل گفته شد دريافت و نصب نمائيد .

استفاده از PacketX

با يک مثال ساده سعی می کنم روش استفاده از اين کتابخانه را به شما آموزش دهم .
پس از نصب PacketX وارد محيط ويژوال بيسيک شده و از منوی Project مورد Components را انتخاب کنيد .


سپس مورد PacketX Type Library را انتخاب کنيد تا به ToolBar اضافه شود .


اين ActiveX را در فرمتان قرار دهيد و سپس در قسمت properties آن روی Custom کليک نموده و نوع آداپتور را مشخص نمائيد .


پس از انتخاب آداپتور با کليک روی دکمه Edit می توانيد اطلاعاتی از قبيل مد کاری و ساير بافر و نوع فيلترينگ را مشخص نمائيد .


نام اين شی را نيز PacketX1 می گذاريم .
در فرمتان دو دکمه به نامهای Start و Stop قرار دهيد . همچنين يک listBox با نام IPList در فرمتان قرار دهيد .
در کد مربوط به Form_load عبارت زير را بنويسيد :

PacketX1.Adapter.BPFilter = "port 80"x


عبارت فوق مشخص می کند که می خواهيم packet های پورت 80 را capture کنيم .
کد زير را برای event مربوط به کليک شدن دکمه Start بنويسيد :

PacketX1.start


کد زير را برای متد OnPacket مربوط به PacketX1 بنويسيد :

Private Sub PacketX1_OnPacket(ByVal pPacket As PACKETXLibCtl.IPktXPacket)x
IPList.AddItem (pPacket.DestIpAddress)x
End Sub


کد فوق آدرس IP مقصد packet ها را به يک ليست اضافه می کند . شما می توانيد اطلاعات ديگری از قبيل داده موجود در packet ، سايز داده ، آدرس مبدا ، تاريخ ارسال داده و غيره را استخراج کنيد .
کد زير را برای event مربوط به کليک شدن دکمه Stop بنويسيد :

PacketX1.stop



برای اينکه بتوانيد در يک مدت خاص وضعيت دريافت و ارسال packet را بدست آوريد بايد ابتدا توسط دستور زير مد آداپتور را در حالت Statistic قرار دهيد :

PacketX1.Adapter.Mode=PktXModeStatistics
PacketX1.Adapter.ReadTimeout=2000 '// 2 sec


سپس PacketX1 را start نموده و توسط متد OnStatistics اطلاعات مربوطه را استخراج کنيد .

اطلاعات بيشتر

برای مشاهده اطلاعات کامل در مورد ساختار PacketX و ماژولهای آن به آدرس زير مراجعه کنيد :
PacketX Documentation


+ حامد شیدائیان ; ۱:٢٠ ‎ب.ظ ; شنبه ٢۱ دی ،۱۳۸۱
comment نظرات ()

آشنايی با کتابخانه Windows Packet Capture - بخش سوم



بررسی يکی از برنامه هاي نوشته شده با WinPcap : معرفی WinDump

مقدمه :

برنامه WinDump نسخه تحت ويندوز برنامه مشهور TcpDump می باشد که در سيستم عامل UNIX وجود دارد . اين برنامه يکی از بهترين ابزارهای Network Sniffer/Analyzer می باشد .
WinDump کاملاً با TcpDump سازگار می باشد و می توان از آن برای مانيتور کردن ترافيک شبکه بر اساس قوانين مختلف و پيچيده ای که قابل تنظيم هستند ، استفاده کرد .
WinDump روی سيستم عاملهای 95/98/ME و نيز NT/2000/XP قابل استفاده می باشد .
WinDump از کتابخانه libpcap موجود در WinPcap استفاده می کند .

دريافت برنامه :

برای دريافت نسخه 3.6.2 به آدرس زير مراجعه کنيد :
WinDump.exe
WinDump source code
نکته : قبل از اجرای اين برنامه بايستی برنامه 2.3 WinPcap را روی سيستم خود نصب کنيد .
برای دريافت نسخه 3.8 alpha به آدرس زير مراجعه کنيد :
WinDump.exe
WinDump source code
نکته : قبل از اجرای اين برنامه بايستی برنامه 3.0 WinPcap را روی سيستم خود نصب کنيد .

پاسخ به سوالاتی در مورد برنامه WinDump :

۱ - چگونه می توان با استفاده از WinDump ليست آداپتورهای شبکه را بدست آورد ؟
با اجرای دستور WinDump –D
توسط دستور WinDump –i adaptername می توان WinDump را روی آداپتور خاصی اجرا کرد .

۲ - آيا می توان از WinDump روی اتصالات PPP ( اتصالات مودمی ) استفاده کرد ؟
WinDump از همان device هايي پشتيبانی می کند که WinPcap می کند . به بخش قبل مراجعه کنيد .

۳ - چگونه می توان اطلاعاتی در مورد TcpDump بدست آورد ؟
به آدرس زير مراجعه کنيد :
www.tcpdump.org

۴ - با وجود نصب آخرين نسخه برنامه WinDump ، چرا اين برنامه قادر به capture کردن همه packet ها نيست ؟
توسط سوئيچ B می توانيد سايز بافر درايور را افزايش دهيد برای مثال دستور Windump –B 5000 سايز بافر را ۵ مگابايت می کند . سايز بافر برنامه در حالت عادی 1 مگابايت است .

۵ - آيا می توان چندين WinDump را روی يک ماشين اجرا کرد ؟
بله

۶ - چرا WinDump در زمان capture کردن برای مدتی hang می کند ؟
علت آن فراخوانی تابع gethostbyaddr در برنامه می باشد که برای استخراج host name ها بکار می رود . می توان توسط سوئيچ n- از name resolution جلوگيری کرد .

۷ - آيا اطلاعات کاملی در مورد برنامه WinDump وجود دارد ؟
به آدرس زير مراجعه کنيد :
WinDump Manual

موضوع بحث بعد :
آشنايي با اکتيواکس PacketX

+ حامد شیدائیان ; ۱٢:٤٧ ‎ب.ظ ; چهارشنبه ۱۸ دی ،۱۳۸۱
comment نظرات ()

آشنايی با کتابخانه Windows Packet Capture - بخش دوم


پاسخ به سوالاتی در مورد کتابخانه WinPcap :

۱ - WinPcap چگونه روی سيستم نصب می شود ؟
در صورت اجرای فايل نصب ، فايل درايور و Dll های مربوطه در دايرکتوری سيستم شما کپی می شوند . همچنين در Control Panel بخش Add/Remove Program می توانيد عبارت WinPcap را مشاهده کنيد .

۲ - آيا WinPcap 2.2 آخرين نسخه WinPcap است ؟
خير . آخرين نسخه WinPcap نسخه ۲.۳ می باشد که از آدرس زير قابل دريافت است :
Support Windows 95/98/ME/NT/2000/XP
WinPcap auto-installer:driver +DLLs
Developer's pack
WinPcap source code
همچنين WinPcap 3.0 Alpha 4 را می توانيد از آدرس زير دريافت کنيد :
WinPcap auto-installer:driver +DLLs

۳ - چگونه می توان فهميد که WinPcap در حال اجرا روی يک کامپيوتر Win2k/XP است ؟
در بخش Run دستور msinfo32 را وارد کنيد . سپس در بخش Software Environment و سپس بخش System Drivers بايستی عبارت NPF را ببينيد .

۴ - برنامه های بر مبنای WinPcap ( مثل Windump که بعداً در مورد آن صحبت خواهم کرد ) بدرستی اجرا نمی شوند . آيا اشکال از WinPcap است ؟
برنامه Windump را نصب کنيد . دستور windump -D ليست آداپتورهای مجاز را گزارش می دهد و همچنين نشان می دهد که آيا WinPcap قادر به شناسايی درست سخت افزار شما بوده است يا نه . اگر Windump درست کار کند ، اشکال از برنامه شماست نه از WinPcap .

۵ - آيا می توان از WinPcap در اتصالات PPP (‌ اتصالات مودمی ) استفاده کرد ؟
در ويندوز ۹۵ بخاطر باگی که در NDIS است WinPcap گاهی اوقات اتصال PPP را reset می کند . در ويندوزهای ۹۸ و ME اين مشکل وجود ندارد اما گاهی اوقات قادر به ارسال packet نيست . در ويندوزهای NT/2k/XP نيز برخی مشکلات در فرايند binding وجود دارد که مانع از درست کار کردن درايور پروتکل روی آداپتور WAN می شود . اين مشکل بخاطر درايور PPP با نام ndiswan است که يک واسط استاندارد را برای capture کردن مهيا نمی کند .

۶ - Security در WinPcap چگونه است ؟
مدل Security اين برنامه ضعيف است و نويسندگان اين برنامه درحال کار روی آن هستند .

۷ - آيا از WinPcap می توان در محيطهای برنامه نويسی Borland استفاده کرد ؟
برای اينکه بتوان از امکانات WinPcap در C++ Builder استفاده کرد بايستی توسط برنامه COFF2OMF.EXE که در دايرکتوری Borland وجود دارد ، کتابخانه های Packet.lib و wpcap.lib که بر اساس استانداردهای مايکروسافت ( استاندارد COFF ) هستند را به استاندارد OMF تبديل کنيد مثال : COFF2OMF input.lib output.lib

۸ - آيا می توان از WinPcap در ويژوال بيسيک استفاده کرد ؟
بطور مستقيم نمی توان از اين کتابخانه در VB استفاده کرد . شرکت BeeSync يک کنترل ActiveX با نام PacketX ايجاد کرده که بوسيله آن می توان از تواناييهای WinPcap در ويژوال بيسک يا هر محيط ديگری که Microsoft ActiveX technology را پشتيبانی کند استفاده کرد .

بحث در مورد اين ActiveX موضوع بخش بعدی اين سلسه مقالات می باشد .

۹ - آيا WinPcap می تواند با فايروال کار می کند ؟
ممکنست گاهی اوقات کار نکند .

۱۰ - آيا می توان از WinPcap در جاوا استفاده کرد ؟
WinPcap بطور مستقيم از جاوا پشتيبانی نمی کند اما در اين آدرس می توانيد يک Java wrapper را برای اينکار دريافت کنيد .

۱۱ - آيا WinPcap از device های loopback پشتيبانی می کند ؟
خير و علت آن بخاطر محدوديتهای ويندوز است .

۱۲ - WinPcap از چه سخت افزارهايي پشتيبانی می کند ؟
NPF device driver طوری توسعه يافته که بتواند با آداپتورهای اترنت درست کار کند اما نمی تواند بدرستی با آداپتورهای PPP WAN ( مودمها ) کار کند . همچنين نبايستی با کارتهای FDDI, ARCNET, ATM و Token Ring مشکلی داشته باشد اما اين امر بطور قطعی تائيد شده نيست . با آداپتورهای Wireless نيز نمی تواند درست کار کند و در بهترين حالت قادرست يک Ethernet emulation را ببيند .

۱۳ - آيا می توان توسط WinPcap ، بسته های اطلاعاتی ورودی را Drop کرد ؟
خير فقط می توان بسته ها را capture کرد .

۱۴ - آيا می توان توسط امکانات WinPcap يک Firewall ساخت ؟
همانطور که در بالا گقته شد WinPcap قابليت Drop کردن بسته ها را ندارد و تواناييهای Filtering در WinPcap تنها روی بسته های sniff شده است . برای جلوگيری کردن از ورود يک بسته به پشته TCP/IP بايستی خودتان يک درايور ميانی ايجاد کنيد .

۱۵ - چگونه می توان کاری کرد که WinPcap بطور اتوماتيک در زمان بوت سيستم فعال گردد ؟
مقدار کليد زير را در رجيستری از 0x3 به 0x2 تغيير دهيد . اين کار فقط در ويندوزهای NTx جواب می دهد :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NPF\Start

۱۶ - آيا با کامپايل مجدد سورس WinPcap نتيجه درستی حاصل می شود ؟
بله اما ابتدا بايستی Service Pack 5 برنامه Microsoft Visual Studio را از سايت مايکروسافت دريافت و آنرا نصب کنيد .

۱۷ - آيا درايورهای ديگری بجز WinPcap برای کار با packet های TCP/IPوجود دارد ؟
بله . برای مثال برنامه Zx Sniffer يک کتابخانه capture کردن packet دارد که مشابه WinPcap است .

۱۸ - آيا Document ها و Tutorial های کاملی برای کار با Packet Driver API و Packet.dll و wpcap.dll در ويژوال سی وجود دارد ؟
بله . برای اينکار می توانيد از مطالب زير استفاده کنيد :
How to use wpcap.dll
wpcap specific extensions
Packet Driver API. How to use the low level capture library
Instructions and examples of how to write and compile a capture application using libpcap calls or packet driver's (PACKET.DLL) calls
Compiling WinPcap

+ حامد شیدائیان ; ۱٢:٠٩ ‎ب.ظ ; سه‌شنبه ۱٧ دی ،۱۳۸۱
comment نظرات ()

آرشيو موضوعی


بخش آرشيو موضوعی به وبلاگ اضافه شد .
اکنون می توانيد با کليک روی لينک سمت راست ، ليست مطالب گذشته اين وبلاگ را مشاهده کنيد .

+ حامد شیدائیان ; ۱٢:٠۳ ‎ب.ظ ; دوشنبه ۱٦ دی ،۱۳۸۱
comment نظرات ()

آشنايي با کتابخانه Windows Packet Capture - بخش اول


مقدمه :

برای آشنايي با مبانی شبکه های TCP/IP به بحث مروری بر TCP/IP مراجعه کنيد .

معرفی :

کتابخانه WinPcap يک معماری برای استخراج Packet های TCP/IP و آناليز شبکه در محيطهای ۳۲ بيتی ويندوز می باشد . اين کتابخانه شامل سه بخش است :

۱ - يک فيلتر Packet در سطح هسته سيستم عامل ( Kernel )

۲ - يک کتابخانه dll سطح پايين ( low-level ) با نام packet.dll

۳ - يک کتابخانه مستقل از سيستم عامل و سطح بالا ( high-level ) با نام wpcap.dll

فيلتر packet يک درايور دستگاه ( device driver ) است که به ويندوزهای ۹۵ ، ۹۸ ، ME ، NT و ۲۰۰۰ قابليت استخراج و capture کردن و نيز ارسال داده خام ( raw data ) از يک کارت شبکه را می دهد . همچنين اين امکان را دارد که packet های capture شده را در يک بافر ذخيره کند و يا آنها را فيلتر نمايد .
packet.dll يک API است که بمنظور دسترسی مستقيم به عملکرد درايور packet استفاده می شود . بنابراين packet.dll يک واسط برنامه نويسی مستقل از سیستم عامل های مايکروسافت را مهيا می کند .
Wpcap.dll مجموعه ای از ابزارهای سطح بالای اصلی برای capture را مهيا می کند که اين توابع با کتابخانه libpcap ( کتابخانه capture در سيستم عامل UNIX ) سازگار می باشند . اين توابع اجازه capture کردن packet ها را با روشی مستقل از سخت افزار شبکه و مستقل از سيستم عامل مهيا می کنند .

دريافت کتابخانه WinPcap :

نسخه WinPcap 2.2 :
برای دريافت برنامه auto-installer ( شامل درايور و DLL های مربوطه ) برای سيستم هایWindows 95/98/ME/NT/2000 به آدرس زير مراجعه کنيد :
WinPcap auto-installer (driver +DLLs)
برای دريافت بسته توسعه دهنده اين کتابخانه که شامل برنامه های نمونه ايجاد شده توسط packet capture driver و packet.dll و libpcap است ، به آدرس زير مراجعه کنيد :
Developer's pack
برای دريافت source code کتابخانه WinPcap به آدرس زير مراجعه کنيد :
WinPcap source code

+ حامد شیدائیان ; ۱٠:٠٦ ‎ق.ظ ; چهارشنبه ۱۱ دی ،۱۳۸۱
comment نظرات ()

ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پايانی


انواع روشهای پيمايش عناصر درخت :
۱ - روش 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 مي باشد .
+ حامد شیدائیان ; ٤:٤٩ ‎ب.ظ ; سه‌شنبه ۱٠ دی ،۱۳۸۱
comment نظرات ()

ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم

کلاس درختهای جستجوی باينری

برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
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


در بخش بعد ، در مورد متدهای اين کلاس بيشتر توضيح خواهم داد و سپس برنامه نمونه ای را برای کار با اين کلاسها خواهيم نوشت .

+ حامد شیدائیان ; ۱٠:٢٠ ‎ق.ظ ; پنجشنبه ٥ دی ،۱۳۸۱
comment نظرات ()

ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم

صف :
صف نوعي ساختار داده اي است که گره ها از ابتداي صف ( سر صف 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 گفته مي شود .
درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هر گره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد .


در بخش ششم يک کلاس برای پياده سازی درختهای جستجوی باينری ايجاد خواهيم کرد .

+ حامد شیدائیان ; ٩:٤۸ ‎ق.ظ ; سه‌شنبه ۳ دی ،۱۳۸۱
comment نظرات ()

ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم


کلاس پشته :
همانطور که در بخش قبل گفته شد پشته نوعی ليست پيوندی است که گره هاي جديد فقط به انتهاي آن اضافه شوند . روالهاي اصلي پشته 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


+ حامد شیدائیان ; ۱٠:٥٥ ‎ق.ظ ; یکشنبه ۱ دی ،۱۳۸۱
comment نظرات ()