int m1 = "2";
cout<< (m1 + 3)< 9<<endl;
m1 = 8; cout<<m1 <<endl; عدد الاخطاء في الكود السابق هي :
Anonymous Quiz
18%
1
21%
2
29%
3
24%
4
8%
5
درس اليوم : المصفوفات
ماهي المصفوفات وما الحاجه اليها ؟
اذا كنا نريد تعريف متغيرات كثيره او مثلا كنا نريد عمل متغيرات ل 300 طالب خاصه في الرقم الاكاديمي وكنا نريد عمل متغيرات ايضا للاسم ورقم الهاتف والتقدير والنتايج فهل معقول ان نعرف 3 او 4 متغيرات لكل طالب
يبدو ذلك مستحيلا نوعا ما ومتعبا وقد يستغرق وقت كبيرا جدا يتجاوز ال 3 ايام
اذا ما الحل لذلك ؟؟
تقوم المصفوفات بهذا العمل كله دون تعب حيث يمكننا تعريف اكثر من 1000 متغير من خلال سطر برمجي واحد

اذا ماهي المصفوفات وما طريقه كتابتها؟

المصفوفه : هي مجموعه من المتغيرات من نفس النوع والحجم

اذا لعمل مصفوفه فكاننا نقوم بتعريف متغيرات فالمتغيرات تحتاج 3 عوامل رئيسيه هي نوع البيانات واسم المتغير وقيمته اما العنوان لا شأن لنا به فالجهاز هو من يقوم بعمل العناوين للمتغيرات ولكن المصفوفه تحتاج معامل اخر ما هو المعامل؟

المعامل الرابع الاساسي في المصفوفات هو عدد المتغيرات التي نريد عملها في المصفوفه فقد نحتاج 5 متغيرات او 30 او 100 او 1000 على حسب الحاجه

طريقه تعريف المصفوفه;

data_type array_name[array_size] = {value_1 , value_2 , ............ , value_n};
والتي هي

نوع_البيانات اسم_المصفوفه[حجم_المصفوفه] = {قيمه_المتغير_الاول , قيمه_المتغير_الثاني , ....... , قيمه_المتغير_الاخير};

سوال: هل من الضروري ان يتم تمرير القيم الى المصفوفه مباشره؟

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

int ides[300] ;
المصفوفه السابقه جميع عناصرها من نوع int اي اعداد صحيحه واسم المصفوفه هو ides وحجم المصفوفه هو 300 اما قيمه كل خليه من المصفوفه فهي فارغه بمعنى لا توجد بداخلها شيئ

ويمكن ايضا عمل مصفوفه من نوع نصي string او عدد حقيقي float او غيرها من انواع البيانات وايضا يمكنك تسميه المصفوفه كما تريد عدا استخدام كلمه محجوزه

اذا هل يمكنك الان تعريف مصفوفه؟
تابع درس المصفوفات:
عرفنا كيف نقوم بعمل مصفوفه من نوع محدد وبحجم معين والان كيف نقوم بتعبئه المصفوفه بالببيانات؟

هناك طريقتان لتعبئله المصفوفات بالبيانتات وهي كالتالي

1- الطريقه الاولى:
ان نقوم بتمرير البيانات مباشره
مثال
string names[3] = {"Ahmed" , "Ali" , " muhammed" }

ملاحضات هذه الطريقه:
1- يجب ان تكون البيانات بين قوسين مجعدين
2- يجب ان تمرر البيانات بالصيغه الصحيحه كان تقوم بتمرير النصوص بين الفاصلتين المزدوجه (" ") والكاركترات بين الفاصلتين الاحاديه (' ') .....الخ
3- يجب الفصل بين القيم عن بعضها بفاصله سفليه ( , )
4- القيم الممرره تخزن في المصفوفه علي الترتيب
5- لا يمكن استخدام هذه الطريقه الا وفقط عند تعريف المصفوفه


الطريقه الثانيه:
ان تقوم بتعبئه المصفوفه خليه خليه

يمكن تعبئه الخلايا بشكل منفرد بعد تعريفها وذلك على النحو التالي
array_name[cell_id] = value ;
امثله
names[0] = "Ahmed";
names[1] = "abdullah";
names[2] = "mazen";
names[30] = "khalid";

ملاحضات هذه الطريقه:
1- يجب دائما تحديد رقم الخليه التي سيمرر اليها القيم
2- الخايه الاولى تحمل الرتبه 0 وليس 1 مثلا
names[1]
هي الخليه الثانيه وليست الاولى
3- يجب ايضا تمرير البيانات بالشكل الصحيح
4- لا يتم استخدام الاقواس الجعده عند تمرير القيم
5- لا يمكن تمرير قيمتين لمتغيرين في نفس الكود
6- يجب ان تكون المصفوفه معرفه مسبقا قبل تمرير البيانات بهذه الطريقه
يمكن ايضا الطلب من المستخدم ادخال البيانات وتخزينها مباشره في المصفوفه كما يلي
cin >> names[2] ;



هل يمكنك تعريف مصفوفه وتعبئتها بالبيانات؟
تابع درس المصفوفات
تعلمنا كيف نقوم بتعريف مصفوفه وكيف نقوم بتمرير القيم اليها والان كيف يمكننا الحصول على تلك البيانات واستخدامها 🤔؟

قلنا ان المصفوفه عباره عن مجموعه من المتغيرات ولكن هذه المتغيرات تحمل رتب داخل المصفوفه( [1] )
هل عرفت كيف تحصل على البيانات الان🤔

تذكر كيف قمنا بتمرير القيم الى خلايا المصفوفه كل خليه على حده من خلال الطريقه التاليه
names[0] = "Ahmed";
اذا بما انها شبيهة بالمتغيرات اذا يمكننا التعامل مع كل خليه على انها متغير مستقل بذاته مثلا
int x = 10;
عندما اردنا طباعه قيمه x كنا نكتب التالي
cout << x ;
كذلك المصفوفه لا فرق في ذلك سوى رتبه المتغير بالنسبه للمصفوف ولنعتبر ان رقم المتغير جزءا من اسمه
اذا يمكننا الحصول عليها كالتالي
مثلا كان لدينا مصفوفه نصيه تحمل اسماء موضفي الشركه وكنا نريد ان نحصل على اسم احد الموضفين ونخزنها في متغير نصي اخر ونقوم بطباعتها فنقوم بالتالي

string bos ;
bos = names[20] ;
cout << bos<< endl;

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

cout << names[20] << endl ;

الان بت تعرف كيف تقوم بعمل مصفوفه وكيف تخزن فيها القيم وكيف تستخدم هذه القيم لاحقا غدا انشاء الله بنتعرف عن طرق عمل مصفوفات متعدده الابعاد والفرق بينها وبين المصفوفات العاديه وطرق مبسطه لتعبئه المصفوفات باستخدام جمل الدوران loops وقبل ذلك قم بعمل التمرين التالي
قم بانشاء مصفوفه نصيه بحجم 4 وسمها باي اسم تريده .

اجعل المستخدم هو من يدخل القيمه الاولى للمصفوفه.

قم بتعبئه بقيه عناصر المصفوفه بالاسماء التاليه
Ali
Ahmed
Adnan
خزن القيمه التي تحتوي على Adnan في متغير نصي اخر باسم
name_ad

قم بطباعه المتغير name_ad
ثم قم بطباعه بقيه قيم المصفوفه(الاسماء المخزنه فيها)
كل قيمه في سطر خاص بها.
ارسل الحل في التعليقات او في البوت المذكور سابقا 👆.
نستطيع الحصول علي متغير من مصفوفه كالتالي:
int ID[2] = {20 , 30};
int My_ID = ID[2]; cout<<My_ID<<endl; والنتيجه هي 30...؟
Anonymous Quiz
31%
نعم هذا صحيح
10%
لا , لان المتغير My_name تم تعريفه حديثا
31%
لا , لسبب آخر
28%
الاجابه صحيحه ولكن الافضل كتابة:cout<<ID[2];
داله sort
هي احدى دوال مكتبه algorithm
تعمل على فرز القوائم او المصفوفات عن طريق معاملات يتم تمريرها اليها او دوال مقارنه امثله عليها
- اذا اردت صنع قاعده لفرز العناصر كان تفرزها اولا الاعداد الاوليه ثم الفرديه ثم الزوجيه
يمكنك ذلك من خلال صنع داله مقارنه وتمريرها فيها مثال على ذلك

bool com(char aa , char bb)
{
int a = aa - '0' , b = bb - '0';
//تحويل قيم ال char الى int للمقارنه بينها
return a < b ;
}
int main
{
string num = "83846";
sort(num.begin(),num.end(),com)
cout<<num<<endl;
return 0;
}
في هذا المثال سيتم فرز الاعداد ابتدائا من بدايه السلسله النصيه الى نهايتها حسب شرط داله com والتي ترجع true اذا كان الارقم الاول اصغر من الرقم الثاني .
بالمختصر ستقوم بترتيبها تصاعديا.

يمكنك وضع شرط كما تريد لعمليه الفرز .
درس اليوم
#الدوال

انواعها:
1- دوال لا ترجع قيمه (نوعها void)
2- دوال ترجع قيمه
(لها نفس انواع بيانات المتغيرات سواءا متغيرات ثابته int float double char ....etc او متغيرات مصطنعه struct-class-enum....etc)


_كل الانواع السابقه يمكن ان تكون
1_ تستقبل قيما
2_ لا تستقبل قيما

_الدوال التي تستقبل قيما يمكن ان تمرر القيم اليها بطريقتين
1_ #التمرير_بالقيمه
2_ #التمرير_بالمرجع

_التمرير بالقيمه تعني ان الداله ستقوم بانشاء متغيرات اخرى وتعطيها القيم التي مررت اليها ثم تتعامل مع هذه المتغيرات الجديده

_التمرير بالمرجع يعني ان الداله ستتعامل مباشره مع المتغيرات التي مررت فيها ويتم وضع العلامه & قبل اسم المعاملات المنشأه فيها

اليكم مثال سيوضح الفرق بينها

#include<iostream>
using namespace std;

void swap1(int n1 , n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}
void swap2(int &n1 , int &n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}

int main()
{
int a = 5; b = 7;
cout<<"main vales\n a = "<<a<<" b = "<<b<<endl<<"_____________\n";
swap1(a , b);
cout<<"after swap1\n a = "<<a<<" b = "<<b<<endl<<"_____________\n";
swap2(a,b);
cout<<"after swap2\n a = "<<a<<" b = "<<b<<endl<<"_____________\n";
return 0;
}


والنتيجه هي :
main vales
a = 5 b = 7
___________
after swap1
a = 5 b = 7
___________
after swap2
a = 7 b = 5
___________


اتمنى تكون الفكره وصلت وجربو الكود بانفسكم لتتعلمو المزيد 👍🤍
#بالتوفيق_للجميع
#الدوال
الدوال التي لا ترجع قيمه :

_دائما ما يكون نوعها هو void وهي لا تحجز اماكن في الذاكره الا وفقط للمتغيرات التي بداخلها فقط

_لا تحتوي هذه الدوال على قيم عند كتابه الامر return

_يعتبر الامر return في هذه الدوال امرا لايقافها بمعني ان الداله تنتهي عند هذا الكود

_غالبا ما تستخدم هذه الدوال لاداء وظائف الطباعه والاخراج او وظائف الكتابة والتعديل على المتغيرات العامه في البرنامج

_تستخدم ايضا غالبا كدوال #الاستدعاء_بالمرجع او #call_by_reference للكتابه والتعديل على قيم المتغيرات الممره فيها


امثلة :

1-لا تستقبل قيما
void say_hello()
{
cout<<"\tHello Sir \n";
}
تقوم هذه الداله بطباعه النص (Hello Sir) في كل مره يتم استدعائها فيه

2-تستقبل قيما
void say_welcome(string name)
{
cout<<"\tWellcome "<<name<<" to my project .\n";
}

تقوم هذه الداله بالترحيب بالشخص الممر اسمه فيها عند استدعائها مثلا
say_welcom("Ahmed");
والنتيجه هي طباعة
Welcome Ahmed to my project .

3-#الاستدعاء_بالمرجع
void Swap(int &a , int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
تقوم هذه الداله بتبديل قيمتي المتغيران الذان يمرران اليها مثل

int num1 = 22 , num2 = 30;
cout<<"num1 = "<<num1<<" num2 = " <<num2<<endl;
Swap(num1 , num2);
cout<<"num1 = "<<num1<<" num2 = " <<num2<<endl;

والنتيجه هي :
num1 = 22 num2 = 30
num1 = 30 num2 = 22

#بالتوفيق_للجميع
تمرين🔊
قم بعمل داله تستقبل رقما ثم تطبع مجموع الارقام الزوجيه من ال0 الى هذا الرقم .

المشاركات على بوت التصحيح :
https://www.tg-me.com/fix_code_bot

#بالتوفيق
#الدوال
الدوال التي ترجع قيمة :

_تحجز هذه الدوال امكنة في الذاكره بمقدار ما يحجزه اي متغير عادي حسب نوعه مثلا الدوال التي من نوع int تحجز 4 byet وتحجز الدوال التي من نوع double 8 byte مع العلم بان هذه الاماكن من الذاكره لا يتم حجزها الا عند تنفيذ الداله ويتم التخزين فيها القيمه التي ترجعها هذه الدوال

_يتم ايضا حجز مساحات للمتغيرات التي يتم انشائها في الدوال والمتغيرات التي يتم تمرير القيم اليها!!

_عند استخدام الاستدعاء بالمرجع فانه لا يتم حجز اي مواقع في الذاكره للمتغيرات التي تم تعريفها لاستقبال قيما بالمرجع!!

_دائما ما تنتهي هذه الدوال بامر return بل ويجب ان تنتهي بهذا الامر بينما الدوال الدوال التي لا ترجع اي قيم لا يشترط ان تنتهي بهذا الامر

_يتم تمرير قيمه بنفس نوع بيانات الداله الى الامر return فان كانت الداله من نوع int يجب تمرير قيمه رقميه الى الامر return مثل
return 10;

امثلة على هذه الدوال:

1_
int sum_of(int a , int b)
{
return (a + b);
}
ترجع هذه الداله المجموع لرقمين يتم تمريرهم اليها

2_
char get_first_of(string name)
{
return name[0];
}
ترجع هذه الداله الحرف الاول من اي نص يمرر اليها

3_
double average(int sum , int count_s)
{
if(count_s != 0)
return (sum/count_s);
else
return 100.0;
}
ترجع هذه الداله المعدل للمجموع وعدد المواد الممره اليها وتم استخدام الامر
if(count_s != 0)
لتجنب وقوع خطا عند القسمه على الصفر


4_
string get_appre(float &n)
{
if(n >= 90)
return "Excelant";
else if(n >= 80)
return "Very good";
else if(n >= 65 )
return "Good";
else if(n >= 50)
return "Accept";
else
return "Fill";
}
ترجع هذه الداله التقدير لاي معدل يتم تمريره اليها وطالما اننا لا نغير من قيمه المتغير الممرر اليها تم استخدام التمرير بالمرجع لتقليل المساحه التي تحجزها على الذاكره
ويفضل عدم استخدام التمرير بالمرجع اذا كنا نريد استخدام هذه الداله مع تمرير قيمه مباشره اليها دون تمرير متغير بدلا من ذلك


#بالتوفيق_للجميع💖
#الدوال
المتغيرات الثابته وخواصها وعملها على الدوال:

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

_نقوم بتعريف المتغيرات الثابته بعد الكلمه المحجوزه static

_عند استدعاء اي داله لا تحمل متغيرات ثابته فان البرنامج يقوم بانشاء داله مشابهة للداله التي قمنا باستدعائها اما عندما تحتوي الداله على متغير ثابت فان البرنامج يستدعي نفس الداله مع نفس المتغيرات في كل مرة يتم استدعاءها فيه


مثال :
#include <iostream>
using namespace std;

void print_number()
{
static int a = 0;
cout<<"the number is : "<<a<<endl;
a++;
}
int main()
{
print_number();
print_number();
print_number();
print_number();
}

والنتيجه هي :

the number is : 0
the number is : 1
the number is : 2
the number is : 3

#بالتوفيق_للجميع
تمرين🔊
قم بعمل داله تقوم بالاتي :
1- تستقبل متغيرا نصيا بالمرجع وتقوم بحذف اي كاركتر منه وإبقاء الارقام فقط
2- تقوم بفرز وترتيب تلك الارقام تصاعديا
3- واخيرا ترجع قيمه رقميه بنوع long وتكون القيمه المرجعة هي مجموع تلك الارقام

ثم في الداله الرئيسيه(main) اطبع السلسله النصيه الجديده وثم اطبع القيمة المرجعة من الدالة

ملاحضه : يمكنك تمرير اي قيمه نصيه للمتغير الذي سيمرر الى الداله
مثال:
string s = "824*82:4828n38";

المشاركات على بوت التصحيح :
https://www.tg-me.com/fix_code_bot

#بالتوفيق
درس اليوم :
#الدوال
استدعاء الداله لنفسها :

_جميعنا يعرف انه بامكاننا استدعاء اي داله من دالخل داله main او من ايي داله اخرى ولكن بامكاننا ايضا استدعاء الداله من داخل هيكلها ايضا ولاكن يرجى مراجعة بعض الآداب والشروط ليعمل البرنامج بشكل صحيح


_شروط استدعاء الدوال لذاتها:
1_ عمل نقطة توقف لاستدعاء الدالة لذاتها وذلك لتجنب دخول البرنامج بدائره لا يمكنه الخروج منها تماما مثل وضع شرط لتوقف داله for او while عن تكرار كود معين

2_ تغيير القيم الممرره الى الداله في كل مره تقوم الداله باستدعاء ذاتها

3_ مراعاه الامر return عند ايقاف الداله ومراعاه القيمه المعاده من الداله


_تستخدم هذه الدوال غالبا بدلا من جمل الدوران for ا while او غيرها من دوال التكرار

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


مثال:
هل تستطيع عمل داله pow والتي ترجع القوى لاي رقم يمرر اليها؟

في الواقع سيقول البعض انه بامكاننا استخدام جمله for للحصول على ذلك مثل الكود التالي

long pow(int number , int power)
{
for(int i = power; i > 0; i++)
number *= number;
return number;
}
هذا الكود صحيح 100 بالمأه ولكن اذا اردت استخدام استدعاء الداله لذاتها سيكون كالاتي

long pow(int number , int p)
{
//نقطه النهاية
if(p <= 0)
return 1;
return (number * pow(number , p-1));
}
هذه الدال مشابهة في النتيجة لداله pow السابقة ولدالة pow الموجوده في مكتبة math



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

#بالتوفيق_للجميع🤍
تمرين🔊

باستخدام فكرة استدعاء الدالة لذاتها :
قم بعمل دالة تستقبل عددا وترجع مضروب هذا العدد .

توضيح :
مضروب 5 = 5×4×3×2×1 = 120
مضروب 7 = 7×6×5×4×3×2×1 = 840

المشاركات على بوت التصحيح :
https://www.tg-me.com/fix_code_bot

#بالتوفيق
2024/05/16 02:33:59
Back to Top
HTML Embed Code: