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

dynamic multidimensional arrays

مغلق
بدأه the smart programmer في 16 فبراير 2005 · 15 رد · 1,349 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

معروف

لتعريفها في الغات الأخرى (مثلاً فورتران) نكتب التالي:

real ar(m ,n)

أما في السي و السي ++ فالعبارة التالية خاطئة

int ar[m][n];

ال m و n يجب أن تكون ثابت عددي أو متغير من نوع const int

وهذا النوع من المتغيرات لا يمكن تغييره في البرنامج

لذلك نلجاء للمؤشرات لكي نعرف مصفوفة غير معلومة الأبعاد

سوف نفترض أننا نريد أن نعرف مصفوفة ذات بعدين من النوع int

نفرض أن عدد الصفوف = d1 وعدد الأعمدة = d2

int** array(int d1 ,int d2)
{
	int** m = new int*[d1];

   for(int i = 0; i < d1; i++)
        m = new int[d2];
   return m;
}

أول سطر هو رأس الدالة و الباراميترات لأبعاد المصفوفة

السطر الثاني لتعريف مصفوفة من المؤشرات عدد عناصرها d1

السطر الثالث لتعريف مصفوفة من الأعداد الصحيحة عدد عناصرها d2 لكل عنصر من عناصر المصفوفة السابقة

في بداية الأمر قد تبدو المؤشرات معقدة بعض الشيء ولكن أنظر إلى الملف المرفق

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

إن شاء الله أكون وفيت .....أدعولي

4.cpp

#2

مشكور أخوي وجزاك الله خير على الطريقة ووفيت وكفيت

والمصفوفة بهذه الطريقة سهلة تكوينها لكن الصعب هو إنك تصلح تحميل زائد operator overloading

للعملية [ ] وتخليها تقبل مصفوفة ذات بعدين طبعا هذا في لغة ++c مثال

matrix * m = new matrix(10,10);

int number = m[5][5];

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

وحبيت المشاركة معك في موضوعك ^_^

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

#3

السلام عليكم

لقد حاولت ولم أستطع

ولكن أنت لا تحتاج إلى تحميل المعامل [ ] للكلاس

يمكنك إستخدام الطريقة الموجودة في الملف المرفق في المشاركة السابقة

#4

السلام عليكم لقد عدلت على الطريقة و جعلتها تعمل عن طريق الكائنات

وأضفت أليها بعض الخواص مثل expand

أرجو إبداء رأيكم

وتنبيهي على أخطائي لأن العلم لا يأتي إلا عن طريق الخطأ و الصواب

البرنامج الكامل في الملف المرفق ولكن سوف أضع جزء منه هنا

template<class TYPE>
class array
{
       TYPE ***arr3;
        int i,j,k;
public:

array(int d1 , int d2 , int d3)
	{
  arr3 = new TYPE **[d1];
  for (i=0; i<d1; i++)
 	 arr3  = new TYPE *[d2];
  for (i=0; i<d1; i++)
 	 for (j=0; j<d2; j++)
    arr3[j]  = new TYPE[d3];
	}
void expand (int d1L , int d2L , int d3L,int d1H , int d2H , int d3H)
	{
  TYPE ***br3 = new TYPE **[d1H];
  for (i=0; i<d1H; i++)
 	 br3  = new TYPE *[d2H];
  for (i=0; i<d1H; i++)
 	 for (j=0; j<d2H; j++)
    br3[j]  = new TYPE[d3H];
  
  
  for (i=0; i<d1L; i++)
 	 for (j=0; j<d2L; j++)
    for (k=0; k<d3L; k++)
   	 br3[j][k] = arr3[j][k];
  
  for (i=0; i<d1L; i++)
 	 for (j=0; j<d2L; j++)
    delete []arr3[j];
  for (i=0; i<d1L; i++)
 	 delete []arr3;
  //delete [] *arr3;
  arr3=br3;
	}
	TYPE &set(int d1 , int d2 , int d3)
	{
  return arr3[d1][d2][d3];
	}
	TYPE get(int d1 , int d2 , int d3)
	{
  return arr3[d1][d2][d3];
	}

};

3.zip

#5

السلام عليكم

أخ smart programmer اتمنى[ ان تساعدني في برنامج يتعلق بموضوعك عن ل dynamic array

برنامجي يحجز المصفوفة عن طريق pointer to int لدلك لجات لطريقة الاخ bms بالطبع احتجت الى عمل overloading for the operator()

و انا مازلت مبتدئة في هدا الموضوع, كتبت الكود بما فيه , مع العلم اني لم اعبي المصفوفة او احاول طباعتها , لكن لدي خطا ااتمنى ان تساعدني في حله ,,و تفهمني كيف اسوي overloading بطريقة صحيحة و شكرا

// A safe array example.

#include <iostream>

#include <cstdlib>

using namespace std;

class array

{

private:

int rows;

int coloumns;

int *ptr;

public:

array();

array operator()(int ,int);

bool operator==(array );

bool operator!=(array );

friend istream &operator >> (istream &stream,array &obj);

friend ostream &operator<<(ostream &stream,array ob);

};

/***********************************/

/*****CONSTRUCTOR*****/

array::array()

{

cout<<"ENTETR NUMBER OF ROWS\n";

cin>>rows;

cout<<"ENTETR NUMBER OF COLOUMNS\n";

cin>>coloumns;

ptr = new array(rows,coloumns);

int number = ptr[rows][coloumns];

}

/************************/

/****OVERLOADING THE OPERATOR()*******/

array array::operator ()(int a,int B)

{

array result;

result.rows=a;

result.coloumns=b;

return result;

}

/*******************/

/*****OVERLOADING THE == OPERATOR*****/

bool array::operator ==(array obj)

{

if((rows==obj.rows) && (coloumns==obj.coloumns))

return true;

else

return false;

}

/***********************/

/*****OVERLOADING THE != OPERATOR*****/

bool array::operator !=(array obj)

{

if((rows!=obj.rows) || (coloumns!=obj.coloumns))

return true;

else

return false;

}

/**********************

}

/************

/

/***************/

int main()

{

array obj;

array obj2;

obj=obj2(1,2);//WILL INVOKE OPERATOR()

if(obj==obj2)

cout<<"THE TWO ARRAYS ARE EQUIVELANTS\n";

if(obj!=obj2)

cout<<"NO,THE TWO ARRAYS ARE NOT EQUIVELANTS\n";

return 0;

}

#6

السلام عليكم الخطأ في دالة البناء وأيضاً المتغير ptr يجب أن يكون تعريفه بهذه الطريقة

int **ptr;

أما بالنسبة للتحميل فأعتقد أنه صحيح

/*****CONSTRUCTOR*****/
array::array() 
{
cout<<"ENTETR NUMBER OF ROWS\n";
cin>>rows;
cout<<"ENTETR NUMBER OF COLOUMNS\n";
cin>>coloumns;
ptr = new int*[rows];
for (int i=0; i<rows; i++)
	ptr=new int [coloumns];
}

أنا آسف الملف المرفق السابق به بعض الأخطاء ولقد أصلحتها هنا

3.rar

تم تعديل هذه المشاركة بواسطة the smart programmer في 19 مارس 2005 في 01:06

#7

السلام عليكم

اخى سمارت لماذا لا تستخدم vector بدلاً من array إمكانياتها عاليه وتغنيك عن اشياء كثيره مثل iterator و insertion والكثير من الدوال المتوفره لها؟!؟

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

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

#8

السلام عليكم

صحيح ال vector رائعة ولكنها لا تدعم مصفوفة ذات أبعاد متعددة (حسب علمي)

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

وشكراً لمرورك وإبداء رأيك

#9

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

لما لا ؟؟ يمكنك تحديد vector يحتوى على object من نوع vector وبذالك يمكنك المرور على الاسطر بواصطة ال itrrator لل vector الخارجى على اساس انه الاسطر و ال iterator لل vector الداخلى على انه الاعمده, وبذالك يمكنك إنشاء قوائم باكثر من بعد. انا لم اجرب هذه الطريقه بالذات ولكنى يصعب على ان ارى مشكله فى ذالك, على كل حال ساجربها ثم اعود بالجواب اليقين إن شاء الله.

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

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

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

#10

بالنسبة للمتغير ptr* فهو اجباري في السؤال أن يكون بهده الطريقة , فكيف ينكنني العمل على هالأساس؟؟

شكرا

#11

السلام عليكم

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

ولكن فكرتي فإنها قد تكون صعبة قليلاً ولكنها تعمل على السي و السي بلس بلس

وشكرأً لك على كل حال يأخي أحمد

وأنا أنتظر رأيك

#include <vector>
#include <iostream.h>
using namespace std;

int main()
{

	vector< vector<int> > r;

	r.resize(3);  
	for (int i = 0; i<r.size(); i++) 
	{
  r.resize(5);
  for (int j = 0; j<r.size(); j++)
 	 r[j] = 10*i+j;
	}

	for (i = 0; i<r.size(); i++) 
	{
  for (int j = 0; j<r.size(); j++) cout <<r[j] << '\t';
  cout << '\n';
	}
	return 0;
}
#12

السلام عليكم

فعلاً عمل رائع مثال سهل ويشرح الفكره بطريقه ممتازه, وعملية البحث عن عنصر سهله, اما الطريقه الاولى فهى تؤدى الغرض فى لغة السى ولكن بعد التعديل اصبحت سى بلس بلس لانك اضفت class من ما يجعلها oop ;).

على كل حال حاول التعود على إستخدام الVectors لانها اسهل واريح, ونسبة الخطاء فيها اقل لانك لا تحتاج لإستخدام المؤشرات.

والسلام

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

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

#13

السلام عليكم

شكراً أخي أحمد

بالفعل الفيكتور إسستخدامها بسيط وأخطائها أقل

ولكن أنا أحب دائماً أن أسلك الطريقة الصعبة ( المؤشرات ) لكي أتعلم.

#14

السلام عليكم

مشكور اخ Smart افدت واجرت ان شاءالله

وماقصرت

انا مبتدئة وحابه اعرف اكثر عن Sorting Arrays

-Quicksort

-Shakersort

-Shell sort

-Bubble sort

يعني الفروق بينها ... :rolleyes:

والف شكر مره ثانيه

اختك لمى

#15

أخ TheSmartProgram :

إذا كنت بالفعل تريد vector (أقصد في السي) فلماذا لا تقوم بكتابة تركيب Struct يقوم بهذه العـملية .. وبإمكانك جعل الدوال أو التوابع خارجة عـن التركيب ..... وسيكون الفرق بينها وبين vector في السي بلس هـو أن الدوال في التركيب الجـديد لن تكون أعضاء فيه ... أيضاً لن يكون بإمكانك استخدام التحـميل الزائد للدوال .. مما سيجعلك تقوم بكتابة بتركيب لكل نمط بيانات .... بإمكانك أيضاً استخدام typdef لتسهيل الأمر .... في الأخير إذا ما قررت أن تقوم بكتابة هذا العـمل فبإمكانك ضمها في مكتبة وتزويدنا بها....

بالمناسبة لقد قمت أنا أيضاً بكتابة vector بسيط للغاية (في السي بلس) تستطيع أن تجـده في هذا الكتاب ... في آخر وحدة منـه:

/index.php?showtopic=74297

#16
http://www.codeguru.com/forum/showthread.php?t=297838

"خيركم من تعلم العلم وعلمه". ..........استغفر الله. ........ اللهم صلي وسلم على سيدنا محمد

احمد عبد الحميد ابوغرارة

CodeGuru CodeProject CGTalk

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

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