المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : لمبرمجي القسم- برنامج بسيط و لغز ابسط ؟


الصفحات : 1 2 [3] 4

نجيب المجيدي
21-12-2003, 02:40 PM
لا أقصدك انت يانورا فمشاركاتك فعالة رغم انشغالك ولكن أين البقية
يوجد الكثير من الأعضاء في المنتدى والمشاركة هنا ليست حصرية على جهابذة البرمجة أو المحترفين فقط فنحن جميعاَ في بداية المشوار فلِم لا يشارك كل من عنده فكره عن البرمجة بقدر ما يستطيع
فبهذا التفاعل سنستفيد جميعاً
وبالتوفيق للجميع

العمراوي
21-12-2003, 07:15 PM
نص مقتبس من رسالة : Nora
السلام عليكم ورحمة الله وبركاته .

اعتذر أخي نجيب عن عدم المشاركة وذلك لانشغالي كما أشرت أنت وليس تخاذلا أو عدم اهتمام ... و الأخ رغيد ماشاءلله عليه دائم التواصل ... موفي ومكفي ...
لكن صدقوني أخوتي الكرام صارت مشاركتي في هذا الموضوع تعطيني أمل من أن هناك أناس مهتمين بمجال البرمجة في بلدنا حتى وأن كانوا طلبة .. فهذه الساحة الحوارية غير المباشرة لتبادل الأفكار و الافادة والاستفادة تنم عن روح التعاون والتي أتمنى أن تستمر ...
بالنسبة لاقتراحك أخي الفاضل سد مأرب فهو بالفعل جيد لكني أرى أن يحول الى اتقان التقنية الجديدة من Microsoft والتي تسمى .Net ... أرى بأن نختار احدى لغات هذه التقنية ونبدأ مع بعضنا تدارسها على هيئة نقاش ( طبعا كل حسب مستواه واذا تم الاتفاق أنا من الأن حاجزة جزء الأسئلة الكثيـــــــــــرة :) )الى أن نصل الى مستوى صنع برامج قواعد البيانات ... ما رأيكم ...



إن برمجة الدوت نيت هي هدفي الأكبر هذه الأيام وقد قطعت فيها شوطا لابأس به قبل أن أتوقف وذلك بسبب الدراسة .,.,.,., حتى أنني قد عمل مشروع السنة عن الدوت نيت .,.,.,.,

وأنا أول من سيكون مشارك ومهتم بهذا الموضوع .,.,.,.,

وعلى أي حال .,.,.,., المشروع بأنزله هنا في المجلس عندما سأتمه .,.,.,.,

رغيد الطيب
24-12-2003, 12:43 PM
السلام عليكم ورحمة الله وبركاته ...

بالنسبة للاتجاه نحو تعلم تقنيات الدوت نت وبخاصة لغتي المفضلة VB والتي اصبح اسمها في الاصدار الاخير VB.NET هو اتجاه ينبغي علي سلوكه واقوم حالياً باستكشاف هذة اللغة الرائعة التي ستنقلك بجد الى عالم آخر من البرمجة فقط ان بذلت قليلاً من الجهد ...

ويسرني وجود هكذا اتجاهات برمجية في اوساط مبرمجي المجلس الذي وعلى الرغم من تسجيلي فيه من فترة إلا انني لم اشارك فيه لكوني مبرمجاً ولا استسيغ اي مواضيع غيرها ولم اكن اعرف ان هناك مهتمين في المجلس ... ثم ما لبتث ان جاءت بعض مشاركات الاخوة البرمجية مثل الامير الصنعاني و غيره ممن تبرعوا بشرح لغات برمجية حفزت الكثيرين على المشاركة وعندها فقط تبين لي انه يوجد كثيرين يميلون الى اميل اليه فا احببت المشاركة و يسرني الان وجود الرغبة في تعلم الدوت نت وانا على اتم الاستعداد للمشاركة معكم فانظروا كيف تريدون ان تكون البداية ؟؟

وهنا واستمراراً لمشوار الالغاز هذا اضيف لغزاً برمجياً جديداً ( مع ملاحظة ان الالغاز التي اطرحها احرص على كونها برمجية بحثة اي لا تخص الفيجوال بيسك فقط او اي اصدار بحد ذاته بل ان الغرض منها هو تحفيز الذهن للحصول على اجابة جيدة للمسائلة ومشاركة الاخرين بافكارهم ) ...

ولغز اليوم هو كيفية بناء المعاملات المنطقية .. وهي AND و OR و XOR و Eqv و اخيراً المعامل Imp ...

ان جميع المعاملات المنطقية السابقة مبنية على اساس منطقي خاص فمثلاً المعامل AND يعطي ناتج True في حالة واحدة وهي ان يكون طرفي المقارنة هما True يعني اذا جربت الكود التالي في زر امر :

Private Sub Command1_Click()
Print (True AND True)
Print (True AND False)
Print (False AND True)
Print (False AND False)
End Sub

تلاحظ ان الناتج هو True فقط في الحالة الاولى والتي فيها الطرفان هما True ...

اما المعامل OR فان ناتجه يكون False في حالة واحدة فقط وهي ان جميع الاطراف هما False اي ان وجود True في اياَ من الطرفين يعطي ناتج True انظر الكود التالي :

Private Sub Command1_Click()
Print (True OR True)
Print (True OR False)
Print (False OR True)
Print (False OR False)
End Sub


اما المعامل XOR فان الناتج فيه يكون True في حالة ان الطرفان مختلفان اي ان الطرف الاول يكون True والاخر False او ان يكون الطرف الاول False والآخر يكون True ... انظر الى الكود التالي :

Private Sub Command1_Click()
Print (True XOR True)
Print (True XOR False)
Print (False XOR True)
Print (False XOR False)
End Sub

فان الناتج سكون True في الحالة الثانية والثالثة وذلك الان قيمة الاطراف فيها مختلفة اما اذا كان كلا الطرفان True او False فان الناتج هو False.

المعامل EQV هو معامل معاكس للـ XOR ويعرف منطقياً باسم (XNOR) وفيه يكون الناتج True اذا تساوى الطرفان فقط اي انهما كانا اما True او False واذا اختلفت قيمة الاطراف فان الناتج هو False.. جرب الكود التالي :

Private Sub Command1_Click()
Print (True EQV True)
Print (True EQV False)
Print (False EQV True)
Print (False EQV False)
End Sub


واخيراً المعامل IMP وهو معامل يعطي True دائماً إلا في حالة واحدة وهي ان يكون الطرف الاول True والثاني False فان الناتج عندها هو False .. فاذا جربت الكود التالي :

Private Sub Command1_Click()
Print (True Imp True)
Print (True Imp False)
Print (False Imp True)
Print (False Imp False)
End Sub

فانك سوف تجد ان الاجابة False فقط في السطر الثاني والذي فيه المقارنة بين الاطرف الاول True والطرف الثاني False ....


ما سبق كان توضيح لنتائج المعاملات والمطلوب هنا بناء الدوال التالية :


Function myAND(A As Boolean, B As Boolean) As Boolean
' اكتب هنا شفرة الدالة
End Function

Function myOR(A As Boolean, B As Boolean) As Boolean
' اكتب هنا شفرة الدالة
End Function

Function myXOR(A As Boolean, B As Boolean) As Boolean
' اكتب هنا شفرة الدالة
End Function

Function myEQV(A As Boolean, B As Boolean) As Boolean
' اكتب هنا شفرة الدالة
End Function

Function myIMP(A As Boolean, B As Boolean) As Boolean
' اكتب هنا شفرة الدالة
End Function


يعني انه اذا استخدمت انا الدوال التي صممتها انت يكون الناتج مثل النتائج الحقيقة للمعاملات فمثلاً اذا كتبت الكود التالي :

Private Sub Command1_Click()
Print myAND(True, True)
Print myAND(True, False)
Print myAND(False, True)
Print myAND(False, False)
End Sub

تكون النتائج كما لو اني استخدمت المعامل الحقيقي AND بالشكل التالي :

Private Sub Command1_Click()
Print (True AND True)
Print (True AND False)
Print (False AND True)
Print (False AND False)
End Sub


الشرط الوحيد هو عدم استخدام اوامر الشروط المعروفة لنا مثل :
SELECT CASE
IF
CHOOSE
SWITCH
IIF
وما شابهها كما لا انسى ان اذكر بان الكود المختصر هو غايتنا المنشودة دائماً ...

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

العمراوي
24-12-2003, 02:32 PM
هذا الحل من عندي يا عزيزي رغيد .,.,.,.,


Dim a As Boolean
Dim b As Boolean

Function myAND(a As Boolean, b As Boolean) As Boolean
myAND = a * b
End Function

Function myOR(a As Boolean, b As Boolean) As Boolean
myOR = a + b
End Function

Function myXOR(a As Boolean, b As Boolean) As Boolean
myXOR = (a * Not b) + (Not a * b)
End Function

Function myEQV(a As Boolean, b As Boolean) As Boolean
myEQV= Not ((a * Not b) + (Not a * b))
End Function

Function myIMP(a As Boolean, b As Boolean) As Boolean
myIMP = a * Not b
End Function

رغيد الطيب
24-12-2003, 08:41 PM
السلام عليكم ورحمة الله وبركاته .

الاخ العزيز غسان ... مشاركة اكثر من رائعة و تواجد يثلج الصدر من مشرف القسم ...

وقد كانت الاجابات صحيحة على الدالتين myAND و myOR وذهة الاجابات هي التي كنت اريدها عند وضع اللغز .. فشكراً لتفاعلك واجاباتك الممتازة اخي العزيز ...


اما الدوال البقية XOR و XNOR و IMP وشفرتهم التي وضعتها كالتالي :

Function myXOR(a As Boolean, b As Boolean) As Boolean
myXOR = (a * Not b) + (Not a * b)
End Function

Function myEQV(a As Boolean, b As Boolean) As Boolean
myEQV= Not ((a * Not b) + (Not a * b))
End Function

Function myIMP(a As Boolean, b As Boolean) As Boolean
myIMP = a * Not b
End Function

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

غير ان اجاباتك نبهتني الى امر آخر وهو اني نسيت ان انوه الى عدم استخدام المعامل NOT والذي يعتبر هو ايضاً احد المعاملات المنطقية لهذا اتمنى ان تكون اجاباتك القادمة او اياً الاخوة لدوال الباقية بدون استخدام هذا المعامل ايضاً بالاضافة الى جميع اوامر الشروط التي ذكرناها سابقاً...

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

انتظر اجاباتاكم الرائعة او اي اللغاز برمجية جديدة واعود بالشكر الجزيل لاخ نجيب الذي اسعدني بوضع لغزين رائعين من قبل ..

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

العمراوي
25-12-2003, 01:44 AM
مشكور يا عزيزي رغيد على التعديل .,.,.,., واضح أننا لم أقرأ سؤالك جيدا قبل الإجابة .,.,.,.,


وجزاك الله خيرا على هذه الالغاز .,.,.,.,.,

طالبة علم
25-12-2003, 11:14 AM
السلام عليكم ورحمة الله ...

Dim a As Boolean
Dim b As Boolean

Function myAND(a As Boolean, b As Boolean) As Boolean
myAND = a * b
End Function


Function myOR(a As Boolean, b As Boolean) As Boolean
myOR = a + b
End Function


Function myXOR(a As Boolean, b As Boolean) As Boolean
myXOR = CBool((CInt(a) - CInt(b)))
End Function


Function myEQV(a As Boolean, b As Boolean) As Boolean
myEQV = CBool((1 + Abs(CInt(a)) + Abs(CInt(b))) Mod 2)
End Function


Function myIMP(a As Boolean, b As Boolean) As Boolean
myIMP = CBool(1 - Abs(CInt(a)) + Abs(CInt(b)))
End Function

...

رغيد الطيب
25-12-2003, 12:47 PM
السلام عليكم ورحمة الله وبركاته ...

الاخت طالبة علم سرني كثيراً انضمامك لنا في هذا الموضوع البرمجي البحث .. وسرتني اكثر الاجابة الرائعة ...

والاجابات التي قمت بطرحها هي اجابات رائعة وصحيحة مئة بالمئة وكتعقيب اضعه للفائدة .. اقول :

اولاً يمكن الاستغناء عن تعريف المتغيرين a و b والذي لاحظت انك والاخ العزيز كونان قد وضعتوهم في بداية الشفرة ... ويمكن الاستغناء عنهما اذ لا استفادة لهم في الكود ...

ثانياً : في اجاباتك الرائعة نلحظ استخدام مكثف لاوامر التحويل بين انواع البيانات وهي الدوال التي تبدأ بالحرف C كا CBool و CInt وغيرها .. ويمكن الاشتغناء عن بعضها اختصاراً للكود ...

بالطبع الملاحظات السابقة لا تعني قصوراً في الاجابة بل ان الاجابة بالفعل اكثر من رائعة .. وتستحق الاشادة ...

وسوف اضع الاجابات التي حظرتها انا قبل ان اضع اللغز وذلك للفائدة والاختصار ...


Function myAND(a As Boolean, b As Boolean) As Boolean
myAND = a * b
End Function

Function myOR(a As Boolean, b As Boolean) As Boolean
myOR = a + b
End Function


Function myXOR(a As Boolean, b As Boolean) As Boolean
myXOR = a - b
End Function


Function myEQV(a As Boolean, b As Boolean) As Boolean
myEQV = Abs(a - b) - 1
End Function


Function myIMP(a As Boolean, b As Boolean) As Boolean
myIMP = b - a - 1
End Function



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

رغيد الطيب
25-12-2003, 01:25 PM
السلام عليكم ورحمة الله وبركاته ...

بعد الاجابة الشافية لطالبة علم على اللغز السابق اضع لغزاً جديداً اسهل من سابقه ... وهي مسئلة معروفة لكل مبرمج بشكل كبير وهي كيفية معرفة ان الرقم الذي ادخله المستخدم فردي ام زوجي ... ؟

طبعاً معلوماتي المتواضعة في الرياضيات تفيد بأن الرقم الذي يقبل القسمة على 2 دون ابقي ( اي ان الباقي صفراً ) هو عدد زوجي بينما العدد الذي لايقبل القسمة على 2 فهو عدد فردي ويمكن كتابة كود كالتالي لحل المسألة :

Private Sub Command1_Click()
Dim N As Integer

N = InputBox("ادخل اي عدد صحيح")

If (N Mod 2) = 0 Then

MsgBox "عدد زوجي"

Else

MsgBox "عدد فردي"

End If
End Sub

الذي قمت به في الكود السابق هو طلب رقم من المستخدم ثم تخزينه في المتغير N وبعد ذلك استخدمت الامر MOD الذي يعيد لي باقي القسمة على 2 فاذا كان الباقي صفراً فان العدد زوجي وما عدا ذلك فهو عدد فردي ...

الاجابة السابقة هي الاجابة الاولى التي تخطر على بال اي شخص ولكن طلبي الان بكم طريقة اخرى يمكنك معرفة ان العدد زوجي ام فردي ...

اذا فالمطلوب من السؤال هو طرح طريقة او اكثر يمكنك بواسطتها فحص المتغير N ثم عرض رسالة تفيد بنوعه هل هو فردي ام زوجي ...

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

نجيب المجيدي
25-12-2003, 03:26 PM
آسف جداً على عدم المشاركة في اللغز السابق
ولكنني أستغرب هذا فعلاً (فليومين أو أكثر لم يكن هناك جديد وفجأة أجد أنكم قد بدأتم لغز جديد و أجبتم عليه وانتقلتم إلى اللغز الثاني)
قل لي هل تتفقون سوياً على يوم محدد تشاركون فيه جميعاً عندما لا أكون موجوداً
أم ماذا
عموماً سأجرب حل هذا اللغز قريباً
وأدام الله أفكارك يا رغيد (وميحرمناش منك أبداً)

نجيب المجيدي
26-12-2003, 04:25 PM
السلام عليكم ورحمة الله وبركاته

ممكن نجرب الطريقة التالية :
أنا فكرت فيها عشان نسيت السؤال واعتقدت ان المطلوب عدم استخدام الشرط وعملتها باستخدام التكرار

Private Sub Command1_Click()
Dim N As Integer
N = InputBox("ادخل اي عدد صحيح")
do while N mod 2 =0 'إذا تحقق الشرط سيظهر الرسالة زوجي ثم
'ينهي الإجراء
msgbox "زوجي"
exit sub
Loop 'إذا لم يتحقق الشرط فسيخرج من الدوران ويظهر
' الرسالة فردي وينهي الإجراء ايضاً
MsgBox "فردي"
End Subويمكن ذلك ايضاً باستخدام Do ... Until
وهذي الطريقة اللي أشوفها مختصرة

Private Sub Command1_Click()
Dim N As Integer
N = InputBox("ادخل اي عدد صحيح")
MsgBox IIf (N Mod 2) ,"زوجي","فردي"
End Sub

رغيد الطيب
26-12-2003, 06:13 PM
السلام عليكم ورحمة الله وبركاته ...

اخي العزيز نجيب بالفعل لا اجد ما يمكنني ان اعبر به عن امتناني على تفاعلك الدائم ...

ودعني اوضح مقصدي من السؤال

اولاً ما اريده هنا ليس اختصار الكود بل اني اريد طرقاً مختلفة لايجاد نوع العدد N هو هو فردي ام زوجي ...

فتخيل معي انه طلب منك برنامج يعلم الصغار الاعداد الفردية والزوجية بحيث يدخل الطفل الرقم ثم يخبره البرنامج بنوع هذا الرقم .. تلاحظ انني استخدمت طريقة الـ MOD التي نعرفها جميعاً وما اقصده الان اذا لم نكن نعلم بوجود المعامل MOD فكيف كنا سنقوم بحل هذة المسألة وبناء هذا البرنامج ...

فمن غير المعقول ان نتخلى عن تصميم البرنامج فقط لاننا لا نعلم عن وجود امر كالـ Mod .... و ينبغي التفكير في طرق اخرى لحل المسألة ..

ولايوجد هنا اي شروط عن الحل يعني استخدم كل ما تريده المهم في النهاية هو ان يفرق البرنامج بين العدد الفردي و الزوجي .. وحبذا لو كانت الاجابة باكثر من طريقة ...

طبعاً الان يمكنني ان اخمن ربما سبع طرق اضافة الى طريقة الـ Mod التي وضعتها يمكن بواسطتها ان نجيب على هذا اللغز ... وجميعها طرق بسيطة جداً وغير معقدة وما يمهني هو محاولة استغلال اللغة البرمجية التي بين ايدينا في حل اللغز بغض النظر عن اللغة سواءً كانت فيجوال بيسك او باسكال او سي او جافا فكل مبرمج يختار ما يناسبه لحل اللغز ثم يضع الاجابة هنا ... و بالله التوفيق ...

ولا انسى ان اقول طريقتك جميلة جداً التي وضعتها بدون استخدام الشروط ( Do Until و Do While ) ...

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

امين وبس
30-12-2003, 04:15 PM
انا سعيد جداً فيكم وفي الموضوع هذا

حقيقة شي جميل وفريد موضوع في البرمجة
نرد الاستمرار في طرح هذة المواضيع

ولكم الف الف شكر

طالبة علم
30-12-2003, 08:23 PM
السلام عليكم ورحمة الله ...

Private Sub cmdEvenOrOdd_Click()
Dim num As Integer
num = Val(Right(Trim(txtNumber), 1))
Select Case num
Case 0, 2, 4, 6, 8: MsgBox " Even Number "
Case Else: MsgBox " Odd Number "
End Select
End Sub


Private Sub cmdEvenOrOdd_Click()
Dim num As Integer
num = Val(Right(Trim(txtNumber), 1))
Dim n As Double
n = Format(num / 2, "00.00") - Format(num / 2, "00")
MsgBox IIf(n = 0, " Even Number ", " Odd Number ")
End Sub


...

رغيد الطيب
31-12-2003, 05:05 AM
السلام عليكم ورحمة الله وبركاته ...

الاخت الفاضلة طالبة علم ... إجاباتك بالفعل اكثر من رائعة بكثير وتوضح لنا ان الله تعالى قد انعم عليك بقكر برمجي مميز .. متعنا الله واياك بما آتانا وسخرنا لخدمة ديننا الاسلامي الحنيف ...

ولأنك قد اجبت باجابتين وحيث اني اردت الاجابة على السؤال باكثر من طريقة فانه يمكن اعتبارك قد اجبت اجابة كاملة بحق ..

لهذا اضع انا بعض الحلول الاخرى التي يمكن استنتاجها لحل المسألة .. وهي بالطبع لا تصل الى مستوى اجاباتك ...


الطريقة الاولى :

هي استغلال معاملي القسمة في الفيجوال بيسك وهما القسمة العادية وعلامتها هي / والقسمة بدون باقي وعلامتها هي \ ...
والقسمة بباقي نحن نعرفها جيداً واما القسمة بدون باقي في تعني انك اذا استخدمت العلامة \ لقسمة 5 على 2 فأن الناتج هو 2 وليس 2.5 كما هو الحال مع القسمة العادية /...
واذا امعنا النظر فانه اذا قسمنا اي رقم زوجي على 2 فان الناتج دائماً مساوي لناتج القسمة بدون باقي \ اما اذا قسمنا رقم فردي على 2 فانه سوف يوجد اختلاف فمثلاً :

2 / 6 = 3
2 \ 6 = 3

2 / 5 = 2.5
2 \ 5 = 2

و من هنا يظهر بوضوح ان النواتج لا تتساوى عند قسمة عدد فردي على 2 باستخدام علامتي القسمة في الفيجوال بيسك ... ويمكن استغلال هذة الميزة كالتالي :




Dim N As Integer

N = InputBox("ادخل عدد صحيح :")

If (N / 2) <> (N \ 2) Then
MsgBox "فردي"
Else
MsgBox "زوجي"
End If



الطريقة الثانية :

يمكن إجراء تحويل بسيط على الحل السابق في حالة عدم معرفة انه يوجد معمل قسمة بدون باقي ... وهنا سنستغل الدالة Fix() التي تحذف الجزء العشري من اي رقم بالشكل التالي :

Dim N As Integer

N = InputBox("ادخل عدد صحيح :")

If (N / 2) <> Fix(N / 2) Then
MsgBox "فردي"
Else
MsgBox "زوجي"
End If



الطريقة الثالثة :

يمكن ايضاً استغلال فكرة رياضية بسيطة وهي اننا نعرف جميعاً ان اي عدد سالب مرفوع الى أس فردي يبقى على سالبيته واما اذا رفع الى أس زوجي فأن الناتج دائماً هو عدد موجب وبالتالي اذا رفعنا اعدد سالب ولنقل سالب اثنين الى أس فردي مثل 3 فأن الناتج هو سالب ثمانية بينما اذا رفعنا نفس العدد ( سالب اثنين ) الى عدد زوجي ولنقل اربعة فأن الناتج هو موجب ستة عشر ... ويمكن استغلال الحقيقة الرياضية كالتالي :

Dim N As Integer

N = InputBox("ادخل عدد صحيح :")

If (-1 ^ N) < 0 Then
MsgBox "فردي"
Else
MsgBox "زوجي"
End If



الطريقة الرابعة :

يمكن ايضاً استغلال الدوران البسيط بواسطو Until او While بحيث نقوم بانقاص 2 من العدد حتى يتبقى عدد اصغر من 2 وبعدها نفحص العدد المتبقي فأن كان واحداً فان هذا يعني ان العدد فردي و إن كان العدد المتبقي صفراً فان هو عدد زوجي :

Dim N As Integer
Dim I As Integer

N = InputBox("ادخل عدد صحيح :")

Do Until N < 2
N = N - 2
Loop

If N = 1 Then
MsgBox "فردي"
Else
MsgBox "زوجي"
End If




الطريقة الخامسة :

وهي عبارة عن تحويل بسيط للطريقة السابقة بحيث نبداً بوضع متغير جديد ثم نزيد قيمته بواسطة دوران بسيط فإذا وصلنا الى رقم تجاوز العدد N فان العدد هو عدد فردي اما اذا وصلنا الى عدد مساوي للـ N قان العدد هو عدد زوجي :

Dim N As Integer
Dim I As Integer

N = InputBox("ادخل عدد صحيح :")

Do Until I >= N
I = I + 2
Loop

If I > N Then
MsgBox "فردي"
Else
MsgBox "زوجي"
End If



الطريقة السادسة :

لمحبي النظام الثنائي Binary فاننا يمكننا ايضاً إستغلال المعامل And لمقارنة الرقم المدخل بالعدد 1 فان كان الناتج هو 1 فان الغدد هو عدد فردي اما اذا كان الناتج هو 0 فان العدد هو عدد زوجي ... وهذا الحل يعتمد على مبدأ هندسي بسيط يفيد بأن كل الارقام الفردية تبدء ببت (Bit) قيمته هي 1 وهو ما نقوم بفحصه باستخدام الـ And بالشكل التالي :


Dim N As Integer

N = InputBox("ادخل عدد صحيح :")

If (N And 1) = 1 Then
MsgBox "فردي"
Else
MsgBox "زوجي"
End If




اخيراً اقول هذة ليست كل الطرق ولكنها البعض و يمكن لكم التفكير بالكثير غيرها .... و بالله التوفيق ...


وسوف انتقل بإذن الله تعالى الى لغز اليوم ...

لغز اليوم بسيط جداً إن شاء الله تعالى وهو كثيراً ما استخدمنا الامر Mod وهو واحد من المعاملات المفيدة جداً برمجياً ولكنه يحتوي على عدة عيوب اهمها انه فقط يتعامل مع الاعداد الصغيرة والتي لا تتجاوز Long وهو تقريباً اقل من 2 ميليار ونصف ....

يعني اذا جربت الكود التالي :


Dim N As Long

N = 3555777222 Mod 870

MsgBox N


فأننا سوف نحصل على خطأ لان العدد الاول قد تجاوز حدود النوع Long فهو يمثل اكثر من ثلاثة مليار ونصف ... وقد كان من المفترض ان يكون الناتج في مربع الرسالة هو 222 ولكن قصور الامر Mod حال دون الحصول على الاجابة الصحيحة ..

السؤال الان اذا لم يكن لدينا الامر Mod فكيف يمكن ان نصنع دالة بسيطة نعطيها رقمين فتقوم بقسمتهما ثم تعيد لنا الباقي بحيث تقبل هذة الدالة ارقام اكبر من اثنين مليار ونصف ولنقل تقبل اعداد من النوع Double ...


Function myMOD(ByVal A As Double, B As Double) As Long
اكتب هنا شفرة الدالة
End Function


بحيث اننا اذا اردنا ان نحصل على اجابة المسألة السابقة باستخدام دالتنا الجديدة نكتب التالي :

Dim N As Long

N = myMOD(3555777222, 870)

MsgBox N



تمنياتي للجميع بالتوفيق ...

الاخ العزيز أمين نسيت ان اشكرك على كلماتك المشجعة اخي الكريم ...

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

طالبة علم
31-12-2003, 08:20 PM
السلام عليكم ورحمة الله ...

أخي الفاضل بصراحة تواضعك شئ طيب جزاك الله عنه كل خير ... فاجابتي لا تستحق كل هذا الاطراء ... ولا أنسى أنك قد ساعدتني في سؤالي الذي عرضته على هذا المجلس (بخصوص الـ Resource File ) والذي كان بالفعل يؤرقني ... فشكرا لك مرة أخرى ...
وبارك الله فيك ووفقك الى مايحبه ويرضاه ...

أما بالنسبة (للغز) الاخير فهذه هي محاولتي على عجل ...

Function myMOD(ByVal A As Double, B As Double) As Long
Dim CS As Double, SC As Long
CS = A / B
CS = Fix(CS)
CS = CS * B
SC = A - CS
myMOD = SC
End Function

...

نجيب المجيدي
07-01-2004, 05:35 PM
ممكن توضحي إجابتك وتشرحي عمل الدالة fix أختي الفاضلة

طالبة علم
07-01-2004, 08:45 PM
السلام عليكم ورحمة الله ...

تقوم الدالة :
Fix(num)
بأرجاع الجزء الصحيح للعدد الممرر num
وهذه أمثلة توضيحية :

Fix(9.1) = 9
Fix(9.9) = 9
Fix(-9.1)= -9
Fix(-9.9)= -9

والكود يعمل كالتالي :

لنأخذ A =22 , B = 5

CS = A / B

cs يحمل ناتج القسمة كان عدداً صحيحاً أو كسرياً وهنا = 4.4

CS = Fix(CS) ' CS = 4

CS = CS * B ' = 4*5 = 20

ولايجاد باقي القسمة :

SC = A - CS
myMOD = SC


...

bassam_78
10-01-2004, 08:13 AM
للاسف يا رغيد برنامجك خربان
لانو ولا مره زبطه وجاب الرقم اللي حطيته ببالي ؟
لذلك ارجوا التعديل ، حتى لو عدلتي اكيد بايكون هناك اخطاء ؟

;)

نجيب المجيدي
10-01-2004, 02:43 PM
مع احترامي أخي , مالك حق تقول الكلام هذا عن الأستاذ رغيد
والأحسن تحاول تستفيد معلومة
بدل كلامك السابق.