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

كيفية إسناد قيم مصفوفة ثنائية إلى مصفوفة أحادية

بدأه khaled_prg في 19 أبريل 2010 · 11 رد · 2,785 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عندي سؤال يتعلق بالمصفوفات الثنائية و إسناد بعض عناصرها إلى مصفوفات أحادية :)

نص التمرين:

اكتب برنامج بلغة c يقوم بالآتي:

1-يطلب من المستخدم ملئ مصفوفة ثنائية مربعة و تحتوي على 9 عناصر

2-يخزن قيم القطر الرئيسي فى مصفوفة أحادية.

3-يخزن قيم القطر الثانوي فى مصفوفة أحادية أخرى.

وهذه محاولتي في التمرين:

#include<stdio.h>
#include<stdlib.h>
int main()
{
int matrice[3][3],matrice_1[3],matrice_2[3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
printf("matrice[%d][%d]=",i,j);
scanf("%d",&matrice[j]);
}
matrice_1[]={matrice[0][2],matrice[1][1],matrice[2][0]}; 
matrice_2[]={matrice[0][0],matrice[1][1],matrice[2][2]};
system("pause");
return 0;
}

تحياتي.

#2

تفضل التعديل

#include<stdio.h>
#include<stdlib.h>
int main()
{
int matrice[3][3],matrice_1[3],matrice_2[3];
for(int i=0;i<3;i++)
 {
  for(int j=0;j<3;j++)
	 {
		printf("matrice[%d][%d]=",i,j);
		scanf("%d",&matrice[j]);
	 }
	  matrice_1=  matrice;
	  matrice_2 = matrice[2-i];
 }

 for(i=0;i<3;i++)
  {
	for(int j=0;j<3;j++)
		printf("%d\t",matrice[j]);
		printf("\n");
  }

	 printf("\n Prinary Diagonal\n");
  for(i=0;i<3;i++)
  {
		printf("%d\t",matrice_1);
  }

	  printf("\n Secondery Diagonal\n");

  for(i=0;i<3;i++)
  {
		printf("%d\t",matrice_2);
  }



return 0;
}

تحياتي

تم تعديل هذه المشاركة بواسطة omani في 19 أبريل 2010 في 03:27

1

OMANI FOR EVER

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

post-12787-12780191801974.jpg

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

#3

جرب هذا الكود

#include<stdio.h>

int main()
{
	int matrice[3][3],matrice_1[3],matrice_2[3];
	int i, j;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
		{
			printf("matrice[%d][%d]=", i, j);
			scanf("%d",&matrice[j]);
		}

	for (i=0; i<3; i++)
	{
		matrice_1 = *(*matrice + i*4);
		matrice_2 = *(*matrice + (i+1)*2);
	}

	system("pause");
	return 0;
}

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 19 أبريل 2010 في 06:45

2

مدونتي: C++ Tips and Tricks

#4
Muhammad alaa كتب:

جرب هذا الكود

#include<stdio.h>

int main()
{
	int matrice[3][3],matrice_1[3],matrice_2[3];
	int i, j;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
		{
			printf("matrice[%d][%d]=", i, j);
			scanf("%d",&matrice[j]);
		}

	for (i=0; i<3; i++)
	{
		matrice_1 = *(*matrice + i*4);
		matrice_2 = *(*matrice + (i+1)*2);
	}

	system("pause");
	return 0;
}

و الله ولى التوفيق

+1

رد مميز من شخص متميز ..

استاذي هل لك أن تشرح لي . المؤشرات في هذا الكود وكيف تعمل .. لاني بصراحه مافهمتها .

تقبل تحياتي

OMANI FOR EVER

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

post-12787-12780191801974.jpg

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

#5
اقتباس
هل لك أن تشرح لي . المؤشرات في هذا الكود وكيف تعمل .. لاني بصراحه مافهمتها .

سأشرح على المثال الموجود بالأعلى. وثائق اللغه تشترط على صانع المترجم ان تكون عناصر المصفوفه مرتبه لذا ستجد ان عناصر المصفوفه matrice[3][3] يتم ترتيبهم داخل الذاكره كالتالى

matrice[0][0]
matrice[0][1]
matrice[0][2]

matrice[1][0]
matrice[1][1]
matrice[1][2]

matrice[2][0]
matrice[2][1]
matrice[2][2]

و إذا افترضنا أن هذه المصفوفه هى مصفوفه احاديه يمكن النظر لها كالتالى

matrice[0]
matrice[1]
matrice[2]

matrice[3]
matrice[4]
matrice[5]

matrice[6]
matrice[7]
matrice[8]

نأتى لنقطة المصفوفات الرياضيه، المصفوفه المربعه يتم ترتيب عناصرها بالشكل التالى

0   1   2
3   4   5
6   7   8

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

0   4   8

و كما نرى فالترتيب يقبل القسمه على الرقم 4 و بالتالى للحصول على العنصر الأول نقوم بضرب 4 * 0 = 0 و الثانى 4 * 1 = 4 و الثالث 4 * 2 = 8

و بالنسبه لعناصر القطر الثانوى فترتيبها هو:

2   4   6

و الترتيب يقبل القسمه على الرقم 2 و بالتالى للحصول على اولهم نضرب 2 * 1 = 2 و الثانى 2 * 2 = 4 و الثالث هو 2 * 3 = 6

المعادلات السابقه يمكن ملاحظة التالى

0 * 4    ,    1 * 4    ,    2 * 4
1 * 2    ,    2 * 2    ,    3 * 2

للحصول على العنصر الأول بالقطر الرئيسى يتم ضرب الرقم 4 فى 0 و للحصول على العنصر الأول بالقطر الثانوى يتم ضرب الرقم 2 فى 1، يمكنك ان ترى ان هذا الترتيب يستمر بشكل ثايت، هذا الترتيب سنحتاجه عن كتابة الكود

لتطبيق القاعدة السابقه على المصفوفه matrice لابد من التعامل معها كأنها مصفوفه احاديه و حينها نستطيع استخدام الـ pointer arithmetic للوصول للموقع الذى نريده. لذا كل ما يتم هو احضار موقع العنصر الأول داخل المصفوفه matrice و من ثم اطبق القواعد السابقه للحصول على قيم العناصر التى نريدها منها كالتالى:

for (i=0; i<3; i++)
{
        matrice_1 = *(*matrice + i*4);
        matrice_2 = *(*matrice + (i+1)*2);
}

كما ترى الحلقه تبدأ من الرقم صفر و تنتهى عند الرقم 2 و بالتالى بضرب هذا الرقم فى 4 يصبح لدينا موقع اى عنصر من عناصر القطر الرئيسى و كذلك إذا تم إضاقة واحد إلى هذا الرقم ثم تم ضربه فى 2 يصبح لدينا موقع اى عنصر من عناصر القطر الثانوى، بعدها يتم اضافة الرقم الناتج إلى *matrice و هى موقع العنصر الأول بالمصفوفه matrice و النتيجه النهائيه هى موقع العنصر الذى نريد داخل المصفوفه لذا نفوم بعمل deference له للحصول على قيمته.

و الله ولى التوفيق

1

مدونتي: C++ Tips and Tricks

#6

أولا .. أشكركم على المساعدة و إن شاء الله تكون في ميزان حسناتكم.

اقتباس
تفضل التعديل

#include<stdio.h>
#include<stdlib.h>
int main()
{
int matrice[3][3],matrice_1[3],matrice_2[3];
for(int i=0;i<3;i++)
 {
  for(int j=0;j<3;j++)
         {
                printf("matrice[%d][%d]=",i,j);
                scanf("%d",&matrice[j]);
         }
          matrice_1=  matrice;
          matrice_2 = matrice[2-i];
 }

 for(i=0;i<3;i++)
  {
        for(int j=0;j<3;j++)
                printf("%d\t",matrice[j]);
                printf("\n");
  }

         printf("\n Prinary Diagonal\n");
  for(i=0;i<3;i++)
  {
                printf("%d\t",matrice_1);
  }

          printf("\n Secondery Diagonal\n");

  for(i=0;i<3;i++)
  {
                printf("%d\t",matrice_2);
  }



return 0;
}

كود جميل :) ولكنك استخدمتَ نفس الفكرة التي اعتمدتُ عليها :huh: إلا أنك استعملتَ الحلقات من أجل إسناد قيم الأقطار , بينما قمتُ باسناد القيم عنصر بعنصر :blush:

و لكن لماذا تظهر لي أخطاء و لا تظهر لك ؟

اقتباس
جرب هذا الكود

#include<stdio.h>

int main()
{
	int matrice[3][3],matrice_1[3],matrice_2[3];
	int i, j;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
		{
			printf("matrice[%d][%d]=", i, j);
			scanf("%d",&matrice[j]);
		}

	for (i=0; i<3; i++)
	{
		matrice_1 = *(*matrice + i*4);
		matrice_2 = *(*matrice + (i+1)*2);
	}

	system("pause");
	return 0;
}

متميز كالعادة :wub: بارك الله فيك :)

+1 و لو استطعتُ الزيادة لفعلت :cool: تستحق أكثر :wink:

اقتباس
و النتيجه النهائيه هى موقع العنصر الذى نريد داخل المصفوفه لذا نفوم بعمل deference له للحصول على قيمته.

لم أفهم هذه النقطة جيدا :blush: أرجوا التوضيح أكثر (لو سمحت :) )

تحياتي.

#7

كعادتك متميز بشروحاتك استاذي الكريم .

تقبل تحياتي

OMANI FOR EVER

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

post-12787-12780191801974.jpg

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

#8
اقتباس
كعادتك متميز بشروحاتك استاذي الكريم .

تقبل تحياتي

لم توضح الفرق بين طريقتك و طريقتي !!! مالسبب؟

هل يوجد خطأ في الطريقة التي اتبعتها في إسناد قيم الأقطار ؟

أرجو المساعدة :) و شكرا مقدما :cool:

تحياتي.

#9

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

مثل هذا الكود:

int matrice[3][3]={1,2,3,6,8,7,9,0,4};
int matrice_1[]={matrice[0][2],matrice[1][1],matrice[2][0]};
int matrice_2[]={matrice[0][0],matrice[1][1],matrice[2][2]};
tvquran_6.gif

#10
khaled_prg كتب:

لم توضح الفرق بين طريقتك و طريقتي !!! مالسبب؟

هل يوجد خطأ في الطريقة التي اتبعتها في إسناد قيم الأقطار ؟

أرجو المساعدة :) و شكرا مقدما :cool:

تحياتي.

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

تحياتي

OMANI FOR EVER

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

post-12787-12780191801974.jpg

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

#11
اقتباس
و النتيجه النهائيه هى موقع العنصر الذى نريد داخل المصفوفه لذا نفوم بعمل deference له للحصول على قيمته.

انظر بتمعن داخل الكود التالى

for (i=0; i<3; i++)
{
        matrice_1 = *( *matrice + i * 4 );
        matrice_2 = *( *matrice + (i+1) * 2 );

}

بإفتراض أن i صفر ستصبح العمليه الحسابيه كالتالى:

matrice_1[0] = *( *matrice + 0 * 4 );
matrice_2[0] = *( *matrice + (0+1) * 2 );

السطرين

*matrice + 0 * 4        = *matrice + 0       = *matrice
*matrice + (0+1) * 2  = *matrice + 1 * 2 = *matrice + 2

كما ترى فالناتج النهائى هو موقع العنصر الأول للقطر الرئيسى و القطر الثانوى فى الذاكره و ليس قيمتهم، و حيث اننا نريد قيمتهم و ليس موقعهم نقوم بعمل dereference للجمل السابقه للحصول على القيمه.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#12
اقتباس

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

مثل هذا الكود:

int matrice[3][3]={1,2,3,6,8,7,9,0,4};
int matrice_1[]={matrice[0][2],matrice[1][1],matrice[2][0]};
int matrice_2[]={matrice[0][0],matrice[1][1],matrice[2][2]};

بارك الله فيك

بالفعل هذه هي الطريقة التي كنت أريد استخدامها :) ولكنني لم أذكر نوع المصفوفة مما تسبب في ظهور أخطاء :blush:

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

كلامك صحيح يا أخ عماني :) أعرف أن طريقتك أفضل :wink: ولكنني استغربت ظهور أخطاء في طريقتي مع أن الفكرة واحدة :ohmy: ولكنني اكتشفتُ الخطأ (عدم ذكر نوع المصفوفة :blush: )

اقتباس

انظر بتمعن داخل الكود التالى

for (i=0; i<3; i++)
{
        matrice_1 = *( *matrice + i * 4 );
        matrice_2 = *( *matrice + (i+1) * 2 );

}

بإفتراض أن i صفر ستصبح العمليه الحسابيه كالتالى:

matrice_1[0] = *( *matrice + 0 * 4 );
matrice_2[0] = *( *matrice + (0+1) * 2 );

السطرين

*matrice + 0 * 4        = *matrice + 0       = *matrice
*matrice + (0+1) * 2  = *matrice + 1 * 2 = *matrice + 2

كما ترى فالناتج النهائى هو موقع العنصر الأول للقطر الرئيسى و القطر الثانوى فى الذاكره و ليس قيمتهم، و حيث اننا نريد قيمتهم و ليس موقعهم نقوم بعمل dereference للجمل السابقه للحصول على القيمه.

شرح زي الفل :wub: تسلم يا أستاذنا الفاضل :)

في أمان الله.

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