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

ضرب مصفوفتين باستخدام الدوال والمؤشرات

مغلق
بدأه مبرمجة new في 4 مايو 2006 · 17 رد · 3,589 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

#include<iostream.h>
void multiply(int *,int *);
void main()
{int i,j,a[3][4],b[4][3],*p1,*p2;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
cin>>*(*(a+i)+j);
p1=&a[0][0];
for(i=0;i<4;i++)
for(j=0;j<3;j++)
cin>>*(*(b+i)+j);
p2=&b[0][0];
multiply(p1,p2);
}
void multiply(int *p1,int *p2)
{ int i,j,k,t,c[3][3]={0,0,0,0,0,0,0,0,0};
for(i=0;i<4;i++)
for(j=0;j<3;j++)
{t=*(p2+i*3+j);
*(p2+i*3+j)=*(p2+j*4+i);
*(p2+j*4+i)=t;}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<4;k++)
c[j]+=*(p1+i*4+k)**(p2+k*3+j);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
cout<<c[j];
}
#2

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

عفوا يا أختى, ماذا تقصدين بعمل هذه ال Loop فأنا لم أفهمها

for(i=0;i<4;i++)
for(j=0;j<3;j++)
{t=*(p2+i*3+j);
*(p2+i*3+j)=*(p2+j*4+i);
*(p2+j*4+i)=t;}

[ ملاحظة ]

برجاء إستخدام التهميش Indentation .

تم تعديل هذه المشاركة بواسطة Blueteeth في 5 مايو 2006 في 03:01

#3

فعلاً كما ذكر Blueteeth

التكرار معناه غير واضح

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

و اظن هذا يعمل

#include<iostream.h>
void multiply(int *,int *);
void Display(int *pMat, int row, int col);
void main()
{
	int i,j,a[3][4],b[4][3],*p1,*p2;
	p1=&a[0][0];
	p2=&b[0][0];

	for(i=0;i<3;i++){
  for(j=0;j<4;j++){
 	 cin>>*(*(a+i)+j);
  }
	}

	for(i=0;i<4;i++){
  for(j=0;j<3;j++){
 	 cin>>*(*(b+i)+j);
  }
	}

	Display( p1, 3, 4);
	Display( p2, 4, 3);
	multiply(p1,p2);

	int dumy; cin >> dumy;
}

void multiply(int *p1,int *p2)
{
	int i,j,k,c[3][3]={0,0,0,0,0,0,0,0,0};

	for(i=0;i<3;i++){
  for(j=0;j<3;j++){
 	 for(k=0;k<4;k++){
    c[j]+=*(p1+i*4+k)**(p2+k*3+j);
 	 }
  }
	}
	Display( &c[0][0], 3, 3);
}

void Display(int *pMat, int row, int col)
{
	for(int i=0;i<row;i++){
  for(int j=0;j<col;j++){
 	 cout<< pMat[i+j*row] << "\t";
  }
  cout<< "\n";
	}
}
#4

السلام عليكم

شكرا للرد جميعا

الحلقة عملتها محاولة لايجاد محورة المصفوفة الثانية لان حسب مافهمت لازم نعمل على تحوير احدى المصفوفات ليستطيع الضرب باستخدام الدوال وقد فعلت ذلك فى مصفوفتين من نفس النوع مثل [3][3]a

و[3][3]b , اي انني حاولت تحوير المصفوفة [3][4]b

تم تعديل هذه المشاركة بواسطة مبرمجة new في 5 مايو 2006 في 12:47

#5
مبرمجة new كتب:
السلام عليكم

شكرا  للرد جميعا

ولكن لم افهم لماذا

int dumy; cin >> dumy;

 

والناتج صحيح ولكن يطبع الصف الاول مكان العمود الأول  هنا لم افهمه

وبالنسبة للبرنامجي السابق الحلقة عملتها محاولة  لايجاد محورة المصفوفة الثانية لان حسب مافهمت لازم نعمل على تحوير احدى المصفوفات ليستطيع الضرب باستخدام الدوال وقد فعلت ذلك فى مصفوفتين من نفس النوع مثل [3][3]a

و[3][3]b , اي انني حاولت تحوير المصفوفة [3][4]b

تم تعديل هذه المشاركة بواسطة مبرمجة new في 5 مايو 2006 في 12:50

#6
اقتباس
ولكن لم افهم لماذاCODEint dumy; cin >> dumy; 

هذا الجزء اضفته اثناء التعديل حتى لا يغلق البرنامج و ممكن عمل ذلك باستخدام getch()

بالنسبة لطباعة النتائج ارجو ارسال مثال عددى. بمعنى قيم المصفوفات و الناتج المنتظر.

مع الشكر

#7

شكرا للرد

والمثال هو المصفوفة الأولى

0 1 1 0

0 1 2 0

0 1 3 0

والمصفوفة الثانية

0 0 1

0 0 1

0 0 1

0 0 0

والمفروض المصفوففة الناتجة هي

0 0 2

0 0 3

0 0 4

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

4 3 2

0 0 0

0 0 0

تم تعديل هذه المشاركة بواسطة مبرمجة new في 5 مايو 2006 في 16:59

#8

أختى العزيزة,

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

و إليكى هذا البرنامج الذى يستطيع حساب حاصل ضرب مصفوفات بأى حجم (ملاحظة: أنا كاتبه على الفيجوال ستوديو 2005 ممكن تلاقى حاجات مش متوافقة مع الكومبيلر بتاعك!)

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

void multiply(int* a /*first matrix*/, int ra /*first matrix rows*/, 
     int* b /*second matrix*/, int cb /*second matrix columns*/, 
     int sh /*SHARED DIMENSION as 'first' columns and 'second' rows MUST BE THE SAME*/, 
     int* r /*to store the result*/
     );
void get_mat(int*& m, int& r, int& c);
void disp(int* m, int r, int c);

int main()
{
	int *a, *b, *r;
	int ra, ca;  // rows and columns for matrix a
	int rb, cb;  // rows and columns for matrix b

	cout << "First matrix size(rows columns) = ";
	cin >> ra >> ca;
	cout << "Second matrix size(rows columns) = ";
	cin >> rb >> cb;
	if (ca != rb){
  cout << "Error: The matrices cannot be multilplied, size mismatch.";
  return 0;
	}
	a = new int[ra*ca];
	b = new int[rb*cb];
	r = new int[ra*cb];

	get_mat(a,ra,ca);
	get_mat(b,rb,cb);

	multiply(a,ra,b,cb,ca,r);

	cout << "\n\nResult = \n";
	disp(r,ra,cb);

	cout << "Press any key to exit...";
	getch();

	return 0;
}

void get_mat(int*& m, int& r, int& c)
{
	cout << "Enter [" << r << "x" << c << "] Matrix :\n";
	for (int i=0; i<r*c; i++)
  cin >> m;
}

void multiply(int* a, int ra, int* b, int cb, int sh, int* r)
{
	for(int i=0; i<ra*cb; ++i){
  r = 0;
  for (int j=0; j<sh; ++j)
 	 r += a[(i/cb)*sh+j] * b[i%cb+j*cb];
	}
}

void disp(int* m, int r, int c)
{
	for (int i=0; i<r*c; i++){
  !(i%c) && cout << endl;
  cout << m << '\t';
	}
	cout << endl;
}

و ناتج المصفوفات المعطاه :

First matrix size(rows columns) = 3 4Second matrix size(rows columns) = 4 3
Enter [3x4] Matrix :
0 1 1 0
0 2 1 0
0 3 1 0
Enter [4x3] Matrix :
1 0 0
1 0 0
1 0 0
0 0 0
Result =
2       0       0
3       0       0
4       0       0
Press any key to exit...
1
#9

فعلاً برنامج Blueteeth جميل واكثر مرونة

الخطاء فى البرنامج كان فى عملية الطباعة و ليس الحساب

وهذه النسخة المعدلة

#include<iostream.h>
void multiply(int *,int *);
void Display(int *pMat, int row, int col);
void main()
{
	int i,j,a[3][4],b[4][3],*p1,*p2;
	p1=&a[0][0];
	p2=&b[0][0];

	for(i=0;i<3;i++){
  for(j=0;j<4;j++){
 	 cin>>*(*(a+i)+j);
  }
	}

	for(i=0;i<4;i++){
  for(j=0;j<3;j++){
 	 cin>>*(*(b+i)+j);
  }
	}

	Display( p1, 3, 4);
	Display( p2, 4, 3);
	multiply(p1,p2);

	int dumy; cin >> dumy;
}

void multiply(int *p1,int *p2)
{
	int i,j,k,c[3][3]={0,0,0,0,0,0,0,0,0};

	for(i=0;i<3;i++){
  for(j=0;j<3;j++){
 	 for(k=0;k<4;k++){
    c[j]+=*(p1+i*4+k)* *(p2+k*3+j);
 	 }
  }
	}
	Display( &c[0][0], 3, 3);
}

void Display(int *pMat, int row, int col)
{
	for(int i=0;i<row;i++){
  for(int j=0;j<col;j++){
 	 cout<< pMat[i*col+j] << "\t";
  }
  cout<< "\n";
	}
}
#10

شكراً لكم جمعيا

#11
"PointerVC" كتب:
الخطاء فى البرنامج كان فى عملية الطباعة و ليس الحساب

أيوة مظبوط يا أخى مش عارف ليه إمبارح معرفتش أطلع الخطأ دا و كان أسهلى أعمل برنامج جديد :)!!

#12

أختى العزيزة أرجو الإنتباه يوجد غلطة مبتدئ فى برنامجى :@ هى إنى نسيت أمسح ال arrays اللى عملتها.

من فضلك زودى ال 3 سطور دى قبل return 0 اللى موجودة فى ال main

delete[] a;
delete[] b;
delete[] r;

تم تعديل هذه المشاركة بواسطة Blueteeth في 8 مايو 2006 في 05:24

#13

السلام عليكم

أخى شكرا ولكن لماذا تمسح arrays و البرنامج بينفذ صح

#14

البرنامج ينفذ صح لكن بعد ما تغلقيه تظل ال arrays موجودة بذاكرة الحاسب RAM و يعتبر نظام التشغيل هذه الذاكرة على أنها مستخدمة ولا يعطيها لبرامج أخرى مع أن برنامجك إنتهى, ولذلك أى شىء فى البرنامج تعمليه عن طريق new لازم تمسحيه فى أخر البرنامج عن طريق delete, و هذه هى طريقة إخبار نظام التشغيل بأن الذاكرة المحجوزة فى برنامجنا لم نعد نحتاجها بعد الأن. لو لم تمسحيها و شغلتى البرنامج عدة مرات حتلاحظى إن الذاكرة ال Physical عندك قلت جدااا و لا ترجع إلا بالريستارت.

#15

شكرا اخى على هذه المعلومات

#17

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

اولا شكرا لكم جميعا على هذه الافادة

لكن عندى استفسار صغير

cin ازاى ممكن انى اكتب الماتريكس ده فى فايل وبعدين اقرا الماتريكس من الفايل من غير ما اعمله

وبعدين ازاى اعرف الاول اذا كان ال2 ماتريكس ينفع انهم يحدث لهم عمليه الضرب او لا

ولكم جزيل الشكر

Ahmed Baraka

#18

اخوي انا كتب برنامج بس للحين مو مخلصه ، استخدمت فيه الذاكرة الديناميكية و البرمجة الكائنية بس للحين ما خلصت منه :) و راح اشاركم الموضوع و هذي صورة من بيئة العمل :) :

77830690pk6.gif

البرنامج انا مخلصه 99% :) بس ناقصه الخوارزميات

:::كوت بو 6:::

IDE : Microsoft Visual Studio 2005 Pro

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…