Transcript PPT

‫محاضرة ‪ :7,6‬مفهوم مصفوفـة من الكائنات‬
‫َ َ َ ُ ُ َّ‬
‫ال رسو َل اللهَ صلى هللا عليه وسلم‬
‫ق َ‬
‫ََ‬
‫َ‬
‫َّ‬
‫ُ‬
‫« مث َل الجليس الصالح َو الجليس‬
‫ْ‬
‫َّ ْ َ َ َ‬
‫َ‬
‫َ‬
‫ْ‬
‫السوءَ كمثلَ صاحَبَ اْلسك‪َ ،‬وك َير‬
‫ْ‬
‫َ‬
‫َ‬
‫َ‬
‫َّ‬
‫َ‬
‫ْ‬
‫َ‬
‫َ‬
‫ْ‬
‫ُ‬
‫ن صاحبَ‬
‫كَ م َ‬
‫الحداد‪َ ،‬ل يعدم َ‬
‫يحه‪ُ،‬‬
‫ْاْل ْسكَ إ َّما َت ْش َت َريه‪ ،‬أ َْو َتج ُ َد َر َ‬
‫َ ُ ْ َ َّ ُ ْ ُ َ َ َ َ َ ْ َ‬
‫كَ‬
‫َ‬
‫ْ‬
‫ك أ َو َثوب َ‬
‫ق بد ن َ‬
‫َوك َير الحدادَ يح َر َ‬
‫َ َ‬
‫ْ َ‬
‫ْ‬
‫ُ‬
‫ُ‬
‫خِبيثًَ »‬
‫أ َو تج َد من َه ريحاَ َ‬
‫رواه الِبخاريَ‬
‫وقال مالك بن دينار‪ -‬رحمه هللا ‪ :-‬إنك إن‬
‫تنقل األحجار مع األبرار‪ ،‬خير‬
‫لك من أن تأكل الخِبيص مع‬
‫الفجار‬
‫وأنشد‪:‬‬
‫وصاحب خيار الناس تنج مسلمــا‬
‫وصاحب شرار الناس يوما فتندما‬
‫‪ ‬ما هو ‪ static variable‬؟‬
‫‪ْ ‬لاذا الربط بين اْلصفوفات و األصناف؟‬
‫‪ ‬بنــاء برنامج سجـل اْلوظفين‬
‫‪ ‬بناء دليل التلفونات (مشـروع الفصل)‬
‫ما هو ‪static variable‬؟‬
‫‪ ‬عند تعريف متغير ما في الصنف (‪ )Class‬بـ ‪ static‬فهذا يعني أن جميع الكائنات‬
‫(‪ )objects‬التي سيتم اشتقاقها من هذا الصنف ستتعامل مع القيمً اْلحدثـً من هذا‬
‫اْلتغير‪.‬‬
‫‪ ‬فكل كائن جديد يغير على قيمً هذا اْلتغير‪ ,‬يتم نشر هذا التغيير على كافً الكائنات‪.‬‬
‫‪ ‬و هذا على عكس ما يحدث في الوضع الطِبيعي حيث يحصل كل كائن على نسخً افتراضيً‬
‫ى‪.‬‬
‫دون أن تتأثر بالكائنات اآلخر َ‬
‫;‪private static int count = 0‬‬
‫؟‬static variable ‫ ما هو‬: ‫تدريب‬
public class StaticVariable {
static int noOfInstances;
public StaticVariable () {
noOfInstances++;
}}
‫مستفيدا من هذا اْلثال اجعل أكبر عدد من الكائنات‬
... ‫ فقط‬5 ‫يمكن انشاءه من هذا الصنف هي‬
public static void main(String[] args){
StaticVariable sv1 = new StaticVariable();
System.out.println("No. of instances for sv1 : " + sv1.noOfInstances);
StaticVariable sv2 = new StaticVariable();
System.out.println("No. of instances for sv1 : " + sv1.noOfInstances);
System.out.println("No. of instances for st2 : " + sv2.noOfInstances);
StaticVariable sv3 = new StaticVariable();
System.out.println("No. of instances for sv1 : " + sv1.noOfInstances);
System.out.println("No. of instances for sv2 : " + sv2.noOfInstances);
System.out.println("No. of instances for sv3 : " + sv3.noOfInstances);
}
1 ‫تدريب ذاتي‬
// 1
//2
//2
//3
//3
//3
‫ْلاذا الربط بين اْلصفوفات و األصناف؟‬
‫َّ‬
‫‪ ‬عندما كنـا نقوم باشتقاق مجموعً من الكائنات من صنف ما فإننا ل يمكننا إجراء‬
‫عمليات الِبحث أو الترتيب أو الطِباعً الجماعيً لهم ‪ ,‬لنهم غير محصورين في مكان محدد‪.‬‬
‫‪ ‬اْلصفوفات تعطينا الفرصً للدوران على عناصرها و بالتالي يمكننا إجراء عمليات الِبحث و‬
‫الترتيب و غير ذلك‪.‬‬
‫‪ ‬من هنا جاء الغرص من الربط بين اْلصفوفات و األصناف‪.‬‬
‫‪e1‬‬
‫; ‪Employee [] x‬‬
‫‪e2‬‬
‫‪Employee class‬‬
‫‪e3‬‬
‫;‪int sal‬‬
‫;‪int id‬‬
‫;‪String name‬‬
‫…‬
‫‪e4‬‬
‫‪e5‬‬
‫‪e6‬‬
‫‪e7‬‬
‫‪e8‬‬
‫ما هو‬static variable ‫؟‬
‫تدريب ‪: 1‬بناء برنامج يحاكي كشف أجهزة الحاسوب باْلختبر‬
‫‪ ‬مستخدمـا مفاهيم البرمجً الشيئيً ‪ ,‬قم ببناء برنامج يحاكي كشف بأجهزة الحاسوب‬
‫باْلختبر‪ ,‬مع إمكانيً طِباعً بيانات كافً األجهزة‪ ,‬علما بأن الكشف الواحد‪.‬يست َوعب‬
‫معلومات ‪ 50‬جهاز فقط‪.‬‬
‫تدريب ‪: 1‬بناء برنامج يحاكي كشف أجهزة الحاسوب باْلختبر‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫فكر معي قليال ‪...‬‬
‫جهاز الحاسوب يعتبر ش يء أليس كذلك ؟!‬
‫بلى‪ ...‬بالتالي يمكننا تمثيله من خالل صنف يحتوي على كافً بياناته‪.‬‬
‫و الكشف هو مكان يتم فيه تخزين بيانات حول أشياء محددة‪.‬‬
‫عندما يحتوي الكشف على بيانات ألشياء من صنف واحد فهذا يعني أنه يحاكي مصفوفً‪.‬‬
‫و بما أن الصنف يعتبر نوع‪ ,‬بالتالي يمكنني تعريف مصفوفً من هذا الصنف‬
‫بناء برنامج يحاكي كشف أجهزة الحاسوب باْلختبر‬: 1 ‫تدريب‬
public class PC {
private static int PCcounter;
private static String code;
‫أوال نقوم بإنشاء‬
private static String YOM;
private static int cost;
‫صنف الحاسوب‬
public PC() {
PCcounter++;
code = "no code";
YOM = "1990"; }
public PC(String code, String YOM, int cost) {
PCcounter++;
this.code =code;
this.YOM = YOM;
this.cost = cost; }
public void info(){
System.out.println("---------------------------");
System.out.println("Code: "+code+"\nYOM: "+YOM+"\ncost: "+cost); } }
‫بناء برنامج يحاكي كشف أجهزة الحاسوب باْلختبر‬: 1 ‫تدريب‬
public class Record {
PC [] rec = new PC[50];
private int count;
public Record() {
count =0; }
public void insert(String code, String YOM, int cost){
if(count<50){
PC p = new PC(code, YOM,cost);
rec[count] = p;
count++;}
else System.out.println("Sorry, The record is complete"); }
public void insert(){
if(count<50){
PC p = new PC();
rec[count] = p;
count++;}
else System.out.println("Sorry, The record is complete"); }
public void PrintAll(){
System.out.println("Count of PC: "+count);
for(int i =0; i<count; i++)
rec[i].info(); } }
‫ثانيـًا نقوم بإنشاء‬
‫صنف السجل‬
‫بناء برنامج يحاكي كشف أجهزة الحاسوب باْلختبر‬: 1 ‫تدريب‬
public class RecordPC {
public static void main(String[] args) { ‫ثالثـًا نقوم بإنشاء كائن‬
Record rec1 = new Record();
rec1.insert("pc123","2010",450);
rec1.insert("pc124","2010",455);
rec1.insert("pc125","2010",460);
rec1.PrintAll();
}
}
‫من السجل ثم نضيف إليه‬
‫أجهزة الحاسوب‬
‫تدريب ‪: 1‬بناء برنامج يحاكي كشف أجهزة الحاسوب باْلختبر‬
‫ناتج عملية الطباعة لكافة‬
‫محتويات الكشف‬
‫تدريب ‪: 2‬بناء سجل معلومات اْلوظفين‬
‫‪ ‬مستخدمـا مفاهيم البرمجً الشيئيً ‪ ,‬قم ببناء برنامج يحاكي سجل اْلوظفين مع إمكانيـً‬
‫طِباعً كافً بيانات اْلوظفين و الِبحث عن موظف بإسمه مع زيادة مرتِبه بنسِبً ‪.%10‬‬
‫تخطيط التعامل بين وحدات اْلشروع‬
‫‪Main‬‬
‫‪Class‬‬
‫صنف إدارة‬
‫اْلوظفين‬
‫‪.2‬يقوم بإنشاء كائنات من‬
‫صنف اْلوظفين‬
‫هذا الـ ‪ Class‬يقوم بتمثيل‬
‫الطالب بمعلوماته كاملً‬
‫َو ه َو مجرد كائن برمجي َل حياة‬
‫فيه َو إنما مجرد تخطيط َو تمثيل‬
‫هذه الكائنات (‪ )Objects‬التي تم إنشاءها من الـ‬
‫‪َ Class‬و هي كائنات حقيقً تحتويَ على بيانات‬
‫آخر‬
‫لتصف طالب معين َو يتم إنشاءها داخل ‪َ Class‬‬
‫غير الذي تم اشتقاقها منه‬
‫َ‬
‫‪Obj3‬‬
‫‪Obj4‬‬
‫‪Obj1‬‬
‫‪Obj2‬‬
‫ بناء‬: ‫التنفيذ‬Employee Class
‫‪emp_manage Class‬التنفيذ ‪ :‬بناء‬
‫ليتم ‪STATIC‬نقوم بتعريف متغير من نوع‬
‫التعامل معه كعداد لعدد الكائنات التي تم‬
‫‪EMPLOYEE‬اشتقاقها من الصنف‬
‫طالما نتحدث عن سجل لبيانات الموظفين‪,‬‬
‫فإننا بحاجة الستخدام مصفوفة يتم في خالياها‬
‫تخزين موظفين و بالتالي فإننا نقوم بتعريف‬
‫‪EMPLOYEE‬المصفوفة من نوع‬
‫نقوم بإعطاء قيمة ‪Constructor‬في الـ‬
‫افتراضية لعدد الخاليا (عدد الموظفين) الذين‬
‫سيتم تخزين بياناتهم في السجل‬
‫أو نقوم نحن بإرسال قيمة كما تشاهد‬
‫{ ‪public class emp_manage‬‬
‫;‪static int i = 0‬‬
‫;‪employee [] emp_file‬‬
‫{ )(‪public emp_manage‬‬
‫;]‪emp_file = new employee[100‬‬
‫}‬
‫{ )‪public emp_manage(int j‬‬
‫;]‪emp_file = new employee[j‬‬
‫}‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫}‬
‫‪emp_manage Class‬التنفيذ ‪ :‬بناء‬
‫الدالة التي تنتمي للسجل و يتم من خاللها‬
‫إضافة الموظفين الجدد و تخزينهم في‬
‫المصفوفة‬
‫قبل إضافة الموظف الجديد البد من التأكد أن‬
‫السجل (المصفوفة) الزالت تحتوي أماكن‬
‫‪if‬فارغة و بالتالي نستخدم جملة‬
‫لإلضافة نقوم بإنشاء كائن جديد من الصنف‬
‫ثم ببساطة نضع هذا الكائن ‪EMPLOYEE‬‬
‫في أول خلية فارغة في المصفوفة و نزيد‬
‫العداد بواحد‬
‫)‪public void addemp(int x, String y‬‬
‫{‬
‫)‪if (i<100‬‬
‫{‬
‫;)‪employee e1 = new employee(x,y‬‬
‫;‪emp_file[i]= e1‬‬
‫;‪i++‬‬
‫}‬
‫‪else‬‬
‫‪JOptionPane.showMessageDialog(null, "Sorry‬‬
‫;)"‪the file of employees is full‬‬
‫}‬
‫‪.‬‬
‫‪.‬‬
‫}‬
‫‪emp_manage Class‬التنفيذ ‪ :‬بناء‬
‫الدالة التي تنتمي للسجل و يتم من خاللها‬
‫طباعة بيانات كافة الموظفين الموجودين‬
‫بالسجل (المصفوفة)‬
‫ليتم فيه ‪String‬نقوم بتعريف متغير من نوع‬
‫جمع كافة بيانات الموظفين كنص‬
‫نتعامل في هذه الحالة كأننا نقوم بطباعة‬
‫بيانات مصفوفة عادية‪ ,‬فنقوم بالدوران على‬
‫)(‪info‬خانات المصفوفة و باستخدام الدالة‬
‫نستعيد بيانات كل موظف و نجمعها لما قبله‬
‫ليتم طباعتهم بجملة واحدة‬
‫)(‪public void print‬‬
‫{‬
‫;""= ‪String output‬‬
‫)‪for (int z =0; z<i; z++‬‬
‫{‬
‫;"‪output = output + emp_file[z].info() + "\n‬‬
‫}‬
‫‪JOptionPane.showMessageDialog(null,‬‬
‫;)‪"The info is: \n"+ output‬‬
‫}‬
‫التنفيذ ‪ :‬إشتقاق سجل و التعامل مع بياناته‬
‫) من الصنف ‪Object‬نشتق سجل جديد (‬
‫و من خالله سنقوم ‪emp_manage‬‬
‫باإلضافة و التعامل معها‬
‫نقوم بإضافة ‪addemp‬من خالل الدالة‬
‫البيانات الخاصة بالموظفين الواحد تلو اآلخر‬
‫; )(‪emp_manage file1 = new emp_manage‬‬
‫;)"‪file1.addemp(4,"ahmad‬‬
‫;)"‪file1.addemp(5,"Mahmoud‬‬
‫نطلب من السجل أن يقوم بطباعة بيانات كافة‬
‫الموظفين الموجودين في السجل األول‬
‫;)"‪file1.addemp(6,"ali‬‬
‫;)(‪file1.print‬‬
‫أمثلً أخرى على تطِبيقات ‪Array of objects‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫سجل يحتوي على بيانات أجهزة الحاسوب التي باْلختبر‪.‬‬
‫سجل يحتوي على معلومات و مواصفات السيارات اْلوجودة بالكراج‪.‬‬
‫سجل للطلِبً اْلوجودين بالكليً‪.‬‬
‫دفتر تلفونات‬
‫مشــروع اْلس ــاق ‪1‬‬
‫‪ ‬مستفيدا من مفهوم ‪ Array of Objects‬قم ببرمجً دفتر لتسجيل جهات التصال على‬
‫الهيئً َو الشاكلً التي يتم بها تسجيل جهات التصال في دفتر التلفونات‪.‬‬
‫‪ ‬قم بالتحليل َو الستنتاج لستخراج‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫كافً األصناف التي لبد أن يحتويها اْلشروع‬
‫السلوك التابع لكل صنف‬
‫التفاعل بين األصناف َو الكائنات‬
‫مشــروع اْلس ــاق ‪1‬‬
‫دفتر تلفونات‬
‫إدارة جهات االتصال‬
‫بحث باالسم ‪ ...‬بالرقم ‪...‬‬
‫بالعنوان ‪ ...‬بالعمر‬
‫إضافة‬
‫جهة اتصال‬
‫‪Contact‬‬
‫جهة اتصال‬
‫‪Contact‬‬
‫جهة اتصال‬
‫‪Contact‬‬
‫تعديل‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫طباعة بيانات‬
‫جهة اتصال‬
‫‪Contact‬‬
‫ما هي ‪ static methods‬؟‬
‫‪ ‬يوجد نوعان من الدوال‪:‬‬
‫‪.1‬‬
‫‪ :Instance methods‬و هذه الدوال هي التي ترتبط بالكائنات و تستخدم متغيرات‬
‫الكائن‪ ,‬أي أنها ال تستخدم و ال يتم تفعيلها إال عند اشتقاق كائن من الصنف و بداخلها ال‬
‫تتعامل إال مع المتغيرات التي تم تعريفها داخل الصنف و التي تعرف باسم ( ‪instance‬‬
‫‪ )variables‬و هذا النوع هو النوع االفتراضي من الدوال و هو الذي تم التعامل معه‬
‫طيلة الفترة السابقة‪.‬‬
‫‪.2‬‬
‫‪ :Static methods‬هي دوال ال تتعامل مع الـ ( ‪ )instance variables‬و ال تعتمد‬
‫على إستقاق كائن جديد من الصنف‪ ,‬بل يتم استخدامها من خالل الصنف مباشرة و‬
‫بإعطاءها قيم مباشرة خارجية‪ .‬أو أن تتعامل مع قيم ‪ .static variables‬هذا النوع من‬
‫الدوال مناسب عند بناء أصناف في علم الرياضيات مثل صنف ‪ Math‬و لذلك يسمى هذا‬
‫النوع أيضا ‪class methods‬‬
‫كيف يتم استدعاء ‪ static method‬؟‬
‫‪ ‬عندما نريد استدعاء دالة من دوال الكائنات ( ‪ )an instance method‬نقوم‬
‫مثال باشتقاق كائن (‪ )Obj‬من الصنف ثم بعد ذلك نقوم باستدعاء الدالة ‪fun‬هكذا‬
‫;)‪Obj.fun(3,5‬‬
‫‪ ‬لكن استدعاء الدالة من نوع ‪ static method‬ال يحتاج منـَّا إلى اشتقاق كائن‬
‫بل يتم مباشرة من خالل اسم الصنف ثم الدالة ‪ ,‬فعلى سبيل المثال‪:‬‬
‫;)‪Math.max(4,7‬‬
‫ ؟‬static method ‫ كمثال على‬Math ‫الـ‬