إنضمامك إلي منتديات استراحات زايد يحقق لك معرفة كل ماهو جديد في عالم الانترنت ...

انضم الينا
استراحات زايد الصفحة الرئيسية

         :: 100% Organic Cotton Baby Wipes – 60 Pcs (آخر رد :konouz2017)       :: فوط صحية ناعمة بالقطن العضوي | فوط صحية قوية الامتصاص | organyckw (آخر رد :konouz2017)       :: |مايونيز صحي وعضوي |من هيلثي كرفتس يصلك الى باب ا healthycrafts (آخر رد :konouz2017)       :: مذاق رائع ومقرمش لرقائق البطاطس بنكهات متنوعة -Corn Up Popped (آخر رد :konouz2017)       :: تفسير حلم اني انخطبت وانا عزباء (آخر رد :نوران نور)       :: القدم في المنام للعزباء (آخر رد :نوران نور)       :: تفسير حلم سقوط سن واحد سفلي في اليد (آخر رد :نوران نور)       :: تفسيرحلم الزواج للمتزوجة (آخر رد :نوران نور)       :: تفسير حلم دورة المياه للعزباء (آخر رد :نوران نور)       :: السياحة في مصر للعوائل (آخر رد :emad100)      

إضافة رد
 
LinkBack أدوات الموضوع انواع عرض الموضوع
  #1  
قديم 05-18-2009, 11:00 PM
عضو ماسي
بيانات محروم.كوم
 رقم العضوية : 503
 تاريخ التسجيل : Dec 2007
الجنس : female
علم الدوله :
 المشاركات : 2,100,611
عدد الـنقاط :3341
 تقييم المستوى : 2139


هذا المشروع عبارة عن برنامج قاعدة بيانات لتسجيل بيانات الطلاب على شكل سجلات كل سجل يحوي بيانات الطالب مثل الاسم و الرقم و الدرجات و التقدير الخ ، و قد قمت بكتابته بلغة سي بلس بلس لسببين :
الأول : التمرين و التدريب الذاتي على كتابة المشاريع بهذه اللغة القوية و المتينة لتحقيق مفاهيم البرمجة كائنية التوجه OOP لحل المشكلات البرمجية راجع هذا الموضوع بخصوص الـOOP .
الثاني : أن هذه اللغة و برغم انتشارها الواسع عالميا فإن استخدامها بين المبرمجين العرب بصورة احترافية قليل – نوعا ما – و ذلك لأسباب ليس هذا مجال بيانها ، لهذا أحببت المساهمة في عملية نشر استخدام هذه اللغة و محاولة تبسيطها و تقريبها للمبرمج العربي خاصة المبتدئين من أمثالي .

الدخول إلى التفاصيل :
لتنفيذ هذا المشروع نحتاج إلى 5 كلاسات (طبقات) كالتالي – مع ملاحظة أن استخراج الطبقات مسألة نسبية تختلف من مبرمج إلى آخر - :
· كلاس Student : و فيه عناصر بيانات كل طالب كالرقم و الاسم و الدرجات ...
· كلاس dBase : تخزين بيانات الطلاب في قاعدة بيانات مبينة على السلاسل المتصلة Linked List و القيام بعمليات الحذف و الاضافة و التعديل الخ.
· كلاس RW2File : مهمته تسجيل البيانات على القرص الصلب و قراءتها منه.
· كلاس UserInterFace : و هو واجهة المستخدم الذي يقوم بإدارة كل العمليات التي يقوم بها البرنامج.
· كلاس StudentCount : و هو كلاس بسيط مهمته تنحصر في عدّ الطلاب بحيث يكون لدينا عدد الطلاب جميعا و عدد الناجحين فقط و عدد الراسبين فقط و ذلك باستخدام الدوال الساكنة static function بدون إنشاء كائنات منه كما سيأتي التفصيل لاحقا...

نأتي الآن إلى تصميم مبسط بواسطة لغة UML (لغة النمذجة الموحدة ) مستخدمين في ذلك تخطيط الطبقة Class Diagram :


شرح مختصر للمخطط أعلاه :
· مساحة الأسماء الجديدة التي سنستخدمها في المشروع بالاسم : studentDB وضعناها بالأعلى.
· الكلاس UserInterFace يستخدم نسخة واحدة من الكلاس RW2File .
· الكلاس RW2File يرث الكلاس dBase

· الكلاس dBase يتضمن نسخ من الكلاس Student عددها مابين 0 – إلى n .
· الكلاس Student يرث الكلاس StudentCount .


الطبقة الأولى Student :
بدأنا بها لأنها أهم طبقة ، و كما ترى فهي ترث من الطبقة StudentCount و لكن دعنا لا نستعجل الآن في ذكر هذا و لنقم بإنشاء الطبقة و كبسلتها بصورة محترفة ! و نترك الكلام عن StudentCount لاحقا :
هذه الطبقة (الكلاس) مطلوب منها تخزين البيانات الخاصة بالطالب : الاسم و الرقم و الدرجات لعدد 6 مواد و درجة نصف السنة و درجة آخر السنة و المتوسط و المعدل (التقدير) كل ذلك في عناصر بيانات (متغيرات) بالاضافة إلى دوال تقوم بإدخال هذه البيانات في المتغيرات الأعضاء (Setter) و دوال تقوم بقراءة هذه القيم (Getter) ... دعنا لا نطيل الكلام و حيّ على العمل :
افتح مشروع جديد على الـ Dev-C++ - حيث سيكون هو المترجم (و بالأصح IDE) الذي سنعمل عليه المشروع ( راجع هذا الموضوع لتحميل المترجم المميز Dev-C++ و معرفة أساسيات استخدامه : هنـــــــــا ) و ليكن مشروعنا على الكونسول – و يمكن تطويره لاحقا ليعمل على واجهة رسومية GUI - و اكتب اسم المشروع و ليكن Student_Database_System أو أي اسم مناسب ثم اختر النوع Console Application ثم ok كما في الصورة بالأسفل ثم حدد مكان حفظ المشروع و من الأفضل عمل مجلد جديد لحفظ ملفات المشروع به :

سيقوم البرنامج بفتح ملف الـmain تلقائيا و لن نحتاجه الآن و سنعدّله لاحقا المهم ، قم بفتح ملف جديد تابع للمشروع (Ctrl+N) ثم اضغط yes لتأكيد إضافته للمشروع و احفظه بالاسم StudentClass.h ثم اكتب الكود التالي و احفظه : (ملاحظة كل كلاس سيكون له ملفان منفصلان :
ملف رأس و ملف تنفيذي.. )


تحليل :
السطر 5:
أعلنا عن مساحة أسماء جديدة بالاسم studentDB بحيث تتضمن تعريف الكلاس بالاضافة للمتغير الثابت QuizeSize و الذي يساوي القيمة 6 في سطر 7 ، هذا الثابت سنستخدمه لتحديد حجم المصفوفة في السطر 33 لدرجات 6 مواد و سنستخدمه أيضا في أماكن أخرى من المشروع .
السطران 11 و 13 :
دالة البناء و دالة الهدم للكلاس.
الأسطر 15 – 21 :
هذه دوال الـ Setter و واضح من اسمها أن وظيفتها هي تعيين قيم المتغيرات الأعضاء في القسم الخاص private و بما أنها في القسم الخاص فهذا يعني أنه لا يمكن الوصول إليها من خارج الكلاس لذلك نستعمل دوال الـSetter لتعيين قيم هذه المتغيرات بحيث اننا نمرر القيمة التي نريد وضعها للدالة و تقوم هي بإسنادها للمتغير – بمعرفتها J - كما سنرى عند عمل الملف التنفيذي implementation file للكلاس.
الأسطر 23 – 29 :
دوال الـGetter و وظيفتها بكل بساطة هي ارجاع القيم المحفوظة بالمتغيرات الخاصة ، فمثلا لو أردنا الاسم نستعمل الدالة GetName() التي ترجع الاسم المحفوظ بالمتغير الخاص Name ، و هكذا... و أعلنا عن هذه الدوال أنها ثابته const حتى لا يسمح لها المترجم بأن تقوم بتغيير قيمة المتغير و إنما فقط تُرجع قيمته و ذلك تجنبا لحدوث أي خطأ غير مقصود ..
كلا النوعين – دوال الـSetter و الـGetter في القسم العام public من الكلاس ، يسمى هذا النوع من الدوال بالواجهة الخارجية للكلاس بحيث يتم الوصول للأعضاء في القسم الخاص عن طريق هذه الواجهة فقط و لايمكن الوصول مباشرة لأعضاء القسم الخاص و ذلك لحماية الكائن من أن يتم تعديل حالته الداخلية – أي المتغيرات الخاصة – من خارجه .
الأسطر 31 – 35 :
هذه هي متغيراتنا الأعضاء في القسم الخاص و هي التي ستحفط لي بيانات الطالب : الرقم stID و الاسم Name و مصفوفة حجمها 6 خانات لحفظ درجات 6 مواد Quize[QuizeSize] و درجة نصف السنة Mid و درجة نهاية السنة Final و متوسط كل الدرجات Average و أخيرا تقدير الطالب Grade ، لاحظ أننا استعملنا أسماء واضحة تدل على الغرض من استخدام المتغير – أو الدالة – و هذا له أهمية كبرى في تسهيل فهم البرنامج و تعديله أو صيانته لاحقا و خاصة في البرامج الكبيرة . طبعا هذه المتغيرات ليست ثابتة أي يتم تحديدها على حسب رؤية المبرمج الذي يقوم ببرمجة المشروع حسب رغبة العميل ...
بهذا نكون قد صممنا الكلاس Student بصورة جيدة يمكن قراءته أي الكود و فهمه و بالتالي تعديله بسهولة و في زمن وجيز J ، نأتي الآن إلى الملف التنفيذي للكلاس كما يلي:
(قم أيضا بعمل ملف جديد و اضافته للمشروع بالاسم StudentClass.cpp )


تحليل :
السطر 2:
قمنا بتضمين ملف رأس الكلاس StudentClass.h و قد وضعناه بين علامتي تنصيص " " حتى يعرف المترجم أنه موجود في نفس المجلد الخاص بالمشروع .
السطر 4:
أعلمنا المترجم باستخدامنا لمساحة الأسماء التي سبق و أعلنا عنها في رأس الكلاس بالاسم studentDB .
الأسطر 6 – 13 :
تنفيذ (متن) دالة البناء و فيها نقوم بتصفير (تهيئة) المتغيرات الخاصة و يتم ذلك في كل كائن يتم انشاؤه من هذا الكلاس تمهيدا للإستخدام.
السطر 15 :
دالة الهدم .
السطر17 :
أولى دوال الـSetter هذه الدالة نمرر لها وسيط من النوع long – عدد صحيح طويل – عبارة عن رقم الطالب يتم اسناد قيمته للمتغير الخاص stID بعبارة أخرى تقوم الدالة يتخزين القيمة الممررة في المتغير الخاص stID .
السطر 19 :
هذه الدالة مثل الدالة السابقة و لكن نمرر لها وسيط من النوع string هو اسم الطالب .
السطران 21 – 22 :
مثل الدالتان بالأعلى إلا أننا استخدمنا تكرار for لنسخ القيم من المصفوفة quize[] التي قمنا بتمريرها للدالة إلى المصفوفة العضو بالكلاس Quize[] و استفدنا هنا من الثابت QuizeSize الذي سبق الإعلان عنه في رأس الكلاس – بالأعلى - سطر 7 و هو يحدد عدد المواد بـ6 مواد
السطر 24 و 26 :
هذان السطران هما دالتان Setter كما الدوال السابقة و وظيفتهما : الأولى تعيين قيمة المتغير الخاص Mid و الثانية تعيين قيمة Final عن طريق القيمة التي يتم تمريرها لكل منهما من النوع int .
الأسطر 28 – 34 :
الدالة SetAverage() و وظيفتها تعيين قيمة المتوسط لكل الدرجات و هي كما ترى لاتحمل أي وسيط و بالتالي لن نمرر لها قيمة المتوسط بل تقوم هي بحسابه ثم تخزين قيمته في المتغير العضو Average من النوع float أي عدد ذو فاصلة عشرية ، طبعا المتوسط يعني مجموع الأعداد على عددها أي مجموع درجات المواد (6 مواد + نصف السنة + نهاية السنة ) على عددها أي 8 .
الأسطر 36 – 44 :
الدالة SetGrade() و هي كالدالة السابقة تقوم بتعيين تقدير الطالب حسب متوسطه باستخدام if – else كما هو واضح و لا نمرر لها أي قيمة .
كل دوال الـSetter أعلاه تعيد قيمة من النوع void أي لا شيء و ذلك لطبيعة وظيفتها ...
الأسطر 46 – 58 :
دوال الـGetter و هي 7 دوال وظيفة كل واحدة ارجاع قيمة المتغير الخاص الذي تتبع له كما سترى عند اختبار الكلاس. قم الآن بترجمة هذا الملف فقط (Ctrl+F9) بحيث أننا كلما نقوم بعمل ملف تنفيذي نقوم بترجمته و في النهاية سنحتاج فقط لترجمة الملف main ثم تنفيذ البرنامج .

اختبار الكلاس Student :
من الأفكار الجيدة في البرمجة هي تقسيم المشروع إلى أجزاء أو مراحل و عند نهاية كل جزء القيام بعمل اختبار لهذا الجزء للتأكد من عمله بكفاءة و في الحقيقة فللإختبار أنواع كثيرة لن نخوض في تفاصيلها و يكفينا الآن عمل برنامج مبسط نستعمل فيه الكلاس Student لإدخال بيانات طالب ثم عرضها فقط لنطمئن أن كل شيء على ما يرام حتى هذه اللحظة JJ :
قم بكتابة الكود التالي في ملف main – و الذي سيختلف شكله من مرحلة إلى أخرى وصولا إلى نهاية البرنامج - :

التحليل :
السطر 3:
ضمنّا المكتبة stdlib.h و هذه هي الطريقة القياسية المتفق عليها – مؤخرا ! – لتضمين المكتبات التقليدية – و المستخدمة أساسا في لغة سي C و قامت لغة سي بلس بلس بوراثتها - بحيث تكتب على الشكل يتم اضافة الحرف c و حذف الامتداد .h ، ملاحظة يقوم المترجم Dev-C++ بتضمينها تلقائيا حيث أنها تعرِّف الدالة system("PAUSE") المستخدمة لتثبيت الشاشة.
الأسطر 4 و 5 :
تضمين المكتبة iostream لعمليات الادخال و الاخراج و تضمين ملف رأس الكلاس StudentClass.h .
الأسطر 7 و 8 :
و فيهما أخبرنا المترجم باستخدامنا لمساحة الأسماء القياسية std بالإضافة لمساحة الأسماء الخاصة بنا studentDB .
السطر 12 :
أعلنا عن الكائن st من الكلاس Student .
الأسطر 15 – 22 :
نقوم فيها باستدعاء دوال الـSetter الخاصة بالكائن – باستعمال معامل النقطة . – أي اسم الكلاس نقطة ثم اسم الدالة مثلا st.SetID(111); و مررنا لهذه الدالة قيمة عبارة عن رقم صحيح هي رقم الطالب سيقوم المترجم باستدعاء الدالة و تنفيذها و بالتالي تخزين الرقم 111 في المتغير الخاص stID و لو حاولت الوصول مباشرة لهذا المتغير مثلا : st.stID = 111; فسيعطيك المترجم رسالة خطأ بأنه لايمكن الوصول إلى المتغير الخاص stID . و هكذا في بقية دوال الـSetter نقوم باستعمالها لإدخال بيانات الطالب إلى المتغيرات الأعضاء ما عدا الدالتان st.SetAverage() و st.SetGrade() حيث لا نمرر لهما أي قيمة و إنما تقومان بحساب المتوسط و التقدير من القيم التي سبق إدخالها ثم تخزنهما في المتغيران Average و Grade كما سبق الكلام عنهما .
الأسطر 25 – 32 :
فيها نقوم بعرض البيانات التي سبق إدخالها و نقوم بذلك باستخدام دوال الـGetter ...
السطر 34:
ايقاف الشاشة مؤقتا للإطلاع على النتائج .
الآن قم بترجمة و تنفيذ البرنامج لتحصل على الآتي :

واو!! كما ترى تمت عملية الاختبار المبسطة بنجاح ! و كلاسنا يعمل بكفاءة و الحمد لله فقد قام بعرض القيم التي قمنا بتمريرها له كما قام بحساب المتوسط Average و التقدير Grade و عرضهما على الشاشة ...

الطبقة الثانية : dBase
هذه الطبقة تقوم بانشاء قاعدة البيانات و تقوم بادارتها مثل الاضافة و الحذف و التعديل ... الخ .
قاعدة البيانات هذه تقوم على القوائم المتصلة Linked List و هي كما نعلم : هيكلة البيانات في شكل سلسلة متصلة من السجلات (العقد) كل سجل (عقدة) يحتوي على الأقل على حقلين الأول لتخزين البيانات الهدف و الثاني عبارة عن مؤشر يُشير لموقع العقدة التالية.
هنا سيكون الحقل الأول كائن st من الكلاس Student أما الحقل الثاني فهو مؤشر للعقدة التالية كما سبق.
في الحقيقة كان يمكننا استخدام المصفوفات array و لكن القوائم المتصلة تتميز عنها بعدة مميزات لعل من أهمها شيئان الأول: استعمال أفضل للذاكرة و الثاني : إدخال عدد غير محدد من الطلاب ، و ليس هذا موضع تفصيل ذلك ! .
الآن لتقم بعمل ملف جديد و اضافته للمشروع و هو ملف رأس الكلاس dBase بالاسم dBaseClass.h كما يلي :

تحليل :
السطر 5 :
تضمين لملف رأس الكلاس Student حيث أننا سنحتاج لاستخدام هذا الكلاس في كلاسنا الجديد هذا لذلك لابد من تضمين ملف الرأس الخاص به.
الأسطر 11 – 14:
هنا و في القسم العام أعلنا عن سجل structure باستخدام الكلمة المحجوزة struct اسمه – أي السجل : student – انتبه فهذا مختلف عن اسم الكلاس Student - ، هذا السجل يحتوي على حقلين – كما سبق – أولهما هو عبارة عن كائن st من الكلاس Student و الثاني هو مؤشر اسمه next من نفس نوع السجل حيث سنستخدمه لاحقا للإشارة إلى عنوان السجل (العقدة) التاليـ(ة)

الأسطر 16 و 19 :
دالتي البناء و الهدم .
السطر 22 :
دالة تعيد قيمة من النوع int و اسمها AddStudent نمرر لها أربع متغيرات أولها من النوع string و البقية أعداد صحيحة int احداها مصفوفة [] . هذه الدالة كما هو واضح من اسمها مهمتها إضافة طالب جديد إلى قاعدة البيانات كما سترى عند الكلام عن متنها ( ملفها التنفيذي ) .
السطر 23:
دالة أخرى من نفس النوع اسمها EditStudent و نمرر لها نفس متغيرات الدالة السابقة مع اضافة متغير آخر من النوع long ، عمل الدالة هو تعديل (تحرير) بيانات طالب موجود مسبقا بقاعدة البيانات .
السطر 24 :
دالة ثالثة اسمها DeleteStudent أي حذف طالب موجود بقاعدة البيانات ، هذه الدالة تاخذ وسيطا واحدا من النوع long .
السطر 25:
دالة رابعة اسمها ChecID سنستخدمها عند الحذف أو التعديل للتأكد من صحة رقم الطالب المدخل بواسطة المستخدم قبل القيام بحذف أو تعديل كما سترى يعد قليل.
هذه الدوال الأربع يمكن اعتبارها دوال عمليات قاعدة البيانات Database Operation كما عنونّاها باستخدام الملاحظة بالسطر 21 و الغرض هو تسهيل و تبسيط الفهم لقاريء الكود ، و الدول التالية هي لعرض البيانات لذلك وضعنا ملاحظة : Get information في السطر 27 .
السطر 28 :
الدالة DisplayAll لعرض بيانات جميع الطلاب.
السطر 29:
الدالة DisplayPass لعرض بيانات جميع الطلاب الناجحين فقط .
السطر 30 :
الدالة DisplayFail لعرض بيانات جميع الطلاب الراسبين .
الأسطر 31 و 32 :
دالتان للبحث عن الطالب اولاهما للبحث عن طريق رقم الطالب لذلك نمرر لها وسيطا من النوع long و الأخرى و بنفس الاسم للبحث عن طريق اسم الطالب لذلك نمرر لها وسيطا من النوع string ، لاحظ استخدامنا لمفهوم زيادة التحميل Overloading لهاتين الدالتين ...

كل الدوال أعلاه في القسم العام من الكلاس و نأتي الآن إلى القسم الخاص :
السطر 34:
متغير fID من النوع long عن طريقه نحدد أول رقم للطالب حيث أن البرنامج يجب أن يقوم بتوليد رقم لكل طالب بصورة آلية (وهذا أسهل للمستخدم ) ، لذلك و كما سترى لاحقا سنستخدم هذا المتغير لتحديد رقم البداية ثم نقوم بزيادته بمقدار 1 عند اضافه طالب و العكس – أي انقاصه بمقدار 1 – عند الحذف .
السطر 35 :
مؤشر اسمه Head من نفس نوع السجل student هذا المؤشر في الواقع هو أهم متغير في كلاسنا هذا حيث أنه يُشير إلى أول عقدة في السلسلة المتصلة التي تحوي بياناتنا و بالتالي إذا أردنا الوصول إلى أي سجل (عقدة) في هذه السلسلة فلا يمكن ذلك إلا عن طريق هذا المؤشر !! لذلك هو مهم جدا جدا ، و إليك هذا المخطط المبسط لشكل السلسلة المتصلة و موقع المؤشر Head منها :


نأتي الآن أعزائي إلى الملف التنفيذي للكلاس dBase و الذي سنكتب فيه متون دواله كالتالي :


تحليل الكود :
السطر 4:
تضمين ملف الرأس dBaseClass.h .
السطر 8 :
دالة البناء الخاصة بالكلاس و التي سيتم استدعاءها عند إنشاء كائن من الكلاس ، و كما ترى تم تهيئة المتغيرات الخاصة : فالمؤشر Head سنعطيه القيمة NULL أي خالي و ذلك للدلالة على أن قاعدة البيانات (السلسلة المتصلة ) خالية و سيتم تغيير هذه القيمة عند اضافة الطلاب لاحقا ، المتغير الخاص الآخر fID تم إعطاءه القيمة 1000 (و هي اختيارية حسب مزاجك ) و ذلك لاخبار الكائن أن الأرقام – أي أرقام الطلاب stID – سيبدأ عدها من هذا الرقم بحيث يتم زيادته بمقدار 1 عند إضافة طالب جديد و بالعكس : إنقاصه بمقدار 1 عند حذف طالب ...
السطر 10:
دالة الهدم التي سيتم استدعاءها عند تدمير الكائن أو عند خروجه من مداه ، هذه الدالة ستقوم بحذف المؤشر Head من الذاكرة – و بالتالي حذف كامل السلسلة - و في الحقيقة فهذه مسألة مهمة جدا جدا لتجنب الوقوع في فخ تسرب الذاكرة ، و في لغة سي بلس بلس فهذه مسئولية المبرمج بخلاف لغة جافا و ليس هذا موضع تفصيل ..
الأسطر 12 – 45 :
هذه أول دالة عضو بالكلاس و اسمها AddStudent() و كما هو واضح فهي تقوم بإضافة طالب جديد لقاعدة البيانات كالتالي :
14 : في هذا السطر أعلنا عن مؤشرين current و linker و هما من نفس نوع السجل student .. فائدة المؤشرين ستتضح بعد قليل حيث سنستخدمهما لإنشاء عقدة جديدة و ربطها بالعقدة التالية في كل مرة يتم استدعاء الدالة لإضافة سجل جديد و هما مؤشران مؤقتان في الواقع (على الرصة stack) بحيث سيقوم المترجم بتدميرهما آليا عند الوصول لقوس نهاية الدالة و بالتالي فلا حاجة لحذفهما باستخدام المعامل delete.
15 : زيادة المتغير الخاص fID بمقدار 1 ، لاحقا سنقوم بتمرير هذا المتغير – بعد زيادته – إلى الدالة SetID() و هي عضو بالكلاس Student و ذلك لوضع رقم الطالب .
16 : سنختبر هنا هل Head = NULL باستعمال عبارة الشرط if ، فإذا كان كذلك (أي قيمة الشرط صواب ) فهذا يعني أن هذه أول عقدة في السلسلة و عند ذلك ينفذ الكود الخاص بإنشائها و وضع البيانات بها في الأسطر 18 – 26 .
18 : نقوم بإنشاء العقدة الأولى عن طريق المعامل new (طبعا هذه العقدة تحتوي على حقلين الأول هو كائن st من الكلاس Student و الثاني هو مؤشر لموقع العقدة التالية ) ثم يخزن عنوان (موقع ) هذه العقدة – بالذاكرة – في المؤشر Head و قد ميزنا العقدة الأولى هنا لأنها الأهم ، و في الأسطر التالية – حتى سطر 26 يتم وضع بيانات الطالب عن طريق دوال الـSetter التي سبق الكلام عنها في الكلاس Student .
26 : في هذا السطر نعطي المؤشر next في هذه العقدة قيمة أولية NULL و هي أولية لأنه سيتم تغييرها عند إضافة عقدة أخرى و لكن الآن لابد من التأكد من جعلها خالية حتى لايكون بها عنوان قديم و غير مقصود بالذاكرة مما قد يسبب أخطاءً كبيرة عند التعامل مع السلسلة بالحذف أو الاضافة أو غير ذلك.

30 : هذا السطر و الأسطر اللاحقة له في هذه الدالة هي قسم else التابعة للشرط if السابق و سيتم تنفيذه إذا لم يكن المؤشر Head خالي (أي كانت قيمة الشرط بالأعلى خطأ ) أي أن السلسلة ليست خالية ( لاحظ هنا فائدة تهيئة المؤشر Head في دالة البناء ) و في هذا السطر يتم اسناد قيمة المؤشر Head إلى المؤشر المؤقت linker و الغرض من ذلك أننا لا نريد تغيير قيمة المؤشر Head لأنه مفتاح للوصول لكامل السلسلة كما سبق و إذا غيرنا قيمته فهذا يعني ضياع كامل السلسلة و عدم تمكننا من الوصول لها بعد ذلك ، لذلك نستعمل هذه الخدعة البسيطة : نحن بحاجة لعنوان أول عقدة بالسلسلة ، نقوم بتخزين هذا العنوان في مؤشر مؤقت هو linker بحيث نغير قيمته هو لاحقا و نحافظ بذلك على قيمة المؤشر الأهم Head .
31 – 32 : هنا نستعمل التكرار للوصول إلى عنوان آخر عقدة بالسلسلة – باستخدام المؤشر linker - و ذلك تمهيدا لإضافة عقدة جديدة و إلحاقها بذيل السلسلة المتصلة كما سترى بعد قليل.
33 : نقوم بإنشاء سجل (عقدة ) جديد(ة) و تخزين عنوانه في المؤشر current و في الأسطر اللاحقة نقوم بوضع بيانات الطالب الجديد باستخدام دوال الـSettre كما بالأعلى .
42 : هذا السطر هو الذي يقوم بعملية ربط العقدة الجديدة بالعقدة الأخيرة بالسلسلة و عنوانها موجود بالمؤشر linker ( حسب الأسطر 31 – 32 ) حيث سنضع بالمؤشر next في هذه العقدة عنوان عقدتنا الجديدة و التي عنوانها محفوظ في المؤشر current .
44 : هنا و بعد الانتهاء بنجاح ستعيد الدالة القيمة 0 للدلالة على نجاح العملية ( إضافة طالب جديد ) .

الأسطر 47 – 69 :
متن دالة أخرى هي EditStudent() و وظيفتها هي تحرير – تعديل – بيانات طالب سبق إدخاله و هي تسمح بتعديل كل البيانات ما عدا رقم الطالب .
49 : لابد أولا من اختبار قيمة المؤشر Head للتأكد من أنه ليس خاليا – أي أن السلسلة ليست فارغة – فإذا كان خاليا فإن الدالة لن تفعل شيئا ، و إذا لم يكن خاليا يقوم بتنفيذ بقية كود الدالة .
51 : نعلن هنا عن مؤشر مؤقت ptr من نفس نوع السجل student و نعطيه قيمة المؤشر Head حيث سنستعمل هذا المؤشر للتنقل خلال العقد ( السجلات) في السلسلة المتصلة .
53 – 57 : هذا التكرار وظيفته هي البحث عن الطالب المراد تعديله بدلالة رقم الطالب و الغرض من ذلك هو معرفة عنوان عقدة هذا الطالب بحيث نتمكن من تعديل البيانات بدلالة المؤشر ptr .
58 – 67 : عند إيجاد الطالب فإن المؤشر ptr لن يكون خاليا بل سيحتوي عنوان سجل الطالب المراد تعديل بياناته و بالتالي فسيقوم بالتعديل باستخدام القيم الجديدة التي تم تمريرها للدالة – و لن يتم تعديل رقم الطالب كما سبق- .

71 – 93 : هذه دالة الحذف DeleteStudent() و وظيفتها بكل بساطة هي حذف سجل الطالب و لكن لابد من معالجة ذلك بحيث لا يحصل انقطاع في السلسلة بسبب حذف عقدة بها كما سترى ، و سنمرر لهذه الدالة وسيطا واحدا هو رقم الطالب المراد حذفه .
73 : التأكد من عدم خلو المؤشر Head و قد سبق الكلام عن ذلك .
75 : نعلن هنا عن مؤشران جديدان أولهما parent و سنخزن به عنوان (والد) العقدة المراد حذفها (أي العقدة السابقة لها) و المؤشر الثاني ptr و سنعطيه قيمة المؤشر Head – عنوان أول عقدة – ثم سنستخدمه لاحقا للتنقل داخل السلسلة .
76 – 77 : في هذا الشرط سيختبر –باستخدام if - إن كانت العقدة المراد حذفها هي العقدة الأولى – و التي يشير إليها المؤشر Head فإذا كان كذلك ( أي صواب ) فسيقوم بكل بساطة بتغيير المؤشر Head بحيث يضع به عنوان العقدة التالية . و إلا فسينفذ مقطع else كما يلي:
78 – 89 : هذا الجزء من الكود سيتم تنفيذه في حالة لم تكن العقدة المراد حذفها هي العقدة الأولى – و التي دائما نميزها بالذكر كما لاحظت لأهميتها - .
80 – 86 : هذا التكرار وظيفته هي البحث عن العقدة السابقة للعقدة المراد حذفها و تخزين عنوانها في المؤشر parent بحيث نستفيد من ذلك بعد قليل في ربط العقدة السابقة بالعقدة التي تلي العقدة المراد حذفها (العقدة الهدف ) ! و ذلك حتى لا تنقطع السلسلة عند حذف عقدة منها .
87 : نعم هذا السطر هو الذي يقوم بعملية الربط المشار إليها بالأعلى ( حيث أن العقدة السابقة يتم ربطها بالعقدة اللاحقة تمهيدا لحذف العقدة الهدف في السطر 88 ) .
90 : يتم انقاص المتغير fID – رقم الطالب - بمقدار 1 و ذلك بعد نجاح عملية الحذف .
و هنا سؤال ذكي : افترض أن رقم الطالب – و الذي مررناه لدالة الحذف هذه – غير صحيح ، مما سيسبب مشكلة أو عدة مشاكل أقلها إنقاص رقم الطالب فما الحل ؟ الجواب : لن نستدعي دالة الحذف – أو دالة التعديل – إلا بعد التأكد من أن رقم الطالب صحيح و ذلك باستخدام دالة عضو مخصصة لذلك ChecID() :

95 – 114 : هنا متن الدالة ChecID() و وظيفتها هي التأكد من أن رقم الطالب الذي أدخله المستخدم هو رقم صحيح ( أي موجود بقاعدة البيانات ) .
97: أعلنا عن متغير صحيح اسمه ReturnCode و كما هو واضح من اسمه سيحمل القيمة التي سترجعها الدالة و أعطيناه قيمة أولية -1 ( و التي ستعني أن قاعدة البيانات خالية ) .
101 – 109 : هذا التكرار سيقوم بالبحث عن رقم الطالب فإذا وجده ستتغير قيمة المتغير ReturnCode إلى 1 ( سطر 105 ) .
110 – 111 : إذا لم يجده (ptr = NULL) ستتغير قيمة ReturnCode إلى 0 .
113 هنا تقوم الدالة بارجاع قيمة المتغير ReturnCode ، إذن و باختصار فهذه الدالة سترجع إحدى ثلاث قيم : -1: للدلالة على أن قاعدة البيانات خالية ، 1: للدلالة على أن رقم الطالب صحيح – أي موجود بقاعدة البيانات - ، 0: للدلالة على أن رقم الطالب غير صحيح – أي غير موجود - ، و سنستفيد بشكل كبير من هذه القيم لاحقا عند حذف أو تعديل سجل طالب كما سترى بحول الله عند اختبار الكلاس dBase .

116 – 141 : هذه دالة بالاسم DisplayAll() أي عرض جميع الطلاب و هي بكل بساطة تقوم بالمرور على كل عقدة في السلسلة بدلالة المؤشر ptr حيث تعرض بيانات كل عقدة (كل طالب ) و لا أعتقد أنها تحتاج إلى مزيد شرح!.

143 – 171 : الدالة DisplayPass() و هي كالسابقة إلا أنها تقوم بعرض الطلاب الناجحين فقط حيث نختبر تقدير كل طالب فإذا لم يكن "F" – أي راسبا يتم عرضه ( الاختبار في سطر 151 ) .

173 – 201 : و هذه الدالة DisplayFail() و هي كسابقتها إلا أنها تعرض بيانات الطلاب الفاشلين ! ، قصدي: الراسبين J
.

203 – 264 : هنا دالتان أولاهما GetStudent() نمرر لها وسيطا واحدا StudentID من النوع long و وظيفتها هي البحث عن طالب بدلالة رقمه و عند إيجاد الطالب يتم عرض بياناته و إلا فستعرض الدالة رسالة تفيد أنها لم تجد طالبا بالرقم المذكور أما الدالة الأخرى فهي بنفس الاسم حيث تقوم بنفس الوظيفة : البحث عن طالب و لكن بدلالة اسمه هذه المرة و كلا الدالتان تقوم بعملهما عن طريق التفتيش عن الرقم أو الاسم في كل عقدة و عند التطابق تقوم بعرض كل بيانات الطالب المطلوب .
انتهينا – حتى الآن – من الكلاس الثاني dBase الخاص بإنشاء و إدارة قاعدة بيانات الطلاب دعونا الآن نقوم باختبارها للتأكد من عملها بصورة مقبولة ثم نستمر في عملية بناء المشروع J .

يتبع ...
__DEFINE_LIKE_SHARE__
رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)


تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة


المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
طلب ربط قاعدة بيانات ؟؟؟؟؟؟؟؟؟ محروم.كوم منتدى أخبار المواقع والمنتديات العربية والأجنبية 0 09-17-2009 05:00 PM
[ طلب دعم فني ] : رفع قاعدة بيانات محروم.كوم منتدى أخبار المواقع والمنتديات العربية والأجنبية 0 08-27-2009 05:20 PM
أغنية الأماكن بلغة الطلاب ........!!! محروم.كوم منتدى أخبار المواقع والمنتديات العربية والأجنبية 0 05-07-2009 02:30 AM
بعد نقل قاعدة البيانات المنتدى بلغة غريبه محروم.كوم منتدى أخبار المواقع والمنتديات العربية والأجنبية 0 04-29-2009 11:40 PM
مشكلة اريد تركيب قاعدة محتاج شخص يركبلي قاعدة بيانات محروم.كوم منتدى أخبار المواقع والمنتديات العربية والأجنبية 0 04-14-2009 11:30 AM


الساعة الآن 04:14 PM


Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.5.2 TranZ By Almuhajir

RSS RSS 2.0 XML MAP HTML