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

ماهو تفسير مخرجات هذا البرنامج؟ (مصفوفات)

بدأه مجلـد جديـد في 3 نوفمبر 2008 · 16 رد · 1,270 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذا هو الكود

  1.  
  2.  
  3. public class test
  4. {
  5. public static void main( String argsv[] )
  6. {
  7. int a[][] = new int[2][2];
  8. a[0][0]=1;
  9. a[0][1]=2;
  10. a[1][0]=3;
  11. a[1][1]=4;
  12.  
  13. foo1( a );
  14. }
  15.  
  16. public static void foo1( int a[][])
  17. {
  18. foo2( a );
  19. printArray( a );
  20. }
  21.  
  22. public static void foo2( int a[][] )
  23. {
  24. int b[][] = new int [2][2];
  25. b[0][0]=10;
  26. b[0][1]=10;
  27. b[1][0]=10;
  28. b[1][1]=10;
  29.  
  30. a = b;
  31.  
  32. printArray( a);
  33. }
  34.  
  35. public static void printArray( int array[][] )
  36. {
  37. for ( int i=0 ; i < array.length ; i++ )
  38. {
  39. for ( int j=0 ;j <array[i].length; j++ )
  40. {
  41. System.out.print( "["+array[i][j]+"]");
  42.  
  43.  
  44. }
  45. System.out.println();
  46. }
  47. }
  48. }
  49.  
  50.  

الذي اريده هو ان تكون المصفوفة a تحتوي على البيانات الجديدة الموجودة في b لكن عند طباعة المخرجات تظهر نتيجة اخرى:

[5][5]
[5][5]
[1][2]
[3][4]

لماذا التغييرات التي اعملها داخل دالة foo2 للمصفوفة a يتم تجاهلها داخل دالة foo1 ؟؟

#2

هل السؤال واضح؟

هذا هو البرنامج:

  1.  
  2. public class test
  3. {
  4. public static void main( String argsv[] )
  5. {
  6. int a[][] = new int[2][2];
  7. a[0][0]=1;
  8. a[0][1]=2;
  9. a[1][0]=3;
  10. a[1][1]=4;
  11.  
  12. foo1( a );
  13. }
  14.  
  15. public static void foo1( int a[][])
  16. {
  17. foo2( a );
  18. printArray( a );
  19. }
  20.  
  21. public static void foo2( int a[][] )
  22. {
  23. a[0][0] = 9;
  24. }
  25.  
  26. public static void printArray( int array[][] )
  27. {
  28. for ( int i=0 ; i < array.length ; i++ )
  29. {
  30. for ( int j=0 ;j <array[i].length; j++ )
  31. {
  32. System.out.print( "["+array[i][j]+"]");
  33.  
  34.  
  35. }
  36. System.out.println();
  37. }
  38. }
  39. }
  40.  

السؤال بالتحديد هو: لماذا التغييرات التي اقوم بها في دالة foo2 على المصفوفة a يتم تجاهلها في دالة foo1 ؟

مثلا قمت بتغيير العنصر الاول من 1 الى 9 ، لكن عند مناداة دالة الطباعة فان العنصر الاول لم يتغير ، اي انه يساوي 1 وليس 9 !

حسبت ما فهمت ان المناداة تكون call by reference وليس call by value عندما ارسل اسم المصفوفة.

#3

طبيعي أن تحصل على هذه النتيجة

لأن المصفوفات لا تعطى للدوال ككائنات وإنما ككقيم

مثلها مثل الأنواع الأساسية primitive types

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#4

خطأ إنك تساوي بين مصفوفتين كأنهم متغيرات عاديه

المفروض كذا :

 public static void foo2( int a[][] )

 {

 int b[][] = new int [2][2];
 b[0][0]=10;
 b[0][1]=10;
 b[1][0]=10;
 b[1][1]=10;

 //a = b;

for(int i=0;i<a.length;i++)
 for(int j=0;j<a.length;j++)
 a[j]=b[j];

 printArray( a);
 }

هذا هو الحل الصحيح

تحياتي

تم تعديل هذه المشاركة بواسطة M.Allaw في 4 نوفمبر 2008 في 03:11


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#5

اتمنى فهم السؤال ، انا احاول التعديل على المصفوفة a في الدالة foo2 ، واريد ان تحتفظ المصفوفة بهذه التعديلات .

الي حاصل هو ان المصفوفة a تفقد جميع التعديلات التي تمت عليها في دالة foo2 عند الرجوع الى الدالة foo1 ، وانا اريدها ان تحتفظ بهذه التعديلات.

تم تعديل هذه المشاركة بواسطة مجلـد جديـد في 4 نوفمبر 2008 في 07:27

#6

أظن أني أوضحت لك في ردي

أما كيف تستطيع الحصول على التعديلات الحاصلة في الدالة foo2

فاجعلها ترجع مصفوفة

ثم ساوي المصفوفة الراجعة بالمصفوفة a

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7

شكرا لك اخي alaadiaa كلامك صحيح 100% :

  1.  
  2.  
  3. public static int[][] foo2( int a[][] )
  4. {
  5. a[0][0] = 9;
  6. return a;
  7. }
  8.  

الان البرنامج يشتغل 100% شكرا مره اخرى

#8

العفو

عندما تريد شكري استخدم زر الشكر

^^^^^^

نفسي يزيد عداد الشكر عندي :lol:

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

سلام

ال Arrays في جافا هي objects واي تعديل يتم بستخدام ال refrence تبع ال array بيعدل بال array الاولى

ويا أخ (مجلد جديد) انا عملت copy paste للكود تبعك و كان الخرج كاتالي

[9][2]

[3][4]

يعني ان ال array اتعدلت و تغيرت القيمة من 1 الى 9

#10

فعلاً كلام الأخ javaRocks&Rolls

يبدو أني استعجلت حين لم أجرب الشيفرة

آسف لكم على هذا الخطأ

وشكراً للأخ javaRocks&Rolls على التعديل

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

مين يزود :P

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 4 نوفمبر 2008 في 18:23

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#12

أخي أنت قلت أنك تريد نقل محتوى الـb للـa

وأعطيتك الزبده

وعلى كل حال لاتوجد طريقه واحده فقط في البرمجه لكل شخص طريقته والمهم الناتج :)

تحياتي

اقتباس
سلام

ال Arrays في جافا هي objects واي تعديل يتم بستخدام ال refrence تبع ال Array بيعدل بال Array الاولى

ويا أخ (مجلد جديد) انا عملت copy paste للكود تبعك و كان الخرج كاتالي

[9][2]

[3][4]

يعني ان ال Array اتعدلت و تغيرت القيمة من 1 الى 9

تسلم حبيبي جبت الخلاصه :)


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#13

هيه وجدي

نفسي يزيد بالحق

ما تدوس على زري بالمرة <_<

مخاصمك :(

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#14
javaRocks&Rolls كتب:

سلام

ال Arrays في جافا هي objects واي تعديل يتم بستخدام ال refrence تبع ال array بيعدل بال array الاولى

ويا أخ (مجلد جديد) انا عملت copy paste للكود تبعك و كان الخرج كاتالي

[9][2]

[3][4]

يعني ان ال array اتعدلت و تغيرت القيمة من 1 الى 9

جرب وانسخ الكود الاول الموجود في المشاركة الاولى ، عند طباعة المصفوفة في دالة foo1 لن تظهر لك التغييرات.

#15

سلام

لانة ما حصلش اي تغير لل array المعرفة في الدالة main

لأن التعليمة الي في السطر 30 في الدالة foo2

a = b;

تعني انك خليت ال reference a يشير لل المصفوقة b الي عرفتها في الداله foo2

ولما استدعيت دالة الطباعة في السطر 32 من الدالة مررت لها ال reference a الي يشير للمصفوفة b عشان كذة طبع المصفوفة b

printArray( a);

ولما رجع التنفيذ للدالة foo1 طبعت المصفوفة المعرفة في الدالة main لان ال reference a الي فيها مازال يشير لل مصفوفة الي في ال main

#16

المشكلة بالضبط في السطر الاخير الذي كتبته اخي java rocks & rolls

على حسب فهمي المتواضع ان المؤشر a المفروض يكون يؤشر على المصفوفة الجديدة b لاني قمت بعمل التغييرات في دالة foo2

لو كان البرنامج بلغة c++ وبنفس الدوال وstatements فسوف يحتفظ المؤشر a بالتغييرات التي تحدث عليه في اي دالة اخرى ، لا ادري ماهو الفرق بين اللغتين في هذا الامر بالتحديد؟

#17

سلام

اقتباس
المشكلة بالضبط في السطر الاخير الذي كتبته اخي java rocks & rolls

أعتقد انة الي مش واضح بالنسبة لك انة ال reference a في الدالة foo1 غير الي في الدالة foo2 غير الي في الدالة main

لانة لما يتم تمرير reference من دالة لأخرى يتم تمرير نسخة من الreference

على فكرة انا جربت البرنامج بال c++ وكانت النتيجة نفس النتيجة الي بالجافا

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