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

من اللي عنده إستعداد يكتب معاي مشروع في ال data structure

مغلق
بدأه saud_1 في 18 يونيو 2003 · 14 رد · 1,438 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أذا كان فيه أحد عنده إستعداد فأنا راح أحط المشروع في المنتدى

بحيث نضع ال ADT ونشوف أحسن تمثيل يمكن أن نمثل فيه هذا المشروع

وأخيرا ً نكتب المشروع داله داله حتى نخلص

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

#3

انا معك بس كل شئ بحقه :D عاد لاتصدق امزح معك .... انادرست مادتين عن data structure

#4

فكرة هذا المشروع هي تمثيل مضفوفه (MATRIX) أو أكثر وتخزينها في الذاكره

ثم إجراء بعض العمليات عليها مثل الجمع والضرب

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

100,000

لذا سوف نخزن في الذاكره فقط الأرقام التي ليست صفرا ً

  1    2    3    4



1  



2       16        22



3            55



4       11

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

row   column  value

2      2        16

2      4        22

3      3        55

4      2        11

العمليات المطلوبه :

1- readmat

أدخال مصفوفه والمدخلات هي

أ- أسم المصفوفه

ex:

Matrix name : AAA

ب- أبعاد المصفوفه

ex:

Dimension (# rows, # columns) : 4 6

ج- قيم المصفوفه وراح يكون إدخالها على هذه الصوره

(row , column , value )

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

2  2  16

2- transpose

تبديل الصفوفه بالأعمده والأعمده بالصفوف

3- ADD

جمع مصوفتين ووضع الناتج في مصفوفه ثالثه

4- SUB

طرح مصفوفتين ووضع الناتج في ثالثه

5- MULT

ضرب مصفوفتين ووضع الناتج في ثالثه

6- SHOW

عرض القيم غير الصفريه لمصفوفه والعرض يكون على نفس صورة الإدخال

هذا هو كل المشروع

وعلى فكرة هذا المشروع يعتبر مشروع سهل نسبيا

#5

التمثيل العام للبرنامج :

سوف يعتمد التمثيل التالي على أننا سوف نبني صف class اسمه MATRIX يحتوي على ما يلي :

template<class T> class CMatrix

{

    friend ostream & operator <<(ostream &, const CMatrix &);

    friend istream  & operator >>(istream &, CMatrix &);

   private:

	int rows;

	int cols;



	T * TArray;



void  SetDimension(int rows, int cols);

  void   ReadValues(int nbRow, int nbCol, T val );

   public:

	CMatrix(void);

	Virtual ~ CMatrix(void);



	void ReadMatrix();

	void TransePos();

	void Print();



	CMatrix & operator +(const CMatrix &, const CMatrix &);

	CMatrix & operator –( const CMatrix &, const CMatrix &);

	CMatrix & operator *( const CMatrix &, const CMatrix &);

	CMatrix & operator /( const CMatrix &, const CMatrix &);



	int operator ==(const CMatrix &) const;

	int operator !=(const CMatrix &) const;

};

هذا الصف سوف يكون عبارة عن قالب يقبل أي نوع من المصفوفات ( int, char, float, long, double )

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

العمليات على المصفوفات سوف تكون عبارة عن تحميل زائد للعمليات OverLoading :

CMatrix M1, M2, M3;

M3 = M1 + M2;

M3 = M1 - M2; 

M3 = M1 * M2;

M3 = M1 / M2;

تم طرح الموضوع بشكل خشن لذلك أرجو المشاركة .

#6

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

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

غريبه

اختكم

لغة سي

#7

أسف جدا ً على التأخير الطويل بسب ضروف طارئه

أخ إسماعيل قبل كل كي شي وش نوع التمثيل اللي ناوي تمثلها

هل هي linked list

لا تنسى أن عملية الضرب راح تأخذ وقت طويل أذا مثلناها بواسطة ال

linked list

وبعدين ياليت تكتبها ب struct

حتى يستطيع فهمها اللي متعلم السي فقط

واللي أنا واحد منهم

#8

ماذا سيُمثل بـ list ?

أنا برأيي لا حاجة لذلك فامطلوب هو بناء نمط جديد فلماذا الـ List

على كل سأبدأ بوضع الحلول لكن أين المشاركات , فقد كان الإتفاق أن نبني كل تابع لوحده بمشاركة الجميع , أي أنا أضع حلاً وأنت تضع حلاً وهو يضع حلاً ثم نأخذ الحل الأفضل(f)

#9

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

row   column  value

2      2        16

2      4        22

3      3        55

4      2        11

في هذه الحالة يمكن عمل class للقيم

مثلا

class Index_Value

{

 private:

int x;

int y;

double value;

public:

Index_Value(int xx,int yy, double v){x=xx;y=yy;value=v;}

int getIndexX(){return x;}

int getIndexY(){return y;}

double getValue(){return value;}

void setValue(double v){value=v;}



}

ثم ادرج اي كائن من هذه الكلاس في list

ولتكن هذه list عباره عن كلاس جديد على النمط التالي

class MyList

{

private: 

int Cols,Rows;

.....//Definition a List with next



MyList(double ** matrix,int cows, int cols);//change the data in List

OutMatrix();//write the Data as matrix

double** toMatrix();



Sort();

}

كما انصح استخدام الtemplete

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#10
اقتباس
كاتب الرسالة الأصلية : khwlani

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

row   column  value

2      2        16

2      4        22

3      3        55

4      2        11

طريقة اخرى

اكتب دالة تحول الindex الى string

CString Index2String(int i,int j )

{

CString str(i);

Cstring str2(j);

return( str1+"##"+str2);

}

ثم خزن البيانات في CMap

void   Mymatrix(CMap *myMap ,double **data,int rows,int cols)

{



double value;

for(int i to rows)

{

for (int j to cols)

if(data[j]!=0)

{

    CString key=SetAt(Index2String(i, j );

     myMap->SetAt(Index2String(key,data[j]);

}



}

}

بالطبع هذه ليست اكواد ولكنها خوارزميات

وللقرأة من CMap شاهد المساعدة لهذه الكلاس

ثم استخدم دالة لتحويل ال key الى index

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#11

ما رأيكم هل يُحقق المطلوب

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

على فكرة لاحظت أننا لن نحتاج إلى أبعاد المصفوفة rows - cols

على فكرة أنا أنتظر حُلولكم (f) (f)

matrix.zip

#12

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

اكمل الحل وبعد ذلك نتناقش كما ارجو ان تحاول بفكرة CMap لانك في هذه الحالة لديك المعلومات عن كل index مما يسهل لك العمليات الحسابية

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#13
   

 CString key=SetAt(Index2String(i, j );

     myMap->SetAt(Index2String(key,data[j]);

يجب ان تعدل الى

   

 CString key=Index2String(i, j );

     myMap->SetAt(key,data[j]);

ثم انشء دالة تحول ال string الى index

void  String2Index(CString str, int &i,int &j)

{

	i=-1;

	j=-1;



	if(str.GetLength()<4)

	return;

	CString ii,jj;



	int index=str.FindOneOf("##");

	ii=str.Left(index-1);

	jj=str.Right(index+2);

     

	i=atoi((char*)ii.GetBuffer(ii.GetLength()));

	j=atoi((char*)jj.GetBuffer(jj.GetLength()));



}

ارجو التاكد من عمل الدالة

اللهم انا نسألك علما نافعا ونعوذ بك من حماقة الجهلاء
#14

طيب شوف الحل هذا

اللي أستخدمت فيه ال

priority Queue

علشان أقدر أتعامل معها في عمليه الضرب بسهوله أكثر

typedef struct node

{

     int priority,col;

     double  val;

}recnode,*ptr;

typedef struct queue record

{

     ptr  fornt,last;

}*pq;

typedef struct stackrec

{

     int priority,col;

     double  val;

}*stack;

priority=row

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

في ستاك

إلى أن أنتهي من عملية الضرب بعدين ارجعها في الطابور

#15
اقتباس
كاتب الرسالة الأصلية : khwlani

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

اكمل الحل وبعد ذلك نتناقش كما ارجو ان تحاول بفكرة CMap لانك في هذه الحالة لديك المعلومات عن كل index مما يسهل لك العمليات الحسابية

ماهو لازم يطبع المصفوفه كامله أهم شي يعرض الأرقام غير الصفريه وموقعها ( row,column )

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

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