إنشاء برنامج مختصر للآلة الحاسبة
لتحميل ملف التفيذ للآلة الحاسبة
using System;
using System.Drawing;
using System.Windows.Forms;
/********************
إطار Constants
خاص بكتابة الثوابت
********************/
static class Constants
{
public const String ApplicationName = "الآلة الحاسبة"; //اسم البرنامج
public const String TextBoxFontName = "Times New Roman"; // نوع الحرف لمربع التحرير
public const int TextBoxFontSize = 31; //حجم الخط
public const int TextBoxMaxLength = 10; //عدد الأرقام التي يكمن إدخالها
public const int TextBoxWidth = 300; //عرض ةربع التحرير
public const int TextBoxHeight = 50; // إرتفاع ةربع التحرير
public const String ButtonFontName = "Times New Roman"; // نوع الحرف للأزرار
public const int ButtonFontSize = 30; // حجم خط الأزرار
public const int ButtonWidth = 150; // عرض الأزرار
public const int ButtonHeight = TextBoxHeight; // إرتفاع الأزرار
public const String EqualButtonLength = "يساوي"; // اسم زر يساوي
public const String ClearButtonLength = "مسح"; // الاسم الذي يظهر على زر تفريغ مربع التحرير
}
/********************
إطار Form1
يتم تفيذ البرنامج من هذا الإطار
********************/
class test
{
public static void Main()
{
Application.Run(new Form1());
}
}
/********************
إطار Form1
إمتداد للإطار السابق
********************/
class Form1 : Form
{
private double answer_number; // متغير لحفظ نتيجة العمليات الحسابية
private TextBox InputTextBox;
public Form1()
{
FormDesign();// حزمة خاصة لتحديد تصميم البرنامج
Reset();// حزمة خاصة لإعادة الإعدادات
}
/* حزمة FormDesign */
/* تصميم النافذة */
public void FormDesign()
{
StartPosition = FormStartPosition.CenterScreen;//جعل شاشة البرنامج في منتصف الشاشة
MaximizeBox = false; //تعطيل خاصية تكبير النافذة
FormBorderStyle = FormBorderStyle.Fixed3D; // تعطيل تغيير حجم الشاشة
Text = Constants.ApplicationName;// اسم البرنامج
BackColor = SystemColors.Window;// لون خلفية البرنامج
ClientSize = new Size(Constants.TextBoxWidth + (Constants.ButtonWidth *2), Constants.ButtonHeight);// حجم شاشة البرنامج . وهي بمقدار عرض مربع التحرير زائد حجم الزر مضروبا في 2 وبإرتفاع مطابق لإرتفاع الأزرار. وعلمة * تعني علامة الضرب في معظم لغات البرمجة
// إنشاء مربع التحرير
InputTextBox = new TextBox(); // إنشاء مربع تحرير باسم InputTextBox
InputTextBox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize); // نوع وحجم الحرف
InputTextBox.Width = Constants.TextBoxWidth; // العرض
InputTextBox.Height = Constants.TextBoxHeight; // الارتفاع
InputTextBox.Multiline = false; // تعطيل خاصية تعدد الأسطر
InputTextBox.TextAlign = HorizontalAlignment.Left; // تحديد مكانه إلى اليسار
InputTextBox.MaxLength = Constants.TextBoxMaxLength; // عدد الحروف والأرقام التي يمكن إدخالها
InputTextBox.Parent = this;
InputTextBox.Location = new Point(0, 0); // تعيين الحيز
InputTextBox.TextChanged += new EventHandler(InputTextChanged); // خاصية للتحقق عند حدوث أي تغيير
InputTextBox.TabIndex = 0; // جعلها أول عنصر يظهر في الشاشة تحديد الترتيب 0 يعني الأول
InputTextBox.TabStop = true; // السماح للإنتقال باستخدام مفتاح الحقول
// إنشاء زر يساوي
Button EqualButton = new Button(); // إنشاء زر باسم EqualButton
EqualButton.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize); // نوع وحجم الخط
EqualButton.TextAlign = ContentAlignment.MiddleCenter; // في مركز الوسط
EqualButton.Width = Constants.ButtonWidth; // العرض
EqualButton.Height = Constants.ButtonHeight; // الإرتفاع
EqualButton.Text = Constants.EqualButtonLength; // الاسم الذي يظهر على زر يساوي
EqualButton.BackColor = SystemColors.Control; // الخلفية
EqualButton.Parent = this;
EqualButton.Location = new Point(Constants.TextBoxWidth, 0); // الحيز
EqualButton.Click += new EventHandler(ButtonClick); // عند الضغط على زر يساوي
EqualButton.TabIndex = 1; // ترتيب العنصر الثاني
EqualButton.TabStop = true; // السماح بالإنتقال باستخدام مفتاح الحقول
// إنشاء زر الحزف
Button ClearButton = new Button(); // إنشاء زر باسم ClearButton
ClearButton.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize); // نوع وحجم الحرف
ClearButton.TextAlign = ContentAlignment.MiddleCenter; // تحديد الموقع بمركز الوسط
ClearButton.Width = Constants.ButtonWidth; // العرض
ClearButton.Height = Constants.ButtonHeight; // الإرتفاع
ClearButton.Text = Constants.ClearButtonLength; // اسم ور المسح
ClearButton.BackColor = SystemColors.Control; // لون الخلفية
ClearButton.Parent = this;
ClearButton.Location = new Point(Constants.TextBoxWidth + Constants.ButtonWidth, 0); // الحيز
ClearButton.Click += new EventHandler(ButtonClick); // عند الضغط على زر المسح
ClearButton.TabIndex = 2; // الترتيب الثالث
ClearButton.TabStop = true; // hالسماح للإنتقال باستخدام مفتاح الحقول
}
/* حزمة إعادة الضبط*/
/* إعادة قيم المتغيرات*/
public void Reset()
{
answer_number = 0; //جعل متغير النتيجة في القيمة 0
InputTextBox.Text = ""; // تفريغ مربع التحرير
}
/* عند حدوث تغيير في مربع التحرير*/
/* التحقق باستخدام خاصية InputTextChanged */
public void InputTextChanged(object sender, EventArgs e)
{
TextBox textbox = (TextBox)sender;
String check_string = "0123456789.+-*/"; // ابأشياء المسموح بإدخالها في مربع التحرير. والمسموح به هو الأرقام من 0 إلى 9 والعلامات زائد وناقص وفي وعلى
String checked_string = String.Empty;
char get_character = '\0';
char error_character = '\0';
bool check_flag = true;
for (int i=0; i
get_character = textbox.Text[i];
check_flag = false;
for (int j=0; j
if (get_character == check_string[j]) // التأكد إذا كان ما تم إخاله صحيحا
{
check_flag = true;
break;
}
}
if (check_flag) checked_string += get_character;
else error_character = get_character;
}
if (textbox.Text.Length == checked_string.Length) return;
InputTextBox.Text = checked_string;
MessageBox.Show("لا يمكن إدخال الحرف " + error_character, Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/* عند الضغط على الأزرار*/
public void ButtonClick(object sender, EventArgs e)
{
Button button = (Button)sender; // التعرف على نوع الزر الذي تم الضغط عليه
if (button.Text == Constants.EqualButtonLength) // إذا كان زر يساوي
Calculation(); // الذهاب إلى حزمة إجراء العمليات الحسابية
else if (button.Text == Constants.ClearButtonLength) // أما إذا كان زر المسح
Reset(); // الذهاب إلى حزمة إعادة الضبط
else // وإذا لم يكن الأمر مطابقا للحالتين السابقتين
MessageBox.Show("هنالك خطأ ا في الضغط على الأزرار", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
InputTextBox.Focus(); // جعل المؤشر على عنصر مربع التحرير
}
/* حزمة إجراء العمليات الحسابية Calculation */
/* التعرف على محتوى مربع التحرير ومن ثم إجراء العمليات */
public void Calculation()
{
int phase = 0; // 0 استعداد. و 1 تعني مكتوب الأرقام يسار العلامة فقط. و 2 تعني مكتوب حتى علامة الحساب. و 3 تعني مكتوب الأرقام يمين العلامة الحسابية
char input_operator = '\0'; // نوع العلامة الحسابية
double left_number = '\0'; // الأرقام يسار العلامة الحسابية
double right_number = '\0'; // الأرقام يمين العلامة الحسابية
String buffer_string = String.Empty; // لحفظ الأرقام التي تم إدخالها
for (int i=0; i
char get_character = InputTextBox.Text[i];
if (Char.IsDigit(get_character) || get_character == '.') // في حالة الأرقام الصحيحة أو الكسرية
{
if (phase == 0 || phase == 2) phase += 1;
if (get_character == '.') // التأكد ن وجود نفس العلامة لأكثر من مرة
{
for (int j=0; j
if (buffer_string[j] == '.') // في حالة الكسور
{
MessageBox.Show("تكرار في الكسور", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
buffer_string += get_character; // حفظ موقت في المتغير ريثما يتم التعرف على الأرقام يمين ويسار العلامة الحسابية
}
else if (get_character == '+' || get_character == '-' || get_character == '*' || get_character == '/')
{
if (phase == 1) // في حالة كتابة الأرقام يسار العلامة الحسابية
{
phase += 1;
left_number = double.Parse(buffer_string);
buffer_string = String.Empty;
input_operator = get_character;
}
else if (buffer_string.Length == 0)
{
MessageBox.Show("لا توجد أرقام يسار العلامة الحسابية", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
MessageBox.Show("لا يمكن إجراء أكثر من عملية في وقت واحد", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
else
{
MessageBox.Show("لا يمكن كتابة " + get_character, Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
if (phase != 3) // في حالة عدم كتابة الأرقام يمين العلامة الحسابية
{
MessageBox.Show("الرجاء كتابة الصيغة بصورة صحيحة", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
right_number = double.Parse(buffer_string);
switch(input_operator)
{
case '+': // في حالة الجمع
answer_number = left_number + right_number;
break;
case '-': // في حالة الطرح
answer_number = left_number - right_number;
break;
case '*': // في حالة الضرب
answer_number = left_number * right_number;
break;
case '/': // في حالة القسمة
answer_number = left_number / right_number;
break;
default:
answer_number = 0;
break;
}
InputTextBox.Text = Convert.ToString(answer_number); // إدخال النتيجة في مربع التحرير
}
}
شرح مختصر لبرنامج الآلة الحاسبة
إطار Constants
في هذا الإطار قمنا بكتابة الثوابت المستخدمة في هذا البرنامج
لا يحتوي على أي أوامر بل هو خاص بالثوابت
ولأستخدام هذه الثوابت من الإطارات الأخرى فقط نقوم بكتابة اسم الإطار هذا ثم . متبوعة باسم الثابت المراد استخدامه
فمثلا عندما نريد كتابة اسم هذا البرنامج تكون طريقة الكتابة كما يلي
Constants.ApplicationName
و ApplicationName هو اسم الثابت المختص أو الذي عيناه لكتابة عنوان أو اسم هذا البرنامج
ثانيا إطار Form1
وهو الإطاري الرئيسي لتنفيذ برنامج الآلة الحاسبة
ويتم تنفيذه من النقطة الرئيسية للتنفيذ وهي وظيفة Main
وباستخدام Application.Run
نقوم بتنفيذ إطار Form1
وهذا الإطار هو يعتبر الإطار الأساسي لأنه يحتوي على كافة الأوامر والحزم المستخدمة في هذا البترنامج
وعند تنفيذ هذا الإطار يتم تلقائيا تنفيذ حزمتي
حزمة FormDesign
وحزمة Reset
حزمة FormDesign
في هذه الحزمة يتم إعداد النافذة وكافة العناصر المستخدمة في هذا البرنامج
أولا باستخدام خاصية StartPosition = FormStartPosition.CenterScreen يمكننا جعل شاشة البرنامج في وسط الشاشة
وخاصية MaximizeBox = false لتعطيل تكبير الشاشة
وباستخدا خاصية FormBorderStyle = FormBorderStyle.Fixed3D نقوم بعدم السماح لتغيير الشاشة
وبعد هذا قمنا بكتابة اسم البرنامج والخلفية والحجم
Text = Constants.ApplicationName;
BackColor = SystemColors.Window;
ClientSize = new Size(Constants.TextBoxWidth + (Constants.ButtonWidth *2), Constants.ButtonHeight);
ومن ثم نقوم بإنشاء مربع التحرير وزري يساوي وزر المسح
Reset
هذه الحزمة يتم طلبها عند بداية تنفيذ البرنامج وأيضا عند الضغط على زر المسح
وفيها نقوم بتصفي المتغير الخاص بالنتيجة
وأيضا تغير مربع التحرير من أي محتوى
حزمة InputTextChanged
وهذه الحزمة يتم طلبها تلقائيا كلما حدث تغيير في مربع التحرير
وعند حدوث أي تغيير يتم التأكد من نوع الحرف الذي تم إدخاله هل هو مسموح به أم لا
فمثلا عندما ندخل أي حرف تظهر لنا رسالة تحذيرية للتنبيه ولتصحيح الخطأ
ومن ث نقوم بكتابة المتغيرات المختلفة
في عنصر 「textbox نقوم بجعلها موافقة لكافة الميزات والخصائص الخاصة بمربع التحرير
ومتغير check_string نقوم بإضافة الأرقام والحروف المسموح باستخدامها في مربع التحرير
وبعد ذلك نقوم بالتحقق من ما تم إدخاله في مربع التحرير
for (int i=0; i
get_character = textbox.Text[i];
check_flag = false;
for (int j=0; j
if (get_character == check_string[j]) // 入力可能文字だったら
{
check_flag = true;
break;
}
}
if (check_flag) checked_string += get_character;
else error_character = get_character;
}
أولا نقوم بالتأكد من الحروف واحدا واحد
فإذا كان الحرقم متاحا بكتابته نقوم بإضافته إلى متغير
checked_string
ونقوم بتكرار هذه العملية حتى نهاية آخر شيء تم إدخاله في مربع التحرير
وفي حالة كان ما تم إدخاله غير مسموح به نقوم بإضافته إلى متغير error_character
وبعد الإنتهاء من التأكد من جميع محتوى مربع التحرير وفي حالة عدم وجود أخطاء نقوم بالخروج من هذه العملية وإضافة الأرقام الصحيحة إلى متغير checked_string
وذلك كا موضح في سطر
if (textbox.Text.Length == checked_string.Length) return;
وفي حالة وجود أخطاء نقوم بإضافة الأرقام الصحيحة إلى مربع التحرير
كما هو موضح في سطر
InputTextBox.Text = checked_string;
ومن ثم نقوم بإصدار رسالة تحذيرية لتوضيح محتوى الخطأ
كما هو موضح في سطر مربع الحوار
الضغط على الأزرار ButtonClick
باستخدام خاصية Button button = (Button)sender يمكننا التعرف على نوع الزر الذي تم إختياره
ونتعرف عليه من خلال اسم الزر الذي تم إختياره
if (button.Text == Constants.EqualButtonLength)
Calculation();
else if (button.Text == Constants.ClearButtonLength)
Reset();
else
MessageBox.Show("حدث خطأ ما ", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
عند الضغط على زر يساوي يتم الذهاب إلى حزمة Calculation
وعند الضغط على زر المسح يتم الذهاب إلى حزمة Reset
وبعد ذلك نجعل المؤشر على مربع التحرير InputTextBox.Focus();
حزمة Calculation
يتم طلب هذه الحزمة عند الضغط على زر يساوي
أولا نتعرف على محتوى مربع التحرير ومن ثم نقوم بإجراء العمليات
أولا نقوم بتحديد المتغيرات المستخدمة
أما بالنسبة للمتغير phase
لإجراء العمليات الحسابية من خلال محتوى مربع التحرير يجب علينا أولا معرفة الأرقام يسار العلامة الحسابية ونوع العلام الحسابية والأرقام يمين العلامة اتلحسابية
وبتغير محتوى المتغير phase يمكننا التعرف على النقطة الحالية التي تم التأكد منها
وبالنسبة إلى المتغيرات الأخرى يمكنك التعرف عليها من خلال قراءة التعليقات
ولإجراء العمليات
أولا نقوم من الحقق من محتوى مربع التحرير واحدا واحد
في حالة كان المحتوى رقما صحيحا أو أرقام كسرية نقوم بإضافته إلى المتغير buffer_string
إذا كان الرقم كسريا نقوم بالتأكد مجددا من محتوى المتغير buffer_string
فإذا تم العسور على رقم كسري آخر يتم إلغاء هذه العملية
وكالما كان المحتوى رقما يتم تكرار هذه العملية
وعند العسور على إحدى علامات الحساب نعتبر أن الأرقام يسار العلامة قد إكتملت لذا نقوم بإضافتها إلى المتغير left_number
وبعد ذلك نقوم بحزف محتوى المتغير buffer_string
وإضافة علامة الحساب إلى المتغير input_operator
وبعدها نواصل تكرار التحقق من محتوى مربع التحرير
وفي حالة عدم أي أخطاء
يكون محتوى المتغير left_number هو الأرقام يسار العلامة
والتغير input_operator يحتوي على علامة الحساب
والمتغير buffer_string يحتوي على الأرقام يمين العلامة
وفيي سطر
right_number = double.Parse(buffer_string);
نقوم بإضافة الأرقام يمين العلامة إلى المتغير right_number
وبهذا تكون قد اجتمعت لدينا جميع العناصر المهمة لإجراء العميةوبالتعرف على نوع علامة الحساب يمكننا أجراء العمليات بكل يسر وسهولة
switch(input_operator) //خاصية switch تستخدم للتعرف على نوع أو قيمة المتغير إذا كان يحمل أكثر من إحتمال وذلك باستخدام خاصية case
{
case '+':// إذا كانت قيمة المتغير switch +
answer_number = left_number + right_number; //نقوم بإضافة عملية الجمع إلى المتغير answer_number وهكذا نفعل مع بقية الخيارات
break;//للخروج من هذه العملية
case '-':
answer_number = left_number - right_number;
break;
case '*':
answer_number = left_number * right_number;
break;
case '/':
answer_number = left_number / right_number;
break;
default:
answer_number = 0;
break;
}
وقنوم بإضافة نتيج العملية إلى المتغير answer_number
وأخيرا يتم إظهارها في مربع التحرير
وذلك كما موضح في السطر
InputTextBox.Text = Convert.ToString(answer_number);
وبهذا نكون قد أكلنا برنامج الآلة الحاسبة
ملخص
حاولنا من خلال هذا البرنامج التعرف على معظم الأوامر الأساسية
التي تستخدم في إنشاء معظم البرامج
ولا يكاد برنامج يخلو من معظم هذه الأووامر المستخدمة في هذا البرنامج
ولتنفيذ أي برنامج يتم تنفيذه عن طريق إحدى الوسائل التالية
طريقة التنفيذ الأولى هي التنفيذ المباشر أو تنفيذ الأكواد على حسب الترتيب من أعلى إلى أسفل
طريقة التنفيذ الثانية هي باستخدام if أو إذا الشرطية والتي يمكن من خلالها توجيه مسار التنفيذ على حسب الإختيار بنعم أو لا
والطريقة الثالثة هي عن طريق التكرار
وذلك بتكرار القيم المعينة حتى الحصول على النتائج المطلوبة
ومهما كان البرنامج كبيرا أو مهما إختلفت لغة البرمجة المستخدمة لتنفيذ البرامج
لا توجد أي طريقة أخرى لتنفيذ البرامج سوى هذه الطرق الثلاثة
ولذا لتصميم أو تنفيذ أي برنامج يجب ممارسة ومعرفة خاصيتي إذا الشرطية وملحقاتها وخاصية التكرار معرفة جيدة
سائلا الله لنا ولكم التوفيق