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

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

بدأه almstshar2 في 2 فبراير 2009 · 6 رد · 1,251 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

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

طبعا هذي الدرووس تجميعة من كتب ومن النت .. :)

المصفوفات ARRAYS

الجزء الاول

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

___________________________________________

نرجع للدروسي القديمة شوي عند التعريف عن متغير نقوم بحجز مكان لة بالذاكرة وتحديد نوعة(النمط)...

int num

قومنا بحجز 4 byte لانة عدد صحيح طبعا هي قليلا ما تختلف من جهاز الى جهاز

الحجز لا يكون مرتب يعني بجميع الذاكرة ..

يمكن يكون متغير في اليسار والثاني باليمين....في الذاكرة طبعا ....يعني نادرا ما يكونا جنب بعض

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


<< "sizeof(float): " << sizeof(float) << endl
<< "sizeof(double): " << sizeof(double) << endl
<< "sizeof(char): " << sizeof(char) << endl
cout << "sizeof(int): " << sizeof(int) << endl

_______________________________________________________

نقدر نقول ان المصفوفة عبارة عن مجموعة من المتغيرات متلاصقة مع بعض تحمل نفس الاسم ونفس النوع.

#التصريح عن المصفوفة:

نستخدم العبارة التالية

int Matrix [50];

هنا تم التعريف عن مصفوفة من النوع int واسمها Matrix وحجمها 50 اي تحمل 50 عدد من النوع int .

ملاحظات:

نسمي الرقم الموضع بين القوسين بالدليل sub****** .

يجب الدليل ان يكون عدد صحيح او اي متغير يعطي قيمة صحيحة.

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

int c[8];

وقمنا بأدخال اعداد عشوائية ...للمثال فقط.. نشووف الصوورة التالية وهي تمثيلة داخل الذاكرة (طبعا ميزة السي ++ تخليك تتحكم في الذاكرة على راحتك )

طيب نرججع ونشووف الصوورة

gaG69711.png

(طبعا من اليسار الى اليمين)وعند الرغبة في الوصول الى احد الاعداد نختار اسم المصفوفة والدليل الذي يوجد به العدد الذي نريدة...

مثلا نريد طباعة العدد 65 يتم الوصول الية

cout<<c[6];

ملاحظات:

يبدا حجز المصفوفة من الدليل صفر وليس واحد

ويبقى الدليل الاخير دون استخدام وعند اسناد اي قيمة الى الدليل الاخير يعطينا المترجم خطاء(راح نتطرق لها مستقبلا)

ونستفيد من ذالك انة اذا تم التعريف عن مصفوفة حجمها 10 فان الدليل يبدأ من صفر الى 9

ننتقل الى الجزء العملي ..وناخذ كم مثال

في المثال التالي راح نكتب مصفوفة حجمها 10 ونمطها int ونقوم بأعطها القيمة صفر الى العناصر العشرة للمصفوفة


#include <iomanip>
using namespace std;
void main()
{
int n[10];
for (int i=0; i<10;i++)
{
n = 0;
}//end of for
for (int j =0;j<10;j++)//to Print the Matrix n
{
cout<<setw(70)<<j<<setw(13)<<n[j]<<endl;
}
system("pause");
}
   #include <iostream>

ومثل ما انت شايفين استخدام اللوب لعطاء قيم للمصفوفة واستخدام اللوب للطباعة

ملاحظة:

الجزء هذا ينوب عنة


{
n = 0;
}//end of for
   for (int i=0; i<10;i++)

ينوب عن هذا الكود

n[10] ={0};

ويمكن تخزين عناصر في المصفوفة عند تعريفها والمثال التالي يوضح الطريقة


#include <iomanip>
using namespace std;
void main()
{
int n[10]={88, 65,5555,4545,4345,354,454,344,3334};

for (int j =0;j<10;j++)//to Print the Matrix n
{
cout<<setw(7)<<j<<setw(10)<<n[j]<<endl;
}
system("pause");
}
   #include <iostream>

نشوف المثال التالي

وهو برنامج يقوم بطباعة مخطط


#include <iomanip>


void main()
{
const int arraySize=12;//to array size
int a[arraySize] = {1,2,4,5,6,7,8,9,4,3,2,8};//The arre A

cout<<"Element"<<setw(13)<<"Value"<<setw(17)<<"Historam"<<endl;

for (int i =0; i < arraySize;i++)
{
cout<<setw(7)<<i<<setw(13)<<n<<" ";
for (int j = 1;j<=n;j++)
cout<<"#";


cout<<endl;
}
}
#include <iostream>

مثال اخر...

وهو برنامج يقوم بجمع عناصر المصفوفة...


using namespace std;

void main()
{
const int arraySize=12;//to array size
int a[arraySize] = {1,2,4,5,6,7,8,9,4,3,2,8};//The arre A

int total = 0;

for(int i=0;i<arraySize;i++)

total=total+a;
cout<<"total is:"<<total<<endl;

}
#include <iostream>

ودمتم سالمين

ارجو من الجميع كتابة الاكواد داخل المترجم وتجربتها وتغيرها والعب فيها ....

اي استفسار لا يردك الاكيبورد

تم تعديل هذه المشاركة بواسطة almstshar2 في 2 فبراير 2009 في 23:59

#2

بسم الله الرحمن الرحيم

Arrays

][®][^][®][The Part II][®][^][®][

مثل ما حنا عارفين ان المصفوفات يمكن ان تكون من اي نمط

راح نتكلم عن سلاسل الحروف مع النمط char

اي سلسلة من سلاسل الحروف مثل hello هي بالواقع عبارة عن مصفوفة حروف .

لذالك يمكن اعطاء قيم ابدائية لمصفوفة حروف باستخدام سلاسل الحروف على سبيل المثال يقوم التصريح التالي

char string1[] = "first";

باعطاء قيم ابتدائية لكل عنصر من عناصر المصفوفة string1 يقابل حرف من السلسلة "first"

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

مهم:

لو نلاحظ ان السلسة "first " تحتوي على خمسة حروف بالاضافة الى حرف خاص يحدد نهاية هذة السلسلة وهو الحرف الصفري null character

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

 '\0'

تنتهي كافة سلاسل الحروف بالحرف الصفري ويتم بالتالي التصريح عن مصفوفات التي تتعامل مع هذي السلاسل بحث انها تكون ذات حجم كافي لتخزين السلسلة مع الحرف الصفري.

وعلى اعتبار ان السلاسل هي مصفوفات فيمكن الوصل الى كل حرف من حروفها (عن طريق الدليل)

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

cout<<string1[0];

يمكن انشاء مصفوفة والطلب من المستخدم ادخال سلسلة ويكون بااستخدام التابع cin

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

char string2[20];

هنا قمنا بانشاء مصفوفة حروف قادرة على تخزين 19 حرف مع الحرف الصفري...

والعملية التالية تقوم

cin>>string2;

لتخزين المدخلات في المصفوفة .

لاحظة انا كتبنا اسم المصفوفة فقط ولم نعطي اي تعليمة خاصة بالحجم.

وبالتالي تقع المهمة على المبرمج ان يصرح عن مصفوفة تفي بالغرض المطلوب من ناحية الحجم .

ويمكن طبعتها بالكود التالي

cout<<string2;

نشووف مثاال عملي على الي تكلمنا عنة

#include <iostream>
using namespace std;
int  main()
{
	 char string1[20],string2[]="the string 2";
	 cout<<"Enter the string\n";
	 cin>>string1;
	 cout<<"the string 1\t"<<string1<<endl;
	 cout<<"the string 2\t"<<string2<<endl
	 <<"string whithe space\n ";

	 for (int i=0;string1 !='\0';i++)
	 cout<<string1<<"  ";
	 cout<<endl;
	 system("pause");
	 return 0;

}

الشرح

char string1[20],string2[]="the string 2";

أولا :عرفنا مصفوفتين من نوع char الأولى عطيناها حجم وهو 20 والثانيه ماعطيناها حجم لكننا حددنا لها

جمله فالكومبايلر مباشره راح يحسب الحجم اللي هو13 فهو يحسب أيضا السبيس بين الكلمات

ثانيا:طلبنا من المستخدم ادخال الجمله في المصفوفه الأولى لأننا ماعبيناها فهي فارغه (مع ملاحظة الألتزام بالحجم حق المصفوفه)

cout<<"Enter the string\n";
	 cin>>string1;

ثالثا:عملنا عملية اخراج بسيطه لعناصر المصفوفتين

cout<<"the string 1\t"<<string1<<endl;
	 cout<<"the string 2\t"<<string2<<endl

رابعا : وهنا الفكره أننا راح نخرج عناصر المصفوفه الأولى اللي دخلناها مفرقه (أي مسافه بين كل حرف وحرف في الجمله المدخله)

<<"string whithe space\n ";

	 for (int i=0;string1 !='\0';i++)
	 cout<<string1<<"  ";
	 cout<<endl;

مع ملاحظة أنه وضعنا شرط التوقف في الفور لوب هو الوصول للحرف الصفري أو النل

فمثلا :لو أنا دخلت الجمله في المصفوفه الأولى IMAMفراح تخرج كالأتي:

I  M  A  M

واتمنى ان الدرس يكون واضح.

#3

بارك الله فيك اخي الفاضل , واصل وإلى الامام... :happy:

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#4

بسم الله الرحمن الرحيم

الله يبارك فيك اخوي time1

Passing Arrays to Functions

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

نأخذ مثال عند المصفوفة imam1

int imam1[30];

وعند تمريرها لتابع Mod

Mod(imam1,30);

ياخذ المصفوفة imam1 وحجمها كوسيطين لة .

تقوم السي ++ بتمرير المصفوفات اتوماتيكيا الى التوابع بأاستخدام اسلوب التمرير بالعنوان call-by-refrence

(حيث يمكن للتوابع المستدعاة من تغير قيم عناصر المصفوفة )

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

اذا يمكن تمرير اي مصفوفة بأكمالها كوسطاء بالعنوان واتمرير اي عنصر بالقيمة من عناصرها مثل اي متحول عادي.

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

ملاحظة:

يجب كتابة الجزء الرأسي للتابع المراد تمرير المصفوفة عن طريقة على الشكل التالي

void Mod (int b[],int ArrsySize)

للدلالة على ان التابع يتوقع استقبال مصفوفةمن الاعداد الصحيحة حسب الوسيط b وهي تحتوي على ArrsySize عنصرا.

ما هو ضروري انك تكتب حجم المصفوفة .

_____________________________________________

نأخذ المثال التالي لتوضيح الفرق بين عملية تمرير مصفوفة وعنصر من عناصر المصفوفة

#include <iostream>
#include <iomanip>
using namespace std;
void modi(int [],int);
void modiElment(int );
int main()
{
const int ArraySize=5;
int a[ArraySize]={0,1,2,3,4};
cout<<"The Values of the original array are:"<<endl;
for (int i=0;i<ArraySize;i++)
cout<<setw(3)<<a;
cout<<endl;
modi(a,ArraySize);//array a passed call-by-reference
cout<<"The Values of the modi array are:"<<endl;
for (int i=0;i<ArraySize;i++)
cout<<setw(3)<<a;
cout<<endl<<endl;
cout<<"the value of a[3] is "<<a[3]<<endl<<endl;
modiElment(a[3]);
cout<<"the value of a[3] is "<<a[3]<<endl<<endl;
system("pause");
return 0;
}
void modi (int b[],int Size)
{
for (int j=0;j<Size;j++)
b[j]*=2;
}
void modiElment(int e)
{
cout<<"Value in ModiElment is "<<(e*=2)<<endl<<endl;
}

شرح الكود:

في البداية يقوم البرنامج بطباعة العناصر الخمسة الصحيحة لمصفوفة a .ثم تتم عملية تمرير المصفوفة الى التابع modi حيث يتم ضرب كل عنصر من عناصر a بالعدد 2. بعدها نعيد طباعت المصفوفة a ضمن التابع ال main . نلاحظ من خلال من الخرج انة بالفعل تم تغير قيم عناصر المصفوفة a بواسطة التابع modi .

ثم يقوم البرنامج بعد ذالك بطباعة قيمة العنصر

a[3]

ثم يمررة الى التابع modiElment الذي يقوم بضرب قيمة الوسيط بالعدد2 ويقوم بطباعة القيمة الجديدة

لاحظ انة عند طباعة قيمة العنصر في التابع ال main انة لم يجري عليها تغير .لان عملية تمرير عنصر من عناصر المصفوفة تتم بالقيمة وليس بالعنوان.

_____________________________________________________

احيانا نحتاج الى تمرير المصفوفة دون المساس بي قيم عناصر المصفوفة.وعلى اعتبارا ان عملية تمرير المصفوفة تتم بالعنوان فأنة من الصعب التحكم في عملية التغيير.ولتفادي ذالك نستخدم const لمنع القيام باي تغير على قيم عناصر المصفوفة المررة.

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

واي محاولة لتغير قيمها يؤدي الى حدوث خطاء .

نأخذ المثال التالي للتتضح الفكرة

#include <iostream>
#include <iomanip>
using namespace std;
void TryToModi(const int []);
int  main()
{
int a[]={10,20,30};
cout<<a[0]<<"  "<<a[1]<<"   "<<a[2]<<endl;
TryToModi(a);
system("pause");
return 0;
}
void TryToModi(const int b [])
{
b[0] *=2;
b[1] *=2;
b[2] *=2;
}

الشرح:

يبين البرنامج كيفية استخدام const مع التابع TryToModi المعرف مع الوسيط const int b[]

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

بحيث لا يمكن تغير القيم الثلاث.

وهذا والله اعلم

ارجو اني وفقت في تقديم هذا الشرح.

#5

جزاك الله خيراً وتابع، لي عودة لأطلع على موضوعك بإذن الله :)

هذه الجملة خاطئة  :wacko: 


#6

بسم الله الرحمن الرحيم

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

يعطيك العافية اخوي على المرور

البحث الخطي:

تعتمد طريقة البحث الخطي على مقارنة كل عنصر من عناصر المصفوفة مع القيمة التي يراد البحث عنها.

تعمل طريقة البحث الخطي بشكل جيد مع المصفوفات الصغيرة الحجم او المصفوفات الغير مفرزة.ولكن مع المصفوفات الكبيرة

لا تعمل بشكل جيد.

طيب نأخذ مثاال

//Linear Search of an Array
 #include <iostream>
 using namespace std;
 int linear (int[],int,int);
 int main()
 {
  const int arraySize=100;
  int a[arraySize], searchkey, elemnt;

  for (int i=0; i<arraySize;i++)
   a= 2 * i;
  cout<<"Enter Intergr search key:"<<endl;
  cin>>searchkey;
  elemnt=linear(a, searchkey,arraySize);
	if(elemnt != -1)
	 cout<<"Found value in elemnt"<<endl<<elemnt<<endl;
	else
	 cout<<"Value not found"<<endl;
  system("pause");
  return 0;
 }
 int linear(int array[],int key,int size)
 {
  for (int n=0;n <size;n++)
   if (array[n]==key)
	return n;
  return -1;
 }

هذا مثال لعملية بحث داخل مصفوفة

int linear (int[],int,int);

الجزء الرأسي لتابع لو نلاحظ هنا طريقة تعريفة بأنة سوف يستقبل مصفوفة ...

int a[arraySize], searchkey, elemnt;

searchkey يستخدم لحفظ الرقم الذي يراد البحث عنة

elemnt وهو الذي يقووم بأستدعاء الدالة البحث وارجاع ترتيب الرقم المراد البحث عنة داخل المصفوفة.

for (int i=0; i<arraySize;i++)
   a= 2 * i;

هنا يتم اعطاء قيم لعناصر المصفوفة

elemnt=linear(a, searchkey,arraySize);

هنا تم استدعاء الدالة وتمرير المصفوفة a

وحجمها arraySize

والرقم المراد البحث عنة searchkey

والان نذهب الى دالة linear

int linear(int array[],int key,int size)
 {
  for (int n=0;n <size;n++)
   if (array[n]==key)
	return n;
  return -1;
 }

array ==المصفوفة a

key == searchkey

size==arraySize

وطريقة البحث تتم بأاستخدام ال for

اتوقع الباقي واضح

واي استفسار لا يردك الا الكيبورد.

تم تعديل هذه المشاركة بواسطة almstshar2 في 4 فبراير 2009 في 18:43

#7

جميل جدا اسلوبك ممتاز بارك الله فيك.

tvquran_6.gif

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