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

أول برنامج حقيقي لي (آراكم وتقييمكم)

بدأه Abdeljalil في 10 سبتمبر 2013 · 6 رد · 1,920 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كتبت أول برنامج حقيقي لي في لغة ++C، ليس برنامجا إحترافيا حقا، لكن جربته و يعمل بشكل ممتاز

عمل البرنامج هو تخزين أرقام الهاتف، مع أدوات أساسية كالحذف والإضافة والحذف الكامل والعرض

أرجوا أن تعطوا آراءكم في البرنامج وملاحظاتكم.

الكود المصدري في المرفقات، لم أستطع رفعه في صيغة exe لأنني أستعمل لينوكس وليس ويندوز. لذلك لا أستطيع. آسف إن أزعجكم اأمر  :(  :(

phonebook.cpp

تم تعديل هذه المشاركة بواسطة Abdeljalil في 10 سبتمبر 2013 في 21:59

1
#2

لم اجرب البرنامج و لكن بنظرة سريعة عليه اعتقد ان التقييم 3 من 10 كافي.

 

خصائص اللغة التى استخدمتها: (5 نقاط)

1- الجمل الشرطية if/switch.

2- goto للأسف.

3- حلقات التكرار for/while.

4- الدوال.

5- بعض من STL.

 

الأخطاء المنطقية فى الكود: (-2 نقطه)

1- كل الدوال يتم تمرير لها القيم بالقيمه و مع كبر حجم البرنامج سيصبح ابطء كثيرا بسبب كثرة نسخ المحتويات الأصلية مع كل استدعاء.

2- يمكن استبدال استخدام goto بحلقة while و ستحتاج لإعادة هيكلة الجزء الذى يستخدمها فى اخر main.

 

ما الذى لم تستخدمه:

1- الفئات بكل ما تحويه من خصائص.

2- مفهوم دوال الـ inline.

3- المؤشرات.

4- المرجع.

5- الثوابت.

 

التقييم النهائي = 5 + (-2) = 3 نقاط.

 

لي عودة.

 

و الله ولي التوفيق

2

مدونتي: C++ Tips and Tricks

#3

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

 

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

 

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

 

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

 

حتى لا تتخبط فى تصميم الملفات دعنى اعطيك ما سيكون الشكل النهائي للملفات:

 

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

 

الملف index.bas

 

محتويات هذا الملف تحسب بالسطر و السطر الأول يحتوى على:

indexed id

حيث indexed هي كلمه ثابته دائما لا تتغير و id هو عدد السطور التاليه، فمثلا ملف يحتوى على 5 بيانات سيكون كالتالي:

indexed 5line 1line 2line 3line 4line 5

بعد سطر indexed كل سطر يمثل بيان خاص بملف، هذا البيان يحتوى على الأقل جزين يفصل بينهم semi-colon و شكله كالتالي:

type_id;name.dat ;...

حيث:

type_id: هو طبيعة محتويات ملف البيانات و قيمه:

-> 1: بيانات اساسية فقط و هي الإسم مقسم إلى جزئين الأول هو إسم الشخص و الثاني بقية الإسم و رقم التليفون الجوال.

-> 2: محتوى الرقم 1 مضاف إليه تاريخ الميلاد و البريد الإلكتروني.

-> 3: محتوى الرقم 2 مضاف إليه النوع و الوظيفة و العنوان.

 

name.dat: هو إسم الملف الذى قمت بحفظه و name هو إسم من اختيارك و لا يتكرر، أيضا الإسم name لا يحتوى على مسافات بيضاء او على semi-colon (و ذلك للتسهيل) . نظام محتويات الملف هى امر يعود لك اجعله كما تشاء

 

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

 

خصائص البرنامج: توجد خصائص متعلقة بالملف index.bas و اخرى متعلقه بملفات البيانات.

 

A- خصائص الملف index.bas

1- يتم إنشائه إن لم يكن موجودا و يتم وضع البصمه الخاصه به "indexed 0" لتدل على انه فارغ.

2- إذا تم حذف ملف بيانات يتم حذف السطر الخاص به.

3- عدد السطور المذكور بعد "indexed" غير مسموح فيه بأى سطر فارغ فإن حدث ذلك يتم إنهاء البرنامج و طبع رسالة تفيد بذلك.

4- إذا وجد سطر غير مطابق المواصفات للسابق ذكره ستم انهاء البرنامج و طبع رسالة تفيد ذلك.

5- وجود اختيار لتحسين محتويات الملف و ذلك بحذف السطور الغير مطابقة للمواصفات و ايضا حذف كافة البيانات التى تلى السطور الأساسية إن اردت.

 

B- خصائص متعلقة بالملفات البيانات *.dat

1- لابد ان يستطيع البرنامج من اضافة ملفات جديدة و تعديل محتوياتها و حذفها. و لحذف ملف استخدم الدالة std::remove.

2- كل شخص له رقم لا يتكرر و يتم انشائه من البرنامج و لا يتم تعديله ابدا.

3- تعديل اى بيان حتى لو كان إسم الشخص نفسه مع العلم ان إسم الشخص مع بقية الإسم يسمح بتكراره.

4- امكانية البحث المنطقي و سيتم تفصيلها لاحقا.

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

 

البحث المنطقي: هو امكانية البحث عن بيان محدد او مجموعة بيانات بأى من او كل من التالي:

 

1- يمكن البحث بإسم الشخص فقط أو إسم عائلته او كلاهما معا.

2- يمكن البحث برقم التليفون الجوال.

3- يمكن البحث بتاريخ الميلاد او بعدم وجود تاريخ الميلاد.

4- يمكن البحث بالبريد الإلكتروني او بعدم وجود بريد الإلكتروني.

5- يمكن البحث بالنوع او بعدم وجود نوع.

6- يمكن البحث بالوظيفة او بعدم وجود وظيفة.

7- يمكن البحث بالعنوان او بعدم وجود عنوان.

 

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

5 Person(s) found, with information:
	123 Muhammad, aladin
	456 Muhammad, Kamel
	789 Muhammad, Said
	102 Muhammad, Salem
	563 Muhammad, Abdallah

بعد البحث يتم سؤال المستخدم عما يريد ان يفعل، هل يريد الحذف او التعديل او انهاء البحث أو بدء بحث جديد.

 

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

 

إذا اراد التعديل يتم إنهاء البحث و الدخول فى مرحلة التعديل.

 

 

عمليات البرنامج

 

عندما يبدأ البرنامج عمله يتم إظهار رسالة تفيد تحدبد طبيعة ما يريد المستخدم: "إضافة، حذف، تعديل، بحث، إنهاء"

 

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

Enter your first name: Muhammad

Which Entry you want to do:
1-Name    2-Phone    3-DOB
4-Email   5-Gender   6-Job
7-Address 8-Finish

Enter Add choice: 3
Enter DOB(day/month/year): 1/1/2000

Enter Add choice: 3
What you want to do: 1-Edit, 2-Delete, 3-Return

Enter sub choice: 1
Enter DOB(day/month/year): 1/1/2000

Enter Add choice: 3
What you want to do: 1-Edit, 2-Delete
DOB deleted.

Enter Add choice: 1
What you want to do: 1-Edit first name, 2-Edit the rest, 3-Return

Enter sub choice: 3

Enter Add choice: 8

Person Saved with id: 153.

What you want: 1- Add, 2-Edit, 3-Delete, 4-Search, 5-Exit

عند التعديل يتم إظهار قائمة "Which Entry you want to do"

 

عند الحذف يتم إضافة رقم الشخص المراد حذفه.

 

-------------------

 

هذا البرنامج ليس بسهل و يحتاج منك تركيز كبير فى التصميم، فإقراءة بعناية و إن كان لديك استفسار فمرحبا به.

 

 

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 11 سبتمبر 2013 في 18:51

2 −1

مدونتي: C++ Tips and Tricks

#4

شكرا جزيلا أخي C++er على إهتمامك الكبير

لم أقرأ بعد تعليقك الثاني، فقط اﻷول، سأقرأ الثاني بعد قليل.

بخصوص جملة goto، في هذا الموضع في رأيي تكون أكثر فعالية من حلقة تكرارية، حيث إستعمالها هنا أسهل وأبسط.

بخصوص التمرير بالقيمة، في الـ map بحثت كثيرا لكن يبدو أنه لا توجد طريقة للتمرير بالمرجع، فقط بالقيمة.

أيضا لم أفهم ماذا تقصد بالدوال inline، لم أتعرض لها من قبل.

شكرا مجددا على إهتمامك  :D

#5
اقتباس
بخصوص جملة goto، في هذا الموضع في رأيي تكون أكثر فعالية من حلقة تكرارية، حيث إستعمالها هنا أسهل وأبسط.

 

هذه هو الكود الخاص بك بإستخدام goto:

repeat:

int repeat_or_exit;

// your code here

cout << "Exit (0) or repeat (1) ?" << endl;
cin >> repeat_or_exit;
if(repeat_or_exit == 0){
	cout << "Program ended successfully!" << endl;
	return 0;
}
else if(repeat_or_exit == 1){
	goto repeat;
}

و هذا الكود يقوم بنفس الوظيفه بإستخدام while:

int repeat_or_exit = 1;
while(repeat_or_exit == 1)
{
	// your code here

    cout << "Exit (0) or repeat (1) ?" << endl;
    cin >> repeat_or_exit;
}
cout << "Program ended successfully!" << endl;

ايهم اسهل فى القراءة و التصحيح؟

 

 

اقتباس
بخصوص التمرير بالقيمة، في الـ map بحثت كثيرا لكن يبدو أنه لا توجد طريقة للتمرير بالمرجع، فقط بالقيمة.

 

التمرير بالقيمه ليس داخل الـ map و لكن فى تمريرها نفسها، التالي هو التصريح الخاص بالدوال كما هو فى الملف:

void add(map<string, string> numbers);
void show(map<string, string> numbers);
void clear(map<string, string> numbers); //cleat the txt file and the map also
void erase_number(map<string, string> numbers); //erase one number from the phonebook

و هذا هو بعد جعل التمرير بالمرجع:

void add(map<string, string>& numbers);
void show(map<string, string>& numbers);
void clear(map<string, string>& numbers); //cleat the txt file and the map also
void erase_number(map<string, string>& numbers); //erase one number from the phonebook
اقتباس
أيضا لم أفهم ماذا تقصد بالدوال inline، لم أتعرض لها من قبل.

الـ inline هو تلميح للمترجم أنه إذا كانت الداله التى يتم إستدعائها صغيره أو يمكن الإستغناء عن الإستدعاء حينها يتم وضع كود الداله* مكان الإستدعاء.

 

وضع كود الداله: ليس الكود الذى كتبته أنت و لكن الكود الذى صنعه المترجم.

 

فمثلا الدالة show بإضافة الكلمه inline فى التعريف الخاص بها كالتالي:

inline void show(map<string, string>& numbers);

فأنت تعلم المترجم ان هذه الداله يمكن وضع الكود الخاص بها مكان الإستدعاء.

 

 

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 11 سبتمبر 2013 في 19:17

2

مدونتي: C++ Tips and Tricks

#6

واو! يبدو أن C++er أو أظنه سابقا "محمد علاء الدين" عاد إلى شبابه! وجعل من قلمه مداراً لمنفعة أخوته :)

دعني أهمس لك بسر دون أن يعلم الأعضاء :P : منافسك الوحيد في ++C هو خالد الشايع.

وقد بدأ Mr.B يلاحقكم كما يبدو، وقد يخفي مخزونا لا نعلمه!! امم أو لعل الحاضر الغائب "وجدي" داخل في المنافسة (الافتراضية).

 

ما أفقد المنتدى هيبته كثرة الأعضاء المبتدئين وكسل من خبروا الصنعة.

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#7
اقتباس
واو! يبدو أن C++er أو أظنه سابقا "محمد علاء الدين" عاد إلى شبابه! وجعل من قلمه مداراً لمنفعة أخوته :)

مازلت محمد علاء الدين  :)،  الإنشغال سبب التقاعس.

 

اقتباس
دعني أهمس لك بسر دون أن يعلم الأعضاء :P : منافسك الوحيد في ++C هو خالد الشايع.

و أين هو، حقا اشتقت إلى المناقشات معه.

 

اقتباس
وقد بدأ Mr.B يلاحقكم كما يبدو، وقد يخفي مخزونا لا نعلمه!! امم أو لعل الحاضر الغائب "وجدي" داخل في المنافسة (الافتراضية).

وفقهم الله و اعاننا جميعا لما فيه خير.

 

 

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…