الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خوارزميات بسيطة للمبتدئين

مثبّترائج
بدأه Abboodd في 23 ديسمبر 2008 · 56 رد · 104,762 مشاهدة · في قسم الدروس والمواضيع الهامة
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم ورحمة الله

هذا كود رسم المربع:

  1.  
  2. Dim RectangleWidth As Integer, RectangleHeight As Integer, Letter As String, i As Integer, j As
    Integer
  3. RegtangleWidth = Text2.Text
  4. RectangleHeight = Text1.Text
  5. Letter = Text3.Text
  6. Text4.Text = ""
  7. For i = 1 To RectangleHeight
  8. For j = 1 To RectangleWidth
  9. Text4.Text = Text4.Text & Letter
  10. If j = RectangleWidth Then Text4.Text = Text4.Text & vbNewLine
  11.  

ممممم، ما الذي حدث هنا؟؟؟

فلنسر مع الكود خطوة خطوة:

Dim RectangleWidth As Integer, RectangleHeight As Integer, Letter As String, i As Integer, j As Integer

تعريف متغيرات هي: العرض، الطول، الحرف الذي سنكتب به، ومتغيران لحلقتي For

RegtangleWidth = Text2.Text
RectangleHeight = Text1.Text
Letter = Text3.Text
Text4.Text = ""

وهنا قمنا بجعل العرض هو العدد المكتوب في Text2 والطول هو العدد المكتوب في Text1 والحرف هو الحرف المكتوب في Text3، ثم قمنا بمسح محتويات Text4 الذي سوف يتم الرسم فيه، وذلك لأننا إذا أردنا الرسم أكثر من مرة، فسوف نحتاج لأن نمسح المكتوب في المرة السابقة ليظهر ما نريد، تمام؟؟ :)

For i = 1 To RectangleHeight
	For j = 1 To RectangleWidth

وتبدأ الحلقتان، يمكنك أن تلاحظ أننا قمنا باستدعاء إحدى الحلقتين من داخل الثانية، لماذا؟ هنا فلنفترض أن المتغير RectangleHeight قيمته 3، والمتغير RectangleWidth قيمته 5، عندما يدخل البرنامج أثناء سيره إلى الحلقة الأولى، سيجد الحلقة الثانية من داخلها، ويقوم بتنفيذها 5 مرات، في كل مرة يقوم بالتالي:

Text4.Text = Text4.Text & Letter

أي أنه في كل مرة سيضيف الحرف المحدد في المتغير Letter إلى النص المكتوب، فإذا وجد أنه قد وصل إلى العدد الذي حددناه في متغير العرض، انتقل إلى السطر الثاني هكذا:

If j = RectangleWidth Then Text4.Text = Text4.Text & vbNewLine

هنا سوف يتحقق هل وصل المتغير في حلقة For إلى 5 في حالتنا هذه؟ إن كان فعلاً قد وصل فإنه يضيف سطراً جديداً vbNewLine ثم يخرج من الحلقة الصغيرة، ويجد عندها Next الخاصة بالحلقة الكبيرة، عندها سيزيد i مرة واحدة، ويعود لينفذ الحلقة من جديد، ويكرر العملية 3 مرات في مثالنا هذا لنحصل على الشكل التالي:

@@@@@

@@@@@

@@@@@

أرجو أن أكون قد وفقت في شرح هذا المثال

والسلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#27

السلام عليكم ورحمة الله

خوارزمية رسم مثلث قائم بحرف ما:

خوارزميتنا اليوم شبيهة بسابقتها، كما رأيتم في المثال في المرفقات السابقة، عند تحديد رقم معين كطول لضلع المثلث القائم، وحرف معين ليرسم به، مثلاً الطول 7 والحرف @ فستكون النتيجة بعد ضغط الزر كالتالي:

@

@@

@@@

@@@@

@@@@@

@@@@@@

@@@@@@@

فكيف سنقوم بذلك؟ :hmm:

أنت أخبرني....... لأني لن أشرح هذه المرة، أنت من سيفكر ويحسب ويستنتج، طبعاً لا تنسَ الاستعانة بحلقات For التكرارية وطرق الانتقال من سطر إلى آخر vbNewLine

وأهم شيء ضبط خاصية MultiLine إلى True.

نعم يا عزيزي.... :) أنت من سيفكر ويحل، لأنك إذا لم تملك الإرادة للتعلم، فلا أحد يستطيع تعليمك.

بالتوفيق ;)

والسلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#28

السلام عليكم ورحمة الله

ستضحك من نفسك بعد هذا الحل :) :

  1.  
  2. Dim Letter As String
  3. Dim TriangleLength As Integer
  4. Dim i As Integer, j As Integer
  5. Letter = Text2.Text
  6. TriangleLength = Text1.Text
  7. Text3.Text = ""
  8. For i = 1 To TriangleLength
  9. For j = 1 To i
  10. Text3.Text = Text3.Text + Letter
  11. If j = i Then Text3.Text = Text3.Text + vbNewLine
  12.  
  13.  

ولنشرحه:

Dim Letter As String
Dim TriangleLength As Integer
Dim i As Integer, j As Integer

عرفنا ثلاثة متغيرات: متغير الحرف الذي سيرسم المثلث به، متغير طول ضلع المثلث، ومتغيران لحلقتي For

ثم:

Letter = Text2.Text
TriangleLength = Text1.Text
Text3.Text = ""

نجعل متغير الحرف هو ما يطبعه المتسخدم في Text2 ومتغير الطول ما يطبعه في Text1 ونقوم بتفريغ مربع النص الذي سنكتب فيه.

ثم:

For i = 1 To TriangleLength
	For j = 1 To i
		Text3.Text = Text3.Text + Letter
		If j = i Then Text3.Text = Text3.Text + vbNewLine
	Next
Next

نجعل المتغير i يمشي من 1 إلى الطول وليكن 7

ثم نجعل المتغير j يمشي من 1 أيضاً إلى القيمة التي وصل إليها i وستعرفون لماذا :)

ولنتابع سير البرنامج بافتراض أن متغير الطول يساوي 7 ومتغير الحرف هو @

سيدخل البرنامج إلى الحلقة الكبيرة التي متغيرها هو i ومنها يدخل إلى الصغيرة التي متغيرها j، وبما أننا كتبنا:

For j = 1 To i

فإنه سينظر إلى قيمة i وسيجدها واحداً بما أننا في المرة الأولى من الحلقة، فيقوم بتنفيذ الأوامر مرة واحدة، ويضيف الحرف @ إلى النص ثم يتحقق هل أصبح المتغير j يساوي المتغير i ، وبما أن j=i=1 فإنه سينتقل إلى سطر جديد ويخرج من الحلقة

ثم يعود من جديد ويزيد قيمة i مرة واحدة ويعود ليكرر العملية من جديد وهذه المرة سيكررها مرتين، لأن قيمة i أصبحت 2، ثم يطبع سطراً جديداً ويعود ليزيد قيمة i مرة واحدة وهكذا حتى تصل قيمة i إلى 7 ويكون قد طبع الشكل التالي في مربع النص:

@

@@

@@@

@@@@

@@@@@

@@@@@@

@@@@@@@

حاول أن تركز وتفهمها جيداً ;)

فهذه كانت آخر خوارزمية في المرحلة الثانية، وننتقل إلى المرحلة الثالثة قريباً بإذن الله

والسلام عليكم ورحمة الله

تم تعديل هذه المشاركة بواسطة Abboodd في 25 فبراير 2009 في 16:46

هذه الجملة خاطئة  :wacko: 


#29

السلام عليكم ورحمة الله

هذه المرحلة الثالثة والأخيرة، سنستعمل فيها دوالاً من تصميمنا، مصفوفات ديناميكية، وأشياء جميلة بإذن الله.

لذلك كن مستعداً ;)

Level_3.rar

هذه الجملة خاطئة  :wacko: 


#30

بارك الله فيك

و جزاك احسن الجزاء

وارجو من حضرتك بعد اكمال هذه الخوارزميات الرائعة ... البدء فى شرح ال oop

الللى عقدتنى ..... :cry:

#31
اقتباس
بارك الله فيك

و جزاك احسن الجزاء

وارجو من حضرتك بعد اكمال هذه الخوارزميات الرائعة ... البدء فى شرح ال oop

الللى عقدتنى .....

آمين على الدعاء، وبالنسبة لـOOP هناك دروس عنها في قسم الدروس والمواضيع الهامة، يمكنك البحث عن المواضيع التي تتحدث عن الأصناف Classes.

ونصيحة، إذا أردت أن تتعلم البرمجة غرضية التوجه، فعليك كما يقول Mike D Sutton أن تتعلم بعض اللغات التي تدعم البرمجة غرضية التوجه بشكل كامل، مثل C++ أو Java، ليس من الضروري أن تتعلمها كلها، ولكن فقط المبادئ.

هذه الجملة خاطئة  :wacko: 


#32

شاكر رد حضرتك والاهتمام بالموضوع.......

وارجو ان تأخذ بايدينا "نحن المبتداين " الى الطريق الصحيح

وجزاك الله عنا خير الجزاء

المشكلة انى فاهم ال oop فى ال php نقول بنسبة 50%

لكن لم تعاملت معها فى ال vb.net حسيت بلخبطة ؟!

وبالرغم انى قرات كتاب " برمجة إطار عمل دوت نت " لاستاذنا الفاضل " تركى العسيرى" جزاه الله خيرا وبارك الله له فى دنياه و آخرته

الا انى شعرت بالحيرة بين مفاهيم ال oop فى كلا اللغتين

فهل ذلك غباء منى ام يوجد فرق ام ماذا .... ؟؟

#33
اقتباس
المشكلة انى فاهم ال oop فى ال php نقول بنسبة 50%

لكن لم تعاملت معها فى ال vb.net حسيت بلخبطة ؟!

وبالرغم انى قرات كتاب " برمجة إطار عمل دوت نت " لاستاذنا الفاضل " تركى العسيرى" جزاه الله خيرا وبارك الله له فى دنياه و آخرته

الا انى شعرت بالحيرة بين مفاهيم ال oop فى كلا اللغتين

مبادئ OOP هي واحدة في كل اللغات، تغليف، وراثة.....

فقط أنت اقعد، وحاول المقارنة بين العملية في هذه اللغة، وفي اللغة الأخرى، أنا شخصياً، فهمت البرمجة غرضية التوجه بشكل أكبر بكثير بعد تعلم مبادئها في C++ ، المشكلة أنني لا أستطيع مساعدتك لسببين، أولهما أني لست خبيراً جداً في الـOOP ولكني أتعلمها وأحاول استعمالها في البرنامج الذي أعمل عليه الآن، والسبب الثاني أنك تتحدث عن VB.NET وهذا المنتدى لـClassic VB يعني فيجوال بيسك 6 وما قبلها، ابحث في منتدى VB.NET لعلك تجد ما تريده.

وفقك الله :)

هذه الجملة خاطئة  :wacko: 


#34

السلام عليكم ورحمة الله

خوارزمية رسم مثلث متساوي الساقين بحرف ما:

على غرار سابقتيها، هذه خوارزمية رسم بالحروف، اكتب رقماً ما في مربع طول الضلع، واختر حرفاً في مربع الحرف، واضغط الزر لترى النتيجة، فلنأخذ مثلاً الطول 7 والحرف #:

------#

-----###

----#####

---#######

--#########

-###########

#############

إذا اعتبرنا أن الخط - هو مسافة فارغة، فهذا يعني أنك في السطر الأول ستضع 6 مسافات فارغة، وحرفاً واحداً، في السطر الثاني سيقل عدد المسافات واحداً ويزداد عدد الحروف اثنين، وهكذا حتى يصل عدد المسافات في السطر السابع إلى الصفر.

هذه المرة لن أكتب لك كوداً، أنت اكتشفها بنفسك (على الورقة والقلم)، إذا أردت أن تعرف كيف تضيف فراغات فأسهل طريقة هي هذه:

Text1.Text=Text1.Text + " "

بسيطة ;)

طبعاً لا تنس ما تعلمناه، من vbNewLine و خاصية MultiLine .....

والسلام عليكم ورحمة الله

تم تعديل هذه المشاركة بواسطة Abboodd في 10 مارس 2009 في 19:28

هذه الجملة خاطئة  :wacko: 


#35

السلام عليكم ورحمة الله

هذا هو الكود:

  1.  
  2. Dim TriangleLength As Integer
  3. Dim Letter As String
  4. Dim A As Integer
  5. Dim i As Integer, j As Integer, y As Integer
  6. TriangleLength = Text1.Text
  7. Letter = Text2.Text
  8. Text3.Text = ""
  9. A = 0
  10. For i = 1 To TriangleLength
  11. For j = 1 To TriangleLength - i
  12. Text3.Text = Text3.Text + " "
  13. For y = 0 To A
  14. Text3.Text = Text3.Text + Letter
  15. Text3.Text = Text3.Text + vbNewLine
  16. A = A + 2
  17.  
  18.  

فلنحلل الكود، أولاً:

Dim TriangleLength As Integer
Dim Letter As String
Dim A As Integer
Dim i As Integer, j As Integer, y As Integer

تعريف متغير الطول، الحرف المستخدم في الكتابة، ومتغير لعدد الحروف الذي سنكتبها في كل سطر، وثلاثة متغيرات لجمل For.

ثم:

TriangleLength = Text1.Text
Letter = Text2.Text
Text3.Text = ""
A = 0

نعبئ المتغيرات بالقيم الموجودة في النصوص، ونفرغ النص الذي سنكتب فيه كما أننا نجعل قيمة المتغير A مساوية للصفر، فقد نحتاج إلى القيام بالعملية أكثر من مرة..

ثم:

For i = 1 To TriangleLength
	For j = 1 To TriangleLength - i
		Text3.Text = Text3.Text + "	"
	Next

وهنا ندخل إلى الحلقة الكبيرة التي متغيرها i وندخل منها إلى الصغيرة التي متغيرها j والتي ستحدث في المرة الأولى ست مرات في حال كان طول المثلث 7،، وفي كل مرة تتم إضافة مسافات فارغة، هنا أنا وضعتها أربع فراغات، يمكنك أن تضع أي عدد يناسبك من الفراغات

ثم تأتي الحلقة الثانية:

	For y = 0 To A
		Text3.Text = Text3.Text + Letter
	Next
	Text3.Text = Text3.Text + vbNewLine
	A = A + 2
Next

ثم هنا نضيف الحرف، يمكننا ملاحظة أن المتغير A يزيد مرتين في كل حلقة كبيرة، يعني، لنحلل الكود إذا كان طول الضلع 7

الحلقة الكبيرة ستحدث 7 مرات، من واحد إلى 7، ثم ندخل منها إلى الصغيرة الأولى، ستتكرر 6 مرات لأننا نطرح قيمة i من طول الضلع، وفي المرة الأولى ستكون قيمة i هي واحد، لذلك ستحدث الحلقة الصغيرة ست مرات، وتطبع الفراغات ست مرات، ثم تنتقل إلى الحلقة الثانية، ستتكرر في البداية مرة واحدة، لأننا نمشي من الصفر إلى A الذي قيمته صفر، ونطبع الحرف مرة واحدة، ثم نخرج من الحلقة، نضيف سطراً vbNewLine ونزيد قيمة A مرتين، ثم نعود إلى أول الحلقة الكبيرة، وتصبح قيمة i هي 2، وتتكرر الأمور، لاحظ هذه المرة أن الحلقة الصغيرة الأولى ستتكرر 5 مرات، بينما تتكرر الحلقة الثانية 3 مرات.

أرجو أن أكون قد وفقت للشرح، والسلام عليكم ورحمة الله

تم تعديل هذه المشاركة بواسطة Abboodd في 11 مارس 2009 في 16:24

هذه الجملة خاطئة  :wacko: 


#36

السلام عليكم ورحمة الله

خوارزمية إيجاد قواسم عدد:

عدنا إلى الابتدائي ;) إذا نظرت إلى الخوارزمية التالية في مرحلتنا هذه، وكتبت عدداً ما في مربع النص، ثم ضغطت الزر الموجود، فسوف يعطيك قواسم العدد، كل قاسم في رسالة MsgBox ، فمثلاً قواسم العدد 18 هي:

1

2

3

6

9

18

فهو يقبل القسمة على هذه الأعداد.

بدءاً من خوارزميتنا هذه، سنقوم باستخدام الإجراءات للقيام بالعمليات التي نريدها، ، سنصمم إجراءً تعطيه الرقم فيعطيك مصفوفة عناصرها قواسمه، من الممكن أن يكون شكل الإجراء كالتالي:

Private Sub FindDeviders(ByVal Num As Long, ByRef Result() As Long)

لاحظ الوسيط Result() ، القوسان الفارغان يدلان على أنها مصفوفة ديناميكية، إذا لم تكن بعد قد فهمت المصفوفات جيداً، وخصوصاً الديناميكية منها، فسارع إلى ذلك...

سوف أعطيك طريقة عمل هذا الإجراء:

هناك بعض الأشياء التي يجب أن نراعيها عند حلنا لهذه الخوارزمية:

1- ما هي قواسم العدد المحدد؟

2- ما عددها؟

3- كيف نحصل عليها؟

4- كيف نعرض النتائج؟

سوف نستعمل بالتأكيد حلقة For تكرارية، تمشي من الواحد إلى العدد الذي حددناه في الوسيط Num ، وكلما وجدنا عدداً قاسماً لعددنا هذا باستخدام المعامل Mod، أضفناه إلى مصفوفة النتائج، وزدنا عدد القواسم واحداً، يمكنك الاستفادة من جملة:

ReDim Preserve Deviders(Times)

حيث Deviders هي مصفوفة النتائج، وTimes هو العدد الحالي للقواسم، تذكر أنه يجب أن تدرس المصفوفات جيداً قبل البدء بهذه الخوارزمية، وفي النهاية، تسند القيم التي تجمعت عندك في المصفوفة Deviders إلى المصفوفة Result كالتالي:

Result() = Deviders()

ما رأيك بالمزيد من المساعدة؟؟؟ هذا كود الزر Command1:

  1. Private Sub Command1_Click()
  2. Dim MyArray() As Long
  3. Dim Counter As Long
  4. Call FindDeviders(Val(Text1.Text), MyArray())
  5. For Counter = 0 To UBound(MyArray)
  6. MsgBox MyArray(Counter)
  7. Erase MyArray
  8. End Sub
  9.  
  10.  

كما ترى، عرفنا المصفوفة الديناميكية MyArray وأسندنا إليها القواسم

ثم نعرض كل عنصر منها في MsgBox يمكنك ملاحظة الدالة UBound والتي تعيد لك رقم آخر عنصر في المصفوفة، إذا أردت الحصول على رقم أول عنصر فيها، يمكنك استخدام الدالة LBound أي إذا كانت المصفوفة فيها 9 عناصر من 0 إلى 8 مثلاً، فإن UBound تعطيك رقم 8، و LBound تعطيك صفر.

لكننا لن نحتاج إلا إلى UBound في خوارزميتنا هذه، فبدايتها معروفة بالنسبة لنا، على عكس نهايتها.

كما أننا استعملنا الدالة Erase لمسح المصفوفة في نهاية الإجراء، فنحن لم نعد بحاجة إليها.

حاول قراءة هذا الشرح وفهمه جيداً، واستيعاب كل كلمة منه، بقي عليك كتابة الإجراء FindDeviders حاول قدر المستطاع، وفكر على الورقة والقلم ;)

والسلام عليكم ورحمة الله

تم تعديل هذه المشاركة بواسطة Abboodd في 13 مارس 2009 في 15:05

هذه الجملة خاطئة  :wacko: 


#37

السلام عليكم ورحمة الله

أظن أن هذه الخوارزمية كانت جديدة بعض الشيء عليكم، لكن لا بأس، إن كنت قد حاولت ونجحت، فهذا ممتاز، وإن كنت قد حاولت وفشلت، فهذا أيضاً ممتاز، أما إن فكرت خمس دقائق ثم ذهبت، فهذا يعني أن هذا الموضوع كله لا فائدة منه، فالهدف الأساسي هنا، هو أن تتعلم كيف تفكر في حل مشاكلك.

وإليكم شفرة الحل:

  1.  
  2. Private Sub FindDeviders(ByVal Num As Long, ByRef Result() As Long)
  3.  
  4. Dim Times As Long
  5. Dim Deviders() As Long
  6. Dim Counter As Long
  7.  
  8. For Counter = 1 To Num
  9. If Num Mod Counter = 0 Then
  10. ReDim Preserve Deviders(Times)
  11. Deviders(Times) = Counter
  12. Times = Times + 1
  13. End If
  14.  
  15. Result() = Deviders()
  16.  
  17. End Sub
  18.  
  19.  

ما الذي فعلناه هنا؟؟

أولاً عرفنا مصفوفة ستحمل القواسم، ومتغيراً هو عدد القواسم، ومتغيراً ثالثاً لحلقة For:

Dim Times As Long
Dim Deviders() As Long
Dim Counter As Long

ثم بدأنا بحلقة، تمشي من الواحد إلى العدد Num فإذا كان Num يقبل القسمة على العدد الذي وصلنا إليه، أعدنا تعريف المصفوفة Deviders مع الاحتفاظ بالعناصر التي كانت فيها ثم نضيف العدد Counter إلى المصفوفة، ونزيد عدد القواسم مرة واحدة.

وبالمثال تتضح الفكرة، لو اعتبرنا أن العدد Num هو 15، فلنبدأ بالحلقة التي ستصبح هكذا:

For Counter = 1 To 15
	If 15 Mod Counter = 0 Then
		ReDim Preserve Deviders(Times)
		Deviders(Times) = Counter
		Times = Times + 1
	End If
Next

لاحظ أننا وضعنا 15 بدل Num، ثم تبدأ الحلقة، هل 15 تقبل القسمة على 1 بدون باقي؟ نعم، إذاً أعد تعريف المصفوفة Deviders وضع فيها عنصراً واحداً سيكون رقمه 0، لأن قيمة Times لا زالت صفر، ثم اجعل قيمة هذا العنصر:

Deviders(0)=1

وزد قيمة Times مرة واحدة، ثم أكمل الحلقة، هل تقبل 15 القسمة على 2؟ لا، إذاً أكمل، هل تقبل الثلاثة؟ نعم، إذاً أعد تعريف المصفوفة Deviders ولكن هذه المرة بعنصرين، العنصر الأول (0) كانت قيمته واحد، أما العنصر الثاني (1) ستصبح قيمته 3، ونزيد Times مرة واحدة ونكمل.... إلى أن ننهي الأعداد كلها، ثم نضع كل عناصر المصفوفة Deviders في المصفوفة Result

أما الإجراء Command1_Click فقد طرحته من قبل، يمكنك الاستغناء عن هذا السطر:

Erase MyArray

فهو خطأ مني وزيادة لا فائدة منها.

حاول قراءة الشرح جيداً، والتفكير بطرق أخرى لحل هذه الخوارزمية.

والسلام عليكم ورحمة الله

تم تعديل هذه المشاركة بواسطة Abboodd في 13 مارس 2009 في 15:29

هذه الجملة خاطئة  :wacko: 


#38

السلام عليكم ورحمة الله

خوارزمية كتابة الأعداد غير الأولية:

مممممممممممممم... إذا جربت خوارزميتنا الثالثة في هذه المرحلة، وكتبت العدد 15 مثلاً في مربع النص، ثم ضغطت الزر، فسوف تظهر لك رسائل MessageBoxes تحوي هذه الأعداد:

1

4

6

8

9

10

12

14

15

يمكنك ملاحظة أن هذه الأعداد هي الأعداد غير الأولية المحصورة بين الواحد والـ15، فهو يعطيك رسالة بكل عدد غير أولي حتى يصل إلى العدد الذي حددته،.

سوف نناقش هنا بعض المفاهيم:

ما هو العدد الأولي؟

هو كل عدد صحيح طبيعي أكبر تماماً من الواحد، ولا يقبل القسمة إلا على نفسه أو على الواحد.

وأظن هذا معروفاً ولكن للتذكرة، وللتأكيد على أن العدد واحد لا يعتبر عدداً أولياً.

في تمريننا هذا سنستعمل دالة وإجراء، الدالة هي:

Private Function IsPrimary(ByVal Number As Long) As Boolean

وسوف نستعملها لنعرف هل العدد Number أولي أو لا، فإذا كان العدد أولياً تعيد لك الدالة True وإذا لم يكن تعيد False.

في هذه الدالة يمكننا في البداية أن نختبر العدد، هل هو الواحد؟ فإن كان فهو غير أولي حسب التعريف، فنعيد False ونخرج من الدالة عن طريق Exit Function.

ثم نكمل الدالة إن لم يكن واحداً ونبدأ حلقة تكرارية من العدد Number-1 إلى 2 (حاول أن تفكر لماذا :calc: ) ونجرب قسمة العدد Number على كل عدد في هذه الحلقة، فإن قبل القسمة على أي منها أسندنا قيمة False إلى الدالة وخرجنا منها، وإلا فنكمل، وفي النهاية إن أنهى الحلقة ولم يخرج بعد من الدالة فهذا يعني أننا جربنا القسمة على كل الأعداد ولم ننجح، وعندها نسند True.

أما الإجراء الذي سنستعمله فهو:

Private Sub WriteUnPrimaryNumbers(ByVal Number As Long, ByRef Result() As Long)

وفي هذا الإجراء سنمشي في حلقة من الواحد إلى Number ونتحقق، هل العدد أولي بواسطة الدالة IsPrimary هكذا مثلاً:

If IsPrimary(Number) Then

أو:

If Not IsPrimary(Number) Then

فإذا وجدنا العدد غير أولي أضفناه إلى مصفوفة الأعداد Result() بالطريقة نفسها في خوارزميتنا السابقة.

وفي النهاية، نضع شفرة Command1_Click، حاول أن تفكر بها، هي شبيهة جداً بسابقتها.

فكر بالحل ;)

والسلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#39

يبدو أن الأمور قد بدأت تتعقد :)

هذه هي الدالة IsPrimary:

  1.  
  2. Private Function IsPrimary(ByVal Number As Long) As Boolean
  3.  
  4. Dim Counter As Long
  5.  
  6. If Number = 1 Then
  7. IsPrimary = False
  8. Exit Function
  9. End If
  10.  
  11. For Counter = Number - 1 To 2 Step -1
  12. If Number Mod Counter = 0 Then
  13. IsPrimary = False
  14. Exit Function
  15. End If
  16.  
  17. IsPrimary = True
  18.  
  19. End Function
  20.  
  21.  

في البداية نتحقق، هل Number يساوي الواحد؟ فإذا كان فالواحد عدد غير أولي، ونسند False ونخرج من الدالة، وإن لم يكن نكمل..

ثم نتحقق من قسمة العدد Number على كل الأعداد الصحيحة بين Number-1 و 2، فإن قبل القسمة فهو غير أولي، وخرجنا من الدالة، وإلا أكملنا، وعندما تنتهي الحلقة دون أن نخرج من الدالة فهذا يعني أن العدد أولي، ونسند True.

والآن الإجراء WriteUnPrimaryNumbers:

  1.  
  2. Private Sub WriteUnPrimaryNumbers(ByVal Number As Long, ByRef Result() As Long)
  3.  
  4. Dim Counter As Long
  5. Dim Numbers As Long
  6.  
  7. For Counter = 1 To Number
  8. If Not IsPrimary(Counter) Then
  9. ReDim Preserve Result(Numbers)
  10. Result(Numbers) = Counter
  11. Numbers = Numbers + 1
  12. End If
  13.  
  14. End Sub
  15.  

إنه شبيه بإجرائنا في خوارزميتنا السابقة، لاحظ كيف استعملنا دالتنا IsPrimary لنعرف هل العدد أولي أو غير أولي، فإن كان غير أولي أعدنا تعريف المصفوفة Result وأضفناه لها، فكر بها، إنها كمثالنا السابق ;)

والحدث Command1_Click يأتي في النهاية:

  1.  
  2. Private Sub Command1_Click()
  3.  
  4. Dim MyArray() As Long
  5. Dim Counter As Long
  6.  
  7. WriteUnPrimaryNumbers Val(Text1.Text), MyArray()
  8.  
  9. For Counter = LBound(MyArray) To UBound(MyArray)
  10. MsgBox MyArray(Counter)
  11.  
  12. End Sub
  13.  

أيضاً كالسابق، لاحظ استعمال LBound للتعبير عن بداية المصفوفة MyArray و UBound للتعبير عن نهايتها.

جميلة ولذيذة :P أليست كذلك؟؟؟

والسلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#40

السلام عليكم ورحمة الله

خوارزمية Fibonacci:

اسم غريب على بعضنا، صحيح :)

لكن لا تقلقوا، فهي سهلة بإذن الله.

هذه الخوارزمية تقدم سلسلة أعداد كالتالي:

0___1___1___2___3___5___8___13___21.......

ما المميز في هذه الأعداد؟ :hmm: في البداية نبدأ بالصفر، ثم الواحد، ثم يكون كل رقم هو مجموع الرقمين السابقين له، انظر معي:

0 + 1 = 1

1 + 1 = 2

1 + 2 = 3

2 + 3 = 5

3 + 5 = 8

5 + 8 = 13

8 + 13 = 21

...

...

حاول استنتاج الأعداد التي بعدها...

سوف نستعمل في خوارزميتنا هذه إجراء ندعوه Fibonacci هذا الإجراء شكلة كالتالي:

Private Sub Fibonacci(Numbers As Long, Result() As Long)

تأخذ الدالة وسيطتين، الأولى Numbers وتمثل عدد الأرقام التي نريدها، والثانية Result() وهي تعيد مصفوفة النتائج.

يمكنك في بداية هذه الدالة إعادة تعريف المصفوفة Result() كالتالي:

ReDim Result(Numbers - 1) As Long

وبهذا، إن رغب المستخدم بعرض خمسة أعداد من هذه السلسلة مثلاً، فإنه سوف يمرر العدد 5 إلى السلسلة، وسوف يحدث التالي في البرنامج:

ReDim Result(4) As Long

وبما أن عناصر المصفوفة تبدأ من الصفر، فهذا يعني أن عندنا خمسة عناصر هي كالتالي:

Result(0) = 0
Result(1) = 1
Result(2) = 1
Result(3) = 2
Result(4) = 3

إذاً، في خوارزميتنا هذه:

العنصر (صفر) قيمته تساوي الصفر

العنصر (واحد) قيمته تساوي الواحد

باقي العناصر قيمتها مجموع الرقمين الذين يسبقانها.

لن أشرح كثيراً في مثالنا هذا، بل سأتركك لتفكر وتستنتج، وكالعادة... على الورق ;)

والسلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#41

السلام عليكم ورحمة الله

وهذا حل خوارزميتنا الأخيرة:

  1.  
  2. Private Sub Fibonacci(Numbers As Long, Result() As Long)
  3.  
  4. Dim Counter As Integer
  5. ReDim Result(Numbers - 1) As Long
  6.  
  7. Select Case Numbers
  8. Case 1
  9. Result(0) = 0
  10. Case 2
  11. Result(0) = 0
  12. Result(1) = 1
  13. Case Is > 2
  14. Result(0) = 0
  15. Result(1) = 1
  16. For Counter = 2 To UBound(Result)
  17. Result(Counter) = Result(Counter - 1) + Result(Counter - 2)
  18. End Select
  19.  
  20. End Sub
  21.  

اولاً، نعيد تعريف المصفوفة Result بالعدد Numbers-1:

ReDim Result(Numbers - 1) As Long

ثم نختبر العدد Numbers فإن كانت قيمته 1 فهذا يعني أن فيه عنصراً واحداً، نضبطه إلى الصفر، وإن كانت قيمته 2، فهذا يعني أن فيه عنصرين، نجعل الأول صفراً والثاني واحداً، وإن كانت أكبر من الإثنين، نجعل قيمة العنصر الأول صفراً، والثاني واحداً، وما بقي من الأعداد يكون مجموعاً للعددين الذين قبله:

	Select Case Numbers
	 Case 1
		 Result(0) = 0
	 Case 2
		 Result(0) = 0
		 Result(1) = 1
	 Case Is > 2
		 Result(0) = 0
		 Result(1) = 1
		 For Counter = 2 To UBound(Result)
			 Result(Counter) = Result(Counter - 1) + Result(Counter - 2)
		 Next
	 End Select

أما الإجراء Command1_Click فهو كالتالي:

Private Sub Command1_Click()

	Dim MyArray() As Long
	Dim Counter As Integer

	Fibonacci Val(Text1.Text), MyArray()

	For Counter = LBound(MyArray) To UBound(MyArray)
		MsgBox MyArray(Counter)
	Next

End Sub

وقد طرقنا بابه في خوارزميتينا السابقتين.

حاول فهم الكود جيداً، وتطبيقه :)

والسلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#42

وبهذا يا إخواني، أنهينا سلسلتنا هذه، وأرجو الله أن أكون قد أفدت.

في المرفقات، السلسلة كاملة بصيغة Doc مع الSource codes الخاصة بالأمثلة.

والسلام عليكم ورحمة الله

_________________________.rar

هذه الجملة خاطئة  :wacko: 


#43

ممتاز اخى

جزاك الله كل خير

Mimo

040.gif

#44

السلام عليكم ورحمة اللع وبركاته

انا عضو جديد وارحب بكل الاعضاء والزوار

اذا كان في الامكان انا اريد عمل منظمة للبيانات الشخصية مثل رقم الموظف وام الموظف ...الخ

ممكن المساعد رجاءاً

#45

شكرا لك اخي

لتنزيل اخر البرامج المساعده للمبرمجين والبرامج بشكل عام

http://www.tahmeelnet.blogspot.com

#46

ما شاء الله

مشكوووووووووووور على الدرس الرائع والمهم

بارك الله فيك

وإلى الأمام نحو المعالي

#47

جزاك الله خيراً يأخي الكريم ونأمل منك المتابعة

#48

السلام عليكم...

أخي كاتب الموضوع,,, أنا أقوم بتحميل المواضيع او الدروس لقرائتها لاحقا وبعد أن قرأتها أقول لك أنها دروس رائعة وطريقتك رائعة في ايصال الفكرة ولكن للأسف الموضوع لم يأخذ مداه الحقيقي فهو يستحق اكثر,,, لقد أستفدت منها وتحياتي لك وشكري الكبير,,,

#49

جزاك الله خيراً

#50

بسم الله الرحمن الرحيم

السلام عليكم

كل الشكر لجهودكم أخي الكريم

جزاكم الله خير الجزاء

تقبلوا مروري

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…