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

سي بلس بلس

مغلقرائج
بدأه البارودي في 28 نوفمبر 2004 · 165 رد · 36,744 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#101

• مجمل انواع المتغيرات

امثلة برامجنا الي الان استخدمت اربع انوع من المتغيرات Int و Char و Float و Long . بالاضافة الي اننا ذكرنا الانواع Bool و Short و Double و Long double .

هيا بنا نتوقف الان لجمع هذه الانواع من البيانات .الجدول رقم ( 2) يعرض الكلمات المحجوزة التي استخدمت لتعريف البيانات و الحدود الرقمية للقيم للنوع الذي يستطيع ان يمد به و الضبط الاحادي ( في حالة الرقم من النوع Float ) و عدد ال Bytes في الذاكره المستغله في منطقة ال 32-bit .

post-14-1102695097_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 10 ديسمبر 2004 في 19:11

#102

• انواع المتغيرات بلا علامات

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

الجدول 3 يظهر الاصدارات الغير المعلمة .

post-14-1102695277_thumb.jpg

#103

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

لتغيير النوع Integer للنوع الغير معلم ضع الكلمة المحجوزة Unsigned قبل الكلمة المحجوزة لنوع المتغيرات .

كمثال. المتغير الغير معلم للنوع Char ستكون معرفه مثل

Unsigned char ucharvar;

للاهمية حدود الانواع المعلمة يمكن ان يقودك لاخفاءعيوب البرنامج .

بالتاكيد ( من الحتمل نادرا ) الاحوال مثل العيوب يمكن ان تستبعد عن طريق استخدام الانواع الغير معلمه .

كمثال : البرنامج التالي يخزن الثابت 1500000000 ( 1,5 بليون ) كل منهم مثل Int في Signedvar ومثل Unsigned int في Unsignvar .

#include<iostream.h>
int main()
{
	int signedvar=1500000000;
	unsigned int unsignvar=1500000000;

	signedvar=(signedvar*2)/3;
	unsignvar=(unsignvar*2)/3;

	cout<<"signedvar="<<signedvar<<endl;
	cout<<"unsignvar="<<unsignvar<<endl;
	return 0;
}

post-14-1102695696_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 10 ديسمبر 2004 في 19:21

#106

البرنامج قام بضرب كل من المتغيرات ب 2 ثم قسمهم علي 3 . ومع ذلك النتيجه ستكون اصغر من العدد الاصلي و الوسط الحسابي سيكون اكبر من العدد او الرقم الاصلي . هذه الحاله العامه لكن يمكنها ان تقودك الي مشاكل . في Signtext نحن نتوقع ان ثلثين الرقم الاصلي او القيمة الاصلية او 1000000000 سيعاد تخزينها لكلا من المتغيرين .

و لسؤ الحظ في ال Signedvar عملية الضرب انشات نتيجه

– 3000000000 – تجاوزت الحدود للمتغير Int

( -2147483648 الي 2147483647) ها هي المخرجات :

post-14-1102696145_thumb.jpg

#107

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

مسجله اجابه صحيحه .

المغزي من هذا الموضوع هو :

احترس من ان يجب ان تكون جميع القيم المحدثه من البرنامج داخل الحدود للمتغيرات التي تحتويها .

( الاجابة ستكون مختلفة في 16 bit او 64bit حسابيا التي تستخدم ارقام مختلفة من ال Byte للنوع Int )

#108

• انواع التحويلات

C++ مثل C تكون مرنه اكثر من بعض اللغات الاخري في طريقة علاج العبارات التي تشمل انواع بيانات مختلفه و متعدده . مثلما في المثال .

انظر في برنامج Mixed .

#include<iostream.h>
int main()
{
	int count=7;
	float avgweight=155.5f;
	double totalweight=count*avgweight;
	cout<<"totalweight="<<totalweight<<endl;
	return 0;
}

post-14-1102805163_thumb.jpg

#111

هنا تمت عملية الضرب بين متغير من النوع Int و متغير اخر من النوع Float لينتج لنا متغير من النوع Double .

هذا البرنامج تم معالجته بدون اخطاء :

المعالج ينظر اليها ببساطه حيث انك تريد ان تضرب ( او تنجز اي عمليه حسابيه اخري ) ارقام من انواع متعدده .

لاحظ ان جميع اللغات تكوّن حلول . البعض لا يصرح بالتعبيرات المختلطه و ستقوم بوضع علامه عند الخط الذي ينجز العملية الحسابيه ببرنامج Mixed كما لو كان هناك خطأ.

كذلك اللغات تتظاهر بان عندما تخلط انواع المتغيرات سيؤدي الي حدوث خطأ و ستحاول ان تأمنك من نفسك . C++ و ال C مع ذلك تتظاهر بانك يجب ان تملك سبب جيد لتفعل ما انت فاعله و ستساعد في حمل ما تقصده.

انها احد اسباب شهرة لغة ال C++ و ال C .

انها تعطي لك كثير من الحريه . بالطبع و بكثير من الحريه ستكون ايضا

كثير من الفرص لكي تقع في الاخطاء .

تم تعديل هذه المشاركة بواسطة البارودي في 12 ديسمبر 2004 في 01:53

#112

• التحويل التلقائي

دعنا نتأمل ماذا يحدث عندما المعالج يواجه مثل خليط من الانواع المختلفه من المتغيرات في التعبيرات مثل التي في Mixed .

الانواع حسبت " Higher " او " Lower " و اسست علي وجه التقريب علي النظام المعروض في الجدول رقم ( 4 ) .

الجدول رقم ( 4 ) ترتيب انواع البيانات

post-14-1102984174_thumb.jpg

#113

المعاملات الرياضيه مثل + و * تفضل ان تقوم بالعمليه في معاملات من نفس النوع . عندما معاملين من نوعين مختلفين يتقابلوا في نفس التعبير او السطر من الكود .

النوع الاقل من المتغير يتغير الي النوع الاعلي من المتغير .

كذلك مثلما في Mixed .

القيمه Int المحسوبه تغيرت الي النوع Float و خزنت في متغير مؤقت قبل ان تضرب بالمتغير الذي من النوعAvgweight float .

النتيجه ( للآن من النوع Float ) ثم بعد ذلك تتحول الي Double لذلك يمكن ان يخصص للمتغير من النوع Totalweight double .

هذه العمليه تم عرضها باشكل رقم ( 9 ) .

post-14-1102984399_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 14 ديسمبر 2004 في 03:33

#114

التحويل ياخذ اماكن غير ملحوظه و عادتا لا تحتاج لتفكر جيدا في ذلك .

C++ بصورة تلقائيه يفعل ما تريد . و مع ذلك في بعض الوقت المعالج لا يكون سعيد بالتغيير كذلك كما سنري بعد دقائق . ايضا عندما نبدأ في استخدام الهدف سنكون تحت تاثير تعريف انواع البيانات التي لدينا .

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

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

كما يحدث هنا ببناء انواع البيانات .

#115

• التحويلات

اصوات الطبقات مثل بعض الاشياء التي تحدث بنوعيه من المجتمع في الهند . لكن في ال C++ هو عبارة عن جمله او شرط طبق لتخصيص بيانات متحوله عن طريق المبرمج .

كاعتراض علي التحويل التلقائي للبيانات نحن فقط سنشرح .

الطبقات ايضا تسمي النوع Casts . لأي شئ الطبقات او ال Casts ؟

في بعض الوقت المبرمجين يحتاجون لتغيير القيم من احد الانواع الي النوع الاخر في الحالات التي المعالج لن يقوم بفعل ذلك تلقائيا او بدون تظلم .

ها هي انواع مختلفه من ال Casts في ال C++ القيا سيه :

Static casts – Dynamic casts او Reinterpret casts و Const casts .

هنا نحن سنهتم فقط بال Static casts .

نحن سنتعرف علي الاخرين و التي تستخدم في حالات خاصه اكثر في الفصل التالي .

طبقات ال C++ لديها انواع من المحظورات الظاهره . هذه الشفرة تستخدم طبقات ال C++ لتغيير المتغيرات من النوع Int بمتغيرات من النوع Char :

Acharvar = static_cast < char > ( anintvar);

هاهو المتغير الذي سيكون طبقه ( Anintvar ) وضع في قوسين و النوع سيتغير الي ( Char ) و الذي وضع في القوسين <> .

النتيجه ان المتغير Anintvar سيتغير الي النوع Char قبل ان يخصص قيمته ل Acharvar في هذه الحاله العبارات المخصصه ستنفذ الطبقات بنفسها لكن في هذه الحاله التي سيكون الطبقات بها شئ ضروري .

تذكر ان في مثال Signtest ان الحل الوسط تجاوز مقدار نوع المتغير و الحل غير صحيح .

نحن نتجاوز المشكله عن طريق استخدام Unsigned int بدلا من Int .

هذا واجب لان الحل الوسط – 3000000000 – يوافق الحدود للتغيرات الغير معلمه .

لكن عادتا او احيانا الحل الوسط لن يوافق احد انواع المتغيرات الغير معلمه و ذلك في الحالات التي ربما نكون قادرين علي حل المشكله باستخدام الطبقات Cast :

ها هو المثال :

#include<iostream.h>
int main()
{
	int intvar=1500000000;
	intvar=(intvar*10)/10;
	cout<<"intvar="<<intvar<<endl;

	intvar=1500000000;
	intvar=(static_cast<double>(intvar)*10)/10;
	cout<<"intvar="<<intvar<<endl;
	return 0;
}

post-14-1103040328_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 14 ديسمبر 2004 في 19:05

#118

عندما نقوم بضرب المتغير Intvar في 10 النتيجه – 15000000000 – ستكون بعيده كل البعد عن التوافق مع المتغير من النوع Int او Unsigned int . مما يؤدي الي اجابه خاطئه كما هو موضح عن طريق مخرجات الجزء الاول من البرنامج .

نحن قادرين علي اعادة تعريف بيانات انواع المتغيرات لكي تكون Double . هذا يزود بحجرات كثيرة لان هذا النوع يحوي عدد من 10 رقم عشري .

لكن اظن ان لبعض الاسباب كذلك مثل المحافظة علي البرنامج صغير المساحه لن نحتاج لتغيير المتغيرات للنوع Double في هذه الحاله ها هو حل اخر :

يمكننا ان نحول Intvar الي النوع Double قبل عملية الضرب .

هذا في بعض الوقت يسمي اجبار . هذه البيانات تجبر لكي تحول و تصبح نوع اخر .

هذا التعبير

 Static_cast<double>(intvar)

تحول Intvar للنوع Double . انها تؤدي مؤقتا الي وجود متغيرات من النوع Double بنفس قيم المتغير Intvar .

هذا المتغير المؤقت يضرب في 10 . لان النوع Double يناسب النتيجه .

هذه النتيجه تقسم علي 10 و تخصص للمتغير البسيط Int الذي اسمه Intvar و ها هي مخرجات البرنامج :

post-14-1103040805_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 14 ديسمبر 2004 في 19:13

#119

الاجابه الاولي بدون تحويل وهي خطأ .

لكن في الاجابه التاليه التحويل يؤدي الي اجابه صحيحه .

قبل لغة ال C++ القياسيه التحويلات كانت تعالج مستخدمه تنسيقات مختلفه .

بجانب

Acharvar = static_cast<char>(anintvar);

كان يمكن ان تقول:

Acharvar = (char)anintvar;

او بالتناوب:

Acharvar = char(anintvar);

مشكله واحده بهذه الاقترابات وهي انها صعبة الرؤيه .

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

Static_cast

هذه التحويلات القديمه لازالت تعمل لكنها تستخدم بعزم قليل ( او تستنكر لتستخدم نص اصطلاحي ) .

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

انها تضبط طرق تجنب الانواع بسلامه ( و التي تعني التاكد من ان المتغيرات لا تغير الانواع بصوره خاطئه ) .

و تستطيع ان ترشدك للاخطاء لانها تجعل من المستحيل للمعالج ان يكتشف احتماليه الاخطاء .

و مع ذلك في بعض الوقت التحويلات لا يمكن تجنبها .

سنري بعض الامثله لحالات عندما التحويلات تكون ضروريه كما سنري بعد ذلك .

تم تعديل هذه المشاركة بواسطة البارودي في 14 ديسمبر 2004 في 19:18

#120

مشكور على اجتهادك :)

#121

لا شكر علي واجب

و ارجو من المشتركين في الدورة المتابعه

لان الفصل قد اقترب علي الانتهاء و الاختبار قد اقترب موعده

#122

• المعاملات الرياضيه

كما انت من المحتمل ستستنتج في هذا الوقت .

C++ تستخدم اربع معاملات رياضيه بسيطه + و – و * و / لعمليات الجمع والطرح والضرب و القسمه .

هذه المعاملات تعمل في كل انواع البيانات لكل من ال Integer و Floating point .

انها تستخدم بنفس الطرق التي تستخدم في اللغات الاخري و بدقه مشابهه للاستخدام في علم الجبر .

و مع ذلك هذه بعض المعاملات الرياضيه الاخري التي لا تستخدم بوضوح.

#123

• معامل الباقي

هذا هو خامس معامل رياضي يعمل فقط مع المتغيرات من النوع Integer ( الانواع Char و Short و Int و Long ) انه يسمي معامل الباقي و ينوب عنه بواسطة علامة النسبه المئويه ( % ) .

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

برنامج Remaind يشرح التاثير .

#include<iostream.h>
int main()
{
	cout<<6%8<<endl
  <<7%8<<endl
  <<8%8<<endl
  <<9%8<<endl
  <<10%8<<endl;
	return 0;
}

post-14-1103310171_thumb.jpg

تم تعديل هذه المشاركة بواسطة البارودي في 17 ديسمبر 2004 في 22:02

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

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