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

ورشة عمل عن المصفوفات

بدأه علاء الصالحي في 13 نوفمبر 2008 · 22 رد · 2,833 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيف حال الشباب هنا

يبدو لي أنه لا وجود لكم أصلاً :wink:

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

وأصل في حل الكثير من المشكلات

الموضوع ليس لشرح المصفوفات

وإنما سنضع بعض المشكلات هنا

نحاول حلها

نتناقش فيها

أريد أن أرى تفاعلاً هاهنا

لا تضطوروني إلى ذكر أسماء معينة :lol:

سأبدأ أنا بمشكلة بسيطة

كيف تطبع مصفوفة؟

السؤال سهل لذا أريد إبداع

كيف يكون الإبداع في هذا السؤال؟

هذه هي مشكلتكم :P

تحياتي

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

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

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

728x90.png

#2

فكره جيده أخي علاء ،،

حل مُبَدِع :) /

 

[color= #000066; font-weight: bold;]int array[color= #009900;][[color= #009900;]] [color= #339933;]= [color= #009900;]{[color= #cc66cc;]3,[color= #cc66cc;]5,[color= #cc66cc;]6[color= #009900;]} [color= #339933;];

	[color= #000000; font-weight: bold;]for [color= #009900;]([color= #000066; font-weight: bold;]int element [color= #339933;]: array[color= #009900;])

		[color= #003399;]System.[color= #006633;]out.[color= #006633;]printf[color= #009900;]([color= #0000ff;]"%d[color= #000099; font-weight: bold;]n",element[color= #009900;])[color= #339933;];

استخدام for each للوصول الى القيم في المصفوفه ، بدلا من استخدام الحلقه العاديه ... ولن نضطر الى عمل counter ولا زيادته ، for each تقوم بالمهمه ..

بالتوفيق ،

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

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

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

#3

اخي علاء فكره جميله تسلم ايدك

هذه باستخدام جمله for

int array={2,6,7,8,9,4};
for(int i=0;i<=array.length;i++)
System.out.println("array number "+array);

والان للتفاعل الاكثر اريد طباعه هذه المصوفه بالترتيب

{d,s,a,e,g,a,s,e,r,e,y,u,}

#4

ماذا عن الطباعة العكسية؟

ماذا عن الطباعة من المنتصف حرف من الأمام وحرف من الخلف؟

هيا أرونا الإبداعات

char[] array={'d','s','a','e','g','a','s','e','r','e','y','u'};

  for(int i=0;i<=array.length;i++){
for(int j=i;j<=array.length;j++)
if((int)array<(int)array[j])
swap(i,j);
System.out.println("array number "+array);
}

بصراحة لست متأكد من موضوع casting

هل سيفهم المترجم الجملة بدونه

لكني وضعته للاحتياط

بالمناسبة الدالة swap تقوم بالتبديل بين العناصر في المصفوفتين

ويجب عليك كتابتها بنفسك :P

وأخيراً أقول ربما يكون هناك مشاكل في الشيفرة من ناحية المنطق

لأني لم أجربها

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 19 نوفمبر 2008 في 05:21 — السبب: تعديل على الشيفرة مع الشكر للأخ بيشوي

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

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

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

728x90.png

#5

أخي وجدي هل الكود الذي كتبته هو مزيج بين الـ c و الـ java أم أن الكتابة ممكنة في الجافا (لم أرها من قبل)

#6
اقتباس
أخي وجدي هل الكود الذي كتبته هو مزيج بين الـ c و الـ Java أم أن الكتابة ممكنة في الجافا (لم أرها من قبل)

يسمى هذا الـ Loop بـ For each .. و يتم استخدامه مع الجافا ، و مع الـ Objects بشكل خاص على اعتبار ان المصفوفة عبارة

عن كائن ...

ايضاً ممكن تجد For each في بعض اللغات مثل PHP و على ما اذكر في VB

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

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#7

السلام عليكم

اسمه كرر لكل عنصر foreach

وهو موجود في كل لغات البرمجة تقريباً أذكر منها c# vb php

ويذكر أن php أول لغة احتوتها

كما ستجدها في تلك اللغات باسم foreach

لكن هنا في جافا رؤوا أن الموضوع ليس بحاجة إلى إضافة كلمة محجوزة keyword جديدة

وأن كلمة for القديمة مع شكل foreach قادرة على تغطية الأمر

ويمكن تطبيقه في الجافا على المصفوفات وعلى كل ماله علاقة بالواجهة Iteratable

كنت كتبت مقالين عن الموضوع

لمحة جافاوية 17: كرر لكل عنصر

لمحة جافاوية 18: الفئات القابلة للتكرار

لاحظ أن هذا التكرار لا يأتي بشيء جديد

ويهيألي أن جافا تستعيض بنفس الـ byte code الخاص بـ for عند الترجمة

وهذه شيفرة الطباعة العكسية

int array={2,6,7,8,9,4};
for(int i=array.length-1;i>0;i--)
System.out.println("array number "+array);

هل هناك من يقوم بطباعة العناصر عنصر من البداية وعنصر من النهاية؟

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

هيا يا شباب أريد إبداعاً

تحياتي

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

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

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

728x90.png

#8

فكرة رائعة جدا جدا يا علاء ...

كما اتمنى ان يكون هناك دروس اخرى بنفس الأسلوب .

#9

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

 

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class Demo

[color= #009900;]{

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]static [color= #000066; font-weight: bold;]void main [color= #009900;]([color= #003399;]String args[color= #009900;][[color= #009900;]][color= #009900;]) [color= #009900;]{

	[color= #000066; font-weight: bold;]int array[color= #009900;][[color= #009900;]] [color= #339933;]= [color= #009900;]{[color= #cc66cc;]4,[color= #cc66cc;]5,[color= #cc66cc;]66,[color= #cc66cc;]7,[color= #cc66cc;]9,[color= #cc66cc;]83,[color= #cc66cc;]1,[color= #cc66cc;]3,[color= #cc66cc;]6[color= #009900;]} [color= #339933;];

 

	[color= #000066; font-weight: bold;]int i[color= #339933;]=[color= #cc66cc;]0 , j[color= #339933;]=array.[color= #006633;]length[color= #cc66cc;]-1  [color= #339933;];

 

	[color= #000000; font-weight: bold;]for [color= #009900;]([color= #339933;]; i[color= #339933;]< array.[color= #006633;]length[color= #339933;]/[color= #cc66cc;]2 [color= #339933;]; i[color= #339933;]++,j[color= #339933;]--[color= #009900;]) 

		[color= #003399;]System.[color= #006633;]out.[color= #006633;]printf[color= #009900;]([color= #0000ff;]"%d %d ",array[color= #009900;][i[color= #009900;]],array[color= #009900;][j[color= #009900;]][color= #009900;])[color= #339933;];

 

	[color= #000000; font-weight: bold;]if [color= #009900;]( array.[color= #006633;]length [color= #339933;]% [color= #cc66cc;]2 [color= #339933;]!= [color= #cc66cc;]0 [color= #009900;]) 

		[color= #003399;]System.[color= #006633;]out.[color= #006633;]printf[color= #009900;]([color= #0000ff;]"%d",array[color= #009900;][i[color= #009900;]][color= #009900;])[color= #339933;];

 

[color= #009900;]}

[color= #009900;]}

أخ Djug زي ما قال الشباب ، وكمان printf تستخدم في جافا (من اصدار 5 وما فوق) ، وهي جيده في عمليه تنسيق المخرج Formating ..

حسناً ، من يقوم بأخذ تقاطع مصفوفتين(عناصر مشتركه) ووضعهم في مصفوفه جديده ثالثه ،

Array A: 17 1 3 19 3 7 9 13 15 2

Array B: 2 3 6 8 9 3 5 16

Elements in Common: 3 9 2

:wink:

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 14 نوفمبر 2008 في 01:09

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

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

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

#10

سادخل قيم لمصفوفة بارقام عشوائية :lol:

فأنا لا احب الطباعة :angry:


int x[]=new int [ARRAY];
for(int i=0;i<ARRAY;i++)
{
x=(int)(Math.random()*5);
}
int ARRAY=100;

ولا احب الوظائف ايضا :angry:

بالتوفيق

الله معكم..

1
#11

شد حيلك معانا أخي MKSoft

وإن شاء الله في نيتي هذا الشيء

شادي ليست واجب

هل رأيت أحد قال شادي يحل السؤال

لكن أبشر المرة القادمة عيلك :)

أختي بنت اليمن شاركينا

وجدي هذا حل السؤال

ArrayList list=new ArrayList();
if(a.length<b.length)
swap(a,b);
for(int i :a)
for(int j:b)
if(i==j){
list.add(i);
break;
}

هذه الطريقة السهلة

طبعاً بتعقيد m*n حيث n وm هي أطوال المصفوفتين a و b

هل هناك طرق أسهل وجدي؟

نريد طباعة المصفوفة مرتين في نفس التكرار

مرة تكون الطباعة من أولها

ومرة تكون الطباعة من آخرها

هيا إبداع يا شباب

تحياتي

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

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

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

728x90.png

#12

اوكي راح احاول اشارك ... :)

اقتباس
نريد طباعة المصفوفة مرتين في نفس التكرار

مرة تكون الطباعة من أولها

ومرة تكون الطباعة من آخرها

هذا حل سريع ... و هناك ايضاً حل اخر في بالي (قريباً في الاسواق :) )

الحل هذا لو حابين ان تتم الطباعة من الشمال الى اليمين و بعده العكس

public static void main(String[] args) {

		int array[] = {2,5,8,0,2,4,7};
		String rtl = "";
		String ltr = "";

		int j = array.length - 1;

		for(int i=0; i < array.length; i++)
		{
			ltr += array + "\t";
			rtl += array[j] + "\t";

			j--;
		}

		System.out.println (ltr);
		System.out.println (rtl);

	}

اما اذا نريد ان نطبع مرة من البداية و مرة من النهاية :

public static void main(String[] args) {

		int array[] = {2,5,8,0,2,4,7};

		int j = array.length - 1;

		for(int i=0; i < array.length; i++)
		{
		 System.out.print (array + "\t" +array[j] + "\t");

		 j--;
		}

	}

تم تعديل هذه المشاركة بواسطة بنت اليمن في 14 نوفمبر 2008 في 21:52

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

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#13

سؤال للحج شادي

كيف أرتب مصفوفة تصاعدياً؟

(هات وصلة لموضوعك الي بيتكلم عن الترتيب :lol: )

سؤال للجميع

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

نريد كشف بالعناصر للمصفوفة وتكرار كل عنصر

تحياتي

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

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

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

728x90.png

#14

السلام عليكم ..

اقتباس
سؤال للجميع

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

نريد كشف بالعناصر للمصفوفة وتكرار كل عنصر

اعتقد هذا ما يسمى بالهستوجرام (تكرار لون في صورة او ذبذبة في ملف صوت) ...

لنفترض ان لدنا مصفوفة ِA قيمها بين الصفر و التسعة (كمثال : تكون اي قيمه داخلها بين 0 و 9) ، و تحتوي على 50 عنصر داخلها ..

int A[] = new int[50];

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

في المصفوفة A و الخانة ذات الفهرس 1 عدد الواحدت في المصفوفة A و هكذا ...

لنفترض اننا سوف ندخل القيم بشكل عشوائي الى المصفوفة A .. فسيكون الكود اللزم لإدخال العناضر و إحتساب عدد

تكرار كل عنصر كما يلي :

for (int i = 0; i<A.length; i++) {
			A = rnd.nextInt(10);
			counters[A]++;
		}

و هذا كود شامل للعملية مع توضيح الطباعة :

import java.util.Random;

public class testArray {	

	public static void main(String[] args) {

		Random rnd = new Random();
		int A[] = new int[50];
		int counters[] = new int[10];

		for (int i = 0; i<A.length; i++) {
			A = rnd.nextInt(10);
			counters[A]++;
		}

		for (int i = 0; i<A.length; i++) {
			System.out.print (A + "\t");
		}

		System.out.println ();

		for (int i = 0; i<counters.length; i++) {
			System.out.println (i + " was found " + counters + " times");
		}
	}
}

امنياتي بالتوفيق ...

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

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#15

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

و إن شاء الله هشارك معاكم

و ياريت مستر علاء تعمل كده فى موضوعات تانى

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

بيشوى عاطف

#16

صحيح أخت بنت اليمن

وهذا الموضوع إحصائي أصلاً

ويستخدم في الكثير من العلوم

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

طيب ماذا لو قلنا لا نريد حدود للقيم

بمعنى أن لدي مجموعة من القيم أنا جاهل لماهيتها

شادي شكلي هقتلك :lol:

تحياتي

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

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

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

728x90.png

#17

أهلاً وسهلاً أخ بيشوي

نريد تفاعلاُ في هذا الموضوع

حتى نستطيع أن نكمل في غيره

تحياتي

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

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

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

728x90.png

#18

لا أعتقد يوجد حل أفضل من حلك يا علاء ، لكن ممكن تحسينه بترتيب المصفوفه أولا ،،

بالنسبه لكيفيه عد العناصر من غير معرفتها ؟ فهذا سؤال جيد .. وربما الحل بعمل مصفوفه count بنفس عدد خانات المصفوفه التي تحتوي على العناصر ،، أي كل خانه في count تمثل لي تكرار الخانه المناظره لها في مصفوفه العناصر..

ونقوم بالبحث من البدايه للنهايه في مصفوفه العناصر، في حال وجدنا أن العدد غير موجود نقوم بزياده الموقع المناظر له في count ، والا نقوم بزياده موقع نفس العدد الموجود في count ..

 

[color= #000000; font-weight: bold;]for [color= #009900;]([color= #000066; font-weight: bold;]int i[color= #339933;]=[color= #cc66cc;]0 [color= #339933;]; i[color= #339933;]<array.[color= #006633;]length [color= #339933;]; i[color= #339933;]++[color= #009900;]) [color= #009900;]{

[color= #000066; font-weight: bold;]int num [color= #339933;]= array[color= #009900;][i[color= #009900;]] [color= #339933;];

[color= #000000; font-weight: bold;]if [color= #009900;]( [color= #009900;](tmp [color= #339933;]= isFound[color= #009900;](num,array,i[color= #009900;])[color= #009900;]) [color= #339933;]!= [color= #cc66cc;]-1[color= #009900;])

	count[color= #009900;][tmp[color= #009900;]][color= #339933;]++;

[color= #000000; font-weight: bold;]else

	count[color= #009900;][i[color= #009900;]][color= #339933;]++;

[color= #009900;]}

وهذا الحل كامل ،، وربما هناك طرق أفضل :

import java.util.Random;

public class Demo {
	public static void main (String args[]) {
		int array[] = new int[30];
		int count[] = new int[30];
		Random rnd = new Random();
		int tmp = 0;

		for ( int i=0; i<array.length; i++) 
			array = rnd.nextInt(10);

		printArray(array);

		for (int i=0; i<array.length; i++) {
			int num = array;
			if ( (tmp = isFound(num,array,i)) != -1)
				count[tmp]++;
			else
				count++;
		}

		for (int i=0; i<array.length; i++) {
			if (( tmp=isFound(array,array,i)) == -1 )
				System.out.println( array + " : " + count );
		}
	}

	public static int isFound (int num , int arr[],int c) {
		for (int i=0; i<c; i++)
			if ( num == arr )
				return i;

		return -1;
	}

	public static void printArray (int arr[]){
		for (int element : arr)
			System.out.print(element + " " );

		System.out.println("\n\n");
	}

}

بالتوفيق ،

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

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

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

#19

جميل جداً وجدي

باستخدام المصفوفات هذا الحل الأفضل

وهو المطلوب في موضوعنا هذا

لكن استخدام List يوفر مساحة كبيرة

طيب لدينا كائن من نوع جملة String

نريد أن نجري عليه العملية indexOf

هذه العملية تأخذ مدخلين الجملة التي نريد البحث فيها

ولنسميها a

والجملة التي يتم البحث عنها

ولنسميها b

و ترجع كل الأماكن في الجملة a التي تتواجد فيها الجملة b

طبعاً لن أوصيكم بأن استخدام الدوال في String

غير مسموح به ما عدا charAt

أنا كمان أريد أن أشارك معكم

هل من أحد يطرح أسئلة :(

تحياتي

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

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

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

728x90.png

#20

أنا أعلم أن مشاركتي جائة متأخرة لكن هي فكرة أحببت وضعها

مارأيكم في طباعة المصفوفة بإحدى الدوال العكسية

// BlackBeard

public class Main {
	static int[] array1={1,2,3,4,5,6,7};
	static int[][] array2={{8,9,10,11,12,13,14},{15,16,17,18,19,20,21}};
	static int i=-1;
	static int j=-1;

	public static void printArray(int[] a){
		i++;
		if(i<a.length){
			System.out.print(a+" ");
			printArray(a);
		}else{
			i=-1;
		}
	}

	public static void printArray2(int[][] a){
		j++;
		if(j<a.length){
			printArray(a[j]);
			System.out.println();
			printArray2(a);
		}else{
			j=-1;
		}
	}

	public static void main(String[] args) {
		printArray(array1);
		System.out.println();
		printArray2(array2);
	}
}
showimagephp.jpg

#21

تقصد العودية recursive؟

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

مثل التكوينات الشجرية أو ماشابه

لأن مناداة دالة calling method والعودة إليها في آخر المطاف عند العملية الحسبة النهائية عبارة عن عمليات قفز في الذاكرة

ومعروف أن عمليات القفز تأخذ أعلى حمل

على الهامش أحيي فيك حب الإطلاع :)

تحياتي

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

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

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

728x90.png

#22
علاء الصالحي كتب:

تقصد العودية recursive؟

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

مثل التكوينات الشجرية أو ماشابه

لأن مناداة دالة calling method والعودة إليها في آخر المطاف عند العملية الحسبة النهائية عبارة عن عمليات قفز في الذاكرة

ومعروف أن عمليات القفز تأخذ أعلى حمل

على الهامش أحيي فيك حب الإطلاع :)

تحياتي

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

على العموم هي فكرة عدم الإعتماد على الحلقة لم يتم ذكرها

مشكور أخي الكريم

showimagephp.jpg

#23
علاء الصالحي كتب:

ماذا عن الطباعة العكسية؟

ماذا عن الطباعة من المنتصف حرف من الأمام وحرف من الخلف؟

هيا أرونا الإبداعات

char[] array={'d','s','a','e','g','a','s','e','r','e','y','u'};

  for(int i=0;i<=array.length;i++){
for(int j=i;j<=array.length;j++)
if((int)array<(int)array[j])
swap(i,j);
System.out.println("array number "+array);
}

بصراحة لست متأكد من موضوع casting

هل سيفهم المترجم الجملة بدونه

لكني وضعته للاحتياط

بالمناسبة الدالة swap تقوم بالتبديل بين العناصر في المصفوفتين

ويجب عليك كتابتها بنفسك :P

وأخيراً أقول ربما يكون هناك مشاكل في الشيفرة من ناحية المنطق

لأني لم أجربها

تحياتي

ولماذا لا تستخدم ال sort في كلاس Arrays

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		char[] array={'d','s','a','e','g','a','s','e','r','e','y','u'};
    	java.util.Arrays.sort(array);
		  for(int i=0;i<array.length;i++)
			System.out.println("array char "+array);


	}


	}

على فكرة لديك خطأ في الكود الخاص بك حيث أن ال for التي وضعتها تخرج اكسبشن ارراي اوت اوف باوندريز لانك واضع >=

Linux for human beings

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