أذا كان فيه أحد عنده إستعداد فأنا راح أحط المشروع في المنتدى
بحيث نضع ال ADT ونشوف أحسن تمثيل يمكن أن نمثل فيه هذا المشروع
وأخيرا ً نكتب المشروع داله داله حتى نخلص
وعلى فكره هذا مشروع جامعة الملك سعود الترم الأول من هذا العام حق ال MATRIX
أذا كان فيه أحد عنده إستعداد فأنا راح أحط المشروع في المنتدى
بحيث نضع ال ADT ونشوف أحسن تمثيل يمكن أن نمثل فيه هذا المشروع
وأخيرا ً نكتب المشروع داله داله حتى نخلص
وعلى فكره هذا مشروع جامعة الملك سعود الترم الأول من هذا العام حق ال MATRIX
انا معك بس كل شئ بحقه :D عاد لاتصدق امزح معك .... انادرست مادتين عن data structure
فكرة هذا المشروع هي تمثيل مضفوفه (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
عرض القيم غير الصفريه لمصفوفه والعرض يكون على نفس صورة الإدخال
هذا هو كل المشروع
وعلى فكرة هذا المشروع يعتبر مشروع سهل نسبيا
التمثيل العام للبرنامج :
سوف يعتمد التمثيل التالي على أننا سوف نبني صف 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;
تم طرح الموضوع بشكل خشن لذلك أرجو المشاركة .
السلام عليكم ورحمة الله وبركاته
هل تصدق ان نفس هذا المشروع كان في الفصل الاول لدينا في الجامعة
غريبه
اختكم
لغة سي
أسف جدا ً على التأخير الطويل بسب ضروف طارئه
أخ إسماعيل قبل كل كي شي وش نوع التمثيل اللي ناوي تمثلها
هل هي linked list
لا تنسى أن عملية الضرب راح تأخذ وقت طويل أذا مثلناها بواسطة ال
linked list
وبعدين ياليت تكتبها ب struct
حتى يستطيع فهمها اللي متعلم السي فقط
واللي أنا واحد منهم
ماذا سيُمثل بـ list ?
أنا برأيي لا حاجة لذلك فامطلوب هو بناء نمط جديد فلماذا الـ List
على كل سأبدأ بوضع الحلول لكن أين المشاركات , فقد كان الإتفاق أن نبني كل تابع لوحده بمشاركة الجميع , أي أنا أضع حلاً وأنت تضع حلاً وهو يضع حلاً ثم نأخذ الحل الأفضل(f)
شوف المصفوفه السابقه أذا بغينى نخزنها في الذاكره راح نخزنها على الصوره التاليه
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
اقتباسكاتب الرسالة الأصلية : 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
ما رأيكم هل يُحقق المطلوب
هذه النسخة من البرنامج لا تحتوي على كل الإمكانيات, فقط بعض التوابع من أجل التعريف بكيفية التعامل مع مصفوفة أحادية تُمثل مصفوفة ثنائية .
على فكرة لاحظت أننا لن نحتاج إلى أبعاد المصفوفة rows - cols
على فكرة أنا أنتظر حُلولكم (f) (f)
البرنامج جيد لكن عند طباعة المصفوفة يجب ان يطبع مصفوفه حقيقية بمعنى ان القيم الصفرية يجب ان تطبع واضافة على ذلك المستخدم ممكن يدخل القيم الصفرية والأن فكر بالعمليات الحسابية ستواجه المشاكل الكثيره
اكمل الحل وبعد ذلك نتناقش كما ارجو ان تحاول بفكرة CMap لانك في هذه الحالة لديك المعلومات عن كل index مما يسهل لك العمليات الحسابية
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()));
}ارجو التاكد من عمل الدالة
طيب شوف الحل هذا
اللي أستخدمت فيه ال
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
والفائده من الستاك في عملية الضرب لما أسوي بحث لنود اللي أمرها مره واحده مايحتاج أمرها مره ثانيه علشان كذا أحطها
في ستاك
إلى أن أنتهي من عملية الضرب بعدين ارجعها في الطابور
اقتباسكاتب الرسالة الأصلية : khwlaniالبرنامج جيد لكن عند طباعة المصفوفة يجب ان يطبع مصفوفه حقيقية بمعنى ان القيم الصفرية يجب ان تطبع واضافة على ذلك المستخدم ممكن يدخل القيم الصفرية والأن فكر بالعمليات الحسابية ستواجه المشاكل الكثيره
اكمل الحل وبعد ذلك نتناقش كما ارجو ان تحاول بفكرة CMap لانك في هذه الحالة لديك المعلومات عن كل index مما يسهل لك العمليات الحسابية
ماهو لازم يطبع المصفوفه كامله أهم شي يعرض الأرقام غير الصفريه وموقعها ( row,column )
هذا الموضوع مغلق.