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

الربط بين Arrays و ال Pointers ...

مغلق
بدأه المشتاقة للرحمن في 15 ديسمبر 2007 · 27 رد · 2,136 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عشر مباركة عليكم...

عندي مشروع..و هذه تفاصيله

يتكون من مجموعة من classes

1\student وهو abstract class

و مشتق منه part time و full time

2\full time

3\part time

4\ course

و يحتوي على data member

student**students

5/date

فأريد أن أضع فيmain لوب لمجموعة من الطلاب

و المطلوب أن انشيء مصفوفة من مؤشرات الطلاب داخل main...

و سؤالي كيف أجعل المؤشر يؤشر على كل كائن و يخزن المعلومات فيه؟؟؟؟؟؟؟؟

أرجوكم ساعدوني اليوم

#2

اكتبي محاولتكي كامله والمطلوب مع المحاوله.

وسنساعدكي قدر الامكان ان شاء الله.

tvquran_6.gif

#3

حاولت كثيرا...دون فائدة

و اصلا لم نتعمق في دراسة المصفوفات مع المؤشرات ..

لكن لو كان دالة استطيع اجعل المؤشر يستدعي الدالة...لكن مع الكائن مستحيل..

و المشكلة لا استطيع اضع مشروعي هنا..

#4

المثال التالي يشرح الفكرة المطلوبه:

[background=black]
#include<iostream>
#include<string>
using namespace std;

class A
{
public:
 int arab()
 {
  cout<<"I In Class A"<<endl;
  return 0;
 }
 void name(string str)
 {
  cout<<str<<endl;
 }
};
class B : public A 
{
public:
 int arabteam()
 {
  cout<<"I in Class B"<<endl;
  return 0;
 }

};



int main()
{
  A s1;       // متغير من الكلاس الاول
  B s2;       // متغير من الكلاس الثاني
  A *p;        //مؤشر للكلاس الاول 
  B *g;        //موشر للكلاس الثاني
  p=&s1;     //وضعت عنوان المتغير الاول في الموشر  و يجب ان يكون من نفس الفئة  
  p->arab();  // ->      s1.arab()
  p->name("Arab Team");  //  s1.name("Arab Team")
  g=&s2;                         //وضعت عنوان المتغير الثاني في الموشر
  g->arab();     // نفس السابق
  g->arabteam();
  g->name("123456"); 

}






[/background]
tvquran_6.gif

#5

أثابك الله و أجزل لك المثوبة...

هذه جدا واضحة و المثال واضح..

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

على العموم شكرا لتعاونك..

#6

اذا كان فهمي للسؤال صح.

فعليك ان تستخدم تعدد الأشكال .

يعني تجعل الصف STUDENT يحتوي على تابع وتجهل هذا التابع ظاهري VIRTUAL وتعيد تعريف التابع

داخل كل صف مشتق من الصف الأساس STUDENT.

اتمنى ان هذا قصدك من السؤال .

أتراك عين والعيون لها مدى *** ماجاوزته ولامدى لمداكا

إن لم تكن عيني تراك فإنني *** في كل شيء أستبين علاكا

يامنبت الأزهار عاطرة الشذى *** هذا الشذى الفواح نفح شذاكا

يامجري الأنهار ماجريانها *** الا انفعالة قطرة لنداكا

يارب هذا العصر الحد عندما *** سخرت ياربي له نعماكا

او مادرى الانسان ان جميع ما *** وصلت اليه يداه من نعماكا

لو شئت ياربي هوى صاروخه *** او لو أردت لماستطاع حراكا

فليرض عني الناس او فيسخطوا *** انا لم اعد اسعى لغير رضاكا

ذقت الهوى مرا ولم اذق الهوى *** يارب حلوا قبل ان اهواكا

يارب عدت الى رحابك تائبا *** مستسلما مستمسكا بعراكا

اتردني وترد صادق توبتي؟ *** حاشاك ترفض تائبا حاشاكا

فأقبل دعائي واستجب لرجاوتي*** ماخاب يوما من دعا ورجاكا

ياايها الإنسان مهلا مالذي *** بالله جل جلاله أغراكا؟

فاسجد لمولاك القدير فإنما *** لابد يوما تنتهي دنياكا

---------------------------------------------------------------

لا إله إلا أنت سبحانك إني كنت من الظالمين

#7

الاخت العزيزة المشتاقة للرحمن ..

الفرق عند استخدام الكائن كمؤشر عن استخدامه ككائن اعتيادي في الكود هو استخدام الرمز البرمجي ( <- ) (فهو يرمز للتأشير ) الذي يشبه السهم ..

لديك البرنامج التالي وهو يوضح كلاس بسيط يعرف له كائنين الاول اوبجكت عادي والثاني اوبجكت مؤشر له في الmain .

#include <iostream> 
using namespace std; 

class myClass { 
  int num; 
public: 
  void set_num(int val) { 
	 num = val; 
  } 
  void show_num(){ 
	 cout << num << endl; 
  } 
}; 

int main() 
{ 
  myClass ob[2], *objectPointer; 

  ob[0].set_num(10);			  // access objects directly 
  ob[1].set_num(20); 

  objectPointer = &ob[0];		 // obtain pointer to first element 
  objectPointer->show_num();	  // show value of ob[0] using pointer 

  objectPointer++;				// advance to next object 
  objectPointer->show_num();	  // show value of ob[1] using pointer 

  objectPointer--;				// retreat to previous object 
  objectPointer->show_num();	  // again show value of ob[0] 

  return 0; 
}

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

myClass ob[2], *objectPointer;

تم في هذا الكود تعريف كائنين كما قلنا مسبقا الاول ob وهو مصفوفة تتالف من ثلاثة مواقع 0 و 1 و 2 .

ob[0].set_num(10);			 
  ob[1].set_num(20);

في هذا الكود نستدعي الدالة العضو set_num لتخزن الرقم 10 في الموقع 0 للكائن . ونستدعيها مرة اخرى لتخزن الرقم 20 في الموقع الثاني اي الموقع 1 من المصفوفة الكائن ..

اتوقع انه لهنا واضح كل شئ ..

objectPointer = &ob[0];		
  objectPointer->show_num();

في هذا الكود تم استخدام الكائن المؤشر لاخذ عنوان المصفوفة الكائن ob للموقع صفر اي اول موقع فيها ..

وعدها لغرض استعمال المؤشر مع الكائن كما قلت سابقا الفرق سيكون باستعمال الرمز <- بدلا من الدوت ( . ) عند تعيين الخصائص او الدوال الاعضاء .. وفي السطر الثاني من هذا الكود تم استدعاء الدالة الخاصة بالطبع المبرمجة في الكلاس اعلاه لغرض طباعة ما يؤشر عليه المؤشر الكائن . وهنا يؤشر الى الموقع الاول في المصوفة الكائن ob .

نصل الى الكود التالي ..

objectPointer++;			   
  objectPointer->show_num();

في السطر الاول تم زيادة المؤشر الكائن بواحد .. وبذلك فهو سيؤشر الى الموقع الثاني اي الموقع (1) لانه سابقا كان يؤشر على الموقع صفر وبعد الزيادة اصبح يؤشر على الموقع واحد . ثم تم استدعاء الدالة العضو عن طريقة المؤشر الكائن في السطر الثاني باستخدام الرمز البرمجي <- لغرض الطباعة وهنا سيطبع الرقم 20 لانه هو المخزون في الموقع الثاني من المصفوفة الكائن .

objectPointer--;			 
  objectPointer->show_num();

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

وعند استدعاء دالة الطبع بنفس الطرق السابقة فانه سيتم طباعة الرقم 10 لانه اصبح يؤشر الى الموقع صفر .

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

او يمكن ان تحليه بصورة كاملة ..

واي شئ اخر تطلبيه شرح او غموض انا حاضر في الخدمة ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#8

شكرا لك أخ سنان

أسعدك الله في الدنيا و الآخرة و رزقك ما تتمنى و ماتريد..

شرح واضح و ممتع لكن المعذرة لم يكن هذا سؤالي..لأني احس سؤالي غامض..

لكن استفدت كثيرا من الشرح

#9

البرنامج المطلوب سهل على مايبدو .

اذا جعلنا الصف student صف أساسي وجعلنا ضمنه تابع عضو ظاهري ثم قمنا باشتقاق صفوف من الصف student

وداخل كل صف من الصفوف المشتقة عرفنا تابع اسمه نفس اسم التابع الظاهري الموجود بالصف الأساسي student

وجعلناه يؤدي مهمه معينه خاصه بكل صف مشتق .

ثم قمنا بعمل مصفوفة من الصف student من المؤشرات وقمنا بتعيين عنوان كائن مشتق من كل صف من الصفوف المشتقة للعنصر من المصفوفة ثم استدعينا عناصر المصفوفة من خلال حلقة فور فإن سيم استدعاء التابع المناسب لكل صف مشتق.

وجاؤي البحث عن مثال ان شاء الله يوضح الفكرة وسيتم اضافته باقرب فرصة .

أتراك عين والعيون لها مدى *** ماجاوزته ولامدى لمداكا

إن لم تكن عيني تراك فإنني *** في كل شيء أستبين علاكا

يامنبت الأزهار عاطرة الشذى *** هذا الشذى الفواح نفح شذاكا

يامجري الأنهار ماجريانها *** الا انفعالة قطرة لنداكا

يارب هذا العصر الحد عندما *** سخرت ياربي له نعماكا

او مادرى الانسان ان جميع ما *** وصلت اليه يداه من نعماكا

لو شئت ياربي هوى صاروخه *** او لو أردت لماستطاع حراكا

فليرض عني الناس او فيسخطوا *** انا لم اعد اسعى لغير رضاكا

ذقت الهوى مرا ولم اذق الهوى *** يارب حلوا قبل ان اهواكا

يارب عدت الى رحابك تائبا *** مستسلما مستمسكا بعراكا

اتردني وترد صادق توبتي؟ *** حاشاك ترفض تائبا حاشاكا

فأقبل دعائي واستجب لرجاوتي*** ماخاب يوما من دعا ورجاكا

ياايها الإنسان مهلا مالذي *** بالله جل جلاله أغراكا؟

فاسجد لمولاك القدير فإنما *** لابد يوما تنتهي دنياكا

---------------------------------------------------------------

لا إله إلا أنت سبحانك إني كنت من الظالمين

#10

أثابك الله الفدرالي..و جزاك الله خير الجزاء..

بانتظار المثال حتى يتضح لي ماشرحته لي..

#11
 #include <iostream.h>

class Student
{

public:
	virtual void Name() 
	{
		cout << "Student: ";
	} 
};

هذا الصف اسمه Student ويحتوي على تابع ظاهري لأننا وضعنا امامه virtual

ويطبع هذا التابع الكلمة "Student:" .

class A : public Student
{

public:
	virtual void Name()
	{
		Student::Name (); 
		cout << " A\n"; 
	}
};

هذا الصف اسمه A وهو مشتق من الصف Student وداخله تابع اسمه نفس اسم التابع الموجود بالصف الأول(Student) وداخل التابع نستدعي التابع الموجود بالصف الأساسي من خلال تحديده بالطريقة

Student::Name();

مما يؤدي لاستدعاء التابع الموجود بالصف الأساسي.

ثم نطبع بعد ذلك اسم الصف الحالي وهو A.

class B :public Student
{

public:
	virtual void Name() 
	{ 
		Student::Name(); 
		cout << " B\n"; 
	}
};

هذا نفس الصف السابق بالظبط بس الفرق بطباعة اسمه هو B

void main()
{
	A a;
	B b;

	Student *s[2];
	s[0] = &a;
	s[1] = &b;

	for ( int i = 0; i < 2; i++ )
		s->Name();
}

اشتقينا الكائن a من الصف A

وكذلك b من B .

هنا :

	Student *s[2];

أعلنا عن مصفوفة مؤشرات للصف Student

ثم :

	s[0] = &a;
	s[1] = &b;

اسندنا للمؤشرين عنوان الكائنين وهذا مسموح به لأن الصف A (هو) Student

يعني العلاقة بينهما علاقة (هو) مثل كائن الذي اسمه (الحاسب) (هو) كائن من الصف الأساسي الحواسب الآلية .

هنا :

	for ( int i = 0; i < 2; i++ )
		s->Name();

حلقة for نستدعي فيها من خلال المؤشرات التابع Name() وبالتالي يتم استدعاء التابع المناسب لكل صف مما يؤدي لطباعة اسم التابع المناسب .

هذا الصفوف صفوف بسيطه لتوضيح الفكرة من البرنامج .

اتمنى ان يكون هذا هو المطلوب ونعتذر مقدما اذا كان فهنا السؤال بالخطأ .

وبالتوفيق للجميع .

أتراك عين والعيون لها مدى *** ماجاوزته ولامدى لمداكا

إن لم تكن عيني تراك فإنني *** في كل شيء أستبين علاكا

يامنبت الأزهار عاطرة الشذى *** هذا الشذى الفواح نفح شذاكا

يامجري الأنهار ماجريانها *** الا انفعالة قطرة لنداكا

يارب هذا العصر الحد عندما *** سخرت ياربي له نعماكا

او مادرى الانسان ان جميع ما *** وصلت اليه يداه من نعماكا

لو شئت ياربي هوى صاروخه *** او لو أردت لماستطاع حراكا

فليرض عني الناس او فيسخطوا *** انا لم اعد اسعى لغير رضاكا

ذقت الهوى مرا ولم اذق الهوى *** يارب حلوا قبل ان اهواكا

يارب عدت الى رحابك تائبا *** مستسلما مستمسكا بعراكا

اتردني وترد صادق توبتي؟ *** حاشاك ترفض تائبا حاشاكا

فأقبل دعائي واستجب لرجاوتي*** ماخاب يوما من دعا ورجاكا

ياايها الإنسان مهلا مالذي *** بالله جل جلاله أغراكا؟

فاسجد لمولاك القدير فإنما *** لابد يوما تنتهي دنياكا

---------------------------------------------------------------

لا إله إلا أنت سبحانك إني كنت من الظالمين

#12

اختي المشاقة للرحمن اهلا بكي ..

اعلم انه ردي والمثال والشرح هي ليست سؤالك ... ولكن الغرض الاساسي من وراءه لتفهمي المؤشر الكائن وطرق التعامل معه ومع الكائن المصفوفة .. لكي يساعدك في البرنامج المطلوب ..

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

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

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

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#13

بارك الله فيكم

الفدرالي و سنان..

كفيتم و وفيتم

و هذا جزء من السؤال..بناء على رغبتكم..و أنا فهمته مثل ماذكرته سابقا

In the main , you must test the polymorphism by defining an array of student pointers of fixed size. Then, upon your choice or the user choice during the runtime we know that the first index for example will point to an object of type full time student and the second one will point to an object of type part time student and so on.

و قريبا بإذن الله سأرفق محاولاتي..لكن قد لا يتضح ما اقصد الا برؤيتكم للمشروع كامل لأنه في course class يوجد dynamic arrayللطلاب

تم تعديل هذه المشاركة بواسطة المشتاقة للرحمن في 17 ديسمبر 2007 في 14:53

#14

اختي المشتاقة لا شكر على واجب ..

حسب ما فهمت من الجزء الذي وضعتيه ..

انتي دمرتي السؤال في بداية الموضوع .. لانك لم تذكري عبارة

In the main , you must test the polymorphism by defining an array of student pointers of fixed size

فقط ذكرتي المصفوفة والمؤشر ..

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

وهو شئ وما ذكرته انتي سابقا شئ ثاني ..

انا لحد الان لست متاكدا لان السؤال بصراحة لم افهمه جيدا..

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

هنا صفحة المقالة ..

تحياتي العطرة , .. . .

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#15

جزاك الله خير الجزاء..أخ سنان

و آآآسفه للجميع لعدم توضيح سؤالي...

اما بالنسبة لسؤالي بدأت تتضح لي الفكرة لكن المشكلة أني كنت اشتغل على برنامج eclipse

و كان حلي صحيح ..لكن البرنامج eclipse c++ بعد فرمتة الجهاز انحذف و عندما اعدت تثبيته لا يعمل run ولا debug

وانا الآن اشتغل على visual c++6 لكن ظهر عندي 14خطأ و البرنامج صحيح ..فلم استطع ان اغير main

بأن اضع ليسته للستيودنت

فأرجوكم لو توضحون لي الخطأ..لأني متأكده أن حلي صحيح بعد تجريبه في برنامج eclipse c++

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

أرجوكم..

Stuent.rar

#16

السلام عليكم ,,

هل يمكنك تحميل الملفات كاملة بما فيها الـ Date و Course على شكل ملفات h. إضافة للملف الرئيسي على شكل cpp. كلها مضغوطة في ملف واحد حتى نرى ما هي الأخطاء التي لديك,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 26 ديسمبر 2007 في 02:08

#17

و عليكم السلام و رحمة الله و بركاته

ان شاء الله..و شكرا لك على مبادرتك الطيبة

ssssssss.rar

#18

السلام عليكم ,,

البرنامج يعمل لدي ,, :hmm:

المترجم أعطاني warnings لأنه لا يوجد سطر فارغ آخر الملفات ,, فقط ,,

البرنامج يعمل بشكل سليم على ++g و انا استخدم codeblocks

أنا أقصد أنه لا يوجد أخطاء أما منطق البرنامج فلم أتابعه ,, إن كان هناك مشكلة في النتائج يمكن أن تطلعينا عليها ,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 26 ديسمبر 2007 في 03:03

#19

ايضا لدي شغلت البرنامج 3 تحذيرات بدون اخطاء والبرنامج يعمل.

الكومبايلر vc2008

tvquran_6.gif

#20

أثابكم الله ..و جزاكما خير الجزاء

غريب..لماذا يوجد عندي أخطاء باستخدام visual c++6????

هذه رسائل الخطأ:Course.cpp

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.h(8) : error C2258: illegal pure syntax, must be '= 0'

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.h(8) : error C2252: 'FullTimeMaxCredits' : pure specifier can only be specified for functions

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.h(9) : error C2258: illegal pure syntax, must be '= 0'

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.h(9) : error C2252: 'PartTimeMaxCredits' : pure specifier can only be specified for functions

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.h(8) : error C2258: illegal pure syntax, must be '= 0'

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.h(8) : error C2252: 'FullTimeMaxCredits' : pure specifier can only be specified for functions

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.cpp(4) : error C2065: 'FullTimeMaxCredits' : undeclared identifier

PartTime.cpp

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.h(9) : error C2258: illegal pure syntax, must be '= 0'

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.h(9) : error C2252: 'PartTimeMaxCredits' : pure specifier can only be specified for functions

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.cpp(4) : error C2065: 'PartTimeMaxCredits' : undeclared identifier

main.cpp

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.h(9) : error C2258: illegal pure syntax, must be '= 0'

c:\program files\microsoft visual studio\myprojects\tttttt\parttime.h(9) : error C2252: 'PartTimeMaxCredits' : pure specifier can only be specified for functions

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.h(8) : error C2258: illegal pure syntax, must be '= 0'

c:\program files\microsoft visual studio\myprojects\tttttt\fulltime.h(8) : error C2252: 'FullTimeMaxCredits' : pure specifier can only be specified for functions

Error executing cl.exe.

ما الحل؟؟؟

هل أحمل vc2008...أرجوكم ساعدوني..

#21

بالنسبة للأخطاء التي تتعلق بـ 0= فهذه أخطاء حول الـ Pure Virtual Funtions و لكنها لم تظهر لدي :huh: ,

على كل لماذا لا تقومي بتحميل codeblocks فهو رائع و خفيف,

يمكنك تحميل النسخة rc2 و التي يمكنك تنزيلها مباشرة على جهازك أو أن تقومي بتحميل الملفات الأحدث يدوياً, لك الخيار,

تحياتي ,,

#22

رزقك الله التوفيق و السداد في الدنيا و الآخرة...

سأحمل هذا البرنامج بإذن الله...

و حملت الآن visual c++2008

و يختلف عن الاصدار السابق قليلا سأحاول افتح بروجكت ..

#23

الحمدلله ضبط على visual c++2008

شكرا لكم جميعا..زادكم الله من فضله

#24

السلام عليكم..

مساء الخير..

كان سؤالي من قبل عن تطبيق بولي مور فيزم..و عمل قائمة للطلاب..

و طلبتم ان اضع محاولاتي..

و الحمدلله توصلت للحل..لكن ظهر عندي 2logic error

فأرجوكم ساعدوني..في فكرة حلها

و الخطأ وضحته في الملف المرفق هنا..أما باقي الملفات فنفس التي ارفقت سابقا

#25
Main.rar

تم تعديل هذه المشاركة بواسطة المشتاقة للرحمن في 27 ديسمبر 2007 في 18:22

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

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