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

سي بلس بلس من البدايه الي الاحتراف

مغلقرائج
بدأه البارودي في 7 فبراير 2005 · 167 رد · 20,167 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#126

• معامل AND المنطقي

دعنا نري كيف المعاملات المنطقية تدمج التعبيرات المنطقية في لغة إل C++ .

ها هو مثال , ADVENAND , و الذي يستخدم معامل AND المنطقي لتهندم و تنظم لعبة المغامرة في مثال ADSWITCH . نحن سندفن بعض الكنوز في الإحداثيات (7,11) ونري هل اللاعب سيستطيع أن يجده.

#include<iostream.h>
#include<process.h>
#include<conio.h>

int main()
{
	char dir='a';
	int x=10,y=10;


	while(dir !='\r')
	{
  cout<<"\n Your location is "<<x<<", "<<y;
  cout<<"\n Enter direction(n,s,e,w): ";
  cout<<endl;
  dir=getche();

  switch(dir)
  {
  case 'n': y--; break;
  case 's': y++; break;
  case 'e': x++; break;
  case 'w': x--; break;
  }
  if(x==7 && y==11)
  {
     cout<<"\n You found the treasure!\n";
     cout<<endl;
     exit(0);
  }
	}
	return 0;
}

post-36368-1116294432_thumb.jpg

#127

المفتاح لهذا البرنامج هو جملة If :

if(x==7 && y==11)

تعبير الاختبار سيكون True فقط ( حقيقي ) لو كان كل من إل X تساوي 7 و إل Y تساوي 11 . معامل AND المنطقي"&&" يتضمنان تعبيرين علاقيين لانجاز هذه النتيجة .

( التعبير العلاقي هو الوحيد الذي يستخدم معامل علاقي ).

لاحظ إن علامات الحصر ليست ضرورية حول التعبيرات العلاقية.

post-36368-1116294710_thumb.jpg

#128

هذا لان المعاملات العلاقية لها أسبقية اعلي من المعاملات المنطقية.

هنا بعض التفاعلات بينما المستخدم يصل إلي الإحداثيات:

post-36368-1116294813_thumb.jpg

#132

• المعامل OR المنطقي

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

هنا مثال , ADVENOR , و الذي يستخدم معامل OR المنطقي لتطبيق هذا العائق المخيف لتحرير المغامرة.

انه مختلف عن برنامج ADVENAND .

ها هو البرنامج:

#include<iostream.h>
#include<process.h>
#include<conio.h>

int main()
{
	char dir='a';
	int x=10,y=10;

	while(dir != '\r')
	{
  cout<<"\n\n Your location is "<<x<<", "<<y;
  if(x<5 || x>15)
 	 cout<<"\n Beware: dragons lurk here";
  cout<<"\n Enter direction(n,s,e,w): ";
  dir=getche();
  switch (dir)
  {
 	 case 'n': y--;break;
 	 case 's': y++;break;
 	 case 'e': x++;break;
 	 case 'w': x--;break;
  }
	}
	return 0;
}

post-36368-1116295596_thumb.jpg

#133

التعبير :

x<5 || x>15

يتحقق حينما إما X اصغر من 5 ( اللاعب ذهب بعيدا ناحية الغرب ) أو X اكبر من 15 ( اللاعب ذهب بعيدا ناحية الشرق ) .

مرة أخري , المعامل" || " له أسبقية اقل من المعاملين العلاقيين

" < " و" > " , لذلك فلا علامات حصر مطلوبة في هذه العبارة .

#135

• المعامل NOT المنطقي

المعامل NOT المنطقي " ! " هو معامل مفرد – ذلك , انه يأخذ فقط محور واحد .

( تقريبا كل المعاملات التي رأيناها لهذا الحد معاملات ثنائية ; تأخذ محورين اثنين . المعامل الشرطي هو فقط معامل ثلاثي في إل C++ )

تأثير المعامل " ! " هو إن القيمة المنطقية لمحوره تكون معكوسة :

لو كان شئ ما حقيقي ( True ) , المعامل "!" يجعله خاطئ (False )

ولو كان الشئ هذا خاطئ (False ) , فان المعامل"!" يجعله حقيقي ( True ).

( سيكون لطيفا إذا الحياة عولجت هكذا بسهوله ).

علي سبيل المثال , ( X == 7 ) تتحقق إذا كانت إل X تساوي 7 ,

لكن !( X == 7 ) تتحقق إذا كانت إل X لا تساوي 7 .

( في هذه الحالة يمكنك استخدام معامل لا يساوي العلاقي , X != 7 , لتطبيق نفس التأثير ).

#136

•القيمة True/False لكل المتغيرات من النوع Integer

نحن لربما أعطيناك الانطباع إن لكل تعبير يملك القيمة True أو False , يجب أن يتضمن معامل علاقي.

لكن في الحقيقة , كل تعبير عدد صحيح Integer له القيمة True أو False , حتى ولو كان متغير وحيد .

التعبير X يكون True بينما إل X لا تساوي صفر , و False عندما إل X تساوي صفر.

بتطبيق المعامل "!" إلي هذه الحالة , يمكننا أن نري أن إل !X بتكون True عندما إل X تساوي صفر , حيث إنها تعكس القيمة الحقيقية ل X .

دعنا نضع هذه الفكرة للعمل . تخيل في لعبة مغامرتك بأنك تريد وضع فطر علي كل المواقع عندما كل من إل X و إل Y ضعف إل 7 .

( كما تعرف من المحتمل , فطر , عندما يستهلك من قبل اللاعب , يمنح القوي السحرية ) الباقي عندما إل X تقسم علي 7 و التي يمكن أن تحسب عن طريق X%7 تكون صفر فقط عندما إل X تكون ضعف إل 7 .

لذلك لتحديد مواقع الفطر , يمكننا أن نكتب :

post-36368-1116297046_thumb.jpg

#137

علي أية حال , تذكر بان التعبيرات بتكون True أو False حتى ولو لم تتضمن معاملات علاقية , يمكنك استخدام معامل "!" لتزود صيغة أكثر تصغيرا.

post-36368-1116297166_thumb.jpg

#138

هذا له بالضبط نفس التأثير .

قلنا قبل ذلك بان المعاملات المنطقية "&&" و "| |" لهم أسبقية اقل من المعاملات العلاقية.

لماذا إذا نحتاج علامات الحصر حول X%7 و Y%7 ؟

لان بالرغم من انه معامل منطقي , المعامل " ! " هو معامل مفرد , و الذي لديه أسبقية اعلي من المعاملات العلاقية.

#139

• خلاصة الأسبقية

دعنا نلخص حالة الأسبقية للمعاملات التي رأيناها حتى الآن.

المعاملات التي في اعلي القائمة لديها أسبقية اعلي من التي اقل منها في الأسفل .

المعاملات التي بأسبقية اعلي تم تقييمها قبل المعاملات التي بأسبقية اقل. المعاملات التي علي نفس الصف لها أسبقية مساوية.

يمكنك أن تجبر تعبير لكي يقيم أولا بوضع علامات الحصر حوله.

post-36368-1116297345_thumb.jpg

#140

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

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

أيضا يجعلون الأمور واضحة أمام أي شخص يقرا قائمة الكود ويري ماذا أنت نويت .

#141

• جمل التحكمات الأخرى

هناك عدة جمل تحكمات أخري في إل C++.

نحن بالطبع رأينا واحدة , Break, و التي استخدمت في جملة Switch , و التي يمكن أن تستخدم في أماكن أخري أيضا.

الجمل الأخرى ,Continue , و التي تستخدم فقط في حلقات التكرار, و الثالثة , Goto , و التي يجب تفاديها.

دعنا ننظر إلي هذه الجمل بالتتابع.

#142

• جملة Break

جملة Break تؤدي إلي الخروج من حلقة التكرار , كما هو حدث في جملة Switch .

الجملة التالية المنفذة بعد Break هي الجملة التي تتبع حلقة التكرار .

الشكل التالي يعرض عملية جملة Break .

post-36368-1116297721_thumb.jpg

#143

لعرض جملة Break , هنا برنامج , SHOWPRIM , و الذي يعرض توزيع الأرقام الأولية في شكل تخطيطي :

#include<iostream.h>
#include<conio.h>

int main()
{
	const unsigned char white=219;
	const unsigned char gray =176;
	unsigned char ch;

	for(int count=0;count<80*25-1;count++)
	{
  ch=white;
  for(int j=2;j<count;j++)
 	 if(count%j==0)
 	 {
    ch=gray;
    break;
 	 }
 	 cout<<ch;
	}
	getch();
	return 0;
}

post-36368-1116297837_thumb.jpg

#144

في الواقع كل موقع 80 عمود في 25 سطر علي الشاشة مرقم من صفر إلي 1999 ( والتي تكون 80 * 25-1 ) .

إذا كان الرقم في موقع معين أساسي , فان الموقع يأخذ اللون الأبيض . وإذا لم يكن أساسي , يأخذ اللون الرمادي.

الشكل التالي يعرض النتيجة.

علي وجه التحديد , الصفر لم يعتبر كبداية , لكنه يظهر باللون الأبيض لتجنب تعقيد البرنامج .

فكر بالأعمدة عبر القمة و التي ترقم من صفر إلي 79 .

لاحظ ذلك انه لا أساسي ( ماعدا 2 ) و التي تظهر في الأعمدة المستوية المعدودة , منذ هم جميعا يقبلون القسمة علي 2 .

هل هناك نمط لأرقام أخري ؟

عالم الرياضيات سيكون متحمس جدا لو أنت وجدت النمط الذي يسمح لك للتوقع سواء أي رقم معطي يكون أساسي .

post-36368-1116298050_thumb.jpg

#146

عندما مدخل حلقة التكرار يقرر بان العدد غير أساسي , فانه يضع قيمة المتغير الحرفي CH بتساوي GRAY , ثم بعد ذلك ينفذ جملة Break للهروب من مدخل حلقة التكرار .

( نحن لا نريد الخروج من البرنامج بالكامل , كما هو الحال في مثال PRIM , بعد ذلك نحن لدينا كل سلسلة الأعداد للعمل عليها .)

لاحظ ذلك جملة Break فقط هي التي تخرجك من عمق حلقة التكرار.

هذه حقيقة مهما كانت الإنشاءات متداخلة مع بعضها البعض :

جملة Break تخرجك من التركيبة مهما كان المضمون .

إذا كان هناك جملة Switch ضمن حلقة التكرار , فان جملة Break التي في جملة Switch ستخرجك فقط من Switch و ليس خارج حلقة التكرار.

آخر جملة Cout تطبع الحروف المرسومة , ثم بعد ذلك يتم تكملة حلقة التكرار , لاختبار العدد التالي هل هو أساسي أم لا .

مجموعة امتدادات حروف أل ASCII الموضوعة

هذا البرنامج يستخدم حرفين من امتدادات حروف ASCII الموضوعة , الحروف مثلت بالأرقام من 128 إلي 255 , القيمة 219 تمثل كتلة بلون غامق ( ابيض علي اسود مع التحكم في الأبيض ) , بينما 176 تمثل كتلة رمادية اللون .

مثال SHOWPRIM يستخدم جملة Getch( ) في آخر سطر لمنع مؤشر إل DOS من تحريك الشاشة إلي اعلي عند انتهاء البرنامج .

انه يقوم بتجميد الشاشة حتى تقوم بالضغط علي أي مفتاح .

نحن نستخدم النوع Unsigned Char للمتغيرات الحرفية في SHOWPRIM منذ إنها ارتفعت قيمتها إلي 255 . لان النوع Char فقط يقبل حتى 127 .

#148

• جملة Continue

جملة Break تخرجك من قاع حلقة التكرار .

أحيانا , علي أية حال , أنت تريد أن ترجع إلي قمة حلقة التكرار عندما شئ غير متوقع يحدث . تنفيذ جملة Continue لديه هذا التأثير.

( علي وجه التحديد , جملة Continue تأخذك إلي شيالة الإغلاق لجسم حلقة التكرار , و الذي منه أنت بتقفز عائدا إلي بداية حلقة التكرار .)

الشكل التالي يعرض عملية جملة Continue .

post-36368-1116298669_thumb.jpg

#149

هنا اختلاف في مثال DIVDO . هذا البرنامج الذي رأيناه في وقت سابق , يجري قسمة , ولكن له عيب قاتل : لو المستخدم ادخل القيمة صفر كمقسوم , البرنامج سيمر بالفشل الهائل و ينهي برسالة خطأ في وقت التنفيذ RUNTIME ERROR بوجود خطأ في القسمة .

النسخة المعدلة من البرنامج , DIVDO2 , تتعامل مع هذه الحالة بشكل أكثر رشاقة .

#include<iostream.h>

int main()
{
	long dividend,divisor;
	char ch;

	do{
  cout<<"Enter dividend: ";cin>>dividend;
  cout<<"Enter divisor: ";cin>>divisor;
  if(divisor==0)
  {
 	 cout<<"Illegal divisor\n";
 	 continue;
  }
  cout<<"Quotient is "<<dividend/divisor;
  cout<<", remainder is "<<dividend%divisor;

  cout<<"\n Do another? (y/n): ";
  cin>>ch;
	}while(ch !='n');
	return 0;
}

post-36368-1116298804_thumb.jpg

#150

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

هذه بعض الأمثلة للمخرجات :

post-36368-1116298892_thumb.jpg

هذا الموضوع مغلق.

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