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

أسئلة عن العمليات Operator

مغلق
بدأه Desigen في 2 يونيو 2005 · 23 رد · 1,978 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يعطيكم العافية

ممكن أسئل عن عمل هذه المعاملات

& هل لها تعامل غير المرجع

|
^
=<<
~
*<-

#
##
*.


شكرا لكم

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 10 أبريل 2014 في 18:57 — السبب: add some tags

#2

السلام عليكم ،،

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

&& معامل منطقي معناه And

|| معامل منطقي معناه Or

^ معناه الاس او القوة في الرياضيات.. مثلاً : 4^2 اي 2 اس 4 = 16

>= اصغر من او يساوي

<= اكبر من او يساوي

~ تستخدم في Classes في دالة الهدم ..

# تستخدم في بداية البرنامج مع الموجهات (لتعريف الثوابت او ضم ملفات خارجية .. الخ)

* اشارة لتعريف المؤشر (و كذلك تمثل اشارة الضرب الرياضي)

بنت اليمن ،،

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

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#3

بالنسبة للOperators السابقة

فان ال~ تستخدم ايضا في الbitwise not او عملية الinvert

و ايضا ^ لا يتخدم في ال++C في الاس لان عملية الاس في ال++C ليست جزء من العمليات الاساسية و انما ^ يقوم بعملية الExclusive OR او XOR

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#4

شكرا لردكم

المعاملات يلي ذكرتها معاملات موجودة في السي

يوجد | و ||

أنا أعلم أن || هو يقوم بعملية OR

لكن لا أعلم ما فائدة هذا المعامل |

.....

.....

في سؤال أخر إذا فيه مجال

class A
{
	const int x; 
};

كيف يمكن لي إعطاء قية للـ x علما أنه متحول ثابت .

شكرا لكم .

#5

المعامل I يستخدم في الBitwise OR و ايضا المعامل & يستخدم في ال Bitwise AND

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#6

طيب ممكن تشرحلي أكثر إذا في مجال

عن هذي المعاملا و إذا في كود صغير جدا عليها

|

^

=<<

~

*<-

#

##

*.

شكرا لك

#7

استخدم الMSDN فستجد الاف الاكواد عن الOperators

و بالمرة اقرا في الOperator Overloading

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#8

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

السلام عليكم

اقتباس
|

^

=<<

~

*<-

#

##

*.

والله بالنسبة للامثلة فدة صعب فى تلك الفترة علشان الامتحانات لولها كان ممكن اوضح بأمثلة مكتوبة ومشروحة

أولا بالنسبة ل|| دى علامة or معناه أحتمال وقوع أى من الحدثين

بمعنى لو كان المتغير x مثلا يساوى واحد أو ثلاثة مثلا أطبع wellcome (أى أى من الحدثين true ينفذ الشرط)

بالنسبة ل&& دى علامة and يعنى لازم وقوع الحدثين معا يعنى لو كانx==1 &&y==2 أطبع عــــــــــــــــــــــلام

تمام كدة

طب

بالنسبة ل~

دى فى حالتين لو انت عامل class وعاوز تهدم ال object بعد أستخدامة وبالتالى تستخدم العلامة دى وتسمى الدالة ب destructor

وايضا دة فى حالة تعربف pointer فى الcladss وبالتالى كدة انت تحرر الpointer

يكتب ازاى

~NameClass()

{

delete pinter

}

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

أما للعلامات الاخرى وضحة وقد قالها الاخوة

طب بالنسبة للعلامة # ودى تستخدم ف السى معناها اللى جاى بعدها دة ملف وعاملة include ف البرنامج

أما . دى لو حبيت استدعى دالة من الclasss

عن طريق

name of object. name of method

وخلى بالك دى فى حالة ان الobject دة refrence يعنى طريقة كتابتة

nameOfClass NameObject;

طب علامة <-

تسمى بالarrow وتستخدم ف حالة استدعاء دالة بس اية اللى يفرق هنا عن علامة الdot ما الاثنين واحد

لالا خلى بالك العلامة الarrow فى حالة ان الobject دة مش refrence دة pointer للclass

أى يكتب

NamClass *NameObject

بالنسبة لسؤال اللى انت عاوزة

اقتباس
كيف يمكن لي إعطاء قية للـ x علما أنه متحول ثابت

دلوقتى انت عاوز تعرف قيمة ابتدائية لهذا المتغير اولا يبقى انت لازم مطالب سيدتك بعمل constructor لكى تعطى لاى متغير القيم الinitila

class A
{
private:    لحماية المتغير من اى class تانى ممكن يتعامل معاة
const int x; 
public:
a()
{
x=0;
}
};

معلش بقى علشان مافيش وقت اضع امثلة للحاجات دى بس يعنى ممكن تكون كدة وضحت:D

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#9

شكرا كثير لكم

أنا سألت عن Operator لإني قرأت Operator Over Loading من MSDN

و ما خطر ببالي دور على المعاملات فيها !!!

class A
{
	const int x; 

public :

	A () { x = 0; }  
};

الكود السابق قام بإنتاج خطأ من النوع التالي :

error C2758: 'A::x' : must be initialized in constructor base/member initializer list

و مكتوب الباني لا يعرف الثوابت من خلاله !

شو الحل لهذه المشكلة .

#10
#include <iostream>
#include <conio>
class a
{
 private:
 int x;
 int re;
 public:
 a()
 { x=5;       re=0;  }
 void print()
 {   cout<<" x=\t"<<x<<"\n"; }

 void sum()
  {      re+=x+3;        cout<<"result is:\t"<<re<<"\n"; }

};
void main()
{

  a b;
  b.print();
  b.sum();
 getch();
}

أدى مثال واضح وصريح يارب أكون وصلتلك ما تريدة

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#11

شكرا لك و لتعاونك :)

أنا بعرف إكتب صنف و أعلم مبدأ الوراثة و virtual

بس خطر في بالي هذا السؤال

أريد متحول في الصنف يكون ثابت !

إذا كنت بدي إكتب هذا المتحول في int main

فهذا الأمر بغاية السهولة :

const int x = 5 ;

لكن السطر السابق لايمكن كتابته داخل الصنف

و لا يمكن إعطاء قيمة للمتحول الثابت بعد تعريفه

فسؤالي ما هو الحل لإعطاء و تعريف متحول ثابت داخل الصنف ؟

شكرا لرحابة صدرك :D

#12

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

أخى design والله سؤالك يدل على عبقريتك

والاجابة كما هى

#include <iostream>
#include <conio>
class a
{
private:
int x;
const int *qw;
public:
a()
{ x=5;
qw=&x;    }
void print()
{   cout<<" x=\t"<<*qw<<"\n"; }

/*void sum()
 {     }*/

};
void main()
{

 a b;
 b.print();
 //b.sum();
getch();
}

وهى عبارة عن لعبة بسيطة وهى ان عرفت متغير من نوع int وثابت ايضا

وهو مؤشر واكيد انت عارف المؤاشرات واهميتها ف السى

المهم حطيت لة الaddress بتاع الx

وبالتالى عملت متغير ثابت وتغلبت ع مشكلة التى قد قلتها

يارب اكون قد أوضحت ما تريدة

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#13

برافوا عليك تماما

مؤشر إلى عنوان ثابت

و إنسى المتحول !

حل منطقي جدا و ذكي

شكرا لك

#14

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

أشكرك ولاتتردد فى أى سؤال تريد ان تسألة ستجد الحل بأذن الله

وشكرا للمتابعة

وربنا يوفقك

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#15

السلام عليكم

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

لمعرفة كيف يمكننا عمل ذلك لابد ان نفهم ما يحدث عند إنشاء الكائن.

اول خطوه هى إستدعاء الـconstructur وفيه تتم عمليتين, الاولى هى إنشاء الدوال, والثانيه هى تشغيل الشفره التى توجد بين قوسين {} فى الـconstructure لذلك علينا ان نحدد القيم فى نفس الوقت الذى ننشئ فيه الدوال وليس بعدها, لاننا لو انشانا الداله وحددنا انها من نوع const لايمكن تغير قيمتها بعد ذلك, والطريقه الوحيده الوحيده هى عن طريق initialize list وتكتب هكذا :

class A
{
private:    
const int x;
public:
ِA(int  _x):x(_x)
{
}
};

قائمة تحديد القيم تاتى مباشرتاً قبل قوس البدايه { وتكتب كما هو موضح فى الشفره اعلاه

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

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

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

#16

شكرا لك أخي أحمد غريب

إذا بدك الصراحة فكرة المؤشر الثابت إلى قيمة فكرة مش بطاله

لكن الخطأ إنه ممكن تغير قيمة x في أي لحظة و المؤشر لا يمكنك تغير عنونه

لكن من ناحية ثاينة إذا استخدمنا المؤشر إلى قيمة ثابتة لن تنجح معنا هنا !!!

المهم هو إنه في طريقة لتعريف المتحولات الثابته في الأصناف

لكن سؤالي لك إذا في مجال

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

ما هو الحل علما أنه يمكن تغير x في لحظة بناء الكائن

شكرا لك

#17

سؤال أخر عن الوراثة المتعدية

و أنا أحب أن أطلق عليها الوراثة الهجينة !

class A 
{
      public : 
           void print () { cout << "The Class A"; }
};

class B 
{
      public : 
           void print () { cout << "The Class B"; }
};

class C : public A , public B
{	
};

int main ()
{
         C Obj1; 
         Obj1.print (); 
}

الكود السابق ينتج خطأ من النوع التالي :

لن يتمكن مترجم اللغة من تقرير من هو الإجراء print الذي سيتم منداته

و كحل أولي هو

اقتباس
class C : public A , public B

{

          A :: print ;

};

أو كحل ثاني هو

تغيير برمترات أحدهما !

أما الحل الثالث هو

عبر إستخدام التوجيه virtual

سؤالي كيف سيتم حل هذه المشكلة بإستخدام الحل الثالث

شكرا لك و لحسن صبركم :D :)

#18

يعطيكم العافية

إلك عندي سؤال أخي أحمد

إنت إستخدمت طريقة ما بعرف شو إسمها

عندي هذا الكود يلي كتبته اليوم الظهريات

using namespace std; 

class A
{
	int x; 

public : 

	A () { x = 0; }
	A ( int a ) { x = a; } 
	A ( A & Obj ) { x = Obj.x; }; 

	virtual void print () { cout << "X = " << x << endl; }
	int getx ( void ) { return x; } 
};

class B : public A 
{
	int y; 

public : 

	B () { A ( 0 ); y = 0; }
	// B ( int a , int b ) { A ( a ); y = b; }
	B ( int a , int b ) : A ( a ) { y = b; }
	// B ( B & Obj ) : A ( Obj.x ) { y = Obj.y; }
	B ( B & Obj ) : A ( Obj.getx () ) { y = Obj.y; } 

	virtual void print () { A :: print (); cout << "Y = " << y << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
	A Obj1; Obj1.print (); 
	A Obj2 ( 2 ); Obj2.print (); 
	A Obj3 ( Obj2 ); Obj3.print (); 

	A * Ptr1 = new A (); Ptr1->print (); 
	A * Ptr2 = new A ( 3 ); Ptr2->print (); 
	A * Ptr3 = new A ( * Ptr2 ); Ptr3->print ();

	return 0;
}

أنا بعرف إنه هذي الطريقة يلي إستخدمتها أستخدمها عندما إريد مناداة

الباني الخاص بالأب

و لكن شو ممكن تخبرني عن هذه الطريقة

و لاحظ أن مترجم اللغة أعطاني خطأ في إحدى التعبيرات و لم يعطيني

خطأ في التعبيرات الأخرى

و شكرا لحسن تعاونكم جميعا :rolleyes:

#19

عامة استخدام الMultiple Inheritence غير مستحب في الOOP و هذا لانه يصعب عملية الTracing جدا و ايجاد الاخطاء و لهذا تجد جميع لغات البرمجة الجديدة لا تسمح بالMultiple Inheritence فالافضل هو ان ترث Class واحدة و تعمل Implement لعدة Interfaces كما تريد و هذا لان الInterfaces لا تحمل Implementation

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#20
Desigen كتب:
شكرا لك أخي أحمد غريب

إذا بدك الصراحة فكرة المؤشر الثابت إلى قيمة فكرة مش بطاله

لكن الخطأ إنه ممكن تغير قيمة x في أي لحظة و المؤشر لا يمكنك تغير عنونه

لكن من ناحية ثاينة إذا استخدمنا المؤشر إلى قيمة ثابتة لن تنجح معنا هنا !!!

المهم هو إنه في طريقة لتعريف المتحولات الثابته في الأصناف

لكن سؤالي لك إذا في مجال

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

ما هو الحل علما أنه يمكن تغير x  في لحظة بناء الكائن

شكرا لك

اسئلتك كثيره يا دزاين يعنى ما صدقت الناس تجاوب عليك, زى المثل إلى يقول تديله صباعك ياخذ ايدك. :D

على كل حال الحل بسيط حدد قيمة x فى بداية الـcalss ولن يستطيع المستخدم ان يغيره عند إنشاء الكائن

int const x =0;

Desigen كتب:
سؤال أخر عن الوراثة المتعدية

و أنا أحب أن أطلق عليها الوراثة الهجينة !

class A 
{
      public : 
           void print () { cout << "The Class A"; }
};

class B 
{
      public : 
           void print () { cout << "The Class B"; }
};

class C : public A , public B
{	
};

int main ()
{
         C Obj1; 
         Obj1.print (); 
}

الكود السابق ينتج خطأ من النوع التالي :

لن يتمكن مترجم اللغة من تقرير من هو الإجراء print الذي سيتم منداته

و كحل أولي هو

أو كحل ثاني هو

تغيير برمترات أحدهما !

أما الحل الثالث هو

عبر إستخدام التوجيه virtual

سؤالي كيف سيتم حل هذه المشكلة بإستخدام الحل الثالث

شكرا لك و لحسن صبركم  :D  :)

بالنسبه لحل مثل هذه المسئله عليك بتحدد كلاس اب تكون فيه الداله print من نوع virtual بحيث الدالتين A و B ترث من هذا الكلاس الجديد وعند إنشاء عنصر من هذا الكلاس تحدد الكلاس الابن:

class D{
 virtual void print () {  }
};
class A : public virtual D
{
      public : 
           void print () { cout << "The Class A"; }
};

class B : public virtual D
{
      public : 
           void print () { cout << "The Class B"; }
};

class C : public A , public B
{	
};

int main ()
{
         D Obj1 =new C; 
         Obj1.print (); 
}

وفى هذه الحاله سيقوم الكلاس بإستدعاء print من الكلاس C.

Desigen كتب:
يعطيكم العافية

إلك عندي سؤال أخي أحمد

إنت إستخدمت طريقة ما بعرف شو إسمها

عندي هذا الكود يلي كتبته اليوم الظهريات

using namespace std; 

class A
{
	int x; 

public : 

	A () { x = 0; }
	A ( int a ) { x = a; } 
	A ( A & Obj ) { x = Obj.x; }; 

	virtual void print () { cout << "X = " << x << endl; }
	int getx ( void ) { return x; } 
};

class B : public A 
{
	int y; 

public : 

	B () { A ( 0 ); y = 0; }
	// B ( int a , int b ) { A ( a ); y = b; }
	B ( int a , int b ) : A ( a ) { y = b; }
	// B ( B & Obj ) : A ( Obj.x ) { y = Obj.y; }
	B ( B & Obj ) : A ( Obj.getx () ) { y = Obj.y; } 

	virtual void print () { A :: print (); cout << "Y = " << y << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
	A Obj1; Obj1.print (); 
	A Obj2 ( 2 ); Obj2.print (); 
	A Obj3 ( Obj2 ); Obj3.print (); 

	A * Ptr1 = new A (); Ptr1->print (); 
	A * Ptr2 = new A ( 3 ); Ptr2->print (); 
	A * Ptr3 = new A ( * Ptr2 ); Ptr3->print ();

	return 0;
}

أنا بعرف إنه هذي الطريقة يلي إستخدمتها أستخدمها عندما إريد مناداة

الباني الخاص بالأب

و لكن شو ممكن تخبرني عن هذه الطريقة

و لاحظ أن مترجم اللغة أعطاني خطأ في إحدى التعبيرات و لم يعطيني

خطأ في التعبيرات الأخرى

و شكرا لحسن تعاونكم جميعا  :rolleyes:

فى الحقيقه لا اعرف ماذا تحاول ان تفعل هنا لانك تحاول إنشاء عناصر من كلاس من نوع virtual ولا اعتقد ان الكمبايلر يسمح بذلك ياريت توضح اكثر.

المفروض إذا اردت إستخدام هذا النوع من الكلاس تقوم بعمل التالى:

A * Ptr1 = new B (); Ptr1->print ();

على سبيل المثال.

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

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

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

#21

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

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

#include <iostream>
#include <conio>
const int x=9;
class a
{
private:

const int *qw;
public:
a()
{
qw=&x;    }
void print()
{   cout<<" x=\t"<<*qw<<"\n"; }

/*void sum()
{     }*/

};
void main()
{

a b;
b.print();
//b.sum();
getch();
}

اة على فكرة ايضا من كود الاخ أحمد ان ممكن تكتب الconstructor بطريقتين

اولها دوى طريقة الاخ أحمد كما موضح ف المثال

class a
           {
            int x;
            a(int y):x(y)  {  /*empty body */  }
           };

اما الطريقة الثانية قد سبق شرحها

وأدى يا سيدى تصحيح الخطأ اللى ف البرنامج السابق

int main(int argc, char* argv[])

ضعة مكان ال main وبأذن الله لا تجد أى أخطأء

أما عن السؤال بتاع الvirtual أأسف على عدم الاجابة علية حيث انى ناسى الvirtual خالص (أخر مرة كنت شغال بالvirtual منذ خمسة أشهر)

ولكن يعنى ممكن اوضح ليك شوية حاجات انا فاكرها

ان الvirtual عبارة عن شيى وهمى اى اخل الدالة وهمية بمعنى ان انا ممكن استدعيها من الclass اللى انا عاوزوة

وأيضا اما عن اجابة الاخ الباشمهندس فى صحيحة بس ممكن اعمل interface فى السى عن طريق الpure virtual fnction

دى مرحلة متطورة عن الvirtual

اقتباس
لكن سؤالي لك إذا في مجال

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

ما هو الحل علما أنه يمكن تغير x في لحظة بناء الكائن

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

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#22

شكرا لكم جمميعا على هذا التجاوب الجميل

اقتباس
لكن سؤالي لك إذا في مجال

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

ما هو الحل علما أنه يمكن تغير x في لحظة بناء الكائن

جاوبني عليه الأخ أحمد

A ( ) : ( x = 5 ) { /* The body */ }

بالنسبة لسؤال الخطأ يلي أشرت له في أخر مداخلة

هو التالي

B () { A ( 0 ); y = 0; }
// B ( int a , int b ) { A ( a ); y = b; }
B ( int a , int b ) : A ( a ) { y = b; }

نلاحظ إنه مترجم اللغة أعطاني خطأ على العبارة الثانية

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

لكتابة العبارة الثانية أسفلها

برأيكم ليه أعطاني المترجم هذا الخطأ !

أخي أحمد الي أنا حاولت أكتبه في main

هو عبارة عن مؤشر إلى الأب يؤشر إلى الأبن

فأي مؤشر إلى الصنف الأب يؤشر إلى أي صنف إبن :)

شكرا لكم

و اغذرنا على هذا الشيئ صباعك ياخذ ايدك :D :lol:

#23

السلام عليكم

// B ( int a , int b ) { A ( a ); y = b; }
B ( int a , int b ) : A ( a ) { y = b; }

فى هذه الحاله لايوجد constructor فى كلاس A ياخذ عنصرين لذلك لابد ان تحدد عند إنشاء الكائن ماهو الconstructor الذى ترغب فى ان يستخدمه.

إذا وضعت constructor الاب داخل الbody هاكذا

 B ( int a , int b ) { A ( a ); y = b; }

مايحدث هو ان الكائن ينشاء اولاً ثم يقوم الconstructor بتنفيذ ما بداخل القوسين, ولكن لإنشاء الكائن وقبل تنفذ ما بداخل القوسين لابد من إستدعاء constructor الاب, والسؤال هو اى constructor سيقوم الكائن بإستخدامه, حيث انه لا يوجد constructor فى كلاس الاب ياخذ مدخلين , الحل هو تحديد الconstrucor قبل تكوين الكائن.. وذلك بوضعه فى الinitilizing list.

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

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

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

#24

طيب طيب

شكرا لك و أسفين على تعبك معنا

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

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