Professional Documents
Culture Documents
للمبتدئين
في فيجوال بيسك 6
خوارزميات بسفيطة للمبتدئيفن ،هفي عبارة عفن دورة بسفيطة أجريفت ففي
قسم مبرمجي لغة Visual Basic 6وما قبلها من إصدارات ،في منتديات
الفريق العربي للبرمجة:
/http://www.arabteam2000-forum.com
الهدف الساسي من هذه الدورة ،كان رفع مستوى التفكير البرمجي ،عن
طريق طرح بعض الخوارزميات البسيطة ومحاولة حلها.
ويجفب التنويفه هنفا إلى أن الخوارزميات التفي سفيتم طرحهفا ليسفت متكاملة
تماماً ،وإنما الهدف منها هو التفكير في حلول المشاكل.
قسففمت هذه الدورة إلى ثلث مراحففل ،سففتجدون شفراتهففا فففي المجلد
Source codesالمرفق مع الكتاب.
وأسفأل الله أن أفيفد بهذه الدورة وهذا الكتاب ،وإن أصفبت فمفن الله ،وإن
أخطأت فمن نفسي ومن الشيطان.
Abboodd
ما هي الخوارزمية؟
فلنقلها ببساطة :هي الطريقة المناسبة للقيام بعمل ما أو حل مشكلة معينة.
فمثلً:
Label1.Caption=Text1.Text
هذه خوارزمية! ماذا؟! نعم ،هذه خوارزمية تقوم بنقل محتوى Text1وتضعه في . Label1إذا
ليس من الضروري أن تكون الخوارزمية من النوع:
X^2+2AB/25Y=2CB
لحل هذه الخوارزمية تحتاج إلى استعمال معامل حساب باقي القسمة . Modمثال:
If 9 Mod 3 = 0 Then
"MsgBox "Yes
Else
"MsgBox "No
End If
حيث يقوم الكود بتقسيم العدد 9على العدد ،3ثم يختبر باقي القسمة ،فإن كان صفراً فإن العدد 9
يقبل القسمة على ،3وإن كان غير الصفر فإنه ل يقبل.
بدّل الن ن 9والن ن 3بالعداد أو المتغيرات المناسننبة ،وحاول قدر المسننتطاع ،فإن لم تسننتطع ،تعال
واقرأ الحل.
الحننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننل:
الحنل بسنيط جداً ،وهنو يختنبر ناتنج قسنمة العدد الموجود فني النن TextBoxعلى ،2فإن كاننت
القيمة صفراً فإن العدد زوجي ،وإن كانت غير ذلك فالعدد فردي .لحظ الكود التالي:
ويمكنك ملحظة الشبه الكبير بين الكودين إن كان عندك اطّلع على لغة ++C.
إذا نظرت إلى المثال في المرفقات في المشاركة السابقة ،ستجد أن المستخدم يظهر له TextBox
و CommandButtonفيكتنب منا يريند فني مربنع الننص ،ثنم ينقنر على الزر فتظهنر له رسنائل
متتالية ،كل واحدة منها تحوي حرفاً من الكلمة ،فلنأخذ مثالً:
كتنب المسنتخدم فني مربنع الننص كلمنة Abbooddوضغنط الزر ،سنتظهر له رسنالة MsgBox
فيهننا Aثننم أخرى فيهننا bثننم أخرى فيهننا bثننم oثننم oثننم .....إلى أن ينهنني الكلمننة كلهننا.
سنننحتاج فنني خوارزميتنننا هذه إلى حلقننة ، Forل تخننف ،سننتكون حلقننة بسننيطة ،كمننا سننتساعدنا
دالّتان:
-1الدالة : Mid
)Mid)Text,Start,Length
ولنأخذ مثالً:
)MsgBox Mid)"Abboodd",4,2
هنا ،ستظهر لك رسالة ،فيها نص ،أول حرف منه هو الحرف الرابع من كلمة ، Abbooddأي
الحرف ، oوطول النص في الرسالة حرفان اثنان ،أي ستكون النتيجة (. )oo
جرب بنفسك! غير المثال وتمرن على هذه الدالة ،لنها ستكون أساسية في خوارزميتنا هذه بإذن
ال تعالى.
-2الدالة : Len
تعيد هذه الدالة طول نص ما ،وتستعمل كما يلي:
(Len)Text
فمثلً:
("MsgBox Len)"Abboodd
برأيك ماذا سيظهر في الرسالة؟ سيظهر الرقم ،7وهو عدد حروف الكلمة ، Abbooddوجرب
مثلً:
(MsgBox Len)Text1.Text
والن ،بدل (احزر ماذا) بالتعابيننر المناسننبة ،وابدأ العمننل بنفسننك ،ول تطلع على الحننل قبننل ألف
محاولة!
ويمكنك طلب المساعدة من أخيك إن كان في الصف الول ...
الحل:
بسيطة:
(For i = 1 To Len)Text1.Text
(MsgBox Mid)Text1.Text, i, 1
Next
ثلثة سطور فقط!
نعننم ،وسنننشرح هذا الكود بمثال ،حيننث سنننفترض أن المسننتخدم كتننب فنني الن ن TextBoxكلمننة
،Abbooddعندها سيتم تنفيذ التالي في الكود:
For i = 1 To 7
(MsgBox Mid)"Abboodd",i,1
Next
ما الذي حدث هنا؟ عندما كتب المستخدم كلمة Abbooddأخذ البرنامج عدد حروف هذه الكلمة
وهو ،7ووضعها بدل )Len)Text1.Text
وبهذا سننننوف تظهننننر هذه الرسننننالة سننننبع مرات ،والن ،مننننا الذي يحدث داخننننل الحلقننننة؟
ألم نقنل إن الدالة Midتعطينك الحروف التني تريدهنا منن ننص منا؟ إذاً فإن البرنامنج يأخنذ كلمنة
Abbooddثم ينظر من أي حرف سيبدأ ،فيجد أنه سوف يبدأ من ، iوبما أن iيزيد مرة في كل
دورة فإن البرنامج ،سيأخذ الحرف الول في المرة الولى ،ثم الثاني ،ثم الثالث.....
Circle)500,300(,400,vbRed
جرب مثلً:
(Form1.BackColor = QBColor)12
هذا سيعطيك اللون الحمر ،يمكنك تجريب الرقام الخرى للحصول على ما يناسبك ،لكن هذا ل
يعطيك إل 16لون ،لذلك إليك الطريقة المثلى للحصول على اللوان:
(RGB)Red,Green,Blue
حيث Redهي نسبة اللون الحمر من 0إلى ،255و Blueهي نسبة الزرق ،و Greenنسبة
الخضنر ،أي أننه سنيأخذ النسنبة التني تحددهنا منن كنل لون ،ويمزجهنا ويعطينك اللون الذي تريده.
وهذه الطريقنة يمكنهنا أن تعطينك ألوان تصنل إلى 16777216لون ! نعنم عدد فلكني منن اللوان
تحصل عليه بهذه الطريقة ،فيمكنك كتابة:
(Form1.BackColor = RGB)0,0,0
لتحصنل على اللون البينض ،وبينن هذينن اللونينن ( )16777214لون آخنر! فكلمنا غيرت درجنة
من الدرجات الثلث ،حصلت على لون جديد.
ملحظننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننة:
ل تستخدم هذا المر في الحدث Form_Loadلسباب ليس هذا مكان ذكرها.
اضغط الزر أكثر من مرة ،ولحظ :في كل مرة تحصل على رقم مختلف بطريقة عشوائية ،ولكن
أحيانًا تريند تحديند الرقام التني تريدهنا ،يعنني مثلً ،أريند رقماً عشوائياً بينن 0و ،255فيمكننك
كتابة التالي:
A = Rnd * 255
MsgBox A
هنل رأينت كينف اسنتعملنا المعلومات التني تعلمناهنا ،فأصنبح لديننا كود يقوم بتغيينر لون النافذة إلى
لون عشوائي في كل مرة.
بقيت ملحظة على العشوائية:
لو لحظنت شيئًا هاماً ،إذا جربنت الكود السنابق ،ثنم أغلقنت البرنامنج وفتحتنه منن جديند ،وجربنت
العملية ،ستجد أنه يعطيك اللوان نفسها في كل مرة ،لذلك ،ولتحصل على أرقام عشوائية حقيقية،
اكتب في الن : Form_Load
Randomize
هذا المننننر سننننيجعل اللوان تختلف فنننني كننننل مرة ،وبهذا تحصننننل على عشوائيننننة حقيقيننننة.
ثم شغل البرنامج ،ولحظ ما الذي سيحدث ،في كل ثانية سيطبع على النافذة كلمة ، Helloحاول
استنتاج طريقة عمل هذه الداة.
والن أصنبح لدينك المعلومات الكاملة لرسنم دوائر عشوائينة على النافذة فني كنل ربنع ثانينة ،حاول
فهم كل نقطة من النقاط السابقة جيداً ،ثم اعمل على استخدامها بما يخدم برنامجك ،إلى أن أعطيك
الحل قريباً بإذن ال.
الحل:
قلّي كم محاولة حاولت ،أقل لك من أنت ،وإليك الحل التالي:
نحنن نريند القيام بالمنر فني كنل ربنع ثانينة ،وهذا باسنتخدام الداة ، Timerوبمنا أنننا فني المثال
السنابق وضعننا 1000فني خاصنية Intervalلنعنبر عنن ثانينة واحدة ،إذن لنعنبر عنن ربنع ثانينة
سنضع ،250ثم ننقر مرتين لنفتح نافذة البرمجة الخاصة بالداة ،ونكتب:
Dim Red As Integer, Green As Integer, Blue As Integer
Dim X As Integer, Y As Integer
Dim Radius As Integer
Red = Rnd * 255
Green = Rnd * 255
Blue = Rnd * 255
X = Rnd * Me.Width
Y = Rnd * Me.Height
Radius = Rnd * 500
(Circle )X, Y(, Radius, RGB)Red, Green, Blue
حاول فهم الكود بنفسك ،واقرأه أكثر من مرة لتحصل على الفائدة الكبرى من التمرين.
كمنا ترى فقند عرفننا ثلثنة متغيرات ،هني نسنبة كنل منن اللون الحمنر والخضنر والزرق فني
اللون الذي نريده ،وعرفننا متغيرينن للحداثيات هني ، X,Yكمنا عرفننا متغيراً هنو طول نصنف
القطر . Radius
ثنم أعطيننا قيماً عشوائينة لكنل المتغيرات ،وجعلننا الحند القصنى لنن Xهنو عرض النافذة ،لكني ل
يقوم برسننم الدوائر خارج النافذة ،وكذلك المتغيننر Yجعلنننا الحنند القصننى له هننو طول النافذة،
للسنبب نفسنه ،أمنا المتغينر Radiusفجعلننا حده القصنى ،500لكني ل تكون الدائرة كنبيرة جداً
(ويمكننك تغيينر النن 500إلى منا تريند) ،وكذلك جعلننا الحند القصنى لدرجات اللوان هنو ،255
للسبب الذي ذكرناه في المشاركة السابقة.
وبقي أن نرسم الدائرة ونمرر إليها القيم العشوائية.
وبهذا أصنبح عندننا نافذة ،يرسنم عليهنا الجهاز فني كنل ربنع ثانينة دائرة تتمتنع بإحداثيات عشوائينة،
ومساحة عشوائية ،ولون عشوائي.
ول تنسى وضع . Randomize
وظيفنننة :جرب عمنننل أشكال وتصنننميمات وابتكارات أخرى ،أريننند أن أرى وظيفتنننك غداً ،وإل
سيكون هناك خصم للعلمات...
ولنبدأ:
عندمفا نفتفح المشروع ،ونختار جدول الضرب ،نجفد نافذة فيهفا TextBoxو
، CommandButtonنضفففع عددا ً مفففا ففففي الفففف TextBoxونضغفففط الفففف
CommandButtonلنحصفففل على جدول الضرب الخاص بالعدد ،مفففن 0
إلى ،10مطبوعا ً على النافذة ،يعني إذا وضعت ،5فإنه سيطبع لك:
0
5
10
15
20
25
30
35
40
45
50
كما أني سأعطيك نصيحة :يفضل ...إن لم نقل يجب ،أن تجرب الحل على
الورق ،قبفففل أن تنقفففل الفكار إلى الحاسفففوب ،لن ذلك يسفففاعدك على
التفكيفر المنطقفي ،وعلى تنظيفم أفكارك بطريقفة مناسفبة ،ويصفرف ذهنفك
مففن التفكيففر بطريقففة كتابففة الكود والتعليمات ،إلى التفكيففر بطريقففة حففل
المشكلة الساسية ،كما أنه يمكنك أن ترسم و(تشخبر) على الورق ،وهذا
ما ل تستطيع فعله على الحاسوب.
الحل:
والن نعود إلى الحل يا أبطال البتدائي ،وهو:
Dim i As Integer, Num As Integer
(Num = Val)Text1.Text
For i = 1 To 10
Print Num * i
Next
كما لحظنا هو حل بسيط ،يتم فيه وضع القيمة الموجودة في الن TextBoxفي المتغير ، Num
ثننم نبدأ بن ن Forونضرب المتغيننر iالذي يزينند فنني كننل دورة ،بالعدد الذي هننو ، Numونطبننع
النتيجة على النافذة.
بالنسبة للدالة ، Valهي دالة بسيطة تقوم بأخذ القيمة العددية لنص ما ،يعني إذا كان عندك ()12
فبدون Valسننيتعامل معهننا البرنامننج على أنهننا نننص ،ممننا سننيؤدي إلى حدوث مشاكننل ،أمننا مننع
استخدام Valفسيفهم أن ما في الن TextBoxهو عدد وليس نصاً (حروفاً( ،وسيتعامل معه على
هذا الساس.
المساحة هي 78.5
المحيط هو 31.4
احسننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننبها
علماً أن قانون المساحة هو:
Q = R^2 * Pi
حيث Qنقصد بها المساحة ،و R^2تعني نصف القطر قوة ،2أما Piفهو ثابت يساوي 3.14
هل تذكرت هذا القانون؟
أما قانون المحيط فهو:
A = 2 * R * Pi
تمام؟
ابدأ الحل ،ول تنس استعمال Valالتي تحدثنا عنها في التمرين الماضي ،لكي يتعامل البرنامج مع
الرقم الموجود في الن TextBoxعلى أنه رقم ،وليس على أنه حرف.
هيا ابدأ ،هذا تمرين صف خامس .....
الحفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففل:
إليكم الحل البسيط:
Dim R As Integer
Dim Area As Double, Perimeter As Double
Const Pi As Double = 3.14
(R = Val)Text1.Text
Area = R ^ 2 * Pi
Perimeter = 2 * R * Pi
" & Areaالمساحة" MsgBox
" & Perimeterالمحيط" MsgBox
فستكون النتيجة هي ،3أي أنه أخذ العدد صحيحاً ودون باقي ،تمام؟ سنستعمل هذا المعامل.
ستقوم بإذن ال بتوظيف هاتين الدالتين لصنع هذا البرنامج ،ماذا ؟؟ تريد مساعدة أكثر ......آسف
شغل مخك.
وسننيكون ممتازًا أيضاً إذا اكتشفننت الحنل بطريقنة أخرى ،كلمننا علينك هنو أن تمسننك قلماً وورقنة
وتحاول ،وأنا بانتظارك.
الحل:
قد تظنون أني تركتكم بدون مساعدة ،لكن السبب الساسي لقلل
الشرح هو أن تفكر أنت به بنفسك ،والن إليك الكود:
Dim intTotalMonths As Integer, intMonths As Integer, intYears As Integer
)intTotalMonths = Val)Text1.Text
"MsgBox intYears & " years and " & intMonths & " months
إذا ً هنفا جعلنفا العدد الجمالي للشهور هفو العدد الموجود ففي الفف ، TextBox
ثم كانت السنوات هي عدد الشهور الجمالي مقسوما ً على 12دون باقي،
والشهور هففو باقففي قسففمة عدد الشهور الجمالي على ،12فمثل ً لو كان
عندنففا 47شهراً ،قسففمناها على 12فكانففت النتيجففة 3والباقففي ،11إذاً
ستكون النتيجة :
فكّر بها...
-3الن ترتيننب العداد ،عليننك أن تركننز معنني جيداً ،وإن كنننت أنهيننت كأس أو فنجان ،الشاي أو
القهوة ،فعليك بأخرى أو آخر.
ل أن المستخدم اختار العداد التالية ،ونطبق المثال عليها: سنفرض جد ً
3-7-10-8-1-9-5-2-4-6
ل بمقارنننة العدد الول بكننل عدد مننن العداد الخرى ،فإن كان العدد المقارَن بننه
سننوف نقوم أو ً
أصغر من العدد الول ،نبدل مكانيهما ،انظر معي:
هنا تتم مقارنة العدد 3بالن ،7وبما أن 3أصغر من ،7فل يحدث شيء ويكمل المقارنة ،ثم يقارن
بالن 10و الن ،8إلى أن يصل إلى الن ،1وبما أن 3أكبر من ،1فإن البرنامج يبدل مكاني العددين
ليصبح الترتيب كما يلي:
ثم يكمل المقارنة ،فيقارن العدد الول الذي أصبح الن ،1بالعداد الباقية ،فيجد أن 1في مثالنا هذا
أصغر من كل العداد الخرى ،لذلك سيكمل المقارنة دون أن يبدل شيئاً إلى أن يصل إلى الن ،6
فيكون عندهننا قنند أنهننى مقارنننة العدد الول بالعداد الخرى ،ثننم ينتقننل إلى العدد الثاننني ،ويبدأ
المقارنة:
وما إن يصل إلى الن 3حتى يبدل بين العددين ،لن 7أكبر من ،3وتستمر الحلقة هكذا حتى يصل
إلى العدد الخير.
تحتاج هذه الخطوة إلى حلقتننني Forمتداخلتينننن ،الولى تقارن العدد المختار بكنننل عدد آخنننر،
والثانينة تنتقنل بنك منن العدد الول بعند أن تمنت مقارنتنه بالعداد الخرى إلى العدد الثانني ،وتبدأ
المقارنة ،ثم الثالث....
وبعند أن تنتهني الحلقنة سنتجد أن العداد أصنبحت مرتبنة منن الصنغر إلى الكنبر ،وإن لم تصندق،
فجرب ذلك على الورق لتجد النتيجة صحيحة.
-4الخطوة الرابعننة هنني طباعننة الرقام على النافذة بعنند أن تننم ترتيبهننا ،وتحتاج إلى حلقننة For
الرابعنة ،لتقوم فيهنا بطباعنة الرقام المحفوظنة فني متغيرات المصنفوفة واحداً تلو الخنر ،ليتفاجاً
المستخدم أن العداد أصبحت مرتبة.
الن حاول ،معك ألف محاولة ،فإن لم تستطع فتعال واقرأ الحل.
الحنننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننننل:
ل سننعرف المصنفوفة ،ونعرف متغيراً آخنر سنتعرف فائدتنه بعند قلينل ،بالضافنة إلى متغيرات أو ً
العد في جمل : For
الن ،عندما يضغط المستخدم الزر ،تظهر له عشرة مربعات الواحد تلو الخر ،وهنا نستخدم
حلقة Forالولى:
For i = 0 To 9
("Numbers)i( = InputBox)"Enter the number please
Next
في الكود السابق بدأنا الحلقة الكبيرة التي عدادها هو المتغير ،iوهو يمثل العدد الذي سنقارن به
العداد الخرى ،ثم تبدأ الحلقة الثانية ،ونلحظ أننا قلنا له أن يجعل البداية التي يبدأ العد فيها هي
نفسنها المكان الذي وصنل إلينه المتغينر iلكني ل تتنم المقارننة بالعداد التني قبنل العدد الذي نريده،
ل في العمل( ،جرب ولحظ الخلل(. مما سيحدث خل ً
وثنم نأخنذ العداد التني سننقارن بهنا واحداً واحداً ،فإن كان أحدهنا أصنغر منن العدد الذي نقارن بنه،
تنم التبدينل ،وإن لم يكنن يكمنل المقارننة ،فإذا تمنت مقارننة كنل العداد يهذا العدد ،انتهنت المقارننة
وخرج منن الحلقنة الصنغيرة ،وعندهنا سنتزيد قيمنة المتغينر iمرة واحدة ،أي إننه سنينتقل إلى العدد
الثاني ويبدأ المقارنة من جديد بالرقام التي تليه ،ويكرر هذه العملية حتى يصل المتغير iإلى ،9
وعندها سيكون الترتيب قد تم ،ويبقى طباعة الرقام على النافذة.
حاول إكتشاف فائدة المتغير . B
حاول فهننم الكود جيداً وقراءتننه عدة مرات ،أعلم أنننه قنند يكون معقدًا قليلً عليننك كمبتدئ ،ولكننن
يجب أن تحاول فهمه وتجريب عمله أكثر من مرة ،ثم حاول أن تطوره.
;int A[10],B
(for )int y=0;y<10;y++
{
;"cout<<"Write the numbers before sorting\t
;]cin>>A[y
}
(for )int i=0;i<10;i++
{
(for )int j=i;j<10;j++
{
(]if )A[j]<A[i
{
;]B=A[i
;]A[i]=A[j
;A[j]=B
}
}
;cout<<endl<<"Here are the numbers after sorted\t"<<A[i]<<endl
}
هذا إن كنت تعرف استخدام ++Cأما إن كنت ل تعرف فأغمض عينيك ول تنظر.
ما هي العودية؟
إذا كنففت قففد تدربففت جيدا ً على الجراءات فيمكننففي عندهففا أن أخففبرك أن
العودية هي إجراء يقوم باستدعاء نفسه ...ما معنى هذا ؟
فلنفنرض جدل ً أنففك قلت لشخففص مففا أنففا أعرفففك ،فقال أنففا أعرف أنففك
تعرفنففي ،فقلت أنففا أعرف أنففك تعرف أنففي أعرفففك ،فقال أنففا أعرف أنففك
تعرف أني أعرف أنك تعرفني ........إلخ
حسنا ً هذا كان مثال ً تقريبيا ً فاشل ً
ولكن الن ،فلنرجع إلى البرمجة ،تخيل أنك عرفت الجراء التالي:
مثلً: ما الذي سيحدث عندما نستدعي الجراء ،في حدث النقر على زر ما
MySub
End NOT
'DO Sub TRY THIS AT HOME
MySub
End Sub
Dim A As Integer
فيقوموالذي سف
Private مففا الذي سففيحدث؟ سففنستدعي الجراء المسففمى MySub
()Sub MySub
وهكذا باسفتدعاء نفسفه مرة أخرى ،ثفم يقوم باسفتدعاء نفسفه مرة أخرى،
"Print "Hello
إلى ما ل نهاية .....
If A = 5 Then
والن لنتطور في استعماله ،انظر المثال التالي:
Exit Sub
Else
A=A+1
End If
End Sub
A=1
MySub
End Sub
علىHello سفيتم طباعفة كلمفة، مفا الذي سفيحدث عنفد النقفر على الزر
. فكر بها،النافذة خمس مرات
If Num = X * Y Then
Exit Function
Else
Num = X + Num
MyFunction X, Y
End If
MyFunction = Num
End Function
MsgBox MyFunction)5 , 3(
End Sub
جربهفا وحاول اسفتنتاج مفا الذي حدث وتفسفيره ،وتمرن قليل ً على العوديفة
بنفسك
أمففا الن ......فالذي نريففد فعله هففو طباعففة جدول الضرب لعدد مففا على
النافذة ،باسفتخدام العوديفة ،فلو وضفع المسفتخدم ففي TextBoxالرقفم 5
مثلً ،ثم ضغط على زر التنفيذ ،سيطبع التالي على الشاشة:
0
5
10
15
20
25
30
35
40
45
50
تمام؟ هيا حاول بنفسك ،إذا فعلتها أنا ،فسوف تفعلها أنت بإذن الله.
الحل:
ها هو ذا الحل:
(Private Sub Multiply)intNum As Integer
Static A As Integer
Print A * intNum
A = A +1
(Call Multiply)intNum
Else
A=0
End If
End Sub
Cls
(Multiply Val)Text1.Text
End Sub
هنفا اسفتدعيناه ومررنفا له القيمفة الموجودة ففي الفف TextBoxوهذا بعفد أن
قمنا بمسح ما كتب على النافذة بالمر Clsتمام؟؟؟؟؟
@@@@@@@
@@@@@@@
@@@@@@@
@@@@@@@
@@@@@@@
@@@@@@@
@@@@@@@
ل ل بند منن ضبنط خاصنية MultiLineلمربنع الننص الرابنع إلى Trueلكني يقبنل الننص كتابنة أو ً
أكثر من سطر فيه ،ثم نقوم بالذي نريده.
فلنفرض أن عندنننننا ثلثننننة متغيرات ،هنننني الطول ،العرض ،والحرف الذي نرينننند أن نكتبننننه
علينننا أن نسننتخدم حلقتنني Forمتداخلتيننن لنحقننق مننا نريده ،الذي سنننفعله هننو أننننا سنننبدأ بكتابننة
الحروف على السطر الول ،مرة ،مرتين ،ثلثة ...إلى أن نصل إلى العرض الذي حددناه وليكن
7مثلً ،عندما يصبح عدد الجروف التي كتبناها في هذا السطر هو ،7عندها يمكننا أن ننتقل إلى
السطر الثاني ،لتنتقل إلى السطر الثاني يمكنك أن تكتب:
Text4.Text = Text4.Text + vbNewLine
أو :
Text4.Text = Text4.Text + vbCrLf
أو :
(Text4.Text = Text4.Text + Chr)13
كنننل الطرق السنننابقة سنننتجعلك تبدأ بالكتابنننة فننني سنننطر جديننند ،طبعاً ل تننننس ضبنننط خاصنننية
MultiLineإلى Trueوإل...
والن عندمننا ننتقننل إلى السننطر التالي نقوم بتكرار العمليننة ذاتهننا ،ثننم ننتقننل إلى السننطر التالي
ونكررها حتى نصل إلى الرقم الذي حددناه في الطول ،تمام؟
بقي عليك التفكير ومحاولة الفهم ،قد يكون هناك طريقة أخرى لذلك ل تحصر دماغك في طريقة
واحدة ،ما دام دماغك قادراً على إبداع مئات الطرق.
الحل:
هذا كود رسم المربع:
Dim TriangleWidth As Integer, TriangleHeight As Integer, Letter As
String, i As Integer, j As Integer
TriangleWidth = Text2.Text
TriangleHeight = Text1.Text
Letter = Text3.Text
"" = Text4.Text
For i = 1 To TriangleHeight
For j = 1 To TriangleWidth
Next
Next
ممممم ،ما الذي حدث هنا؟؟؟
فلنسر مع الكود خطوة خطوة:
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مرات ففي
مثالنا هذا لنحصل على الشكل التالي:
@@@@@
@@@@@
@@@@@
خوارزميتنا اليوم شبيهة بسابقتها ،كما رأيتم في المثال في المرفقات السابقة ،عند تحديد رقم معين
كطول لضلع المثلث القائم ،وحرف معينن ليرسنم بنه ،مثلً الطول 7والحرف @ فسنتكون النتيجنة
بعد ضغط الزر كالتالي:
@
@@
@@@
@@@@
@@@@@
@@@@@@
@@@@@@@
الحل:
ستضحك من نفسك بعد هذا الحل:
Dim Letter As String
Letter = Text2.Text
TriangleLength = Text1.Text
"" = Text3.Text
For i = 1 To TriangleLength
For j = 1 To i
Next
ولنشرحه:
Next
Dim Letter As String
Dim TriangleLength As Integer
Dim i As Integer, j As Integer
عرفنفا ثلثفة متغيرات :متغيفر الحرف الذي سفيرسم المثلث بفه ،متغيفر طول
ضلع المثلث ،ومتغيران لحلقتي .For
ثفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففم:
Letter = Text2.Text
TriangleLength = Text1.Text
"" = Text3.Text
ثفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففم:
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
وستعرفون لماذا..
فإنففه سففينظر إلى قيمففة iوسففيجدها واحدا ً بمفا أننففا فففي المرة الولى مففن
الحلقة ،فيقوم بتنفيذ الوامر مرة واحدة ،ويضيف الحرف @ إلى النص ثم
يتحقق هل أصبح المتغير jيساوي المتغير ، iوبما أن j=i=1فإنه سينتقل
إلى سطر جديد ويخرج من الحلقة..
ثفم يعود مفن جديفد ويزيفد قيمفة iمرة واحدة ويعود ليكرر العمليفة مفن جديفد
وهذه المرة سيكررها مرتين ،لن قيمة iأصبحت ،2ثم يطبع سطرا ً جديداً
ويعود ليزيفد قيمفة iمرة واحدة وهكذا حتفى تصفل قيمفة iإلى 7ويكون قفد
طبع الشكل التالي في مربع النص:
@
@@
@@@
@@@@
@@@@@
@@@@@@
@@@@@@@
------#
-----###
----#####
---#######
--#########
-###########
#############
إذا اعتبرننا أن الخنط -هنو مسنافة فارغنة ،فهذا يعنني أننك فني السنطر الول سنتضع 6مسنافات
فارغنة ،وحرفاً واحداً ،فني السنطر الثانني سنيقل عدد المسنافات واحداً ويزداد عدد الحروف اثنينن،
وهكذا حتى يصل عدد المسافات في السطر السابع إلى الصفر.
.هذه المرة لن أكتب لك كوداً ،أنت اكتشفها بنفسك (على الورقة والقلم) ،إذا أردت أن تعرف كيف
تضيف فراغات فأسهل طريقة هي هذه:
" " Text1.Text=Text1.Text +
بسيطة ....
طبعًا ل تنس ما تعلمناه ،من vbNewLineو خاصية .... MultiLine
الحل:
هذا هو الكود في الصفحة التالية:
Dim A As Integer
TriangleLength = Text1.Text
Letter = Text2.Text
"" = Text3.Text
A=0
For i = 1 To TriangleLength
Next
For y = 0 To A
Next
A=A+2
Next
فلنحلل الكود ،أولً :
Dim TriangleLength As Integer
Dim Letter As String
Dim A As Integer
Dim i As Integer, j As Integer, y As Integer
ثم:
TriangleLength = Text1.Text
Letter = Text2.Text
"" = Text3.Text
A=0
ثفففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففففم:
For i = 1 To TriangleLength
For j = 1 To TriangleLength - i
" Text3.Text = Text3.Text + "
Next
وهنفا ندخفل إلى الحلقفة الكفبيرة التفي متغيرهفا iوندخفل منهفا إلى الصفغيرة
التفي متغيرهفا jوالتفي سفتحدث ففي المرة الولى سفت مرات ففي حال كان
طول المثلث ،،7وفي كل مرة تتم إضافة مسافات فارغة ،هنا أنا وضعتها
أربع فراغات ،يمكنك أن تضع أي عدد يناسبك من الفراغات.
الحلقفة الكفبيرة سفتحدث 7مرات ،مفن واحفد إلى ،7ثفم ندخفل منهفا إلى
الصغيرة الولى ،ستتكرر 6مرات لننا نطرح قيمة iمن طول الضلع ،وفي
المرة الولى سفتكون قيمفة iهفي واحفد ،لذلك سفتحدث الحلقفة الصفغيرة
سفت مرات ،وتطبفع الفراغات سفت مرات ،ثفم تنتقفل إلى الحلقفة الثانيفة،
ستتكرر في البداية مرة واحدة ،لننا نمشي من الصفر إلى Aالذي قيمته
صفففر ،ونطبففع الحرف مرة واحدة ،ثففم نخرج مففن الحلقففة ،نضيففف سففطراً
vbNewLineونزيففد قيمففة Aمرتيففن ،ثففم نعود إلى أول الحلقففة الكففبيرة،
وتصبح قيمة iهي ،2وتتكرر المور ،لحظ هذه المرة أن الحلقة الصغيرة
الولى ستتكرر 5مرات ،بينما تتكرر الحلقة الثانية 3مرات.
هناك بعففض الشياء التففي يجففب أن نراعيهففا عنففد حلنففا لهذه الخوارزميففة:
-1ما هي قواسم العدد المحدد؟
-2ما عددها؟
سفوف نسفتعمل بالتأكيفد حلقفة Forتكراريفة ،تمشفي مفن الواحفد إلى العدد
الذي حددناه فففي الوسففيط ، Numوكلمففا وجدنففا عددا ً قاسففما ً لعددنففا هذا
باستخدام المعامل ،Modأضفناه إلى مصفوفة النتائج ،وزدنا عدد القواسم
واحداً ،يمكنك الستفادة من جملة:
(ReDim Preserve Deviders)Times
حيففففث Devidersهففففي مصفففففوفة النتائج ،و Timesهففففو العدد الحالي
للقواسففم ،تذكففر أنففه يجففب أن تدرس المصفففوفات جيدا ً قبففل البدء بهذه
الخوارزميفة ،وففي النهايفة ،تسفند القيفم التفي تجمعفت عندك ففي المصففوفة
Devidersإلى المصفوفة Resultكالتالي:
()Result)( = Deviders
)MsgBox MyArray)Counter
Next
End Sub
ثفم نعرض كفل عنصفر منهفا ففي MsgBoxيمكنفك ملحظفة الدالة UBound
والتفي تعيفد لك رقفم آخفر عنصفر ففي المصففوفة ،إذا أردت الحصفول على
رقففم أول عنصففر فيهففا ،يمكنففك اسففتخدام الدالة LBoundأي إذا كانففت
المصفوفة فيها 9عناصر من 0إلى 8مثلً ،فإن UBoundتعطيك رقم ،8
و LBoundتعطيك صفر.
Deviders)Times( = Counter
End If
Next
()Result)( = Deviders
End Sub
ثفم بدأنفا بحلقفة ،تمشفي مفن الواحفد إلى العدد Numفإذا كان Numيقبفل
القسفمة على العدد الذي وصفلنا إليفه ،أعدنفا تعريفف المصففوفة Deviders
مففع الحتفاظ بالعناصففر التففي كانففت فيهففا ثففم نضيففف العدد Counterإلى
المصفوفة ،ونزيد عدد القواسم مرة واحدة.
Deviders)0(=1
وزد قيمة Timesمرة واحدة ،ثم أكمل الحلقة ،هل تقبل 15القسمة على
2؟ ل ،إذا ً أكمففل ،هففل تقبففل الثلثففة؟ نعففم ،إذا ً أعففد تعريففف المصفففوفة
Devidersولكففن هذه المرة بعنصففرين ،العنصففر الول ( )0كانففت قيمتففه
واحفد ،أمفا العنصفر الثانفي ( )1سفتصبح قيمتفه ،3ونزيفد Timesمرة واحدة
ونكمففل ....إلى أن ننهففي العداد كلهففا ،ثففم نضففع كففل عناصففر المصفففوفة
Devidersفي المصفوفة . Result
حاول قراءة الشرح جيداً ،والتفكير بطرق أخرى لحل هذه الخوارزمية.
يمكننك ملحظنة أن هذه العداد هني العداد غينر الولينة المحصنورة بينن الواحند والنن ،15فهنو
يعطيك رسالة بكل عدد غير أولي حتى يصل إلى العدد الذي حددته.
سوف نناقش هنا بعض المفاهيم:
ما هو العدد الولي؟
هو كل عدد صحيح طبيعي أكبر تماماً من الواحد ،ول يقبل القسمة إل على نفسه أو على الواحد.
وأظن هذا معروفاً ولكن للتذكرة ،وللتأكيد على أن العدد واحد ل يعتبر عدداً أولياً.
في تمريننا هذا سنستعمل دالة وإجراء ،الدالة هي:
Private Function IsPrimary)ByVal Number As Long( As Boolean
وسنننوف نسنننتعملها لنعرف هنننل العدد Numberأولي أو ل ،فإذا كان العدد أوليًا تعيننند لك الدالة
Trueوإذا لم يكن تعيد . False
فني هذه الدالة يمكنننا فني البداينة أن نختنبر العدد ،هنل هنو الواحند؟ فإن كان فهنو غينر أولي حسنب
التعريف ،فنعيد Falseونخرج من الدالة عن طريق . Exit Function
ثم نكمل الدالة إن لم يكن واحداً ونبدأ حلقة تكرارية من العدد Number-1إلى ( 2حاول أن تفكر
لماذا( ونجرب قسمة العدد 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حاول أن تفكر بها ،هي شبيهة جدًا بسابقتها.
الحل:
يبدو أن المور قد بدأت تتعقد ..هذه هي الدالة : IsPrimary
Private Function IsPrimary)ByVal Number As Long( As Boolean
نتحقق If،هل
Number = 1 Then
البداية يساوي الواحد؟ فإذا كان فالواحد عدد Numberفي
IsPrimaryونسند
=Falseغير أولي،
False
Exit Function
End If
IsPrimary = False
Exit Function
End If
Next
IsPrimary = True
End Function
ثففم نتحقففق مففن قسففمة العدد Numberعلى كففل العداد الصففحيحة بيففن
Number-1و ،2فإن قبل القسمة فهو غير أولي ،وخرجنا من الدالة ،وإل
أكملنفا ،وعندمفا تنتهفي الحلقفة دون أن نخرج مفن الدالة فهذا يعنفي أن العدد
أولي ،ونسند . True
Private Sub WriteUnPrimaryNumbers)ByVal Number As Long, ByRef
Result)( As Long)
استعملنا دالتنا
ReDimكيف لحظResult)Numbers(
Preserve ،إنه شبيه بإجرائنا في خوارزميتنا السابقة
IsPrimary Result)Numbers( = Counter
Numbers = Numbers + 1
End If
Next
End Sub
فإن كان غيففر أولي أعدنففا تعريففف،لنعرف هففل العدد أولي أو غيففر أولي
. إنها كمثالنا السابق، فكر بها، وأضفناه لهاResult المصفوفة
MsgBox MyArray)Counter(
Next
End Sub
منا الممينز فني هذه العداد؟ فني البداينة نبدأ بالصنفر ،ثنم الواحند ،ثنم يكون كنل رقنم هنو مجموع
الرقمين السابقين له ،انظر معي:
1=1+0
2=1+1
3=2+1
5=3+2
8=5+3
13 = 8 + 5
21 = 13 + 8
...
...
تأخنذ الدالة وسنيطتين ،الولى Numbersوتمثنل عدد الرقام التني نريدهنا ،والثانينة )(Result
وهي تعيد مصفوفة النتائج.
يمكنك في بداية هذه الدالة إعادة تعريف المصفوفة )(Resultكالتالي:
ReDim Result)Numbers - 1( As Long
وبهذا ،إن رغنب المسنتخدم بعرض خمسنة أعداد منن هذه السنلسلة مثلً ،فإننه سنوف يمرر العدد 5
إلى السلسلة ،وسوف يحدث التالي في البرنامج:
: في خوارزميتنا هذه،ًإذا
... على الورق... وكالعادة، بل سأتركك لتفكر وتستنتج،لن أشرح كثيراً في مثالنا هذا
:الحل
:وهذا حل خوارزميتنا الخيرة
Private Sub Fibonacci)Numbers As Long, Result)( As Long)
Case 1
Result)0( = 0
Case 2
Result)0( = 0
Result)1( = 1
Case Is > 2
Result)0( = 0
Result)1( = 1
Next
End Select
End Sub
: Number -1 بالعددResult نعيد تعريف المصفوفة،ًأول
ً فهذا يعنفي أن فيفه عنصفرا1 فإن كانفت قيمتفهNumbers ثفم نختفبر العدد
فهذا يعنفففي أن فيفففه،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
End Sub
وقد طرقنا بابه في خوارزميتينا السابقتين.
Abboodd_dude@hotmail.com
أخوكم: