بسم الله والصلاة والسلام على رسول الله

أقدم لكم اليوم أول درس لي في عالم البرمجة .... الله يستر :D

الدرس خفيف ولطيف ، ويحتاج شوية تركيز

في البداية مراجعة رياضية بسيطة
الأعداد الأولية هي التي لا تقبل القسمة إلا على الواحد :cool: وعلى نفسها
مثلا رقم 7 هو رقم أولي لتحقيقه الشروط وأيضا رقم 17
وأيضا رقم 71
بل حتى أن هذا الرقم 139439 هو رقم أولي لإنك لن تستطيع أن تقسمه على أي رقم حقيقي إلا على نفسه وعلى الواحد

طيب البرنامج إلي حنعمله حيطلع كل الأرقام الأولية ضمن مدى معين أي مثلا إلى المليون أو المئة ألف

مثلا الأرقام الأولية ضمن مدى العشرة هي : 2 ، 3 ، 7


طيب خلصنا من موضوع الأرقام الأولية
بالنسبة لموضوع تحليل الأعداد ، فهو ببساطة إيجاد العوامل الأولية لعدد ما
مثلا العوامل الأولية للـ 10 هي 5 و 2
لإنه 5 * 2 = 10
طيب ما هي برأيك العوامل الأولية للـ 12
إن قلت 4 و 3 فالجواب خاطئ :confused:
مع إنه 4 * 3 = 12 والشبب إنه 4 ليست عدد أولي :D

طيب ما هي طريقة تحليل عدد ما !!!
الطريقة هي تقسيمه على الأعداد الأولية إن إمكن بشكل تصاعدي
مثلا 12 نبدأ بتقسيمها على 2
فيكون الناتج 6 ونقسم هذه الأخيرة على 2
فيكون الناتج 3 ونقسم الأخير على 3
فيكون الناتج 1
إذا عوامل الـ 12 هي : 2 و 2 و 3
وتختصر
2² × 3
صورة توضيحية



طيب وهذي صورة أخرى لتحليل العدد 64 = اثنين قوة (أس) ستة




إلي حاب يجرب البرنامج من الآن قبل ما نعمله
http://www.mediafire.com/?jzjl5yxzmny

صورة البرنامج والأدوات



القسم الأيمن لتحليل الأعداد عن طريق وضع عدد والضغط على Analayze
والأيسر لـرؤية الأعداد الأولية عند الضغط على Show All
والجزئية السفلية is it prime !
هي لوضع رقم ما ورؤية إذا ما كان أوليا أم لا



نبدأ على بركة الله
أضف الأزرار الثلاثة لمسرح العمل
Analyze
و
Show All
و
is it prime !
----
أضف 3 textbox
واحد إلى جانب كل زر كما في الصورة مع ملاحظة تعديل خاصية Enabled مربع النص الذي بجانب Show All
إلى الوضع False
----
أضف الـ List box يسارا
و
ListView يمينا
مع ملاحظة تفعيل خاصية Gridlines وأيضا إضافة العمودين كما في الصورة من خاصية Columns


الآن بقي أسهل حاجة في الدرس الأكواد :D


سنبدأ بالقسم الأيسر وهو ،، عرض جميع الأعداد الأولية
في زر show all اكتب هذا الكود

كود PHP:
For a As Integer = 2 To 100000
For i As Integer = 2 To 50000
Dim remain
As Integer
remain
= a Mod i
If remain = 0 Then GoTo f
If i > a / 2 Then ListBox1.Items.Add(a) : GoTo f
Next
f
: Next

txtCount
.Text = ListBox1.Items.Count


شرح الخرابيش إلي فوق :D
كود PHP:
For a As Integer = 2 To 100000


هنا بدأنا حلقة تكرارية من رقم 2 إلى رقم 100000 لنستخلص جميع الأعداد الأولية

For i As Integer = 2 To 50000وهنا حلقة أخرى وهذه الحلقة تمثل مجموعة المقسوم عليه وهي نصف قيمة الحلقة الأولى


توضيح بسيط لكي نعرف هل الرقم 17 هو أولي أو غير أولي نبدأ بقسمته على 2 ثم 3 ثم 4 ثم 5 إلخ...

وإذا صادفنا أن 17 قبل القسمة على أحدها فهو إذا غير أولي
طيب متى نتوقف عن القسمة:confused:
بسيطة :D إذا وصلنا لنصف العدد
طيب لماذا !!:confused:
لإنه لو كان هناك رقم بعد نصف العدد تتوقع أن يكون قاسم للرقم X
فهذا الأمر مستحيل لإنه لو ضربنا هذا الرقم بأصغر عدد أولي بعد الواحد وهو الاثنين فسينتج لدينا رقم أكبر من الرقم X
مثال الرقم 20
نصفه 10
لو فرضنا جدلا أن الرقم 11 من قواسمه
فإن 11*2 = 22 النتيجة أكبر من الرقم 20 :confused:

طيب نرجع للكود

كود PHP:
Dim remain As Integer


هذا المتغير إلي حنسدله باقي القسمة
مثال 5/2 = 2 والباقي 1
طبعا الآلة الحاسبة 5/2 = 2.5
ونحن لا نريد هذا النوع من القسمة نريد أن تكونن كل الأعداد صحيحة (غير عشرية)
ونريد أن نعلم الباقي طيب ما الحل
لإنه A/i سيعطينا رقم ما قد يكون عشري ولن نستطيع أن نأخذ الباقي
الحل هو باستخدام الدالة mod والتي تعطينا الباقي مباشرة
حيث
كود:
5 mod 2 = 1
وهذا ما طبقناه هنا
كود PHP:
remain = a Mod i


حيث أخذنا الرقم a وهو الذي نريد اختباره وقسمناه على i ووضعنا الباقية في المتغير remain
طيب ما رأيك ما الخطوة الباقية ،،،
ما الفرق عندما نقسم العدد الأولي 13 على الأعداد الصحيحة
وعندما نقسم العدد الأولي 15 على الأعداد الصحيحة
لاحظ معي
13 /2
13 /3
13 /4
13 /5
13 /6
13 /7
لاحظ أنه لا يقبل أي عملية قسمة من الموجودة أعلاه والتي هي حتى الرقم 7 والذي يمثل نصف الثلاثة عشر تقريبا

طيب لاحظ العملية على الرقم 15
15 /2
15 /3
لاحظ أن 15/3 مقبولة وليس فيها باقي

مالذس استنتجناه
إن كان الرقم أول فلن يقبل القسمة على الأعداد الصحيحة من الـ2 وحتى نصفه
إذا نضعه عندنا في القائمة وننتقل للرقم الذي بعده لاختباره
وإن كان غير أولي سيقبل على أحد الأعداد ولا داعي لإكمال عمليات القسمة مثلا 15 /4 إلخ..
وإنما ننتقل لاختبار الرقم 16 ولن نضعه في القائمة

كود PHP:
remain = a Mod i
If remain = 0 Then GoTo f
If i > a / 2 Then ListBox1.Items.Add(a) : GoTo f


وهذا بالضبط ما يفعله الكود في الأعلى حيث يفحص قيمة الباقي
ويرى إن كانت صفر (أي أن الرقم a غير أولي) فيكتفي ولا يقوم بتقسيمه على باقي الأعداد
أم السطر الثاني فيفحص قيمة i (المقسوم عليه) ويرى إن كانت قيمته أمب من نصف قيمة المقسوم (a) فإن كان كذلك فيقوم بإدخاله في الـListBox1
أما المقصود بـ GoTo f فهي الذهب للسطر f والذي فيه الأمر next الذي يامر بتجريب مقسوم جديد

طبعا من ناحية تجريب الأرقام من 2 إلى 100000
واحدا واحد وتقسيم كل رقم منها على الأعداد الصحيحة فهذا كله وظيفة الجملتين المركبتين for to
التي تراها في أول الكود

أما
كود:
txtCount.Text = ListBox1.Items.Count
فهي للتسلية فقط :D
حيث تظهر عدد الأعداد الأولية خلال النطاق المحدد وتضعه في صندوق التكست الذي عطلنا خاصية Enabled له في بداية الموضوع




طيب خلصنا من مسألة عرض الأعداد الأولية
لكن ما رأيك مثلا بالرقم
39659
هل هو أولي ؟؟
أو ما رأيك بهذا
966053581
:D:D

طبعا إن استخدمت قلم وورقة فقابلني عام 2100 لتخبرني النتيجة
أما هنا فالموضوع بسيط

في البداية المستخدم يضع الرقم في مربع النص
نقوم باستخدام دالة isnumeric للتأكد من أنه وضع رقم ولم يضع اسمه مثلا :mad:
إذا كان بالفعل وضع رقما ما
نبدأ بقسمة هذا الرقم على نصف عوامله زائدا واحد
مثلا الرقم 39659
نصف عوامله 19829.5 وبالتقريب 19830 يثم نزيد واحد 19831
وسبب زيادة الواحد هو أننا سنقوم بالتحقق من أن المقسوم عليه أكبر من نصف العدد
ولو لم نزده لكان الوصول لهذه القيمة مستحيلة حيث سيبقى المقسوم عليه نفسه قيمة نصف الرقم :confused::D
هذا الكود للزر is it prime
مع تعليقات بالشرح

كود PHP:
If IsNumeric(TextBox1.Text) Then ' التأكد من كون القيمة رقمية
Dim num As Integer = Val(TextBox1.Text) '
تطبيق دالة (فال) والتي تقوم بأخذ قيمة مربع النص ووضغه في المتغير
Dim modnum
As Integer ' تعريف متغير لوضع الباقي فيه
For xx As Integer = 2 To ((num / 2) + 1)
If num = 2 Then MsgBox("yes") : Exit Sub '
لو كان الرقم الذي يتم اختباره هو الرقم 2 فتخرج رسالة مباشرة أنه أولي
modnum
= num Mod xx 'نبدأ بتجريب القسمة
If modnum = 0 Then MsgBox("no ,, " & xx) : Exit Sub '
لو وجدنا رقم يقبل القسمة نتوقف ونخرج رسالة تقول أن العدد الذي تم اختباره ليس أولي ونضع الرقم الذي يقبل القسمة عليه
If xx > num / 2 Then MsgBox("yes") : Exit Sub 'لو أصبح المقسوم عليه أكبر من نصف قيمة الرقم ولم نجد أي قاسم نتوقف ونخبر ان العدد أولي
Next
Else : MsgBox("please enter a number") '
رسالة في حال لم يضع المستخدم قيمة نصية
End I




الآن ألذ قطعة في الموضوع تحليل الأعداد :D
باسم الله

عندنا مربع نص
وزر Analyze التي تعني تحليل
وعندنا listview قائمة عرض
وضعنا فيها عمودين
مثلا شرح لتحليل الرقم 12


في البداية وضعنا الـ 12 على اليسار وجربنا القواسم فوجدنا أن 2 هو الأصغر فقمنا بتقسيم 12 على 2 فكان الناتج 6
فأخذنا الـ 6 وجربنا القواسم مرة أخرى فوجدنا أن 2 هو الأصغر فقمنا بتقسيم 6 على 2
فكان الناتج 3
ثم أخذنا الـ 3 وبدأن بتجريب القواسم :D
فكان القاسم الوحيد لها هو الـ 3
فقسمناها عليه وسلامتكم
عندها استنتجنا أن عوامل الـ 12 هي 2 *2 *3


طيب أتوقع الكل فهم الأسطر إلي تحت الصورة السابقة ،، وفقط المطلوب تحويلها لكود
في البداية سأضع الكود وبالتعليقات ثم أسفله سأضرحه بالتفصيل


كود PHP:
If IsNumeric(TextBox2.Text) Then ' التأكد من كون قيمة مربع النص رقمية كالعادة
ListView1.Items.Clear() '
تفريغ محتويات القائمة

Dim myNumber
As Integer = Val(TextBox2.Text) ' نعرف متغير وإسناد قيمة النص له
If myNumber = 2 Then ListView1.Items.Add("this'
s allready a prime number") : Exit Sub ' اسنثناء الرقم 2
Dim moding As Integer ' تعريف متغير لباقي القسمة
Dim remainder As Integer ' متغير لباقي القسمة الثانية سنشرحه لاحقا
Dim Count As Integer = 0 ' متغير سنستخدمه للعد ولتحرير عناصرا القائمة بالتسلسل
Dim mod2 As Integer ' متغير لباقي القسمة الثالثة وما بعدها

For ly As Integer = 2 To ((myNumber / 2) + 1) ' القسمة الأولى

moding = myNumber Mod ly 'القسمة الأولى
If moding = 0 Then
ListView1.Items.Add(myNumber) : ListView1.Items(Count).SubItems.Add(ly) ' أضفنا الرقم يسارا وقاسمه يمينا
remainder = Val(ListView1.Items.Item(Count).Text) / Val(ListView1.Items.Item(Count).SubItems(1).Text) 'قسمنا الرقم على قاسمه لنكمل الدورة
ListView1.Items.Add(remainder) ' أضفنا ناتج القسمةيسارا
Count += 1 ' أضفنا واحد للعداد المستخدم في القائمة
GoTo 2 ' الذهاب للقسمة الثانية
End If
If ly > myNumber / 2 Then ListView1.Items.Add("
this's allready a prime number") : Exit Sub ' إن لم نجد قاسما فهو عدد أولي ونظهر رسالة بذلك
Next


2
: For xx1 As Integer = 2 To ((remainder / 2) + 1) 'القسمة الثانية
If remainder = 2 Then ListView1.Items(Count).SubItems.Add(remainder) : Exit Sub '
إن كان الناتج 2 نضعه يمينا مباشرة
mod2
= remainder Mod xx1 ' نبدأ بتجريب القسمة على الأرقام
If xx1 > remainder / 2 Then ListView1.Items(Count).SubItems.Add(remainder) : Count += 1 : Exit Sub '
لو لم نجد قاسما إذا هو أولي ونضغه يسارا
If mod2 = 0 Then
ListView1
.Items(Count).SubItems.Add(xx1) ' لو وجدنا له قاسما نضيفه يمينا ،ويجب أن نكمل باقي القسمة لاحقا
remainder = Val(ListView1.Items.Item(Count).Text) / Val(ListView1.Items.Item(Count).SubItems(1).Text) '
قسمنا الرقم على قاسمه لنكمل الدورة
ListView1
.Items.Add(remainder) ' وضعنا ناتج القسمة يسارا في سطر جديد
Count += 1 '
أضفنا واحد للعداد المستخدم في القائمة
Exit Sub
End
If
G: Next

Else : MsgBox("please enter a number")
End If



الشرح :)

كود:
If IsNumeric(TextBox2.Text) Then
التأكد من كون قيمة مربع النص رقمية كالعادة

كود:
ListView1.Items.Clear()
لتفريغ محتويات القائمة من آثار عملية سابقة




كود:

Dim myNumber As Integer = Val(TextBox2.Text) ' نعرف متغير وإسناد قيمة النص له
If myNumber = 2 Then ListView1.Items.Add("this's allready a prime number") : Exit Sub ' اسنثناء الرقم 2
Dim moding As Integer ' تعريف متغير لباقي القسمة
Dim remainder As Integer ' متغير لباقي القسمة الثانية سنشرحه لاحقا
Dim Count As Integer = 0 ' متغير سنستخدمه للعد ولتحرير عناصرا القائمة بالتسلسل
Dim mod2 As Integer ' متغير لباقي القسمة الثالثة وما بعدها
المتغيرات المطلوبة
واستثناء الرقم 2 وساشرح لاحقا لماذا نستثنيه





نبدأ الآن بالـقسمة الأولى
كود:
If moding = 0 Then
' إن كان الباقي صفرا
مثلا كنا نحلل الرقم 6 فوجد له قاسما هو الاثنين إذا الباقي من6 /2 = 0
عندها نضيف الـ 6 في القائمة في العمود الأيسر
بهذا الأمر
كود:
ListView1.Items.Add(myNumber)
حيث قيمة myNumber هنا بالطبع هي 6

الآن نضيف القاسم (2) في اليمين
بهذا الكود
كود:
ListView1.Items(Count).SubItems.Add(ly)
وأما المتغير count فقيمته هنا بالطبع 0 ووضعته لنرمز في أي سطر نحن في القائمة
حيث أن أول سطر هو 0 والثاني هو 1 والثالث هو 2 وسنزيد قيمة السطر كل مرة
أما ly فهو القاسم وقيمته طبعا 2
حتى الآن وصلنا للنتيجة هذه




لنكمل
الآن الخطوة القادمة هي
الوصول للخانة القادمة ألا وهي 3


وطبعا واضح أنه بقسمة 6 على 2 نحصل على 3
إذا :D فلنقسم 6 على 2 ولنحصل على 3 ثم نضعها في سطر جديد
سنضع ناتج القسمة في متغير اسمه remainder

كود:
remainder = Val(ListView1.Items.Item(Count).Text) / Val(ListView1.Items.Item(Count).SubItems(1).Text)
ثم نضيفه في سطر جديد

كود:
ListView1.Items.Add(remainder)
ثم نضيف 1 للعداد count الذي اتفقنا على أنه سيرمز للسطور حيث أننا الآن في السطر 1
لا تنسى أن الترقيم يبدأ من 0

كود:
Count += 1
***
بقي جزئية بسيطة في القسمة الأولى
إن لم نجد قاسما للعدد فهو عدد أولي (مثل أن يطلب المستخدم تحليل الرقم 7) ونظهر رسالة بذلك ونخرج من الإجراء

كود:

كود:

If ly > myNumber / 2 Then ListView1.Items.Add("this's allready a prime number") : Exit Sub


***
بعيدا عن ما بين النجوم أعلاه نرجع لمسألتنا حيث نحن وجدنا قاسما للعدد 6 فهو بالطبع ليس أولي

بعد زيادة المتغير count

GoTo 2 ' الذهاب للقسمة الثانية

الآن نحن في المرحلة هذه

والخطوة القادمة هي تحليل الرقم 3 لنصل لهذه النتيجة


إذا ننتقل للقسمة الثانية

كود:
If remainder = 2 Then ListView1.Items(Count).SubItems.Add(remainder) : Exit Sub
إن كان الناتج 2 نضعه يمينا مباشرة ، طبعا هو هنا 3 لذا لن يتحقق هذا الشرط

نبدأ بتجريب القسمة على الأرقام وتفحص الباقي
كود:
mod2 = remainder Mod xx1
لو لم نجد قاسما ،إذا هو أولي ونضغه يسارا
وهذه هي حالتنا إذ أن 3 عدد أولي
كود:
If xx1 > remainder / 2 Then ListView1.Items(Count).SubItems.Add(remainder) : Count += 1 : Exit Sub
مع ملاحظة أنا زدنا المتغير count وخرجنا من الإجراء حتى لا يعيد البرنامج حلقة التكرار
****
بهذا نكون خرجنا بالنتيجة النهائية لتحليل العدد 6 :D:D
حيث = 3 * 2

*****
لكن انتبه لآخر ما أجريناه على الرقم 3 لاحظ أننا استنتجنا أنه عدد أول لكن ماذا لو لم يكن كذلك
مثل أن يكون 4
وهذا مثال لتحليل الرقم 8

في هذه الحالة سيكمل البرنامج للجملة القادمة
If mod2 = 0 Then
وهي إن كان باقي القسمة للـ remainder يساوي 0
وهو هنا حاصل حيث أن الباقي من 4 /2 هو 0
عندها لو وجدنا له قاسما (الاثنين هنا)نضيفه يمينا ،ويجب أن نكمل باقي القسمة لاحقا

كود:
ListView1.Items(Count).SubItems.Add(xx1)


نكمل التحليل
ذكرنا سابقا أن الباقي من 4 /2 هو 0
والناتج بالطبع هو 4 /2 = 2
نأخذ الـ 2 ونضعها يسارا في سطر جديد
وقد سبق وأن فعلنا هذا عند تحليل الرقم 6 حيث عندما وجدنا العامل 2 قسمنا الـ 6 على 2 ووضعنا الـ 3 في سطر جديد
وهنا سنقسن الـ 4 على الـ 2 ونضع الناتج (2) في سطر جديد

كود PHP:

remainder
= Val(ListView1.Items.Item(Count).Text) / Val(ListView1.Items.Item(Count).SubItems(1).Text) 'قسمنا الرقم على قاسمه لنكمل الدورة
ListView1.Items.Add(remainder) '
وضعنا ناتج القسمة يسارا في سطر جديد


بقي أن نزيد المتغير count لأننا تحركنا لسطر جديد
كود:
Count += 1
ونخر ج من الإجراء
Exit Sub
لكي لا تتكرر الحلقة مرة أخرى


لكن مهلا ألا تلاحظ أن هذا ما توصلنا له




بينما الذي نريده هو


لأن 8 = 2*2*2*

إذا البرنامج ناقص :confused::confused::confused:

لكن الحل بسيط جدا بإذن الله
ببساطة أزل كلمة Exit Sub من المقطع الأخير

وانسخ مكانها المطع نفسه
مع ملاحظة تغيير كل xx1 إلى xx2
كود PHP:
For xx2 As Integer = 2 To ((remainder / 2) + 1)
If
remainder = 2 Then ListView1.Items(Count).SubItems.Add(remainder) : Exit Sub
mod2
= remainder Mod xx2
If xx2 > remainder / 2 Then ListView1.Items(Count).SubItems.Add(remainder) : Count += 1 : Exit Sub
If mod2 = 0 Then
ListView1
.Items(Count).SubItems.Add(xx2)
remainder = Val(ListView1.Items.Item(Count).Text) / Val(ListView1.Items.Item(Count).SubItems(1).Text)
ListView1.Items.Add(remainder)
Count += 1
Exit Sub

End
If
Next


وهكذا دواليك
الآن في المقطع xx2 امسح Exit sub
وانسخ مكانه نفس المقطع مع تغيير xx2 إلى xx3
استمر إلى الرقم 11
سينشأ عندك كود مركب متشابك:D:D
مثل هذا الذي في الصورة
http://img38.imageshack.us/img38/582...10110356pm.png

وستتمكن من تحليل الأعداد الكبيرة جدا
لكن لا تنسى مثلي أن تضع Exit Sub في آخر بلوك
بهذا نكون خلصنا هذا الدرس الطويل جدا و
وذاك الكود المتشابك الذي سببلي صداع شديد جدا جدا جدا :D:D


رابط ملف الـ exe
http://www.mediafire.com/?jzjl5yxzmny
رابط المشروع كاملا
http://www.mediafire.com/?dmw2wzxotln
رابط لتحميل الكود بملف html
http://www.mediafire.com/?mjdtnn4go15

الآن أصابعي تعبت ومخي أخد إجازة بقي جزئية بسيطة
وإلي هي
تكوني متغير نصي من العمود الأيسر
مثلا هنا


12 = 2*2*3
نحتاج كود يستطيع فهم 2*2
على أنها 2^2
فيكون التحليل 2^2 *3

وهذا مهم جدا حيث بدلا من أن يكون تحليل الـ 96
2*2*2*2*2*2*3
:D
يكون 2^5 * 3
فنأخذ هذه العبارة ونضعها في متغير نصي ونرميها في تكست بوك وسلامتك
حاليا ما في بمخي أي فكرة منتظر إبداعاتك


لا تنسوا النقد والآراء ،، فهذا أول درس في حياتي :D
وأيضا لا تنسونا ووالدينا من صالح الدعاء


محبكم
Loersian



المزيد...