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

برنامج "quiz" لتنفيذ الاختبارات على الحاسب

مغلق
بدأه - a l t - في 7 نوفمبر 2005 · 20 رد · 2,436 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

هذا تطبيق لاجراء اختبار مصغر على الحاسب

البرنامج يحتوي على 2 JFrame

الفورم الاول لاجراء الختبار لاحد الطلاب ، وبعد انتهاء الطالب من الاختبار: يخزن في قاعدة البيانات رقم الطالب الاكاديمي و مجموع درجات الاختبار و الخيارات التي تم اختيارها.

اما الفورم الثاني فهو للمشرف او المعلم ، ويمكنه من خلال هذا الفورم

- عرض نتائج اختبار الطلاب

- اضافه او حذف او تعديل على اسئله الاختبار

- اضافه او حذف او تعديل على بيانات احد الطلاب او المشرفين.

ساحاول تطوير البرنامج بحيث يمكن ان يضم أكثر من مادة.

ومن ثم تطوير البرنامج ليعمل عبر شبكة محلية .

البرنامج يحتوي على مزايا وعيوب برمجية ، فيسرني معرفة المزايا لاتمسك بها ، كما يهمني ايضاً معرفة العيوب لأتخلص منها.

يحتوي التطبيق على صنف TimerTime لعرض الساعة في البرنامج ( للامانه هذا الصنف ليس من تصميمي )

quiz.rar

11_03_06_12_48_57_1142110137Image(_66).jpg

#2

من خلال تجربة بسيطة للبرنامج ،

استخدمت قاعدة البيانات أكسيس أليس كذلك ؟ ،

تظهر لي مشكلة عرض الأسئلة بحيث لا تعرض صحيحة وخاصة العربية تتطلع ملخبطة...

لم أستطع تخزين سؤال جديد؟؟

البرنامج جميل ، ولكن أذكر أن جامعة قامت بمثل هذا البرنامج لا أتذكر الآن ولكن يؤدي نفس المهمة ...

#3

نعم وجدت الرابط

http://www.lamsinternational.com/

ولكن هذا لا يمنع أن تطور برنامج لكي تتعلم وتسفيد ...

#4
اقتباس
من خلال تجربة بسيطة للبرنامج ،

استخدمت قاعدة البيانات أكسيس أليس كذلك ؟ ،

تظهر لي مشكلة عرض الأسئلة بحيث لا تعرض صحيحة وخاصة العربية تتطلع ملخبطة...

لم أستطع تخزين سؤال جديد؟؟

البرنامج جميل ، ولكن أذكر أن جامعة قامت بمثل هذا البرنامج لا أتذكر الآن ولكن يؤدي نفس المهمة ...

المشكلة في جهازك ماهو في برنامجي :D

اخوي OMLX تاكد من ان رقم السؤال الجديد غير مستخدم في قاعدة البيانات

11_03_06_12_48_57_1142110137Image(_66).jpg

#5

استخدم إكس بي ، إيش المشكلة إذن ...؟؟

#6

البرنامج يعمل عندي بشكل جيد!

#7

تحليل بسيط للبرنامج:

البرنامج مصمم تصميما جيدا، لا سيما وأنك استخدمت الحزم لفصل الفئات المتشابهة في حزم مختلفة:

1- حزمة exam تحوي الفئات المخصصة للقراءة من قاعدة البيانات. (وتحوي فئات أخرى)

2- حزمة exam.panel تحوي فئات مخصصة في صنع JPanels.

3- حزمة exam.panel.frame تحوي فئات مخصصة في صنع JFrame خاصة بالواجهة.

4- حزمة exam.panel.frame.adminBoard وفيها فئة JFrame متخصصة في التحكم بقاعدة البيانات.

طبعا هذا يعني أنك قسمت الفئات، لكني لا أدري هل تم قسمة الفئات بشكل جيد أم لا! ننتظر مناقشة الأعضاء.

برنامج (الاختبار) أو quiz يجلس على 3 مستويات:

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

2- مستوى الاتصال بقاعدة البيانات، (وهذا المستوى يعتمد على المستوى الأول) وهي تتمثل في فئتين DBConnection و AdminDBConnection ، ووظيفتهما الحصول على المعلومات من قاعدة البيانات بحسب حاجة البرنامج. (نلاحظ وجود تكرار في شفرة كل من هذين الفئتين)

3- مستوى الواجهة الرسومية، (وهذا المستوى يعتمد على المستوى الثاني) وهي تتمثل في فئات كثيرة مقسمة إلى JFrame و JPanel.

ملاحظات سريعة:

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

2- أفضل تقسيم الشفرة إلى مجلدات كما قسمت الفئات إلى حزم،، أعني بهذا أن تجعل ملفات الشفرة ليست كلها تحت ملف src وإنما تحت ملف exam والتي حزمتها exam.panel تكون في مجلد exam/panel وهكذا، لأن هذا يساعدنا لقراءة الشفرة أسرع!...

أرجو أن يشاركنا الأعضاء بآرائهم.

#8

جزاك الله خير الجزاء يا ابو مازن

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

11_03_06_12_48_57_1142110137Image(_66).jpg

#9

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

أنصحك بصنع مستوى مجاور مع الاتصال وهو منطق البرنامج،،، وخذ هذه الأمثلة:

public interface Question{
String question();
Vector answers();
String  choosenAnswer();
}

public class AdminConnection{
public Vector getQuestions(){
//resultSet
Vector v=new Vector();
//code
Question q=new Question("q","answer");
v.add(q);
v.add(q2);
// add all questions from database
return v;
}
public void addQuestion(Question q){
String question=q.question();
Vector v=q.getAnswers();
String choice=v.getChoosen();
statement.execuateUpdate(.. );
}
}

أرجو أن يكون الشرح واضحا.. لاحظ أني أحاول إعطائك الفكرة وعليك التطبيق!

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

#10

يعطيك الف عافية

ولكن عندي سؤال انا صممت اختبار على الحاسب الالي باستخدام برنامج الفجول بيسك باعتقادك من الافضل الفجول ام الجافا

#11

الأفضل هو البرنامج الأفضل، وليست اللغة الأفضل... ضع برنامجك في قسم VB ودعنا نقارن البرنامجين وليست اللغتين!

ويعطيك ألف عافية كذلك.

بالتوفيق!

#12

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

و اجد اشكالات في عدة امور

اقتباس
Question q=new Question("q","answer");

* كيف اصنع كائن لفئة interface الكمبايل اعطاني خطا. وكذلك لم استطع عمل مشيّد لها .

* ()v.getChoosen

هل هذه الطريقه موجودة في الصنف Vector او يجب علي ان اصممها

ارجوا منك التوضيح اخوي ابو مازن

11_03_06_12_48_57_1142110137Image(_66).jpg

#13

تصنع واحد هكذا:

Question q= new MyQuestion(id, "What is your name?", listOfAnswers);

أرجو أن يفيدك هذا التصميم البسيط ، أكمل ما يلزم...

وأي تطور تصنعه اكتب عنه هنا..

بالتوفيق

Question.java.txt

#14

هذا مثال يعمل بشكل جيد والله أعلم... الملفات تحوي قاعدة البيانات وقد عدلت فيها قليلا..

وتحوي أيضا منطق البيانات على شكل فئات:

الحزمة alt.quiz: تحوي واجهات البيانات التي ستستعملها واجهة برنامجنا سواء كان swing أو JSP أو أي واجهة.

الواجهات: Question Answer Student QuizConnection وهذه جميعها واجهات interfaces

الحزمة alt.quiz.inplementation: تحوي الفئات المسؤولة عن التطبيق الخاص الذي سنستعمله مع قاعدة البيانات التي صممناها..

MyQuestion MyAnswer MyStudent QuizConnectionImpl وهذه جميعها فئات أو classes

ملاحظات: قاعدة البيانات: الجدول Exam الإجابة الأولى هي الإجابة الصحيحة دائما!

(واجهة المستخدم هي المسؤولة عن تغيير موقع الإجابة الصحيحة)

حاول عمل برنامج بسيط مثل هذا لتتأكد من عمل الحزمة:

QuizConnection con = new QuizConnectionImpl();
List students = con.getStudents();
int id=123;
String pass = "password";
Student s= con.getStudent(id, pass);// can be null
List questions=con.getQuestions();
System.out.println("Student id: "+s.getID());
System.out.println("Name: "+s.getName());

Question q1=(Question)questions.get(0);
System.out.println(q1.question());
System.out.println(q1.answers());

بالتوفيق!!

alt.zip

examination.zip

#15

السلام عليكم...

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

علما اني انا شخصيا احتاجها جداز

زورو موقعنا

www.algabal.com

#16

الله يغفرلك يا ابومازن ويغفر لوالديك ويغفر للمسلمين اجمعين

اعتذر عن تاخري فانا الان في فترة امتحانات , وبالمناسبه قرائة شفرتك اكثر من مرة وهي تجمع بين سهوله فهم الشفرة و القوه.

اشكرك اخوي ابومازن ولي عودة بعد الانتهاء من الامتحانات، لمواصله هذا المشروع.

اخوي اكرم

تفضل الملف

examination.rar

11_03_06_12_48_57_1142110137Image(_66).jpg

#17

السلام عليكم

حاولت ربط البرنامج ب swing و لقيت مشاكل مع List ( ما استطيع اتعامل معة )

ممكن يا ابومازن ولا عليك امر تشوف الخطا هنا ...

a.rar

11_03_06_12_48_57_1142110137Image(_66).jpg

#18

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

بالنسبة إلى مشكلة List، فالمسألة سهلة جدا،، راجع معي شرح الواجهة Collection interface و List interface،، وغيرهما في الحزمة المهمة java.util،،

java.util package

Collection interface

List interface

وغيرها،،

أرجو أن تفهم تصميم هذه الفئات،، لأنها جميلة جدا،،

Collection عبارة عن واجهة تقول لك أنها مجموعة من الأشياء وكفى.

List عبارة عن Collection لكنها تقول لك أنها الأشياء التي فيها مرتبة ترتيبا معينا!

الفئة Vector عبارة عن List،، أشياؤها موضوعة في مصفوفة.

الفئة LinkedList عبارة عن List أشياؤها موضوعة في حلقات متصلة ببعضها.

الفئة ArrayList عبارة عن List أشياؤها موضوعة في مصفوفة لكنها غير محمية من الاستعمال المتعدد multithreded!

ما نستفيد من هذا الأمر؟؟ لاحظ معي أن QuizConnection.getStudents()،، ترجع لك List وبصراحة أنت لا تعرف هل هي حقيقة Vector أو ArrayList أو LinkedList أو شيء آخر !! لكن المهم هو أنها List!!

الخطأ الذي وقعت فيه،، أنك افترضت في السطر رقم 54 أن المجموعة التي سترجعها QuizConnection.getStudents() هي Vector ولكن الطريقة ترجع لك List كما تعلم! فماذا تفعل؟؟

1- إذا كنت متأكدا أن List الذي سيرجع لك هو Vector فعليك بالقيام ب (القولبة) أو casting،،

Vector v = (Vector)db.getStudents();

بهذا أنت تقول للمترجم أنك متأكد أنها Vector،، ولو كانت غير ذلك لحدث خطأ!!،،

2- الحل الأفضل هو أنك بصراحة لست مضطرا للحصول على Vector فأنت تريد List أو أي قائمة!

List v= db.getStudets();

بهذا سيعمل برنامجك بطريقة أفضل!!

في فئتك StudentTable،، في المنشئ ،، هل فعلا تحتاج إلى Vector؟؟؟ لا أظن ذلك،، فأنت تحتاج إلى List أي List،، سواء كانت Vector أو ArrayList أو LinkedList،، المهم أنك تحتاج إلى List تحوي Students،،

public class StudentTable extends ..... {
List students;
public StudentTable(List s){
students=s;
}
//code

}

طبعا نستطيع الاستمرار أكثر!...

في السطر 31 في نفس الفئة،، هل يجب عليك معرفة نوع الفئة الحقيقة التي تحوي Student؟؟

Student عبارة عن واجهة،، MyStudent عبارة عن فئة تتصف بأنها Student،،

  MyStudent student=(MyStudent)students.get(row);

تستطيع استبدالها ب:

Student student=(Student)students.get(row);

بهذا فئتك StudentTable ستقبل مجموعة أي List تحوي أي نوع من Student سواء كانت :

1- Vector تحوي MyStudent، أو

2- LinkedList تحوي SpecialStudent،، أو

3- ArrayList تحوي StrangeStudent ...!!أو

4- Any List that has any kind of Student ،، أي قائمة من أي نوع من أنواع Student!!!

أرجو أن لا يكون هذا الشرح طويلا،،، بصراحة تصميمك لهذه الفئة شيء رائع جدا!! بالتوفيق!! لمزيد من الإبداع!!

#19

اشكرك يا ابو مازن على هذا التشجيع، اشعر بتحسن في مستواي و الفضل يعود لك بعد الله ،

شعرت بمتعة غير طبيعيه مع البرمجة الكائنيه،

على كل حال هذا البرنامج بعد التحديث.

QuizConnectionImpl.getAnswers

هذي الطريقة لم اتمكن من تمثيلها في JTable

ExamTable.getValueAt

AnswersTable.getValueAt

في هذي الطريقتين وزعت البيانات بطريقة تمشي الحال،

واتمني اعرف طريقة افضل من هذا الاسلوب في التوزيع.

وشكرا

V_2.rar

11_03_06_12_48_57_1142110137Image(_66).jpg

#20
public class AnswersTable extends AbstractTableModel{
	List ansers;
	public AnswersTable( List answers){
  this.ansers=ansers;
	}

انتبه، وحاول دائما كتابة المتغيرات بصورة صحيحة، ومن الأفضل أن تكترث بطريقة كتابة (جواب = answer وليس anser) حتى يقرأ غيرك برنامجك ويفهمه!

كما أنه يوجد خطأ بسيط في الجملة السابقة، فأنت كتبت anser=anser أي null = null،، أما answers فضاعت!! أصلحها!

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

بالنسبة للطريقة getValueAt، فالأمر بسيط، وطريقتك صحيحة،، لكن لا يمنع وجود طريقة أفضل:

	public Object getValueAt( int row, int col){
  Question question=( Question)questions.get( row);
  int countListAnswer=question.answers().size();
  if(countListAnswer<col-1)return "";
  switch( col){
 	 case 0: return question.getID();
 	 case 1: return question.question();
 	 case 2: return question.correctAnswer();
 	 case 3: return question.answers().get(1);
 	 case 4: return question.answers().get(2);
 	 case 5: return question.answers().get(3);
 	 case 6: return question.answers().get(4);
 	 case 7: return question.answers().get(5);
  }
  return "";
	}

هذه في الفئة ExamTable!

اتبع نفس الأسلوب في AnswersTable!

بالتوفيق!

#21

جزاك الله الف خير يا ابومازن

ولي عودة باذن الله بعد الانتهاء من هذا الكود !

11_03_06_12_48_57_1142110137Image(_66).jpg

هذا الموضوع مغلق.

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