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

لنفض الغبار عن القسم جائتكم ألغازي فحلوها

بدأه b.m.s في 11 يوليو 2006 · 37 رد · 5,256 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

*** ممنوع الإستعانة بالكومبايلر ومسموح إلأتصال بصديق ***

هذه أسئلة خفيفة من نوع السهل الممتنع حبيت أحطها

لأن القسم ميت أقصد 99.99999999% من المواضيع أسئلة أو واجبات أو يمكن حل مشاريع جاهزة

فحطيت هذه الأسئلة عشان أحرك القسم وأذكر هذه للأذكي فقط

عموما هذه الأسئلة تبين غباء اللي يكتبون كومبايلر وأيضا إنهم قاعدين يضحكون علينا <<< شكلي طولت عليكم

نبدأ بعون الله

1) ما ذا تتوقع يطبع هذا الكود ؟ ولماذا " إريد تفسير علمي برمجي " ؟

#include<iostream>

int main()
{
	const int ci = 5;
	int * i	  = (int*) &ci;

	++*i;

	std::cout<<"address ci = "<<&ci <<"	ci value = "<<ci<<"\n";
	std::cout<<"address i  = "<<i	<<"	*i value = "<<*i<<"\n";

	return 0;
}

مطلوب من كل واحد يحط ال output اللي يتوقعها وللتذكير ممنوع النظر في ........ أو إستخدام أي لغة ثانية ؟ أقلكم بعدين عشان ما تعرفون الحل ؟

2) ما ذا تتوقع يطبع هذا الكود ؟ ولماذا " إريد تفسير علمي برمجي " ؟ وهل هو صحيح منطقياً ؟

#include<iostream>


class base
{
	public :
	virtual void print(){std::cout<<"base\n";}
};


class derived:public base
{
	private:
	virtual void print(){std::cout<<"derived\n";}
};


int main()
{
	base * b = new derived();
	b->print();
	delete b;
}

3) أين الخطأ ولماذا ؟ " أرجو عدم الإستعانة بالكموبايلر " ؟

#include<iostream>


class base
{
	public :
	virtual void print() = 0;
	virtual ~base() = 0;
};


class derived:public base
{
	public :
	virtual void print() {std::cout<<"print\n";}
	virtual derived(){};
};


int main()
{
	base * b = new derived();
	b->print();
	delete b;
}

4) كيف تعرف عدد المرات اللي سيستدعى فيها الdestructor ؟ علما أن هذه الطريقة standard بين كل الكمبايلرات ؟ (مساعدة قد وضعت موضوع في هذه الطريقة ) ؟

#include<iostream>
#include<cstdlib>

class bms
{
	public:
	bms(){}
	~bms(){}

};





int main()
{
	bms * b = new bms[(unsigned int)rand()];
	// ------------------------------->>destructor كم مرة بيستدعى ال 
	delete [] b;

}

وفي الختام أنتظر مشاركات منكم ويله وروني شطارتكم ؟

تم تعديل هذه المشاركة بواسطة b.m.s في 11 يوليو 2006 في 19:10

#2

السلام عليكم

حيا الله اخونا وحبيبنا bms يا مطول الغيبات..

اليك حل المسئلة الاولى كما توقعته...

لنفرض ان x هى عنوان ci إذاً المفروض الناتج يصبح

address ci=x ci value=5
address i=x+1 i value=x+1

ساعود لتحليل باقي الاسئلة لاحقاً إن شاء الله تعالى

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

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

address ci = "Memory Address for ci"		ci value =  6
address i  = "Memory address for i same as address of ci"	 *i value = 6

التعليل:

لقد جعلنا i يشير الى نفس العنوان الذي يشير اليه ci و من ثم قمنا بزيادة القيمة الموجودة داخل عنوان الذاكرة ل i اي قمنا بزيادة

قيمة ci

اي اصبحت قيمة ci = 6 بسبب الزيادة و يما انّ i تشير الى نفس العنوان فانّ i = 6* ايضا

و الله اعلم

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#4

إجابتك مقنعة اكثر من إجابتي يا وائل ولكن هناك امر بسيط يجب التعقيب عليه..

اولاً

++*i

تعنى اضافة واحد للعدد الذى يشير إليه i وليس كما توقعت انا, فتوقعي كان ان الرمز يعنى إضافة واحد للمؤاشر i .

اما بالنسبة للعناوين فاعتقد بان العدد ci يقع فى العنوان x و i يقع فى العنوان الذي يليه, وذلك لان الكمبايلر منظم ولن يضع عدد فى عنوان x ثم يضع العدد الذى يليه فى عنوان اخر بعيد عن العنوان x, لذلك الاجابة المفروض ان تكون هكذا

address ci = "Memory Address for ci"		ci value =  6
address i  = "Memory Address for ci +1"	 *i value = 6

ننتظر رد الخبير

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5

السؤال الثاني..

سوف يتم طباعة base

ذلك لأنك عندما عرفت نفس الدالة لكن كـ private سيتعذر على البرنامج بلوغها..فيستعيض عنها بالدالة الاصلية (أصلا البرنامج لم يرَ الدالة المعادة.)

ونفس الشيء سيحدث لو لم نكتب كلمة virtual.

التصحيح .. في الفئة المشتقة نعرف دالة بنفس اسم تلك الدالة الاصلية لكن نجعلها عامة public وبدون virtual

يتبع ... :)

#6

:D

تطفل مني على ++C

1- أظن أن الكومبايلر يجب أن يعطي رسالة خطأ, لأنه لا يمكن التعديل على قيمة ci لأنها عرفت على أنها ثابثة const int.

فالتغيير على قيمتها ب i*++ من المفروض أن ينتج خطأ. لو أن الكومبايلر طلع قلبه أبيض و يتسامح مع هذه التطاولات على القيم الثابثة ف النتيجة ستكون كما قال وائل أي 6 في كلا السطرين

2- ظن أنها الدالة public التي سيتم إستدعاؤها, لأن الدالة المعاد تعريفعا ب private ستكون محجوبة , لن يظهر إلا الدالة الأصلية التي لا تزال تحمل تعريف public. يعني في output سنحصل على

base

و الله أعلم

B)

تم تعديل هذه المشاركة بواسطة ikossan في 11 يوليو 2006 في 21:20

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#7

يا شباب اللغز المحير فى المسألة الأولى أن ال ci ثابت const و لذلك ليس مسموح بتغيير قيمته !

بجد حاجات جميلة يا أخ bms عمرها ما خطرت لى على بال! منتظر الإجابات بفارغ الصبر.

#8

بالنسبة للسؤال 3. واحد من اثنين إما:

1) أظن أن الدالة الهادمة لا يمكن ان تكون Pure Virtual.

أو (اذا كان مسموح ان تكون الدالة الهادمة Pure Virtual)

2)لا يمكن أن مبقي دالة Pure Virtual بدون أن نعمل لها override ..

يعني يجب إعادة تعريف الدالة الهادمة.

زمان ما جربت هيك شي..بالفعل اسئلة من نوع السهل الممتنع..

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 11 يوليو 2006 في 21:42

#9

3- الخطأ أظنه في destructor فقد عرف أنه virtual pure يعني لازم الكلاس المشتقة أن تعرفه!!

:D

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#10

الثوابت و علاقتها بالمؤشرات كان موضوع محير أنا فكرت فيه من فترة

بالنسبة للسؤال الأول فسي بلس بلس تسمح لك أن تأخذ مؤشر الثابت بل و أن تعدله من خلال المؤشر :D

و لكن إذاي و هو المفروض ثابت ؟!

إللي حيحصل إنك لما تيجي تحط الثابت في أي Expression سي بلس بلس مش حتروح لمكان الثابت في الذاكرة و تجيبه لأ

إللي حيحصل إن رقم الثابت وهو 5 مثلا المفروض ينطبع في الكود نفسه

يعني بإختصار شديد الثابت

const int x = 5;

سيتم التعامل معه كإنه

#define x 5

و حتى لو جبت مؤشر بموقع الكائن في الذاكرة و عدلته

الكومبيلر بطبيعة الحال بيعمله evaluation في الcomile-time مش في الrun-time

يعني مهما عملت حتطلع القيمة الأولى و إنت عمال تغير في القيمة إللي في المؤشر و هي ملهاش أي لزمة إطلاقا :D

يعني بإختصار لما تيجي تطبع قيمة عناوين ci و i المفروض يطلع نفس الناتج

لكن لما تييجي تطبع قيمة i فحيطلع القيمة الجديدة إللي إنت عملتها و هي 6

لكن ci الكومبيلر بيستبدلها تلقائيا بالقيمة الأساسية إللي هي 5

علشان كده النتيجة المفروض تطلع محيرة كإنهم متغيرين لهم نفس العنوان و قيمتين متغيرتين :D

#11
usama707 كتب:
الثوابت و علاقتها بالمؤشرات كان موضوع محير أنا فكرت فيه من فترة

بالنسبة للسؤال الأول فسي بلس بلس تسمح لك أن تأخذ مؤشر الثابت بل و أن تعدله من خلال المؤشر :D

و لكن إذاي و هو المفروض ثابت ؟!

إللي حيحصل إنك لما تيجي تحط الثابت في أي Expression سي بلس بلس مش حتروح لمكان الثابت في الذاكرة و تجيبه لأ

إللي حيحصل إن رقم الثابت وهو 5 مثلا المفروض ينطبع في الكود نفسه

يعني بإختصار شديد الثابت

const int x = 5;

سيتم التعامل معه كإنه

#define x 5

و حتى لو جبت مؤشر بموقع الكائن في الذاكرة و عدلته

الكومبيلر بطبيعة الحال بيعمله evaluation في الcomile-time مش في الrun-time

هذا يرجع للكوبايلر, صراحة أنا لا أعرف هل في ++C الكومبايلر يعتبر الثوابث على انها Literral أي مثل لغة التجميع, ففي لغة التجميع الثوابث لا يحجز لها مكان في الذاكرة, ولو حجز لها مكان في الذاكرة فلن تصبح ثوابث!!

لهذا لو كان المصرف يتساهل فهذا معناه أنه يحجز لها خانة في الذاكرةو وبالتالي فتغييرها سيكون جائز :wacko:

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#12

فعلا العديد من الأشياء في سي بلس بلس تعود للمترجم

و ممكن في أحد الأحوال عندما يعلم المترجم جميع إستخدامات الثابت و أن المبرمج لم يحاول تعديل قيمته فقد لا يحجز المترجم مساحة له في الذاكرة أصلا و يعامله على أنه iteral كنوع من أنواع ال Optimizations ! و لكن في النهاية هذا يعود للمترجم

ولكن باالنسبة للحالة التي في الأعلى فغالبا فغالبا ما سيحجز المترجم مساحة للثابت في الذاكرة لأن المبرمج ق

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

لذا فالسلوك الإفتراضي لمعظم المترجمات أن بأي حال من الأحوال قيمة ci لا يجب أن تتغير

و لكن عندما تحتاج للتعامل مع مؤشرات إلى ثوابت فغالبا ما سيحجز المترجم مساحة له وإلا فسيعطيك مؤشر لماذا ؟!

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

لذا فالمترجم ليس أمامه إلا حلين

1- لا يمكنك من أخذ مؤشر إلى ثابت و هذا غير عملي بالمرة لأنه أولا يخرق ال Standards ثانيا هناك العديد من الدوال التي تأخذ مؤشرات لثوابت للسرعة ولأنها لا تبغى تعديل ال Arguments

2- أن يعامل الثوابت ك Literals و يحجز مساحة من الذاكرة يخصصها لك عندما تبغي الحصول على مؤشر لها و تتعامل معه

و بصفة عامة فهذا يعود للكومبيلر فقد يختلف نفس الكومبيلر في معاملة الثوابت من الأنواع الأساسية ك int و الأنواع المركبة ك ال class !

1- لذا فكقاعدة عامة يجب أن تعرف المترجم الذي تستخدمه أولا

2- لا يجب أن تستخدم ال C-Style Cast كالتي إستخدمتها في الكود

3- إستخدم static_cast, dynamic_cast, const_cast, reinterpret_cast بدلا منها

4- لا يجب أن تستخدم const_cast إلا في حالة الضرورة القصوى عندما مثلا تستدعي دالة تعود بثابت

5- لا يجب أن تستخدم const_cast إلا في حالة يقينك أن البيانات الأساسية ليست ثوابت أصلا و إلا فقد تصادف نتائج غير متوقعة

#13

اي ده .. انت حفرت كم متر تحت الأرض علشان تطلع الأسئلة الغريبة دي؟ :P

الكثير تحدثوا عن السؤال الأول .. لأنه اول سؤال.

و لا استطيع ان ازيد عليهم .. لأنني لا اعرف ما اللذي سيفعله الكومبايلر عند اخذ مؤشر لـ const و لكن ربما سيعطي خطأ انك لا تستطيع اخذ عنوان لـ lvalue

السؤال الثاني,

اعتقد انه خطأ ان يكون الـ method هو private و virtual في نفس الوقت.

اقصى ما استطيع تخمينه انه undefined و إما ان يكون خطأ او ان كل كومبايلر يتصرف كما يريد!

السؤال الثالث ..

هناك احتمالين ..

اما انه ممنوع عمل pure virtual destructor

او انه لا يمكن انشاء new derived لأن derived لا يحتوي على destructor ...

السؤال الرابع ..

اعتقد ان الـ destructor سوف يستدعي صفر مرات!! يعني ولا مرة ..

لو كنت في جافا لأخبرتك انك لا تنشيء كائنات .. بل تنشئ مؤشرات.

و لكن في هذا المثال يبدو انك فعلا تنشيء كائنات!!

في الحقيقة .. لا ادري!

#14

أهنئكم على صراحتكم في إنه ما أحد إستعان بالكمبايلر وهذا واضح من الإيجابات اللي تفاوتت بين كل شخص ;)

وسأعلق على كل واحد بعد الإجابة على الألغاز

1)

#include<iostream>

int main()
{
	const int ci = 5;
	int * i	  = (int*) &ci;

	++*i;

	std::cout<<"address ci = "<<&ci <<"	ci value = "<<ci<<"\n";
	std::cout<<"address i  = "<<i	<<"	*i value = "<<*i<<"\n";

	return 0;
}

وسيكون ناتج الطباعة

address ci = 0xd7ae8	ci value = 5
address i  = 0xd7ae8	*i value = 6

إشفيكم مستغربين :rolleyes: جربوها على أي كمبايلر في الدنيا بيطلع نفس الجواب مع تغيير العنوان و عادي نفس العنوان بس بقيم مختلفه :huh: !!!!!!!!!! تجي عادي إذا كان الكمبايلر قاعد يلعب علينا ;) ؟؟؟؟؟؟؟ طيب وش التفسير .

التفسير العلمي لها هو أن الكمبايلر ( وهذا standard ) يقوم بحجز مكان للثوابت في الــ stack عشان إستخدامات العناوين والإرسال إلى الدوال وأيضا إذا كان الثابت كائن وله دواله وبياناته الخاصة فيجب أن يؤشر this إلى مكان فعشان الغلابه هذه والمشاكل أصبح للثوابت مكان في الذاكرة لكـــــــــــــن إذا عرف الكومبايلر قيمة الثابت أثناء الــ compile-time فإنه يضع القيمة المخزنة عنده وليس الموجودة في الذاكرة المحجوزة مسبقاً وعندما تستخدم الثابت في expression او أي مكان تجده على الفور يستبدله بقيمته على إفتراض أنه يعرف القيمة وليس على سبيل الـــ Optimization لانه حتى لو كانت الإعدادات فيها disabled فإنه سيظل يقوم بهذه الحركة وللمعلومية فإنه لا يقوم بهذه الحركة إلا للأنواع الــ primitive فقط . وهذه الحركة تعتبر غبية من وجهة نظري لأنه طالما أنت حجزت مكان له في الذاكرة فليش ما ترجع له خصوصاً إنه في إمكانية للتعديل عليه .

2)

class base
{
	public :
	virtual void print(){std::cout<<"base\n";}
};


class derived:public base
{
	private:
	virtual void print(){std::cout<<"derived\n";}
};


int main()
{
	base * b = new derived();
	b->print();
	delete b;
}

هنا وبكل بساطه بيكون الناتج derived :angry: !!!!!!!!!!!!!!!!!!1 بدون تعصيب راح أشرح وش فكرتها

الحين class base عندها دالة virtual تسمى print وهي من النوع public يعني يقدر يوصلها في أي لحظة إذا أنشأ كائن منها

طيب ورث منه class derived وكانت الوراثة public (( وهنا مربط الفرس )) وأعاد تعريف overriding للدالة print صار عنده دالتين print

الاولى : من نوع public وما يقدر يوصلها إلا إذا كان الـ(this )من نوع base

والثانية: من نوع private ويقدر يوصلها إذا كان الـــthis من نوع derived بس على شرط أن يكون من داخل الــ class

كلكم يعرف إنه إذا كانت في دالة virtual في الـــclass فإن الthis اللي موجود في الكائن ما يأشر على الكائن نفسه او على بدايت البيانات الموجوده فيها بل يأشر على جدول الدوالة الظاهرية ( virtual function ) ويكون الoffset اقصد الإزاحة على حسب تسلسل تعريفها ........ كثرت الكلام :blink:

نجي للمهم لما يشوف الكمبايلر جملة مثل هذه

	b->print();

هو راح يقول إن b مؤشر إلى base وعنده دالة من نوع public و هي virtual إذا يمكنه إستداعها والعنوان يتحدد عن طريق جدول الكائن اللي هو derived وبما أن derived صلح overriding لل print فإنه وقت التنفيذ راح تستدعى الدالة private virtual print رغم إنها محمية وهذا هو سبب غباء الكمبايلر . جرب تعدل نوع المؤشر b إلى * derived وشوف وش يطلع لك .عموما اللي ما فهم أو أشكل عليه شئ يقولي وأنا راح أشرحه بالتفصيل الممل بس الحين أنا مستعجل .

3)

#include<iostream>


class base
{
	public :
	virtual void print() = 0;
	virtual ~base() = 0;
};

class derived:public base
{
	public :
	virtual void print() {std::cout<<"print\n";}
	virtual derived(){};
};


int main()
{
	base * b = new derived();
	b->print();
	delete b;
}

بإختصار الpure virtual destructor لازم تعرّف الbody حق الدالة قبل ما تورث منها أي كائن يعني الحل بيكون

base::~base(){}

والسبب إن الdestructor ما يقدر يعيد تعريفه في ال calss derived

4)

#include<iostream>
#include<cstdlib>

class bms
{
	public:
	bms(){}
	~bms(){}

};





int main()
{
	bms * b = new bms[(unsigned int)rand()];
	// ------------------------------->>destructor كم مرة بيستدعى ال 
	delete [] b;

}

إحليكم إلى هذا الرابط

/index.ph...c=82942&hl=

عموما إنتظر غداً أسئلة جديدة وراح تعجبكم وإن شاء الله راح أعقب على كل واحد بإذن الله الحين أنا نعساااااااااااااان ووراي دوام

تم تعديل هذه المشاركة بواسطة b.m.s في 12 يوليو 2006 في 01:00

#15

أخوي احمد غريب

حياك الله في موضوعي وتفكيرك منطقي وهذا هو المنطق البرمجي المفروض إذا دخلنا عن طريق العنوان وغيرنا في قيمته خلاص يتغير الثابت اللي عرفناه

لكن وش نسوي العين بصيرة واليد قصيرة وشاكر لك تواصلك وبإنتظار إجاباتك في الأسئلة القادمة لكن لفظة خبير كبيرة مرة ِ.

أخوي waeldalol

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

أخوي إسماعيل ابراهيم

السؤال الثاني : سيكون كلامك صحيح لو لم تكن الدالة virtual أما إذا كانت virtual فإن الربط سيصبح وقت التنفيذ وبالتالي تطلع الصلاحية من الكمبايلر .

السؤال الثالث : جوابك الثاني نصفه صحيح " لا يمكن أن مبقي دالة Pure Virtual بدون أن نعمل لها " والتكملة يجب أن يكون التعريف كاملاَ للهادم حتى لو كانت pure virtual .

أخوي ikossan

حياك الله والموضوع موضوعك وهذه الأسئلة للجميع

ونرجع لإجاباتك

1) مشكلة الـــ++C إنها تدعم C-style وبالنسبة للـــ C أي cast او conversion يعتبر صحيح

2) نفس الكلام اللي قلته " سيكون كلامك صحيح لو لم تكن الدالة virtual أما إذا كانت virtual فإن الربط سيصبح وقت التنفيذ وبالتالي تطلع الصلاحية من الكمبايلر "

3) لا عادي تقدر تعرفه pure virtual لكن بشرط إنك تكمل تعريفه في نفس ال scope

أخوي Blueteeth

اللغز محير من جد

وترى للمعلومية لو ما سألني عنها زميل ما خطرت على بالي مطلقاَ

أخوي usama707

إجابتك صحيحة لكن في ملاحظات وهي إن الكمبايلر يحجز للثابت مكان في الذاكرة ويستخدم هذا المكان إلا إذا كان يعرف قيمة هذا الثابت وقت تعريف الثابت " مثل المثال السابق " فبكذا راح يحجز خانة لكن ما راح يستخدمها

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

#include<iostream>

int main()
{
	int x;
	std::cin>>x;
	const int ci = x;
	int * i	  = (int*) &ci;

	++*i;

	std::cout<<"address ci = "<<&ci <<"	ci value = "<<ci<<"\n";
	std::cout<<"address i  = "<<i	<<"	*i value = "<<*i<<"\n";

	return 0;
}

وفي هذه الحالة راح يضطر إلى إستخدام المكان في الذاكرة .

وبالنسبة للقاعدة العامة راح أحفظها عن ظهر قلب .

وأخيراً :

أخوي hasan_aljudy

السؤال الثاني الكود صحيح ولا يوجد به أي syntax error أو semantic error قد يكون الخطأ في المنطق

السؤال الثالث الإحتمال ليس صحيح ولكن الإحتمال الثاني صحيح على هذا الكود وليس على كل pure virtual destructor .

السؤال الرابع تستطيع معرفة عدد مرات إستدعائه عن طريق موضوعي السابق /index.ph...c=82942&hl=

وعموما أشكر للأعضاء اللي شاركوا وموعدنا الأسئلة القادمة وهي قريبة إن شاء الله

وبعد ما جاوبت ما شفت ردود فالظاهر الشباب زعلانين

#16

السلام عليكم

بالنسبة للقيمة كلام مقنع ولكن بالنسبة للعناوين فانا غير مقتنع بالمرة... حتى لو الكمبايلر وبيلجيتس وشركائه قالو ان عنوان الـi هو نفسه عنوان الـci فانا غير مقتنع...

لماذا ؟؟

لانه عند استدعاء اى داله فى لغة السي يتم إنشاء stack frame وتوضع فيه المتغيرات, وكما هو واضح من المثال هناك 2 متغير وهما ci و i يعنى المفروض كل واحدة منهم توضوع فى عنوان مختلف, فكيف اصبح عنوان المؤاشر هو نفسه عنوان المتغير...

نحتاج شرح يوضح هذه النقطة وكلمة خيبر مش كثيرة عليك يا b.m.s

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#17
اقتباس
لانه عند استدعاء اى داله فى لغة السي يتم إنشاء stack frame وتوضع فيه المتغيرات, وكما هو واضح من المثال هناك 2 متغير وهما ci و i يعنى المفروض كل واحدة منهم توضوع فى عنوان مختلف, فكيف اصبح عنوان المؤاشر هو نفسه عنوان المتغير...

إظاهر إنك بصيت عالكود بسرعة و مخدتش بالك يا أستاذ أحمد :D

لإن إللي إنطبع هو قيمة المؤشر i إللي هي عنوان ci

و ليس العنوان الخاص ب i

	std::cout<<"address ci = "<<&ci <<"	ci value = "<<ci<<"\n";
	std::cout<<"address i  = "<<i	<<"	*i value = "<<*i<<"\n";
#18

لا والمصيبة إن انا كاتب موضوع عن المؤاشرات, وانا بالذات إلي المفروض اكون حذر اقع فى نفس المطب...

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

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#19
usama707 كتب:
إظاهر إنك بصيت عالكود بسرعة و مخدتش بالك يا أستاذ أحمد :D

لإن إللي إنطبع هو قيمة المؤشر i إللي هي عنوان ci

و ليس العنوان الخاص ب i

	std::cout<<"address ci = "<<&ci <<"	ci value = "<<ci<<"\n";
	std::cout<<"address i  = "<<i	<<"	*i value = "<<*i<<"\n";

مشكور على الإجابة والله يعطيك العافية :rolleyes:

احمد غريب كتب:
لا والمصيبة إن انا كاتب موضوع عن المؤاشرات, وانا بالذات إلي المفروض اكون حذر اقع فى نفس المطب...

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

:D

#20

السلام عليكم

طيب كما اتحفتنا بسؤال خلينا نتحفك بسؤال من مكتبه IOStreams .

ماذا يفعل البرنامج التالي, وما هى النصوص التى تظهر على الشاشة:

ios_base::fmtflags original_flags = cout.flags();

cout << 100 << '|';
cout.setf(ios_base::left,ios_base::adjustfield);
cout.width(5);
cout << 200 << 300 << '\n';

cout.unsetf(ios_base::adjustfield);
stramsize original_precision = cout.precision(2);
cout.self(ios_base::uppercase|ios_base::scientific);
cout << 524.0 << ' ' << 8e2;

cout.flags(original_flags);
cout.precision(original_precition);

لاحظ ان البرنامج يقوم بمهمتين, وهناك مسافة فاصلة بين المهمة الاولي والثانية. السطر الاول هو تمهيد والسطر الثاني فى الفقرة الثالثة ايضاً تمهيد لشئ معين ثم نعيد لهم القيم الاصلية فى اخر سطرين...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#21

هلا أخوي أحمد أحرجتني بهذا السؤال شكله كذا فيه تركات ( جمع trick (h) )

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

بسم الله

ios_base::fmtflags original_flags = cout.flags();

هنا حفظ الformat flags حقت ال cout

cout << 100 << '|';

هنا راح يطبع 100 وبعدها مباشرة راح يطبع |

cout.setf(ios_base::left,ios_base::adjustfield);

هنا يصلح Set لل flags اللي اسمه left مع mask adjustfied يعني بالعربي تصير الطباعة من أقصى اليسار وليس كاعادة من أقصى اليمين

cout.width(5);

هنا يضبط أقل حجم إلى 5 يعني أي حقل ينطبع يكون من 5 إلى .... فوق :P

cout << 200 << 300 << '\n';

هنا راح يطبع من أقصى اليسار 200 وبعدين يطبع فراغيين وبعدين يطبع 300 وبعدين 300 وبعدين فراغيين وبعدين سطر جديد

cout.unsetf(ios_base::adjustfield);

هنا يصلح clear لل ماسك adjustfield في الــ cout

stramsize original_precision = cout.precision(2);

هنا يحفظ الدقة السابقة مع ضبط الجديدة بـــ 2 وبما أن precision هو normal في 2 معناها عدد ال digits

cout.self(ios_base::uppercase|ios_base::scientific);

هنا يصلح set لاثنين بحيث لا يطبع إلا uppercase حتى وإن كانت الحروف صغار والثاني أن الدقة تصبح بعد الفاصلة fraction part

cout << 524.0 << ' ' << 8e2;

هنا راح يطبع

5.24E2	 8.00E2

cout.flags(original_flags);
cout.precision(original_precition);

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

يعني في النهاية راح يكون الناتج تقريباَ

100|200  300
5.24E2	 8.00E2

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

ويارب أكون جاوبت الإجابة الصحيحة

تم تعديل هذه المشاركة بواسطة b.m.s في 18 يوليو 2006 في 01:07

#22

برافو عليك انت وصديقك يا b.m.s الاجابة صحيحة 100%

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#23

الله يوفقك ترى من أمس وأنا قلقان ;)

عموما إنتظر الأسئلة القادمة وراح بعضها يكون مفاجئة بس لا تنسون الشروط

]*** ممنوع الإستعانة بالكومبايلر ومسموح إلأتصال بصديق ***"

#24

بسم الله الرحمن الرحيم

نبدأ القسم الثاني من الأسئلة لكن لاحظوا إن هذا القسم قد يكون أسهل من القسم الأخر وقد يكون أصعب

ونبدأ على بركة الله .

1) كم مرة سيتم طباعة Hello في هذا الكود ؟ ممكن تبسيط بسيط ؟

class base {
public:
	base(){}
};

class hello{
public:
	hello(){cout<<"hello\n";}
	hello(base b){cout<<"hello\n";}
};


int main()
{
	hello  *h1 = new hello();
	hello   h2();
	//...
	delete h1;
}

2) ما الخطأ في هذا الكود وما هو تصحيحك للخطأ ؟ مع التعليل ؟ <<<< اسئلة دكاترة :lol:

	int i = 0;	
switch(i){
		case 1 :
			int j = 100;
			i += j * 2;
		break;

		case 2:
			i += 8 * 4;
		break;
	}

3) ماذا يفعل هذا الكود برأيكم ؟

template< int i >
class what{
  public:
	  enum {RESULT = i * what<i-1>::RESULT};
};

class what<1>{
  public:
	  enum {RESULT = 1};
};

int i = what<10>::RESULT;

4) تستطيع منع الكلاسات الأخرى من أن ترث من عندك في أغلب اللغات من خلال كلمة محجوزة واحدة مثل الjava و visual basic.net لكن لا توجد في ال++C كلمة محجوزة لذلك لكن هل يمكن عمل نفس الشئ في C++ بواسطة بعض الخدع ؟؟؟؟؟ إذا كان الجواب بنعم فإكتب الكود ؟

تم تعديل هذه المشاركة بواسطة b.m.s في 20 يوليو 2006 في 10:30

#25
اقتباس
كم مرة سيتم طباعة Hello في هذا الكود ؟ ممكن تبسيط بسيط ؟

أعتقد مرتان .. ترا انا ما احب التفكير كثير :) .

اقتباس
) ما الخطأ في هذا الكود وما هو تصحيحك للخطأ ؟ مع التعليل ؟ <<<< اسئلة دكاترة

الخطأ هنا

swهtch(i)

وضعت بدلا من حرف o حرف ه ( هاء) :D لا اعلم هل هي مقصودة او لا

ولكن اشك بشيء ثاني وهو ان المتغيران j و i اعلنت عنهما اكثر من مرة في نفس المجال .

فسيعترض المصرف .. ويقول المتغير j و i سبق الاعلان عنهما ..

الحل ان بين كل case >>> { }

هذه اول مرة افكر ... بس ترا ما عندي سالفة .. مع الخيل يا شقرا :) .

تم تعديل هذه المشاركة بواسطة الشمري في 20 يوليو 2006 في 09:13

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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