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

الكود الكامل لبرنامج تعليم الضرب للصغار مع الشرح

استطلاع
بدأه ojindia في 13 يونيو 2010 · 3 رد · 2,069 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام

استطلاع

3 مشارك في التصويت

?? ???? ??????????

????0 صوت · 0%
????2 صوت · 67%
?????1 صوت · 33%
#1 صاحب الموضوع

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

هذا برنامج بسيط قمت بعمله لمساعدة إبني على حفظ جدول الضرب ... حيث يقوم البرنامج بسؤال الطفل 25 سؤالاً مثل 5×4 ...

كل ما عليك فعله هو ضغط الأزرار الصحيحة ويقوم البرنامج بإعطائك علامة الجواب والإنتقال للسؤال التالي.

هنا استراتيجيه لحساب علامة السؤال حيث أن البرنامج يعطي 10 نقاط لكل جواب صحيح ويتم إنقاص علامه عن كل ثانية تأخير أي إذا قمت بإدخال الجواب خلال ثانيتين فسيتم إنقاص علامتين (غير معقول ).

معك حق ... غير معقول ... ما الحل إذا؟؟؟

الحل في المستويات!!! حيث قمت بإضافة خمس مستويات للصعوبة (مبتدئ-متوسط-جيد-متقدم-ممتاز) فالمستوى المبتدئ يعطيك عشر ثواني أمان لتفكر في الجواب قبل البدء بإنقاط العلامات وأما المستوى الممتاز فيعطيك فقط ثانيتين أمان. (حلت المشكلة).

عند وصول علامات السؤال للصفر فإنه يتم إظهار الجواب لمدة ثانيتين وإنهاء السؤال بدون إعطائك اي علامة والإنتقال للسؤال التالي.

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

يمكنك التدرب على جميع جداول الضرب دفعة واحدة أو إختيار جدول ضرب معين مثل جدول 2 أو 4 ...

عند الوصول لآخر سؤال والإجابه عليه سيتم إظهار تقرير بنتائج إمتحانك ويتضمن نوع التدريب ومستوى التدريب وعدد الاسئلة والإجابات الصحيحة والإجابات الخاطئة والنقاط التي ضاعت نتيجة التأخير والنقاط التي ضاعت نتيجة الأخطاء والنتيجة النهائية.

1.png

أرجو أن ينال البرنامج إعجابكم ويكون مفيدا لكم (أقصد لأبنائكم).

هذا هو ملف المشروع والذي سنقوم معا بكتابة الكود الخاص به

ملف المشروع

1- ستجد ضمن المشروع فورم رئيسي واحد باسم FrmMain.frm

2- قم بفتح الكود الخاص بهذا الفورم عن طريق تحديد الفورم من شجرة المشاريع وضغط زر F7

3- سنقوم بداية بتعريف كلاس جديد في أسفل الفورم باسم Test

/// <summary>
/// كائن السؤال
/// </summary>
public class Test
{
/// <summary>
/// الطرف الأول في عملية الضرب
/// </summary>
private int _Q1;
public int Q1 { get { return _Q1; } set { _Q1 = value; } }
/// <summary>
/// الطرف الثاني في عملية الضرب
/// </summary>
private int _Q2;
public int Q2 { get { return _Q2; } set { _Q2 = value; } }
/// <summary>
/// رقم العشرات في ناتج الضرب
/// </summary>
private int _A1;
public int A1 { get { return _A1; } set { _A1 = value; } }
/// <summary>
/// رقم الآحاد في ناتج الضرب
/// </summary>
private int _A2;
public int A2 { get { return _A2; } set { _A2 = value; } }
/// <summary>
/// تابع إنشاء نسخة جديدة من الكلاس (أي بدء تدريب جديد)
/// </summary>
/// <param name="N">نوع التدريب (0للكل 1لجدول الإثنين و2 لجدول الثلاثة وهكذا) </param>
public Test(int N)
{
// تعريف تابع عشوتئي
Random Rnd = new Random();
// الحصول على رقم عشوائي بين 2 و 9 لضرف عملية الضرب الأولى
_Q1 = Rnd.Next(2, 9);
// إذا كان المتغير أكبر من الصفر
if (N > 0)
//فطرف عملية الضرب الثاني هو المتغير +1
_Q2 = N + 1;
else
//وإلا فطرف عملية الضرب الثاني هو رقم عشوائي بين 2 و 9
_Q2 = Rnd.Next(2, 9);
// وضع آحاد الرقم الناتج في تابع والعشرات في تابع
_A1 = (int)(_Q1 * _Q2 / 10);
_A2 = (_Q1 * _Q2) - _A1 * 10;
}

4- سنقوم الآن بإضافة بعض المتغيرات

// عدد الأسئلة
const int QNo = 25;
// كائن التدريب
private Test CurTest;
// رقم السؤال الحالي
private int No = 0;
// مجموع نقاط التدريب الحالي
private int Points = 0;
// نقاط السؤال الحالي
private int CurPoints = 10;
// ثواني الأمان المتبقية قبل البدء بإنقاص النقاط
private int SafeSeconds;
//عدد الإجابات الصحيحة ، عدد النقاط التي فقدتها من التأخير ، عدد النقاط المفقودة من الأخطاء
private int CorNo, LatePoints, WrongPoints;

ملف المشروع حتى الآن

5- إنقر مرتين على مكان فارغ داخل النموذج لتفعيل حدث تحميل النموذج Load وأضف الكود التالي له:

private void FrmMain_Load(object sender, EventArgs e)
{
    //0         مبتدئ - افتراضي
    //1         متوسط
    //2         جيد
    //3         متقدم
    //4         ممتاز    
    cmbLevel.SelectedIndex = 0;

    //0         الكل - افتراضي
    //1         جدول 2
    //2         جدول 3
    //3         جدول 4
    //4         جدول 5
    //5         جدول 6
    //6         جدول 7
    //7         جدول 8
    //8         جدول 9            
    cmbNumber.SelectedIndex = 0;
}

6- إنقر نقرا مزدوجا على زر بدء التديب لتفعيل حدث نقر هذا الزر Click وأضف الكود التالي إليه:

//حدث ضغط زر فحص جديد
private void BtnNew_Click(object sender, EventArgs e)
{
    No = 0;             //رقم السؤال 1
    Points = 0;         //نقاط هذا الامتحان 0
    CurPoints = 10;     //نقاط هذا السئال 10
    CorNo = 0;          //تصفير عدد الأجوبة الصحيحة
    LatePoints = 0;     //تصفير النقاط المفقودة من التأخير
    WrongPoints = 0;     //تصفير النقاط المفقودة من الأخطاء

    NewTest();

    PlnResults.Visible = true;      //إظهار نتائج الإمتحان
    GrpMain.Visible = true;         //إظهار السؤال الحالي
    TblResults.Visible = false;      //إخفاء النتائج
}

6- نقوم بكتابة الكود التالي الخاص بالأمر NewTest والذي سنستدعيه عند كل سؤال جديد

/// <summary>
/// الحصول على سؤال جديد
/// </summary>
private void NewTest()
{
    //إخفاء خانتي الآحاد والعشرات بتحويل لونهما للأسود
    LblTen.ForeColor = Color.Black;
    LblOne.ForeColor = Color.Black;

    //هل نحن ضمن الاسئلة الخمس والعشرون
    if (No < QNo)
    {
        //نعم
        //علامة السؤال الجديد الحالي هو عشرة
        CurPoints = 10;

        //الحصول على سؤال جديد بناء على نوع السؤال
        CurTest = new Test(cmbNumber.SelectedIndex);

        //تحديد مدة الثواني قبل إنقاص علامة السؤال الحالي
        SafeSeconds = 10 - (cmbLevel.SelectedIndex * 2);

        //وضع طرفي السؤال في مكانهما
        LblNo1.Text = CurTest.Q1.ToString();
        LblNo2.Text = CurTest.Q2.ToString();

        //زيادة العداد الذي يحدد رقم السؤال الحالي
        No++;

        //تحديث القيم
        UpdateValues();

        //بدء تشغيل عداد الإنتظار قبل إنقاص العلامات في حال تأخر الإجابة
        TimerAnswer.Enabled = true;
    }
    else
    {
        //لقد تجاوزت الأسئلة الخمس والعشرون

        //إيقاف التايمر
        TimerAnswer.Enabled = false;
        //إخفاء النتائج
        PlnResults.Visible = false;
        //إخفاء الأسئلة
        GrpMain.Visible = false;
        //إظهار نقاط الإمتحان
        ShowFinalResults();
    }
}

7- سنقوم بكتابة كود روتين مهمته إظهار النتائج النهائية للتدريب على الشاشة

/// <summary>
/// عرض نتائج التدريب النهائية
/// </summary>
private void ShowFinalResults()
{
    LblTestKind.Text = (cmbNumber.SelectedIndex == 0) ? "تدريب عام" : "تدريب على " + cmbNumber.Text;
    LblTestLevel.Text = cmbLevel.Text;
    LblCorAns.Text = CorNo.ToString() + " سؤال";
    LblWrAns.Text = (QNo - CorNo).ToString() + " سؤال";
    LblLat.Text = LatePoints.ToString() + " نقطة";
    LblWr.Text = WrongPoints.ToString() + " نقطة";
    LblResult.Text = (Points / 2.50).ToString("##0.##") + "%";
    TblResults.Visible = true;
}

8- سنقوم بتفعيل حدث نقر أزرار الكيبورد للنموذج الرئيسي

private void FrmMain_KeyPress(object sender, KeyPressEventArgs e)
{
    //هل تم بدء الإمتحان
    if (e.KeyChar >= '0' && e.KeyChar <= '9' && CurTest != null && !Timer2.Enabled)
    {
        //في حال كان العشرات غير موجود أو تم حله بنجاح
        if (CurTest.A1 == 0 || LblTen.ForeColor == Color.Green)
        {
            //وضع الرقم المدخل في خانة الآحاد
            LblOne.Text = e.KeyChar.ToString();

            //هل الرقم المدخل صحيح
            if (CurTest.A2.ToString() == e.KeyChar.ToString())
            {
                //نعم
                //تحويل لون خانة الآحاد للون الأخضر
                LblOne.ForeColor = Color.Green;
                //جواب صحيح
                CorrectAnswer();
            }
            else
            {
                //لا
                //تحويل لون خانة الآحاد للون الأحمر
                LblOne.ForeColor = Color.Red;
                if (CurPoints > 0)
                {
                    CurPoints--;        //حذف نقطة من السؤال
                    WrongPoints++;      //زيادة عدد النقاط المقودة من الأخطاء
                }
            }
        }
        else
        {
            //وضع الرقم المدخل في خانة العشرات
            LblTen.Text = e.KeyChar.ToString();

            //هل الرقم المدخل صحيح
            if (CurTest.A1.ToString() == e.KeyChar.ToString())
            {
                //نعم
                //تحويل لون خانة العشرات للون الأخضر
                LblTen.ForeColor = Color.Green;
            }
            else
            {
                //لا
                //تحويل لون خانة العشرات للون الأحمر
                LblTen.ForeColor = Color.Red;
                //حذف نقطة من السؤال
                if (CurPoints > 0)
                {
                    CurPoints--;        //حذف نقطة من السؤال
                    WrongPoints++;      //زيادة عدد النقاط المقودة من الأخطاء
                }
            }
        }
        UpdateValues();
    }
}

8- سنقوم بكتابة كود روتين مهمته وضع قيم المتغيرات في مكانها على الشاشة

private void UpdateValues()
{
    if (SafeSeconds > 0)
        //إظهار نقاط السؤال الحالية مع الثواني المتبقية قبل البدء بالإنقاص
        LblCurPoints.Text = CurPoints.ToString() + "/10 (باقي " + SafeSeconds.ToString() + " ثواني أمان)";
    else
        //إظهار نقاط السؤال الحالي فقط
        LblCurPoints.Text = CurPoints.ToString() + "/10";

    BarNo.Value = No;
    LblNo.Text = No.ToString() + "/" + QNo.ToString();

    //زيادة القيمة الأعظمية لعداد نقاط الإمتحان
    //والتي تساوي رقم السؤال ضرب عشرة
    BarPoints.Maximum = No * 10;
    //ضبط قيم باقي العناصر
    BarPoints.Value = Points;           //قيمة النقاط
    BarCurPoints.Value = CurPoints;     //قيمة نقاط السؤال الحالي
    LblPoints.Text = Points.ToString() + "/" + ((No - 1) * 10).ToString();
}

9- روتين يتم تنفيذه عند الإجابة الصحيحة

private void CorrectAnswer()
{
    //زيادة عدد النقاط بمقدار نقاط السؤال الحالي
    Points += CurPoints;
    //زيادة الأسئلة الصحيحة بمقدار 1
    CorNo++;
    //إيقاف التنفيذ ثانية
    Timer2.Enabled = true;
}

10- تايمر مدته ثانية واحدة ومهمته إنقاص نقاط الأمان ومن ثم إنقاص علامات السؤال عند التأخير

private void TimerAnswer_Tick(object sender, EventArgs e)
{
    //هل نقاط هذا السؤال أكبر من 0
    if (CurPoints > 0)
    {
        //نعم
        //هل بقي ثواني أمان
        if (SafeSeconds > 0)
        {
            //نعم
            //إنقاص ثواني الأمان بمقدار 1
            SafeSeconds--;
        }
        else
        {
            //ثواني الأمان 0
            //إنقاص نقاط السؤال الحالي
            CurPoints--;
            //زيادة عدد النقاط المفقودة من التأخير
            LatePoints++;
        }
        UpdateValues();
    }
    else
    {
        //إظهار الجواب الصحيح
        if (CurTest.A1 > 0)
        {
            LblTen.Text = CurTest.A1.ToString();
            LblTen.ForeColor = Color.Green;
        }
        LblOne.Text = CurTest.A2.ToString();
        LblOne.ForeColor = Color.Green;
        //إيقاف التنفيذ ثانيتين
        Timer2.Enabled = true;
    }
}

11- كتابة كود حدث تغيير حجم النموذج وذلك حتى يبقى السؤال والنتائج النهائية في منتصف النموذج

//حدث تغيير حجم النموذج
private void FrmMain_Resize(object sender, EventArgs e)
{
    if (FrmMain.ActiveForm != null)
    {
        //ضبط توضع السؤال في وسط الصفحة للأسفل قليلا
        GrpMain.Left = (int)(FrmMain.ActiveForm.Width - GrpMain.Width) / 2;
        GrpMain.Top = (int)((FrmMain.ActiveForm.Height - GrpMain.Height) / 1.75);

        //ضبط توضع نتيجة الإمتحان في وسط الصفحة للأسفل قليلا
        TblResults.Left = (int)(FrmMain.ActiveForm.Width - TblResults.Width) / 2;
        TblResults.Top = (int)((FrmMain.ActiveForm.Height - TblResults.Height) / 1.75);
    }
}

11- كود زر إيقاف تنفيذ البرنامج

private void BtnClose_Click(object sender, EventArgs e)
{
    Environment.Exit(0);
}

12- كود التايمر الثاني والذي مدته ثانيتين ومهمته وضع الجواب الصحيح لمدة ثانيتين قبل بدء سؤال جديد

private void Timer2_Tick(object sender, EventArgs e)
{
    //إيقاف المؤقت
    TimerAnswer.Enabled = false;
    //إيقاف العداد
    Timer2.Enabled = false;
    //بداية سؤال جديد
    NewTest();
}

الكود النهائي

الملف التنفيذي

في الختام أرجو أن يكون الشرح واضح مع أني لم أجد الوقت الكافي لتوضيحة

وإعذروني لسببين:

1- ضيق وقتي بسبب المشاغل والذي لم يمكنني من معالجة الأخطاء (استخدام Try Catch)

2- قد توجد بعض الأخطاء التي لم أنتهبه له نتيجة ضعفي وتقصيري

فأرجو منكم الدعاء لي بالتوفيق وتنبيهي لتصحيح أي أخطاء تجدونها.

تم تعديل هذه المشاركة بواسطة ojindia في 13 يونيو 2010 في 08:19

#2

ماشاء الله عليك أخي جميل المشروع :happy: .. لكن فيه مشاكل بالسورس كود أرجوا حلها :wacko: .. وشكراً:)

118650.jpg
#3

أشكرك أخي ولكن ما هي الأخطاء التي حصلت معك؟

#4

UP

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

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

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

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

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