مشاهدة النسخة كاملة : 1كيف اصنع برنامج با ستخدام لغة السي يقوم بعملية الضرب دون اشارة الضرب


متلهف البرمجة
08-05-2006, 07:33 PM
اشكرك اخي على هذه النصائح اريدك دوما بجاني في حل المسائل ولقد تبين لي ان قرائة المسائل المحلولة سوف تعطيني خبرة كبيرة فما رائيك :
اريد منك المساعدة في حل المسائلة التالية:


-1كيف اصنع برنامج با ستخدام لغة السي يقوم بعملية الضرب دون اشارة الضرب
وارجو ان تعطيني الحل بعدةطرق

اكتب برنامج يقوم بطباعة nمن الأعداد بشرط عدم طباعة الأعداد الأولية؟
اكتب برنامج يقوم يجمع أخر عددين مدخلين ؟

منطلق بطموحي
08-05-2006, 08:32 PM
السلام عليكم :

اخي ما رايك ان نفكر معا ...لآ ان نحل مسائل بشكل جاهز ؟

فلنبدأ بمسألة الضرب بدون اشارة الضرب هذه

ساعطيك طريقة تفكيري ...و ربما لديك حل اخر

عملية الضرب نستطيع تحويلها الى عملية جمع

فمثلا 2*3=2+2+2=6 =3+3

فيجب الاستفادة من هذه الخاصيه

فنستطيع هنا تصميم دالة recursive تقوم بهذا العمل

طيب متى تتوقف الدالة ...اذا كان العدد الثاني = 1 نرجع قيمة العدد الاول بمعنى لو كان لدينا 5*1 =5 (صحيح ؟ )

و باملقابل نرجع العد الاول + الدالة (العدد الاول ,العدد الثاني -1 )

مثلا العدد الاول = 5
العدد الثاني = 3

تبدأ الدالة بفحص شرط التوقف if(b==1) ؟ الاجابة لا
اذا نرجع الشرط الثاني
فيصبح 5 + ( العدد الاول = 5 , العدد الثاني =3-1 =2)
هل العدد الثاني =1؟ لا
اذن 5+5+ (العدد الاول = 5 , العدد الثاني = 2-1=1)
هل العدد الثاني = 1؟ نعم
اذن نرجع العدد الاول و هو 5

اذن 5+5+5=15 و هي ناتج عملية ضرب 5*3

انتظر منك تصميم الدالة بنفسك و البرنامج b@#$

mrhanialshater
15-07-2006, 12:53 AM
ذكرت انك تريد اكثر من طريقة يوجد الطرق التالية
((a*b = e^ln(a*b) = e^(ln(a) + ln(b
و باستخدام math.h يمكنك ان تعمل برنامج ضرب بدون اشارة ضرب

طريقة اخرى تحتاج الى مزيد من العمل هي ان تقوم بتحليل العددين المراد ضربهما و كانهما نصوص و وضعهم في مصفوفة مثال 15*21 --> 1 2 (رقم الخانة)
5 1
1 2

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

هناك طرق اخرى لها علاقة بالرياضيات و اخرى بالمنطق (سنطر للتحويل للاعداد الثنائية) ولكن من غير المعقول ان نستخدم طرق كهذه ابطئ بمئات المرات من العملية * التي تقدمها ++c لك دون جهد و التي قام بكتابتها (برمجتها) خبراء في هندسة الحاسوب

و مع ذلك عندما تكون قد اكملت دراستك في ++c اعتقد انه من الجميل ان تتحدى نفسك بكتابة البرامج على نحو لم يكن يخطر ببالك فتلك طريقة ممتازة لصقل مهاراتك و للوصول الى درجة الاحتراف

اما بالنسبة لسؤالك الثاني عن استثناء الاعداد الاولية
اذا كان n عدد صغير يمكنك ان تطبع 1لانه ليس اولي ثم تبدا من 2 الى n
افحص كل عدد اذا كان اولي ام لا من خلال التاكد انه لا يقسم على كل الاعداد التي تقل عن نصفه (اذ لا يعقل ان يقسم على عدد اكبر من نصفه بدون باقي) بدون باقي اذا كان لا يقبل لكل الاعداد يكون اولي لا تطبعه غير ذلك يكون اولي اطبعه

اما اذا كان n عدد كبير اعمل مصفوفة nx2 في السطر الاول ضع الارقام من 1 الى n في السطر الثاني ضع اصفار
اعمل جملة دوران من 2 الى n استخدم i كعدداد لها
في العدد i اذا كان في السطر المقابل له في المصفوفة صفر يكون اولي وكل مضاعفاته غير اولية لانها تقسم عليه لذا عين 1 للسطر المقابل (في المصفوفة) لكل مضاعف للعدد i من خلال جملة دوران
اذا كان المقابل للعدد في المصفوفة 1 يكون العدد غير اولي لان 1 عين له من قبل اي انه مضاعف لاولي و لا حاجة لتعين 1 لمضاعفات العدد i لانها عينت من قبل عندما عين 1 للعدد i
في النهاية اذا كان مقابل العدد في المصفوفة صفر يكون اولي لا تطبعه و اذا كان 1 يكون غير اولي اطبعه

و بالنسبة للسؤال الثالث فاني لم افهم المطلوب بالتحديد

اعتذر عن كتابة البرامج التي طلبتها فان اعطيك سنارة خير من ان اعطيك سمكة