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

كيف اقوم بارجاع مصفوفة 2d ؟

بدأه مجلـد جديـد في 19 أبريل 2008 · 9 رد · 1,039 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد ان ارسل مصفوفة ذات حجم محدد مثل

 array[3][4]

الى دالة تقوم بالتعديل على اول عنصر ثم تقوم بارجاع المصفوفة كاملة الى الدالة الcaller بحيث اقوم باستخدام المصفوفة المسترجعة ك parameter لمناداة دالة اخرى .

بعد ذلك اقوم باسناد المصفوفة كاملة الى مصفوفة local معرفة في main .

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

const int ROW = 3;
const int COL = 4;

void print( int [][COL], char );
int modifyFirstElement( int [][COL] );
int modifySecondElement( int[][COL] );

int main()
{
	int array[ROW][COL];

	for ( int i=0; i < ROW; i++ )
		for ( int j=0; j < COL; j++ )
			array[j]=0;

	array[][COL] = modifySecondElement( modifyFirstElement( array ) );

	print( array , 'A');

	system("PAUSE");
	return 0;
}

void print( int a[][COL], char type )
{
	cout <<"TYPE: " << type << endl;

	for ( int i=0; i < ROW; i++ )
		for ( int j=0; j < COL; j++ )
			cout << a[j] << endl;
}

int modifyFirstElement( int a[][COL] )
{
	a[0][0]= 1;
	return a[][COL];
}

int modifySecondElement( int b[][COL])
{
	b[0][1] = 2;
	return b[][COL];
}

البرنامج يظهر العديد من الاخطاء ، لذلك اتوقع اني لم احسن استخدام المصفوفات .

ملاحظة: لا اريد استخدام pointers ، انا الآن احاول عمل ذلك بدون استخدام اي مؤشر ، في حال كون ذلك مستحيل فارجو معرفة الطريقة باستخدام المؤشرات.

#2

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

ولى ملحوظة

هو ان الكتاب الذى فى التوقيع الخاص بك اللينكات التى تخصه لا تعمل :(

فياريت توفره فى اى مكان وجزاك الله خيرا

#3

السلام عليكم :

هذا مثال بسيط لجمع مصفوفتين مستطيله 3*2.

#include<iostream>
using namespace std;
 typedef struct  {int index[3][2];}Matrix3X2;

Matrix3X2 func(int a[3][2],int b[3][2])
{
 Matrix3X2 t;
t.index[0][0]=a[0][0]+b[0][0];
t.index[0][1]=a[0][1]+b[0][1];
t.index[1][0]=a[1][0]+b[1][0];
t.index[1][1]=a[1][1]+b[1][1];
t.index[2][0]=a[2][0]+b[2][0];
t.index[2][1]=a[2][1]+b[2][1];


 return t;

}

int main()
{
int a[3][2];
int b[3][2];
Matrix3X2 c;
cout<<"Enter A :\n";
cin>>a[0][0]>>a[0][1]
   >>a[1][0]>>a[1][1]
   >>a[2][0]>>a[2][1];

cout<<"Enter B :\n";
cin>>b[0][0]>>b[0][1]
   >>b[1][0]>>b[1][1]
   >>b[2][0]>>b[2][1];

cout<<"A+B ="<<endl;
c = func(a,b);

for(int i=0;i<3;i++)
{
   for(int j=0;j<2;j++)
   cout<<c.index[j]<<" ";  
	  cout<<endl;
}

getchar();
return 0;
}

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 19 أبريل 2008 في 19:09

tvquran_6.gif

#4

eq1

للاسف سرعة الرفع عندي ضعيفة جدا ولا استطيع رفع الملف .

لكن الكتاب هذا منتشر بكثرة في مواقع الانترنت ، ابحث في 4shared او في التورنت وسوف تجده باذن الله

وانا افضل اقتناء الكتاب لانه ممتاز جدا

فهد الشلوي

شكرا لك على الطريقة ، ادخلت مفهوم object oriented لكن باستخدام struct ، هل هناك فرق بين عمل class او struct لنفس المحتويات هذه :

int index[3][2];

؟

#5

حياك الله اخوي لا يوجد فرق اذا اردت اكتب:

class   Matrix3X2 
 {  public:
  int index[3][2];
 };
tvquran_6.gif

#6

لا يوج فرق إلا في شيء واحد..

الحالة الافتراضية للبيانات والدوال في struct هي public

بينما الحالة الافتراضية للبيانات والدوال في class هي private

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

#7

اذا لماذا لغة C لا تعتبر Object Oriented اذا كانت تحتوي على struct ؟!

هل هو بسبب غياب المفاهيم الأخرى مثل inheritance و operator overloading ؟

#8
مجلـد جديـد كتب:
اذا لماذا لغة C لا تعتبر Object Oriented اذا كانت تحتوي على struct ؟!

هل هو بسبب غياب المفاهيم الأخرى مثل inheritance و operator overloading ؟

السلام عليكم

--------

مفهوم Object-Oriented Programming ممكن محكاته بلغة C.. وكون لغة C ليست داعمة لهذا المفهوم فهو لا يعني استحالة تصميم برنامج او نظام بهذا المفهوم بواسطة لغة C.. ولكن لغة ++C تدعم هذا المفهوم مباشرة وبسهولة..اي ان الفرق هو المباشرة والسهولة في البرمجة بهذا المفهوم بين لغة تدعم ولغة لا تدعم

(الكلام سارقته من مؤلف لغة ++C العالِم Bajren Stroustrup) :happy:

----------

بالطبع الصعوبة تشمل ايضاً مفهوم inheritance و Operator Overloading كمان

---------

اطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#9

السلام عليكم

اولا لست فى حاجة لارسال المصفوفة واعادة ارجاعها حيث انها تعتبر حالة خاصة

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

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

ruturn

كما يجب عليك تعريف قيمة المصفوفة فى الـ functions التى تقوم باستقبالها

وذلك لان المصفوفات يجب ان تاخذ قيمة معرفة فى البداية

اما اذا اردت ان تعرف مصفوفة فى ال run time يمكن ذلك من خلال المؤشارت فقط

#include "stdafx.h"
#include "iostream.h"
void getx(int x[5][5]);
int modifyfristElement(int x[5][5]);
int modifySecondElement(int x[5][5]);
int main(int argc, char* argv[])
{

int x[5][5];
getx(x);
modifyfristElement(x);
modifySecondElement(x);

for(int i=0;i<5;i++)
 {
  for (int s=0;s<5;s++)
  cout<<x;
 }
 return 0;
}
void getx(int x[5][5])
{
 for(int i=0;i<5;i++)
 {
  for (int s=0;s<5;s++)
  cin>>x;
 }
}

int modifyfristElement(int x[5][5])
{
 x[0][0]=1;
return 0;
}
int modifySecondElement(int x[5][5])
{
 x[0][1]=2;
 return 0;
}

تم تعديل هذه المشاركة بواسطة عمرو البحر في 22 أبريل 2008 في 23:38

#10
عمرو البحر كتب:
السلام عليكم

اولا لست فى حاجة لارسال المصفوفة واعادة ارجاعها حيث انها تعتبر حالة خاصة

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

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

ruturn

كلام جميل جدا.. وبمعنى اخر فان استدعاء المصفوفات في C/C++ هو دائما call by reference ولست بحاجة لارجاع قيم فكل تغيير في المصفوفة داخل الدالة يغيير المصفوفة الاساسية.

الخيل والليل والبيداء تعرفني ::: والثور والبغل والاغنام والبقرُ

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