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

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

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

هنا سنجد اختلاف في مثال If بإضافة Else إلي جملة IF :

#include<iostream.h>

int main()
{
	int x;

	cout<<"\n Enter a number: ";
	cin>>x;

	if(x>100)
  cout<<"That number is greater than 100\n";
	else
  cout<<"That number is not greater than 100\n";
	return 0;
}

post-36368-1110878498_thumb.jpg

#77

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

هنا مخرجات لمحاولتين مختلفتين في البرنامج :

post-36368-1110878758_thumb.jpg

#80

• مكتبة دالة Getche( )

مثالنا التالي :

يظهر جملة If…Else ضمن حلقة التكرار While .

إنها أيضا تقدم مكتبة دالة جديدة : getche( ) .

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

#include<iostream.h>
#include<conio.h>  //for getche()

int main()
{
	int chcount=0;
	int wdcount=1;
	char ch='a';

	cout<<"Enter a phrase: ";
	cout<<endl;

	while(ch!='\r')
	{

  ch=getche();
  if(ch==' ')
 	 wdcount++;
  else
 	 chcount++;
	}
	cout<<"\n words="<<wdcount<<endl
  <<"letters="<<(chcount-1)<<endl;
	return 0;
}

post-36368-1110879198_thumb.jpg

#81

حتى الآن نحن استخدمنا فقط Cout و >> لعملية الإدخال .

تلك النظرية تتطلب إن المستخدم عادتا يضغط علي مفتاح [Enter] لكي يخبر البرنامج إن عملية إدخال البيانات تمت .

هذا صحيح حتى للحروف المفردة : المستخدم يجب أن يطبع الحروف ثم يضغط علي [Enter] .

علي أية حال , كما في المثال الحالي , البرنامج في اغلب الأحيان يحتاج لمعالجة كل حرف يتم طباعته عن طريق المستخدم بدون الانتظار للضغط علي مفتاح [Enter] .

مكتبة دالة getche( ) تؤدي هذه الخدمة . فهي ترجع قيمة كل حرف تم طباعته بمجرد طباعته . إنها لن تأخذ أي حجج , وتطلب الملف الرئيسي CONIO.H .

في برنامج CHCOUNT قيمة الحروف يتم إرجاعها من getche( ) و التي تخصص ل Ch .

( الدالة getche( ) تردد الحروف إلي الشاشة . لهذا هناك حرف e في نهاية getche .

هناك دالة أخري , getch( ) , هي مشابهة ل getche( ) لكن لا تردد الحروف إلي الشاشة ) .

جملة If…Else تؤدي إلي حساب عدد الكلمات ب WDCOUNT لكي يكون تم زيادته لو الحرف كان مسافة , و الحروف تحسب ب CHCOUNT لكي يكون متزايد لو الحروف كانت أي شئ ماعدا المسافة.

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

( يلاحظ بان هذا البرنامج بإنصاف na•ve , بالرقم بأنه سيخدع بالفراغات المتعددة بين الكلمات.)

هنا بعض التفاعلات البسيطة مع CHCOUNT :

post-36368-1110879584_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 15 مارس 2005 في 12:39

#83

تعبير الاختبار في جملة While يدقق الرؤية هل قيمة CH تكون الحروف '\r' , وهي الحروف التي يتم استقبالها من لوحة المفاتيح عند الضغط علي مفتاح [Enter] . لو كان كذلك فان حلقة التكرار و البرنامج يتم انتهاء عملهما.

#84

• تعبيرات مهمة

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

إن النتيجة تعني إن النظرية غريبة إلي حد ما لكن تستخدم عموما في إل C++ ( و إل C ) .

هنا النسخة المعاد كتابتها , و التي تسمي CHCNT2 :

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

int main()
{
	int chcount=0;
	int wdcount=1;
	char ch;

	while( (ch=getche()) != '/r')
	{
  if(ch==' ')
 	 wdcount++;
  else
 	 chcount++;
	}
	cout<<"\n word="<<wdcount<<endl
  <<"letters="<<chcount<<endl;
	return 0;
}

post-36368-1113474206_thumb.jpg

#86

إن القيمة تم إرجاعها عن طريق getche( ) و التي خصصت إلي ch كما في السابق , لكن التعبيرات المهمة بالكامل تحركت داخل تعبير الاختبار ل While .

إن التعبيرات المهمة تم مقارنتها ب '\r' لرؤية إذا كان يجب إنهاء حلقة التكرار.

هذا يحدث لان التعبيرات المهمة بالكامل تواجه القيمة التي استخدمت في المهمة . ذلك , إذا عادت getche( ) بالقيمة 'a' فان ch لن تأخذ فقط القيمة 'a' لكن التعبير

(ch=getche( ))

تواجه القيمة 'a' أيضا. هذه ثم تقارنها مع '\r' .

الحقيقة هو إن تعبيرات المهمة لها قيمة تستخدم أيضا في البيانات كذلك مثل:

x = y = z = 0;

هذا قانوني جدا في لغة إل C++ .

في الأول Z تأخذ القيمة 0 ثم بعد ذلك إل Z=0 تأخذ القيمة 0 و التي خصصت إلي Y . ثم التعبير Y=Z=0 علي نفس النمط يأخذ القيمة 0 و التي خصصت إلي X .

علامات الحصر التي حول تعبير المهمة:

(ch=getche( ))

ضرورية لان معامل المهمة = لديه الأسبقية الأقل عن المعامل العلائق !=

بدون علامات الحصر التعبير سيتم تنفيذه مثل:

while( ch = (getche( ) != ‘\r’) )   // not what we want

و التي ستخصص القيمة true أو false إلي ch , و ليس التي نريدها.

جملة While التي في CHCNT2 تزود بكثير من القوة في مساحة صغيرة.

إنها ليست فقط تعبير اختبار (تختبر ch لتري إذا كانت تساوي '\r' ) إنها تأتي أيضا بالحروف من لوحة المفاتيح و التي يتم تعينها إلي ch .

إنها أيضا ليست سهلة لكشفها في المرة الأولي التي تراها.

#87

• تداخل جملة If…Else

من المحتمل أن تكون صغيرا جدا لكي تتذكر العاب المغامرة علي أنظمة مايكروسوفت دوس MS – Dos system , لكن دعنا نبعث المفهوم هنا.

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

البرنامج التالي , ADIFELSE , عبارة عن نموذج لجزء صغير لمثال العاب المغامرة.

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

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

	cout<<"Type enter to quit\n";
	cout<<endl;

	while(dir != '\r')
	{
  cout<<"\n Your location is "<<x<<","<<y;
  cout<<endl;
        cout<<"\n Press direction key(n,s,e,w): ";
  cout<<endl;
  dir= getche();
  if(dir=='n')
 	 y--;
  else
 	 if(dir=='s')
    y++;
 	 else
    if(dir=='e')
   	 x++;
    else
   	 if(dir=='w')
      x--;
	}
	return 0;
}

post-36368-1113474787_thumb.jpg

#89

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

أنت يمكن أن تذهب شمال بنسبة وحدة واحدة , وجنوبا , و شرقا , أو غربا, بينما يتابع البرنامج أين أنت ويبلغ عن موقعك و الذي يبدأ عند النقطة (10,10) .

لسوء الحظ , لا شئ مثير يحدث لشخصياتك , أينما تذهب تمتد الأرض البور تقريبا دون حدود بكل الاتجاهات كما هو معروض بالشكل التالي.

نحن سنحاول تزويد الحماس أكثر بعض الشئ إلي هذه اللعبة لاحقا.

post-36368-1113474930_thumb.jpg

#91

يمكنك الضغط علي مفتاح [Enter] للخروج من البرنامج.

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

انه يستخدم جملة IF و التي تم تداخلها في جملة If…Else , والتي تم تداخلها أيضا في جملة If…Else أخري .

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

لو أي شرط منهم تحقق ,سيتم اتخاذ معامل الإجراء الذي تم اتخاذه – تغيير إحداث إل X أو إل Y – ويخرج البرنامج من جميع القرارات المتخذة.

مثل هذه المجموعة المتداخلة لجملة If…Else إنها تسمي شجرة القرارات.

#92

• ملائمة Else

هناك مشكلة محتملة في تداخل جملة If…Else :

يمكنك بشكل غير مقصود أن تجاري Else بجملة IF خاطئة.

برنامج BADELSE يزودك بمثال:

#include<iostream.h>

int main()
{
	int a,b,c;

	cout<<"Enter three numbers,a,b,and c:\n";
	cin>>a>>b>>c;

	if(a==b)
  if(b==c)
  	cout<<"a,b,and c are the same\n";
  else
  	cout<<"a and b are different\n";
  return 0;
}

post-36368-1114404114_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 25 أبريل 2005 في 07:41

#94

نحن استخدمنا قيم متعددة مع Cin المفردة. اضغط علي [Enter] بعد كل قيمة يتم كتابتها. القيم الثلاثة سيتم تخصيصها ل a و b و c .

ماذا سيحدث لو قمت بإدخال القيم 2 ثم 3 و ثم 3 ؟

المتغير a سيأخذ القيمة 2 و المتغير b سيأخذ القيمة 3 إنهما مختلفين لذلك فان أول تعبير اختبار لن يتحقق حيث سيكون False . و أنت ستتوقع إن Else تم تنفيذها بطباعة إن a و b مختلفين. لكن في الحقيقة لا شئ مطبوع . لماذا لا ؟

لان Else تم تناظرها مع If الخاطئة. الفراغ سيقنعك بان Else تم مناظرتها بجملة If الأولي لكن في الحقيقة إنها تم تناظرها بجملة IF الثانية .ها هي القاعدة : Else يتم تناظرها بآخر جملة If و التي ليس لها Else .

ها هي النسخة الصحيحة:

post-36368-1114404392_thumb.jpg

#95

نحن قمنا بتغيير الفراغ و الجملة أيضا طبعت بواسطة جسم Else .

الآن لو قمت بإدخال 2 و 3 و 3 فان لا شئ سيتم طباعته.

لكن قم بإدخال 2 و 2 و 3 سيؤدي إلي النتيجة

b and c are different

لو كنت تريد حقا تزاوج Else مع If السابقة يمكنك استخدام قوسين الشيالات {} حول IF المتداخلة :

post-36368-1114404559_thumb.jpg

#96

هنا إل Else تم تزاوجها مع جملة If الأولي كما يشير الفراغ إليه.

أقواس الشيالات تجعل If المتداخلة مخفية ضمن Else المتتابعة أو التالية.

#97

• بناء جملة Else…If

جملة If…Else المتداخلة في برنامج ADIFELSE تبدو غير ملائمة و يمكن أن تكون صعبة – للبشر – للترجمة , خصوصا إذا كانوا هم متداخلين بعمق أكثر من الواضح .

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

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

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

	cout<<"Type enter to quit\n";
	while(dir !='\r')
	{
  cout<<"\n Your location is "<<x<<","<<y;
  cout<<"\n Press direction key(n,s,e,w): ";

  dir=getche();
  if(dir=='n')
 	 y--;
  else if(dir=='s')
 	 y++;
  else if(dir=='e')
 	 x++;
  else if(dir=='w')
 	 x--;
	}
	return 0;
}

post-36368-1114404819_thumb.jpg

#99

المعالج يري هذا المثال مطابق ل ADIFELSE . لكن نحن رتبنا IFS لذلك فإنهم يتبعون مباشرة ELSE .

النتيجة تبدوا تقريبا مثل كلمة محجوزة جديدة: ELSE IF .

البرنامج يقوم بالنزول بإتباع Else…If حتى يتحقق احد شروط الاختبار.

ثم يقوم بتنفيذ الجملة التالية و يخرج من التتابع .

هذا التنسيق أفضل وأوضح للإتباع عن طريقة If…Else .

#100

• جملة Switch

لو كان لديك شجرة قرارات كبيرة , و تعتمد جميع القرارات علي قيمة نفس المتغير , أنت من المحتمل ستحتاج لكي تأخذ جملة Switch بعين الاعتبار بدلا من سلسة من تركيبات إل IF…Else و إل Else…IF .

هنا مثال بسيط يسمي PLATTERS و الذي سيناشد مطلع الحنين للوطن:

#include<iostream.h>

int main()
{
	int speed;
	cout<<"\n Enter 33,45,or 78: ";
	cin>>speed;

	switch(speed)
	{
	case 33:
  cout<<"LP album\n";
  break;
	case 45:
  cout<<"single selection\n";
  break;
	case 78:
  cout<<"Obsolete format\n";
  break;
	}
	return 0;
}

post-36368-1114405236_thumb.jpg

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…