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

معادلات باقي القسمة

بدأه HGB في 29 يوليو 2009 · 19 رد · 15,224 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

جميعنا يعرف % أو باقي القسمة في العمليات الحسابية وما يمكنه أن يفعل , من مدة طويلة جدا وأنا أستخدم معادلات بباقي قسمة طويلة أضعها في مكان ما في الكود لتعبر عن عملية معقدة وتريح من إستخدام عدة جمل If وتضفي بعض الحرارة على الكود , مثال :

 
//It says Get_Block(x,x+1) or (x,-1)
	Get_Block((((cur_rec*60)-((cur_rec*60)%200))/200)+1,((200-((cur_rec*60)%200))>60) ? -1 : (((cur_rec*60)-((cur_rec*60)%200))/200)+2  );

هذا سطر من كود C++/CLI كتبته لزميل لي قبل فترة , قد لايكون الموضوع معقد لكن ماأستغرب منه أنني لاأجد أي إستخدام لباقي القسمة في الأكواد عموما , مع أنها تخرج من مآزق ويمكن أن تكون أيضا عملية obfuscation للكود , فبدون تعليقات قد تحتاج لوقت أطول لفهم الشيفرة .

في كود آخر :

POW=pow((float)char_num,w);
                                cout<<STRING[((q-(q%POW))/POW)%char_num];

بإختصار يمكن إلغاء عدة جمل if إن كانت تمرر قيمة معينة لمتغير حسب قيمة إختبارية بجملة سطر واحدة بمعادلة من معادلات باقي القسمة لايحضرني مثال معين حاليا للأسف , لكني طرحت الموضوع لأني بدأت أشك أني الوحيد الذي يستخدم هذا النوع من المعادلات :lol: فهل هذا صحيح ؟

*إضافة مثال آخر من موضوع مختلف :lol:

 
EQUATION = ((x-(x%2))/2)*0.25*W-((x+(x%2))/2)*0.5*W+(( (((x%4)%2+1)%2)*(((x%4)/2)+1)%2))* ((ln(W)/ln(2)-3)*10)-A+W

/index.ph...st&p=367604

1

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#2

لا أعتقد بأن هناك من يكتب كود مثل هذا عداك يا هثيم :haha:

عن نفسي أحب التبسيط ولا أحب تعقيد الكود وتشابكه حتى تسهل قرائته فيما بعد ..

مثلا :

Get_Block((((cur_rec*60)-((cur_rec*60)%200))/200)+1,((200-((cur_rec*60)%200))>60) ? -1 : (((cur_rec*60)-((cur_rec*60)%200))/200)+2  );

يمكن أن تقوم بعمل دالة تحسب (cur_rec*60)%200 بدل أن تقوم بكتابتها كل مره ،، أو Macro لا مشكله ، فقط التقليل من التشابك أو تعشيش الأقواس على قولة أحد الكتب :D .

بالتوفيق :) ..

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

أها ... الموضع جاب سخرية :D

اقتباس
يمكن أن تقوم بعمل دالة تحسب (cur_rec*60)%200 بدل أن تقوم بكتابتها كل مره ،، أو Macro لا مشكله ، فقط التقليل من التشابك أو تعشيش الأقواس على قولة أحد الكتب :D

التعشيش جميل عندما يكون المشروع واجب للجامعة , فلكي لايفهم الدكتور أو المشرف شيئا تحتاج أن تعشش الكود كما تحب :D , والمعادلة الأولى فيها تكرار فعلا وكانت مقصودة لكي يصاب طالبها بالإستياء :lol:

طيب مارأيكم بهذا الكود كتبته قبل قليل للسؤال هنا :

/index.ph...st&p=998893

#include <iostream>
using namespace std;

int main()
{
	int N=20,n;
	for(int q=0;q<N*N*2;q++)
	{
		if(!(q%(N*2)))cout<<endl;
		(abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2)))+abs((abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2))))==0 ? cout<<"*" : cout<<" "; 
	}
	return 0;
}

post-19273-1248897693_thumb.png

أليس أجمل بكثير من كتابة nest for loops وجمل ال if التي تملأ المكان :D

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#4

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

حبة حبة علينا يا هيثم, و فهمنا كيف باقي القسمة يحل محل if ؟ :wacko:

كود مثير للعجب صراحة :)

تحياتي ...

1
#5

ياخالد فكرة المعادلات عموما أنها تعطي ناتج Y عند التعويض بقيمة x معينة في المعادلة , معادلات باقي القسمة تتيح إضافة إنكسارات " هذا ماأسميه :lol: " في المعادلة بحيث تعطي نتائج معينة عند قيم معينة والمحنى فيها مستحيل , وهو ليس منحنى أصلا وإنما معادلات خط مستقيم متصلة ببعضها البعض .

الموضوع بسيط وبديهي لكن شكل المعادلة قد يوحي بالقلق :lol: , فإفترض أن لديك عدة جمل if أو جملة switch وفي داخلها تعيين لقيمة w بقيمة تعتمد على التفرع الشرطي الذي تفرع في الأصل بسبب قيمة متغير معين , هنا يمكن حذف كل جمل ال if أو جملة switch ووضع معادلة واحدة شاملة لتعطي لتكون w=long_equation تعطي القيمة المناسبة بالضبط بدون معالجة الجمل الشرطية .

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

لاأريد أن أقول أن هذا أسلوب برمجة جميل أو خلافه لأنك إن أخطأت في كتابة المعادلة ولم تظهر النتائج العكسية حاليا وإكتشفت بعد حين أن هناك مشكلة في المعادلة فلن تستطيع إصلاحها ويجب كتابتها من جديد لأن متابعتها شيء متعب :S وكتابتها أيضا شيء متعب لو لم تعرف القواعد :lol:

لكن صراحة أحب أن أكتب المعادلة مرة واحدة كهذه وأختصر عدة أسطر جمل if وأضع تعليق بسيط عما تفعله المعادلة وأريح دماغي بدون أن أراجعها أبدا , وأيضا يمكن أن تعتبر obfuscation لابأس به :D

لكن الأداء سيتقلص إذا ماضمنت داخل حلقات تكرار كبيرة بالتأكيد .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

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

جميل جدا أخى HGB

عجبنى الموضوع كتير

وهذه محاولتى لرسم الهرم من خلال لوب واحد


using namespace std;
int main()
{
int n=20,r,c;
for (int i=0;i<n*(2*n-1);i++)
{
r=i/(2*n-1);
c=i%(2*n-1);
if(c==0 && r>0) cout<<endl;
(c>=((2*n-1)/2)-r && c<=((2*n-1)/2)+r)?cout<<'x':cout<<' ';
}
cin.get();
return 0;
}
#include<iostream>

post-153585-1248935409_thumb.gif

أتمنى أن تعجبكم الفكره

وشكرا مره تانيه لأخى الكريم HGB

تحياتى

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#7

السلام عليكم

كود عجيب فعلا هل هذا علم علم قائم بحد ذاته !!!

#8

amin_mu123 جميل جدا , والآن ليصبح الشكل كروكي ماعليك إلا أن تستبدل المتغيرات وتضعها في المعادلة مباشرة ليكون كودك بالشكل التالي :

#include<iostream>
using namespace std;
int main()
{
	int n=20,r,c;
	for (int i=0;i<n*(2*n-1);i++)
	{

		if((i%(2*n-1))==0 && i/(2*n-1)>0)  cout<<endl;	
		((i%(2*n-1))>=((2*n-1)/2)-(i/(2*n-1))&& (i%(2*n-1))<=((2*n-1)/2)+(i/(2*n-1)))?cout<<'x':cout<<' '; 
	}
	cin.get();
	return 0;
}

:lol:

ويمكن أن تختصر الشروط < و معاملات && وتجعل هناك شرط واحد فقط , يعني يمكن أن تختصر الموضوع أكثر وأكثر .. والغرض دائما أن أكسر الشروط لشروط أصغر حتى تصل لتفرع ذو حدين فقط , 0 أو غير 0 وتكون عدد الإختبارات أقل مايمكن , قد لايكون لها معنى معين لكنها cool :lol: وتبعد أقواس المعقفات في جمل if الكثيرة وتعلم كيفية إختصار الكود والإبتعاد قدر الإمكان عن إضافة متغيرات كثيرة وشروط الحالات الشاذة في تسلسل الكود والتي كلما زادت كلما كان يعني ان الكود أكثر ركاكة .

اقتباس
السلام عليكم

كود عجيب فعلا هل هذا علم علم قائم بحد ذاته !!!

أسلوب لاحظت أني أستعمله فقط في أغلب برامجي , ولم ألحظ شيء مشابه في الكتب والبرامج التي أراها فأحببت أن أستفسر لأعرف مكان العلة :D

لكن يمكن أن تقول بعد التجربة توجد بعض القوانين لكتابة المعادلات بشكل أسرع .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#9

إنا لله و إنا إليه راجعون، أخ هيثم هل بالإمكان شرح مثال بسيط (أو بسيط جدا)

لكي نستطيع (استطيع على الأقل) فهم الموضوع، أو تخيله على الأقل؟؟؟ :)

#10

أنا اتعقدت.. :D

أستغفر الله العظيم الذي لا إله إلا هو الحي القيوم وأتوب إليه

#11
اقتباس
لكن يمكن أن تقول بعد التجربة توجد بعض القوانين لكتابة المعادلات بشكل أسرع

هل هذا يعني أنك من إبتكر هذه الطريقة ؟

اقتباس
إنا لله و إنا إليه راجعون، أخ هيثم هل بالإمكان شرح مثال بسيط (أو بسيط جدا)

لكي نستطيع (استطيع على الأقل) فهم الموضوع، أو تخيله على الأقل؟؟؟ regular_smile.gif

أريد أن أرى أيضا مثال بسيط

#12

السلام عليكم

يحضرنى مثال لأهمية استخدام معامل باقى القسمه ومعامل القسمه الصحيحه

وهو فى تحويل المصفوفه أحادية البعد الى ثنائية البعد مثل من 9 الى 3x3

او 16 الى 4x4

#include<iostream>
using namespace std;
int main()
{
	int oneDiArr[9]={1,2,3,4,5,6,7,8,9};
	int twoDiArr[3][3];
	for (int i=0;i<9;i++)
	{
		twoDiArr[i/3][i%3]=oneDiArr;
	}
	// display the two dim. array
	for (int j=0;j<9;j++)
	{
		if(j%3 ==0 && j!=0) cout<<endl;
		cout<<twoDiArr[j/3][j%3]<<" ";

	}
	cin.get();
	return 0;
}

استخدمنا المعاملين % و / فى التحويل وكذلك فى عرض المصفوفه بلوب واحد

تحياتى

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#13

المثال الحالي للمثلث كتوضيح , قمت بالتعديل على الكود ليظهر الناتج بالشكل :

post-19273-1248990122_thumb.png

صغرت المثلث للأساس 5 ليظهر الشكل رقم 1 وهو عبارة عن ناتج تنفيذ الجزء باللون الأخضر , والرقم 2 هو ناتج تنفيذ اللون الأزرق وأخيرا المثلث الكامل 3 تنفيذ المستطيل باللون الأحمر .

post-19273-1248991503_thumb.png

لاحظ ماذا كنت أريد أن أفعل , ملئت مربع كامل بأرقام ولاحظ لتسلسلها بسيط جدا , ثم طرحتها من قيمتها المطلقة وإعتبرت أن الصفر * وغير الصفر مسافة "فراغ" .

كل المشكلة أن تحول مسألتك لشكل تتخيله منها تكسر المسألة لخظات وتبدأ بتنفيذها وحد تلو الآخر , فالمشكلة الآن كيف أنشيء تسلسل الأرقام هذا بمعادلات باقي قسمة ؟

هذا الجزء :

abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2)))

لاحظ فيه الصيغة بشكل عام

(a-(a%r))/r

هذه الصيغة من أهم الأمور في معادلات باقي القسمة الطويلة حيث تعتبر فلتر للقيمة المدخلة لتعطيك رقم وحيد لكل مدى أرقام ذو صيغة رياضية تحدده أنت يعني مثلا , للأرقام من 0-14أريدها أن تعطيني رقم ثابت معين , والأرقام من 15-29 رقم آخر وهكذا كمثال بسيط وسريع ... فتكون بالتعويض بقيم a بالرقم المدخل وليكن a=17 ونضع r ثابت ليكون r=15

بالتعويض ستجد :

r

15

15 = 1

إذن القيم من 0-14 ستعطي 0 ومن 15-29 ستعطي 1 وهكذا .. بعدها يمكن أن تجزيء المجزء وتضع أرقام ومجموعات وتعالج الأرقام التي عولجت عدة مرات في نفس المعادلة لتخلص للقيم التي تريدها , لكن 70% من المشكلة في تخيل العلاقة التي ستؤدي للمطلوب في النهاية , فمثلا في المثلث أعلاه الفكرة كانت بأن أكون علاقة بحيث أجعل في السطر الأول الرقم الذي في المنتصف فقط موجب , وفي السطر الثاني الثلاث أرقام التي في المنتصف فقط هي الموجبة وباقي السطر سالب , في السطر الثالث الخمس أرقام في المنتصف موجبة والباقي سالب وهكذا , وفي النهاية بسويتش بسيط تحدد للرقم الموجب * وللسالب فرغ :)

لاأستطيع توضيح الموضوع بشكل أكثف فالأمثلة التي لاتسعفني حاليا هي مايمكن أن يفهم الموضوع أكثر , لكن إن كانت هناك أمثلة يمكن أن نحاول فيها سويا .

اقتباس

هل هذا يعني أنك من إبتكر هذه الطريقة

المفروض :lol:

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#14

Fantastic!!

موضوع جميل و متقدم و معلومة ممتازة لإستعمال %

شكراً هيثم

موفق يارب

bye

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#15

جزاك الله خيرا أخي هيثم

#16

الأن عرفت لماذا علماء الرياضيات هم أفضل مبرمجي العالم. بل وقاموا بتصميم لغات البرمجه .

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

شكرا لكم .

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#17

حسبى الله ونعم الوكيل

إيه ده ياعم هيثم :blink: :blink:

ياراجل جبتلى شلل نصفى ,, أنا كنت ناوى أتعلم اللغة دى لكن انت قضيت على الفكرة تماما :blink:

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#18

ياإخوة الموضوع أسهل مما تتخيلون , ولم أقل مرة أخرى أنها طريقة جميلة للبرمجة , لكن تختصر أسطر كثيرة جدا :lol:

مثال جديد : /index.ph...t&p=1001465

#include <iostream>
using namespace std;

int main()
{
	 int A=16,B=5;

int N=(A-A%2)/2,b=1+(B+((B+1)%2))/2;
for(int q=0;q<(N*N*2)*2;q++)
	{
		 if(!(q%(N*2)))cout<<endl;
(((q-q%(N*N*2))/(N*N*2)))*(N*N)+((abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2)))+abs((abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2)))))+(((q-q%(N*N*2))/(N*N*2)))*(((abs(((N-1)-(q%(N*2))))-abs(((N-1)-(q%(N*2))))%b)/b)-(N*N))==0 ? cout<<"*" : cout<<" ";

	}
	cin.get();
	return 0;
}

غير في قيم A و B فقط , حيث A هي قاعدة المثلث و B هو عرض المستطيل .. B يجب أن تكون أقل من A ليظهر الشكل جميل كسهم .

مثلا ل A=16,B=5 :

post-19273-1249494719_thumb.png

أريد أن أثبت بالدليل العملي أن أي جمل if يمكن أن تحول لباقي قسمة وسأشرح المعادلة في الرد التالي لتوضيح التكنيك المطلوب .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#19

لاحظ للمعادلة عبارة عن جزئين :

(((q-q%(N*N*2))/(N*N*2)))*(N*N)+((abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2)))+abs((abs(((q%(N*2))-(N-1)))-((q-q%(N*2))/(N*2)))))+

هذا الجزء الأول حتى علامة + , وهو المسؤول عن رسم المثلث .

+(((q-q%(N*N*2))/(N*N*2)))*(((abs(((N-1)-(q%(N*2))))-abs(((N-1)-(q%(N*2))))%b)/b)-(N*N))

وهذا الجزء هو المسؤول عن رسم المستطيل أسفل المثلث .

post-19273-1249504817_thumb.png

الآن هي معادلة واحدة وليست معادلتين لأن بينهما علامة جمع .. فكيف تم التقسيم , يعني كيف يظهر مثلث من كل المعادلة الطويلة بجمع الجزئين مرة وكيف يظهر المستطيل المرة التالية ؟

هذا ماأسميه بإنكسارات المعادلة , لاحظ للجزء

(((q-q%(N*N*2))/(N*N*2)))

الذي باللون الأزرق هي المعادلات الحقيقية منفصلة الأعلى للذي يطبع المثلث والأسفل للمستطيل

باللون البني الخفيف هذا الجزء هو الذي يكسر المعادلة والفكرة بسيطة جدا , مرة ستكون قيمته 0 فيصفر الجزء الأول من المعادلة ويتم إحتساب الجزء الثاني فقط , ومرة سيكون 1 ويحتسب الجزء الأول من المعادلة ويكون الكاسر في الجزء الثاني عبارة عن صفر .

خذ كتبيسط للعملية هذه العلاقة :

2*x^3+3.76x^8)

إنظر فقط للجزء الذي يعبر عن الكاسر :

{10})+1)%2)

وفي الجزء الثاني :

{10})+0)%2)

لاحظ مرة جامع صفر ومرة واحد .

لاحظ الآن بالتعويض مرة بالقيمة a=7 في المعادلة الأولى الطويلة , الجزء الأول في المرة الأولى سيتم إحتسابه والجزء الثاني سيكون صفر ويلغى تماما.

أما لو عوضنا بالقيمة a= 13 في المعادلة الجزء الأول سيكون صفر هذه المرة ويلغى والجزء الثاني سيتم إحتسابه .

لماذا 7 و 13 ؟ 7 تقع بين 0-9 و 13 تقع بين 10-19 وهي فئتين مختلفتين حسب مفهوم الكاسر حيث هو بالنسبة لباقي القسمة على 10 , كما وضحت من المشاركات السابقة وشرحت فكرة المعادلة الرئيسية في موضوع باقي القسمة .

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

هذا ماحدث في المثال الخاص بالسهم , فلاحظ أنا أخذت المعادلة الخاصة بالمثلث من المشاركات السابقة كما هي تقريبا , فقط بدل N*2 جعلتها N*N*2 لزيادة المدى .

بنظرة أخيرة على المعادلة قبل تحولها للسهم بالنجوم تصبح :

post-19273-1249505677_thumb.png

الأصفار للنجوم وغيرها فراغ .

-------

الآن بالنسبة لتخيل هذا الشكل هو 50% من المشكلة , و50% الباقية لكتابة معادلة باقي القسمة , تخيل هذا الشكل وبناءه منطقيا بخطوات يحتاج بعض التركيز وتجريد للمشكلة , وبمكن أن تتخيل المشكلة التي تريد حلها مهما كانت وتجردها لمفهوم رقمي كما تحب أو بأي نوع مفاهيم تتقنها , عموما مفاهيم كتب Thinking in c++ , Thinking in java وهذه الأمور أصحابها يعنون تماما عناوين كتبهم , فيمكن أن تحول أمور ومشاكل كثيرة في حياتك لمفهوم برمجي وتقوم بالتصرف حيالها بهذا الشكل , طبعا مرحلة متطورة بعد تشبع لابأس به من الأكواد .

هنا جردت المشكلة لتكون بالأرقام , لأني أحب الأرقام :lol:

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#20

صعبة و مشربكين ببعض

و لكن روعة بصراحة

الموضوع معقد شوي...ولكن راجعة بعدين

مشان نجي و ناطي معاك

:happy:

موفق يارب

bye

تم تعديل هذه المشاركة بواسطة ♥رغـد♥ في 6 أغسطس 2009 في 09:37

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

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