PDA

View Full Version : سوال: مشکل در پیاده سازی پشته



nadia mehraboon
چهارشنبه 07 بهمن 1388, 21:04 عصر
سلام دوستای مهربون
من می خوام طبق مراحل زیر یه فرم ودرست کنم که تو یه پشته یه سری اطلاعات رو درج و حذف کنم اما هر کاری کردم نتونستم
میشه بگید چه طوری یا اینکه سورس آماده ویژوال بیسک رو بزارید تا من توش ببینم مشکل کارم کجا بود
پیشاپیش ممنونم :بوس::قلب::بوس::قلب::بوس::قلب:: وس::قلب::بوس:
اینم توضیحش:


یک کلاس پشته را با استفاده از کلاس 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

http://barnamenevis.org/forum/images/statusicon/user_online.gif http://barnamenevis.org/forum/images/buttons/report.gif (http://www.barnamenevis.org/forum/report.php?p=897706) http://barnamenevis.org/forum/images/misc/progress.gif http://barnamenevis.org/forum/images/buttons/edit.gif (http://www.barnamenevis.org/forum/editpost.php?do=editpost&p=897706)

xxxxx_xxxxx
چهارشنبه 07 بهمن 1388, 21:34 عصر
سلام،
به برنامه نویس خوش آمدید.
چه پیغام خطایی دریافت می کنید؟
کلاس Clist رو ضمیمه کنید. (با کلیک روی دکمه "مدیریت ضمیمه ها")

nadia mehraboon
چهارشنبه 07 بهمن 1388, 22:05 عصر
ممنون از جوابت دوست مهربونم
من ضمیمه هم کردم باز خطا داد
فکر کنم مشکل از کد کلاس باشه
یا کد فرم اصلیش
می تونی تو یه وی بی اجرا کنی بعد ضمیمه کنی که ببینم؟
اینجوری راحت متوجه میشمم
ممنون :قلب:

xxxxx_xxxxx
چهارشنبه 07 بهمن 1388, 22:23 عصر
سلام،
نه؛ منظور منو متوجه نشدید، عرض کردم فایل کلاس Clist رو تو این تاپیک ضمیمه کنید تا بررسی بشه و بتونیم برنامه رو تست کنیم.
پایین همین کادری که توش تایپ می کنید یک دکمه هست که روش نوشته "مدیریت ضمیمه ها" . روش کلیک کنید و فایل کلاس رو انتخاب کنید تا فایل به پسستون ضمیمه شه.

nadia mehraboon
چهارشنبه 07 بهمن 1388, 23:47 عصر
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 براي توصيف ليست پيوندي
.


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

xxxxx_xxxxx
پنج شنبه 08 بهمن 1388, 02:03 صبح
سلام،
کد مشکل خاصی نداره. ظاهراً هنوز برای دکمه ShowStack ناقصه. اما برای Push و pop یه تغییرات جزئی باید بدید که واضحه.
1) هر جا که آخر خط به حرف x ختم شده، اون x رو حذف کنید.
2) تو کلاس ClistNode یک جا Data نوشته شده Dta ؛ اون رو اصلاح کنید.

nadia mehraboon
پنج شنبه 08 بهمن 1388, 08:37 صبح
من انجام دادم
بازم ارور ميده
اينم سورسش
لطفا ببينيد و اصلاحش كنيد
ممنون :قلب:

xxxxx_xxxxx
پنج شنبه 08 بهمن 1388, 13:25 عصر
سلام، به چند نکته دقت کنید.
1) شما کلاس هاتون رو نام گذاری نکردید! در پنجره Properties هر کلاس، مقدار Name رو باید متناظر با اونچه که گفته شده قرار بدید.

2) حروف اضافی x که در انتهای بعضی خطوط ظاهر شده رو از یکی از کلاس ها حذف نکردید.

3) توی فرم، mStack رو در رویداد Load فرم تعریف کردید . درحالیکه باید در قسمت General تعریف بشه.

4) تو کل برنامه هرچی که مقابل msgbox ها نوشته شده رو داخل " " قرار بدید. مثلاً:


MsgBox list Is Empty
باید تبدیل بشه به:


MsgBox "list Is Empty"
تو تابع RemoveFromFront در شرایطی که پشته خالی باید این دستور اجرا میشه:


RemoveFromFront = Null
نیازی به برگرداندن مقدار Null نیست. این دستور باید حذف شه.

برنامه اصلاح شده ضمیمه شد. فقط همونطور که قبلاً گفتم برنامه ناقص هست. ظاهراً کلاسی با نام ClistIterator باید وجود داشته باشه تا روال ShowStack اجرا بشه.

nadia mehraboon
دوشنبه 12 بهمن 1388, 14:35 عصر
ممنون
اون کلاس رو هم اضافه کردم
درست شد
بازم ممنونم:x