أساسيات البرمجة في لغة C#
3.1 مقدمة – מבוא
في البرمجة بلغة السي شارب والتي تعتبر لغة موجهة كائنات، نكتب برنامجنا في المحرر فيجوال ستوديو. نحتاج أن نُميز بين بعض المصطلحات قبل البداية بالبرمجة، وهي:
(أ) أمر (Instruction – הוראה)
(ب) المبرمج (Programmer – המתכנת)
(ج) البرنامج (Program – תוכנה)
(د) المُستخدم (User - המשתמש)
(هـ) شاشة المُخرجات (Console output – פלט מחלקת קונסול)
3.2 البرنامج الأول – התוכנית הראשונה
using System;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
}
}
}| الأمر | شرح |
|---|---|
| using System; | أمر مهم للاختصار في c# عند التعامل مع Console |
| ConsoleApp1 | اسم البرنامج (المشروع) |
| Program | اسم الفئة التي نكتب برنامجنا ضمنها |
| Main() { … } | هنا نكتب أوامر برنامجنا. |
- دائما اسم البرنامج الأساسي هو Main وهي العملية الرئيسية (פעולה – Method) التي منها يبدأ الحاسوب تنفيذ وتشغيل البرنامج. وبما أن محرر C# موجه كائنات لذلك يجب أن تكون البرمجة ضمن class (كائن)، لذلك هذه العملية يجب أن تكون داخل كائن معين.
- لاختصار البرمجة والأوامر نستعمل using System كي لا نكتب كلمة System قبل كل كلمة Console.
- كل امر يجب ان ينتهي بفاصلة منقوطة ;
للتمرن على كتابة اول برنامج لنا سنتعلم أمر الطباعة على الشاشة التالي:
والأمر:
static void Main(string[] args)
{
Console.WriteLine("Hello Class 10 .");
}تشغيل البرنامج:
يتم تشغيل البرنامج بواسطة الضغط على Run أو F5 عندها ستظهر النتيجة على الشاشة Console ولكنها ستختفي في حال انتهاء عمل البرنامج مباشرةً ولن نستطيع رؤية النتائج لذلك مُفضل أن نضغط زر Ctrl مع F5 أو أن نضع الأمر التالي كآخر أمر في البرنامج:
Console.ReadLine();
نتيجة تشغيل البرنامج الأول هي:
Hello Class 10 .
static void Main(string[] args)
{
Console.Write("My name is Hammam.");
Console.Write("I am from Jatt.");
Console.Write("My age is: 39.");
}النتيجة هي:
My name is Hammam.I am from Jatt.My age is: 39.
My name is Hammam. I am from Jatt. My age is: 39.
3.3 المتغيرات – משתנים
المُتغير: هو عبارة عن مكان في الذاكرة، تُحفظ فيه المعطيات والبيانات التي يتم استعمالها في البرنامج. لكل متغير يتم تخصيص مساحة محددة حسب نوع البيانات التي ستُحفظ فيه، ويتم إعطاء هذا المُتغير اسماً ملائماً وهذا الاسم يكون بمثابة عنوان لهذه المعطيات في الذاكرة حيثُ يُعرف مكان المُعطيات داخل الذاكرة حسب اسم المُتغير.
لكل متغير يوجد:
(a) نوع (טיפוס)
(b) اسم. (يُعرف مكانه في الذاكرة حسب الاسم الذي نعطيه إياه).
(c) قيمة. (المُعطيات أو البيانات المُخزنة في المُتغير (القيمة داخل الذاكرة)).
(a) نوع (טיפוס):
نوع المُتغير يحدد المساحة التي سيتيحها الحاسوب في الذاكرة للمتغير لتخزين البيانات فيه. الأنواع الأكثر شهرة هي:
| نوع المُتغير | قيمته | مثال | ملاحظات |
|---|---|---|---|
| bool | قيمة منطقية true أو false | x= false; | حجمه 8 خانات (8 bit = 1 byte) |
| byte | عدد صحيح من 0 حتى 255 | inp = 213; | حجمه 8 خانات (8 bit = 1 byte) |
| char | رمز | ch = ‘$’; | الرموز تلائمها قيم عشرية حسب جدول ASCII |
| double | قيمة عشرية | num = 3.67; | حجمه 64 خانة (64 bit = 8 byte) |
| int | قيمة صحيحة | n = 4; | حجمه 32 خانة يستطيع تخزين أرقام صحيحة بالمجال التالي: -2,147,483,648 حتى 2147483647 |
| string | قيمة نصية (جملة) | name = “Wattad”; |
(b) اسم المتغير:
اسم المُتغير يكون بالنسبة لنا بمثابة عنوان تخزين المُعطيات والبيانات في الذاكرة حيث يسهل علينا التعامل مع تخزين هذه المُعطيات.
من المُفضل أن نعطي أسماء منطقية ذات معنى للمُتغيرات التي نستعملها. مثلا إذا أردنا تخزين علامة الطالب في الامتحان من المفضل أن يكون اسم المُتغير mark وهكذا ...
قوانين اختيار اسم المُتغير:
1) يجب على اسم المُتغير أن يبدأ بحرف أو بخط تحتي _
2) يمنع ان يتضمن اسم المُتغير رموزا (%، *، !، # ...) أو فراغات. (يسمح فقط الخط التحتي)
3) يُمنع أن يحتوي على كلمة محفوظة من كلمات لغة السي شارب (مثلا ممنوع كلمة int ومثلا ممنوع كلمة if وهكذا..)
(c) قيمة المُتغير:
كل مُتغير يستطيع أن يحتوي قيماً تُلائِم نوعه. عند تعريفنا للمُتغيرات فإن هذه المُتغيرات (الأماكن في الذاكرة) لا تحتوي على قيمة ذات معنى (أي يكون فيها قيم بلا معنى זבל)، لذلك يجب علينا قبل طباعة أو استعمال هذه المُتغيرات أن نعطيها قيما مناسبة وذلك بواسطة التعويض (ان نعوض قيم فيها) وذلك يتم بما يسمى إعطاء قيمة بدائية أو بواسطة استقبال هذه القيم من المُستخدم وتعويضها للمُتغير.
تعريف المتغير (التصريح عن المُتغير):
يجب علينا تعريف المُتغيرات قبل ان نستعملها في البرمجة ومفضل أن يكون تعريف المُتغيرات في الأسطر الاولى داخل العملية Main التي نستخدمها.
تعريف المُتغير يتم على النحو التالي:
int n1;
في هذا المثال نوع المُتغير هو int (أعداداً صحيحة) واسم المُتغير هو n1.
هذا المُتغير ليست لديه قيمة ذات معنى (أي يحتوي على "قمامة" זבל).
double t ;
في هذا المثال نوع المُتغير هو double واسم المُتغير t.
هذا المُتغير ليست لديه قيمة ذات معنى (أي يحتوي على "قمامة" זבל).
يجب إعطاء المتغير قيمة بدائية أو قيمة نستقبلها من المُستخدم وذلك يتم باستخدام العملية =
العملية = (אופרטור =) : هي عملية تعويض القيم الموجودة على يمين الإشارة الى داخل (في) المتغير الموجود على يسار الإشارة.
إذا أعطينا المتغير قيمة بدائية يسمى ذلك "إعطاء قيمة بدائية" (אתחול) ويمكن أن يتم ذلك على النحو التالي:
(1) تعريف المُتغير.
(2) نُعطيه قيمة بدائية.
int x; x = 4;
يمكننا كذلك أن نُعرف المُتغير ونعطيه قيمة بدائية (איתחול) معاً.
int x=-4;
كل متغير لا يُعطى قيمة بدائية، أو لا يتم ادخال قيمة فيه من المستخدم فإنه يحتوي على بيانات ليست ذات معنى (قمامة זבל).
int x = 4, y;
int x,y;
int x; int y;
int n; double a;
إمكانية حل (1):
int x; int y; x = 4; y = -5;
إمكانية حل (2):
int x, y; x = 4; y = -5;
إمكانية حل (3):
int x = 4, y = -5;
إمكانية حل (4):
int x = 4; int y = -5;
أوامر الاستقبال (المُدخلات) والإخراج (مُخرجات) (קלט, פלט ומשתנים):
المدخلات <— البرنامج <— مخرجات
3.4 أوامر الإخراج – פלט
حاليا، عملية الإخراج (פלט) هي عملية الطباعة على شاشة Console حيث أن البرنامج يطبع معلومات على الشاشة السوداء.
أمر الطباعة على الشاشة Console (الإخراج) هو Write أو الأمر WriteLine على النحو التالي:
أ. Console.Write: طباعة بدون نزول المؤشر سطرا.
ب. Console.WriteLine: طباعة يتم فيها إنزال المؤشر بعد نهاية عملية Write الى سطر جديد.
باختصار:
WriteLine يعمل عمل Write ولكنه يُنزِل المؤشر إلى سطر جديد في نهاية عمل الدالة.
صيغ الطباعة على الشاشة:
1> Console.Write("الجُملة");
2> Console.Write("جُملة1" + "جُملة2");
3> Console.Write("جُملة {0} تكملة الجُملة {1} تكملة الجُملة", مُتغير سنطبع قيمته مكان {0}, مُتغير سنطبع قيمته مكان {1});
4> Console.Write("جُملة1" + اسم المُتغير الذي سنطبع قيمته + "جُملة2" + اسم المُتغير الذي سنطبع قيمته);
5> Console.Write(اسم المُتغير);3.5 اوامر الاستقبال – קלט
هي أوامر لاستقبال مُعطيات من المُستخدم بواسطة لوحة المفاتيح عبر شاشة Console حيث يتم ادخال هذه المعلومات بواسطة المُستخدم وتُخزن في ذاكرة الحاسوب عند استعمال التعويض الى داخل مُتغير من نوع ملائم.
عملية الاستقبال هي ReadLine() , وهي عملية استقبال معطيات وبيانات من المستخدم عبر الشاشه Console
Console.ReadLine();
وهو أمر استقبال جمله نصيه (string) من المُستخدم عبر شاشة Console.
لاستقبال أي نوع آخر يجب تحويل الجمله النصيه إلى النوع المطلوب بواسطة عمليه Parse بالصيغه التاليه:
double.Parse(Console.ReadLine());
من المُهم أن نُخزن المُعطيات التي نستقبلها من المُستخدم حيث يجب أن نحفظها في متغير كي لا تضيع ولكي نستخدمها لاحقا. لذلك سنستخدم عملية التعويض الى داخل مُتغير من نوع مناسب نكون قد عرفناه مسبقا حيث يصبح أمر الاستقبال ما يلي:
1. استقبال جمله نصيه:
(على المُتغير أن يكون مُعرفا مسبقاً قبل أن نستخدمه)
2. اي نوع اخر: (int, double, char,byte….):
حيث نُحوّل الجملة النصية التي نستقبلها بالعملية Console.ReadLine() الى نوع البيانات الملائمة بواسطة العملية Parse وهي عملية تحويل، ثم نُخزن هذه البيانات الى مُتغير قد قمنا بتعريفه سابقاً.
x = int.Parse(Console.ReadLine());
| الأمر | شرح |
|---|---|
| x | تخزين في الذاكرة بعنوان x |
| int.Parse | تحويل الجملة النصية الى نوع int |
| Console.ReadLine() | استقبال جملة نصية |
- على المُتغير أن يكون مُعرفاً مسبقاً قبل استخدامه.
- عملية التخزين بالذاكرة تتم بواسطة التعويض في متغير باستعمال العملية =
- نستقبل جملة نصية نحولها لمُعطيات ملائمة بواسطة Parse
- من المُفضل طباعة جملة إستعلامية على الشاشة للمستخدم قبل أن نستقبل منه مُعطيات، وذلك لكي يعرف المُستخدم ما هي المُعطيات التي يجب عليه إدخالها.
- من المُفضل طباعة جملة توضيحية على الشاشة للمستخدم مع طباعتنا للنتيجة، وذلك لكي يعرف المُستخدم ما هي هذه النتيجة وما الذي تُمثله.
الجملة الاستعلامية هي جملة نطلب فيها من المُستخدم إدخال مُعطيات حسب المَطلوب، مثلا نطبع له على الشاشة: "أدخل سنة الولادة: " إذا أردنا استقبال السنة التي ولد فيها المستخدم.
الجملة التوضيحية نطبعها إذا طبعنا نتيجة معينة أو مُخرج في البرنامج، مثلا إذا طبعنا للمُستخدم عمره نكتب على الشاشة: " عُمرك هو : "
3.6 كتابة الملاحظات في البرنامج – תיעוד
يمكننا إضافة ملاحظات او تعليقات على البرنامج (بين الأوامر) دون أن نؤثر على البرمجة، هذه الملاحظات تشرح طريقتنا للحل أو تفسر بعض الأوامر والحاسوب لا يتطرق لها.
إضافة الملاحظات يتم بواسطة استخدام // حيث نضع هذين الخطين المائلين وكل ما يكتب بعدهما في نفس السطر يُعتبر ملاحظة والحاسوب لا يتطرق له ولا يأخذه بالحسبان ونستطيع كتابة ملاحظاتنا بعد هذين الخطين في كل سطر بأي لغة نريد.
مهم أن نعلم أن هذين الخطين يجعلان أي كتابه بعدهما في نفس السطر خارج نطاق البرنامج ولكنهما يعملان فقط في السطر الموجودان به.
كذلك يمكننا الغاء أسطر من البرمجة إذا اضفناهما قبل هذه الأسطر.
static void Main(string[] args)
{
// This Program by: همام وتد
int d = 31; // my birth day.
int m = 5; // my birth month.
//d = 300;
//m = int.Parse(Console.ReadLine());
Console.WriteLine("Hammam"); // remark - ملاحظة// still...
Console.WriteLine(d);
Console.WriteLine("m");
}نتيجة التشغيل:
Hammam 31 m
لكن إذا أردنا إلغاء فقرة كاملة أو إضافة ملاحظات ممتدة على أكثر من سطر وليس فقط سطر واحد نستعمل الرموز /* */ حيث يعتبر كل ما هو بين الرمز /* والذي يُغلقه */ ملاحظة ولا يأخذها الحاسوب بالكود ولا تُعتبر من البرنامج.
static void Main(string[] args)
{
// This Program by: همام وتد
int d = 31; // my birth day.
int m = 5; // my birth month.
/*d = 300;
m = int.Parse(Console.ReadLine());*/
Console.WriteLine("Hammam"); // remark - ملاحظة// still...
Console.WriteLine(d);
Console.WriteLine("m");/* نستطيع ايضا استعمالها في نفس السطر */
Console.WriteLine("End");
}3.7 متغيرات وبيانات من نوع جملة نصية (string) – מחרוזות
الجُمل النصية التي يتم تخزينها في متغير من نوع string هي مجموعة من الرموز من لوحة المفاتيح مرتبة الواحدة بجانب الأخرى وهي موجودة في كل نصوص الحواسيب (UNICODE).
تعريف متغير من نوع string:
طبعا هذا تصريح عن المُتغير ولكنه لا يحتوي قيمة ذات معنى (فيه قمامة) لذلك يجدر بنا اعطاؤه قيمة بدائية أو استقبال قيمة وتخزينها فيه من المُستخدم.
- إعطاء قيمة بدائية يتم على النحو التالي:
string name = "Hammam";
نستطيع أيضا:
string name; name = "Hammam";
- استقبال من المُستخدم:
ننتبه أن استقبال المُعطيات من نوع string يتم بواسطة Console.ReadLine() ولا حاجة لأن نستعمل العملية Parse
هنا لم نكتب جملة استعلامية ولكن مُفضل دائماُ أن نكتب جمله استعلامية للمُستخدم لكي نوضح له أي بيانات ومعطيات نريد أن نستقبلها منه.
string name;
Console.Write("Insert your name: "); // جملة استعلامية
name = Console.ReadLine();طباعة الجمل النصية تتم بواسطة استعمال Console.Write( ) كما تعلمنا سابقاً وكذلك طباعة قيمة مُتغيرات من نوع string
1> Console.Write("الجُملة");
2> Console.Write("جُملة1" + "جُملة2");
3> Console.Write("جُملة {0} تكملة الجُملة {1} تكملة الجُملة", مُتغير سنطبع قيمته مكان {0}, مُتغير سنطبع قيمته مكان {1});
4> Console.Write("جُملة1" + اسم المُتغير الذي سنطبع قيمته + "جُملة2" + اسم المُتغير الذي سنطبع قيمته);
5> Console.Write(اسم المُتغير);static void Main(string[] args)
{
string first_name, last_name;
Console.WriteLine("Please enter your first name: ");
first_name = Console.ReadLine();
Console.WriteLine("Please enter your last name: ");
last_name = Console.ReadLine();
Console.WriteLine("{0} {1}", first_name, last_name);
}نتيجة تشغيل البرنامج للمدخلات التالية (الاسم الأول: همام أما الاسم الأخير: حمد) فهي:
Please enter your first name: Hammam Please enter your last name: Hamad Hammam Hamad
Console.ReadLine();رموز خاصة للطباعة داخل الجملة باستعمال الخط المائل backslash:
| الرمز | الشرح |
|---|---|
| \n | نزول المؤشر الى سطر جديد |
| \t | tab افقي أي تقدم المؤشر عدة خانات للأمام |
| \v | tab عمودي أي نزول المؤشر عدة خانات للأسفل |
| \" | طباعة شطائر (لان الحاسوب قد يعتقد أنها نهاية الجملة) |
| \' | طباعة فاصلة عليا |
| \\ | طباعة الخط المائل (backslash) (اذا اردنا طباعته لأنه قد يفهم على انه رمز خاص) |
| \0 | رمز null (لا يطبع الرقم 0) |
| \r | إعادة المؤشر الى أول السطر |
| \a | اصدار صوت (جرس) |
| \b | backspace (وضع فراغ للخلف أي ممحاه) |
static void Main(string[] args)
{
string name="Hammam";
string town = "Jatt";
Console.Write("My name is {0}.\nI live in {1}.\n",name,town);
Console.Write("My father saied: \"Hello\"");
Console.WriteLine("\nnoting to fear\\nothing to fear!");
}نتائج تشغيل البرنامج:
My name is Hammam. I live in Jatt. My father saied: "Hello" noting to fear\nothing to fear!
اللصق التسلسلي في مُتغيرات من نوع جملة نصية:
العملية + في مُتغيرات من نوع جُمل نصية تُستعمل لربط الجمل النصية ببعضها (لصقها ببعضها) وتستعمل أيضا للصق قيمة متغير بجملة نصية.
string+string ➔ string
string+مُتغير ➔ string
مُتغير+string ➔ string
static void Main(string[] args)
{
string str1 = "Hammam";
string str2 = "Wattad";
string str3 = " ";
int age = 39;
string s1, s2, s3, s4,s5;
s1 = str1 + str2; // "Hammam"+"Wattad" => "HammamWattad"
s2 = str1 + str3 + str2; //"Hammam"+" "+"Wattad"=>"Hammam Wattad"
s3 = "my age is" + age; //"my age is39
s4 = "my age is " + age; //"my age is 39"
s5 = "my age is" + str3 + age; //"my age is 39"
Console.WriteLine("s1={0}",s1);
Console.WriteLine("s2="+s2);
Console.WriteLine("s3=" + s3);
Console.WriteLine("s4={0}",s4);
Console.WriteLine("s5=" + s5);
Console.WriteLine(str1+" "+str2+"\nMy age is "+age); //Hammam Wattad
//My age is 39
}static void Main(string[] args)
{
Console.Write("C:\users\windows:");//خطأ لانه يفهم \على انه رمز خاص
Console.Write(@"C:\users\windows:"); // جملة صحيحة
Console.Write("C:\new\timer:"); // \هو رمز خاص
Console.WriteLine(@"C:\new\timer:");
}3.8 متغيرات وبيانات من نوع عدد صحيح (int) – מספרים שלמים
البيانات والمُعطيات من نوع int هي أعداد صحيحة (بدون كسور او نقطة عشرية) من المجال: -2,147,483,648 حتى 2,147,483,647 . من أجل تخزين هذه الأرقام في الذاكرة نحتاج الى 4 byte أي 32 bit وهي 32 خانة يُخزن بها الرقم بالميزان الثنائي (ميزان العَدّ لدى الحاسوب).
تعريف متغير من نوع int:
طبعا هذا تصريح عن المُتغير ولكنه لا يحتوي قيمة ذات معنى. (فيه قمامة) لذلك يجدر بنا اعطاؤه قيمة بدائية أو استقبال قيمة وتخزينها فيه من المُستخدم.
- إعطاء قيمة بدائية على النحو التالي:
int x = 6; int birth_year; birth_year = 1984;
- استقبال من المُستخدم:
ننتبه أن استقبال المُعطيات من المُستخدم يكون من نوع string وذلك يتم بواسطة Console.ReadLine() ولذلك نستعمل العملية Parse لكي نُحول المُعطيات من جملة نصية الى أعداد صحيحة يمكن التعامل معها بواسطة الحسابات والرياضيات (خاضعة لقوانين الحساب).
هنا لم نكتب جملة استعلامية ولكن مُفضل دائماُ أن نكتب جمله استعلامية للمُستخدم لكي نوضح له أي بيانات ومعطيات نريد أن نستقبلها منه.
int mark;
Console.Write("Insert your mark: "); // جملة استعلامية
mark = int.Parse(Console.ReadLine());طباعة قيم المُتغيرات تتم بواسطة استعمال Console.Write( ) كما تعلمنا سابقاً وذلك على ما يلي:
Console.Write("جُملة {0} تكملة الجُملة {1} تكملة الجُملة", مُتغير سنطبع قيمته مكان {0}, مُتغير سنطبع قيمته مكان {1});
Console.Write("جُملة1" + اسم المُتغير الذي سنطبع قيمته + "جُملة2" + اسم المُتغير الذي سنطبع قيمته);
Console.Write(اسم المُتغير);static void Main(string[] args)
{
int positive, negative , id=398201;
Console.Write("Insert a positive number: "); // جملة استعلامية
positive = int.Parse(Console.ReadLine());
Console.Write("Insert a negative number: "); // جملة استعلامية
negative = int.Parse(Console.ReadLine());
Console.WriteLine("Positive number is:{0} and negative number is:{1}",positive,negative);
Console.WriteLine("Positive number is:" + positive + " and negative number is:" + negative);
Console.Write("Your id number is: ");
Console.WriteLine(id);
}نتيجة تشغيل البرنامج هي:
Insert a positive number: 5 Insert a negative number: -2 Positive number is:5 and negative number is:-2 Positive number is:5 and negative number is:-2 Your id number is: 398201
Console.ReadLine();3.9 متغيرات وبيانات من نوع عدد عشري (double) – מספרים ממשיים
البيانات والمُعطيات من نوع double هي أعداد عشرية (تشمل الأعداد الصحيحة أيضاً)، دقة عرض الخانات العشرية تصل حتى 15 خانة بعد النقطة العشرية. من أجل تخزين هذه الأعداد في الذاكرة نحتاج الى 8 byte أي 64 bit وهي 64 خانة يُخزن بها الرقم بالميزان الثنائي (ميزان العَدّ لدى الحاسوب).
تعريف متغير من نوع double:
طبعا هذا تصريح عن المُتغير ولكنه لا يحتوي قيمة ذات معنى (فيه قمامة) لذلك يجدر بنا اعطاؤه قيمة بدائية أو استقبال قيمة وتخزينها فيه من المُستخدم.
- إعطاء قيمة بدائية على النحو التالي:
double a, b = -5, c = 2.5; a = -14.678;
- استقبال من المُستخدم:
ننتبه أن استقبال المُعطيات من المُستخدم يكون من نوع string وذلك يتم بواسطة Console.ReadLine() ولذلك نستعمل العملية Parse لكي نُحول المُعطيات من جملة نصية الى أعداد عشرية double يمكن التعامل معها بواسطة الحسابات والرياضيات (خاضعة لقوانين الحساب).
هنا لم نكتب جملة استعلامية ولكن من المُفضل دائماُ أن نكتب جمله استعلامية للمُستخدم لكي نوضح له أي بيانات ومعطيات نريد أن نستقبلها منه.
double tall;
Console.Write("Insert your tall in [m] units: "); // جملة استعلامية
tall = double.Parse(Console.ReadLine());طباعة قيم المُتغيرات تتم بواسطة استعمال Console.Write( ) كما تعلمنا سابقاً وذلك على ما يلي:
Console.Write("جُملة {0} تكملة الجُملة {1} تكملة الجُملة", مُتغير سنطبع قيمته مكان {0}, مُتغير سنطبع قيمته مكان {1});
Console.Write("جُملة1" + اسم المُتغير الذي سنطبع قيمته + "جُملة2" + اسم المُتغير الذي سنطبع قيمته);
Console.Write(اسم المُتغير);You inserted the number:
الرقم الذي استقبلناه
static void Main(string[] args)
{
double num;
Console.Write("Please insert a number: ");
num = double.Parse(Console.ReadLine());
Console.WriteLine("You inserted the number: ");
Console.WriteLine(num);
}نتيجة تشغيل البرنامج للمُدخل 5 :
Please insert a number: 5 You inserted the number: 5
Console.ReadLine();طباعة عدد خانات مُحدد بعد الخانة العشرية (دقة عرض الرقم على الشاشة):
إذا طبعنا قيمة متغير من نوع double وكان يحتوي على عدد عشري له الكثير من الخانات بعد الفاصلة العشرية، فان دقة عرض الخانات تصل حتى 15 خانة بعد النقطة العشرية.
static void Main(string[] args)
{
double a,b=10,c=3;
double d,e;
a = Math.Sqrt(2); //a عملية تضع جذر الرقم 2 في المتغير
d = b / c;
e = c / b;
Console.WriteLine("a={0},b={1},c={2},d={3},e={4}",a,b,c,d,e);
Console.WriteLine("This code written by: Hammam Wattad.");
}عند تشغيل البرنامج سنحصل على:
a=1.4142135623730951,b=10,c=3,d=3.3333333333333335,e=0.3 This code written by: Hammam Wattad.
ولكننا لا نريد دائما طباعة كل الفواصل العشرية (نريد دقة معينة) وذلك لكي نُسهل التعامل مع هذه المُعطيات، لهذا السبب نستطيع أن نُحدد عدد الخانات بعد الفاصلة العشرية بما يسمى دقة عرض الرقم العشري ويتم ذلك بواسطة استعمال الطريقة التالية:
نكتب داخل الأقواس المُتعرجة التي تضع قيمة المتغير داخل جملة نصية الإشارة التالية
عدد الخانات العشرية:F
مثلا: {0:F1} المُتغير سيتم عرضه بدقة خانة واحدة فقط بعد الخانة العشرية.
{0:F2} المُتغير سيتم عرضه بدقة خانتين بعد الخانة العشرية. وهكذا...
static void Main(string[] args)
{
double a,b=10,c=3;
double d,e;
a = Math.Sqrt(2); //a عملية تضع جذر الرقم 2 في المتغير
d = b / c;
e = 3.0 / 10;
Console.WriteLine("a={0:F3},b={1},c={2:F1},d={3:F0},e={4:F2}",a,b,c,d,e);
Console.WriteLine("This code written by: Hammam Wattad.");
}نتيجة التشغيل هي:
a=1.414,b=10,c=3.0,d=3,e=0.30 This code written by: Hammam Wattad.
3.10 متغيرات وبيانات من نوع بايت (byte) – בית
بايت في الذاكرة هو مكان يتسع ل 8 خانات (8 bit). لذلك أي متغير يتم تعريفه من نوع بايت (byte) يستطيع أن يحتوي أرقاما صحيحة في المجال (0 حتى 255).
اصغر رقم:
أكبر رقم:
لكي نُعرف متغير من نوع بايت يجب كتابة اسم المتغير بعد كلمة byte وذلك للإعلان عنه. هذا يتم بالصيغة التالية:
مثلا نريد تعريف متغير اسمه num من النوع byte:
byte num;
استقبال رقم من المستخدم لداخل متغير من نوع بايت يتم بواسطة الأمر التالي:
على الرقم أن يكون صحيحا موجبا بالمجال 0 الى 255.
طباعة قيمة متغير اسمه num من نوع بايت تتم بواسطة Console.Write كما هو متبع. مثلا:
Console.WriteLine("the value of num is: {0}",num);أو بواسطة عملية دمج النصوص + (لصق تسلسلي):
Console.WriteLine("the value of num is: "+num);static void Main(string[] args)
{
byte n1 = 0, n2 = 100, mark;
Console.Write("insert your final bagrot physics mark: "); // جملة استعلامية
mark = byte.Parse(Console.ReadLine());
Console.WriteLine("Minimum mark:{0} ,maximum mark:"+n2,n1);
Console.WriteLine("You got: {0}",mark);
}نتيجة تشغيل البرنامج:
insert your final bagrot physics mark: 97 Minimum mark:0 ,maximum mark:100 You got: 97
3.11 العمليات الحسابية وجدول المتابعة في البرامج البسيطة – פעולות חשבון וטבלת מעקב
3.11.1 العمليات الحسابية في c#
| # | العملية | شرح | مثال |
|---|---|---|---|
| 1 | + | جمع اعداد أو قيم متغيرات أو لصق تسلسلي | x=2+9; المُتغير x تكون قيمته 11 |
| 2 | - | طرح اعداد او طرح قيم متغيرات | x=2-5; المُتغير x تكون قيمته -3 |
| 3 | * | ضرب اعداد او ضرب قيم المتغيرات | x=9*4; المُتغير x تكون قيمته 36 |
| 4 | / | القسمة بين الاعداد او قيم المتغيرات | x=7/2; المُتغير x تكون قيمته 3 |
| 5 | % | باقي قسمة العدد الاول على العدد الثاني (שארית) | x=8%3; المُتغير x تكون قيمته 2 |
| 6 | ++ | اضف 1 الى العدد او اضف 1 الى قيمة المتغير (קידום ב 1) | x=4; المُتغير x تكون قيمته 4 x++; قيمة x تتقدم وتصبح 5 |
| 7 | - - | اطرح 1 من العدد او اطرح 1 من قيمة المتغير (הפחתה ב 1) | x=4; المُتغير x تكون قيمته 4 x--; قيمة x تتراجع وتصبح 3 |
استراتيجية حل المسائل في البرمجة:
1) علينا فهم السؤال والمطلوب منا بشكل صحيح.
2) علينا تحديد المُتغيرات التي سنستعملها.
3) علينا معرفة الحسابات التي تؤدي للحل أو الخوارزمية (الألغوريثم).
مُتغيرات:
متغيرات ادخال:
- width من نوع double وهو مُتغير لاستقبال وتخزين عرض المستطيل.
- length من نوع double وهو مُتغير لاستقبال وتخزين طول المُستطيل.
مُتغيرات إخراج:
- area من نوع double وهو مُتغير نُخزن فيه مساحة المستطيل.
- perimeter من نوع double وهو مُتغير نُخزن فيه محيط المُستطيل.
طريقة الحساب:
area= width*length ; perimeter = 2 * (width + length) ;
الحل:
static void Main(string[] args)
{
double width, length, area, perimeter;
Console.WriteLine("Please insert width:");
width = double.Parse(Console.ReadLine());
Console.WriteLine("Please insert length:");
length = double.Parse(Console.ReadLine());
perimeter = 2 * (width + length);
Console.WriteLine("the perimeter is : {0}", perimeter);
area = (width * length);
Console.WriteLine("the area is:{0}", area);
}3.11.2 جدول المتابعة – טבלת מעקב
هو جدول تَتَبُع نُتابع فيه سير البرنامج أمراً تلو أمر ونسجل فيه التغييرات التي تطرأ على المُتغيرات وعلى سير تنفيذ البرنامج وكذلك نسجل فيه المُخرجات والنتائج حتى ينتهي عمل البرنامج لنحصل على النتيجة النهائية ولكي نستطيع أن نفهم عمل البرنامج بدقة.
جدول المتابعة مكون من أعمدة وأسطر، حيث اننا نُخصص عمودا للأوامر (نسجل فيه رقم الأمر أو ننسخ الأمر اليه) وعموداً لكل متغير بالبرنامج وعموداً للمُخرجات (أو المعروض على الشاشة).
عدد الأسطر هو كعدد الأوامر التي تُنفذ (يجب عد التكرارية) حيث اننا نضع كل أمر في سطر.
في نهاية تنفيذ كل أمر (الموجود في السطر) نسجل في هذا السطر عند كل عمود ما هي قيمة المُتغيرات وما الذي تم طباعتهُ على الشاشة وذلك بانتهاء تنفيذ الأمر وهكذا
جدول المُتابعة يتم بناؤه إذا أعطي لدينا المُدخلات المُحتملة. (لكل إمكانية مُدخلات نستطيع بناء جدول متابعة)
| # | width | length | perimeter | area | פלט |
|---|---|---|---|---|---|
| 9 | - | - | - | - | |
| 11 | - | - | - | - | Please insert width: |
| 12 | 3 | - | - | - | |
| 13 | 3 | - | - | - | Please insert length: |
| 14 | 3 | 4 | - | - | |
| 16 | 3 | 4 | 14 | - | |
| 17 | 3 | 4 | 14 | - | the perimeter is : 14 |
| 18 | 3 | 4 | 14 | 12 | |
| 20 | 3 | 4 | 14 | 12 | the area is:12 |
3.12 قسمة أعداد صحيحة والتحويل (casting) وباقي القسمة (modulo) – חילוק שלמים, המרה ושארית
3.12.1 قسمة أعداد صحيحة والتحويل casting
في لغة البرمجة خلال العمليات الحسابية التي تتم بين أنواع المُتغيرات هناك أهمية لاتفاق معروف حول طبيعة ونوع الناتج وذلك كي يستطيع الحاسوب تخصيص مساحات بالذاكرة للعمليات الحسابية ونتائجها بما يلائم حجمها.
العمليات الحسابية التي تتم بين الأعداد الصحيحة (int) ناتجها يكون int، ومن هنا فإن قسمة أعداد صحيحة هي بالضرورة عدد صحيح في لغة السي شارب.
مثال:
أي تعبير مُكون من أعداد صحيحة هو عدد صحيح. لذلك لكي نحصل على إجابات دقيقة (عشرية) في القسمة علينا أن نُحول أحد الأعداد الى عدد عشري، حيث أن الحاسوب يعتبر أي تعبير جبري فيه عدد عشري هو تعبير جبري قيمته عشرية.
9 / 2 = 4 9.0 / 2 = 4.5 9 / 2.0 = 4.5
كذلك الأمر إذا استخدمنا المُتغيرات فان قسمة مُتغيرات نوعها int سيكون بالضرورة عددا صحيحا (int) حتى لو قمنا بتخزينه داخل مُتغير من نوع double.
static void Main(string[] args)
{
int a = 7;
int b = 2;
double result;
result = a/ b;
Console.WriteLine("result = {0}",result);
Console.WriteLine("Written By:Hammam");
}result = 3 Written By:Hammam
لذلك يجب علينا تحويل ( casting ) نوع أحد المُعطيات ليكون عدد عشري double لأنها كلها من نوع عدد صحيح int وبذلك نضمن أن النتيجة تكون من نوع أعداد عشرية double لكن يجب أن ننتبه أننا لا نستطيع تخزينها في مُتغيرات من نوع int (Error) لأنه لا يُمكن تخزين عدد عشري double في مُتغير من نوع صحيح int لهذا السبب علينا تخزينها في مُتغير من نوع عشري double.
من هنا نصل إلى ان التحويل يسمى casting وبواسطته نستطيع تحويل مُعطيات من نوع إلى آخر حيث نضع النوع المطلوب داخل أقواس ( ) .
static void Main(string[] args)
{
Console.WriteLine("Example By:Hammam");
int a = 7;
int b = 2;
int result1;
double result2;
// result1 = (double) a / b; Error ---> خطأ برمجي
result2 = (double)a / b; // we can write: result2 = a/(double) b;
Console.WriteLine("result = {0}",result2);
}Example By:Hammam result = 3.5
static void Main(string[] args)
{
int num1,num2;
double res;
Console.Write("Insert the first number: ");
num1 = int.Parse(Console.ReadLine());
Console.Write("Insert the second number: ");
num2 = int.Parse(Console.ReadLine());
res = (double) num1 / num2;
Console.WriteLine("{0}/{1} = {2}",num1,num2,res);
Console.WriteLine("Written By: Hammam.");
}Insert the first number: 12 Insert the second number: 8 12/8 = 1.5 Written By: Hammam.
قسمة أي عدد صحيح على 10 يُعطي رقما ذو عدد خانات أقل بخانة حيث تُقتَطع خانة الآحاد بالرقم الأصلي وتكون النتيجة رقم جديد أقل بخانة (بدون خانة آحاده التي تم اقتطاعها).
قسمة أي عدد صحيح على 100 يُعطي رقما ذو عدد خانات أقل بخانتين حيث تُقتَطع خانة الآحاد والعشرات بالرقم الأصلي وتكون النتيجة رقم جديد أقل بخانتين (بدون خانة آحاده وعشراته التي تم اقتطاعهما).
360123 / 100 = 3601 -67 / 100 = 0 -100/100 = -1 104 / 100 = 1 -8731/100=-87
912/10 = 91 3401/10 =340 -3560/10 =-356 7/10 = 0
3.12.2 باقي القسمة modulo – שארית
في لغة البرمجة c# هناك عملية تعطي باقي قسمة عدد صحيح على عدد صحيح آخر وهي: %
عملية % تسمى عملية باقي القسمة (مودولو - שארית) وهي عملية تعطينا باقي قسمة العدد الصحيح الأول على العدد الصحيح الثاني.
| 7 % 4 = 3 | 74 = 134 | باقي القسمة هو 3 |
| 12 %10= 2 | 1210 = 1210 | باقي القسمة هو 2 |
| 3 % 5 = 3 | 35 = 0 + 35 | باقي القسمة هو 3 |
| 20 % 4 = 0 | 204 = 5 + 04 | باقي القسمة هو 0 |
قوانين:
- اذا كان a يقسم على b بدون باقٍ فان نتيجة العملية a مودولو b هي صفر أي: a % b = 0
- أي عدد زوجي فانه يقسم على 2 دون باقٍ لذلك عدد زوجي مودولو 2 الناتج صفر (لا باقي).
- إذا كانت نتيجة الحساب التالي: عدد معين مودلو 2 هي صفر، فإن هذا العدد زوجي (لأنه يقسم على 2).
- عدد فردي مودولو 2 يعطي نتيجة 1 (الباقي 1).
- أي عدد % n = {0,1,2,3,…..,n-2,n-1}
- 9 % 4 = {0 or 1 or 2 or 3}
static void Main(string[] args)
{
int num, res;
Console.WriteLine("Insert a number: ");
num = int.Parse(Console.ReadLine());
res = num % 7;
Console.WriteLine("{0} % 7 is {1}",num,res);
Console.WriteLine("Written by Hammam");
}Insert a number: 23 23 % 7 is 2 Written by Hammam
| 4 % 10 = 4 | 415723 % 10 = 3 | 320 % 10 = 0 | 154 % 10 = 4 |
عندما يحصل عبد على صدفة يضعها مع الصدَف المتناثرة في الصندوق حتى تكتمل للعدد 15 فيضعها في كيس ويغلقه ويترك هذا الكيس في الصندوق، وإذا كان هناك باقي (لم تكتمل بعد لتصل الى 15 لكي يضعها في كيس) فإنه يتركها متناثرة في الصندوق حتى يكتمل العدد.
اكتب برنامج يستقبل من عبد عدد الصدف الكلي لديه في الصندوق وعلى البرنامج أن يطبع له كم كيس يجب أن يكون ممتلئً ومقفلاً داخل الصندوق وكم صدفة باقية بالصندوق دون كيس.
مثلا إذا كان مع عبد اللطيف 50 صدفة فالبرنامج يطبع انه يوجد بالصندوق 3 أكياس و5 صدفات بلا كيس.
static void Main(string[] args)
{
int seashells, remainders, bags;
Console.Write("Insert number of seashells: ");
seashells = int.Parse(Console.ReadLine());
bags = seashells / 15;
remainders = seashells % 15;
Console.WriteLine("Number of bags:{0}", bags);
Console.WriteLine("Number of seashells without bags:{0}",remainders);
Console.WriteLine("Written By Hammam!");
}نتيجة تشغيل البرنامج مع مُدخل: 50
Insert number of seashells: 50 Number of bags:3 Number of seashells without bags:5 Written By Hammam!
جدول المُتابعة:
| رقم الأمر | seashells | bags | remainder | الشاشة |
|---|---|---|---|---|
| 1 | ||||
| 2 | Insert number of seashells: 50 | |||
| 3 | 50 | |||
| 4 | 50 | 3 | ||
| 5 | 50 | 3 | 5 | |
| 6 | 50 | 3 | 5 | Number of bags: 3 |
| 7 | 50 | 3 | 5 | Number of seashells without bags: 5 |
| 8 | 50 | 3 | 5 | Written By Hammam! |
- مجموع خانات العدد.
- عدد جديد مُكون من ترتيب عكسي لخانات العدد الأصلي.
- تربيع العدد الجديد (تربيع العدد المُكون من ترتيب عكسي لخانات العدد الأصلي).
static void Main(string[] args)
{
int num, ones, tens, hundreds, sum, rev_num, square;
Console.WriteLine("Insert a number:");
num = int.Parse(Console.ReadLine());
ones = num % 10;
num = num / 10;
tens = num % 10;
num = num / 10;
hundreds = num % 10; // hundreds = num;
sum = ones + tens + hundreds;
rev_num = ones * 100 + tens * 10 + hundreds;
square = rev_num * rev_num; // Math.Pow(rev_num,2)
Console.WriteLine("Sum of the digits: {0}",sum);
Console.WriteLine("Reverse number: {0}",rev_num);
Console.WriteLine("Square of reverse number:{0}",square);
}تشغيل البرنامج للمُدخل 496 يُعطينا النتيجة التالية:
Insert a number: 496 Sum of the digits: 19 Reverse number: 694 Square of reverse number:481636
3.13 عمليات حسابية مُختصرة – פעולות מקוצרות
| (1) إضافة 1 (קידום ב 1) | i++; | ⟵ | i=i+1; |
| (2) تنقيص 1 (חיסור 1) | i--; | ⟵ | i=i-1; |
++ و -- تنطبق فقط على الرقم 1 (أي اضافة 1 مسموح وتنقيص 1 مسموح ولكن غير ذلك فلا)
أي لا يجوز i++++; ولا يجوز i----;
أيضا يجوز استعمال ++i; و --i; أي وضع إشارة + + أو إشارة - - قبل اسم المُتغير وهنا سيكون الفارق هو بقيمة التعبير كله، وذلك سيتم توضيحه بالمثال التالي:
int a,b,i = 3, j = 3;
a = i++;
b = ++j;
Console.WriteLine("i={0}",i);
Console.WriteLine("j={0}",j);
Console.WriteLine("a={0}",a);
Console.WriteLine("b={0}",b);i=4 j=4 a=3 b=4
كما يظهر من المثال أنه عندما نضع إشارة التقدم على يمين المُتغير (مثل ++i) فإن قيمة التعبير ستكون قيمة المُتغير قبل عملية التقدم ب 1 (طبعا المُتغير سيتقدم ب 1 بكل الأحوال).
بينما عندما نضع إشارة التقدم على يسار المُتغير (مثل i++ ) فإن قيمة التعبير ستكون قيمة المُتغير بعد عملية التقدم ب 1 (طبعا المُتغير سيتقدم ب 1 بكل الأحوال).
(3) كذلك يوجد عمليات حسابية فيها يتم إجراء العملية الحسابية مع قيمة المُتغير (القيمة الحالية) ثم بعد إجراء العملية يتم حتلنة وتغيير قيمة المُتغير الى قيمة جديدة. وهي على ما يلي:
| العملية | مثال | شرح |
|---|---|---|
| += | sum += a; | sum = sum + a; |
| -= | sum -= b; | sum = sum - b; |
| *= | fact *= a; | fact = fact * a; |
| /= | fact /= b; | fact = fact / b; |
| %= | a %= b; | a = a % b; |
| res *= 5; | هو نفس الأمر | res = res * 5; |
3.14 فئة العمليات الحسابية – המחלקה Math
لإجراء عمليات حسابية من نوع خاص هناك فئة مُعرفة داخل System (تكون ضمن برنامجنا عندما نكتب using System) .
مثال:
- عملية القيمة المُطلقة |X|
- عملية الجذر X
- عملية القوة Xy
- عملية الأكبر MAX Max(X,Y)
اسم الفئة التي سنستعملها لهذه الحسابات هو Math وتحتوي على الكثير من العمليات الحسابية.
طريقة استعمالها:
| الأمر | شرح |
|---|---|
| Math | اسم الفئة |
| . | نقطة لإختيار عملية من ضمن الكثير من العمليات المُتاحة |
| Math.اسم العملية ( … ) | لها قيمة أي نتيجة لذلك نُخزن نتيجتها بالذاكرة (في مُتغير) أو نطبع هذه النتيجة |
| العملية | شرح | مثال — العملية | مثال — النتيجة |
|---|---|---|---|
| Sqrt(n) | عملية الجذر التربيعي | Math.Sqrt(30.25) | 5.5 |
| Abs(n) | عملية القيمة المُطلقة | Math.Abs(-2.7) | 2.7 |
| Pow(n1,n2) | عملية القوة n1n2 | Math.Pow(2,3) | 8.0 |
| Max(n1,n2) | عملية الأكبر بين عددين | Math.Max(2,8) | 8 |
| Min(n1,n2) | عملية الأصغر بين عددين | Math.Min(3,5) | 3 |
| Round(n) | عملية تقريب لعدد صحيح | Math.Round(7.8) | 8 |
- العمليات Sqrt/Pow تعمل على أعداد عشرية (double) وتعيد نتيجة من نوع عشري double.
- العمليات Abs/Max/Min إذا عملت على أعداد صحيحة (int) فإنها ستعيد نتيجة من نوع صحيح int، ولكنها اذا عملت على أعداد عشرية (double) فإنها ستعيد نتيجة من نوع عشري double.
- العملية Round تعمل على أعداد عشرية (double) وتعيد نتيجة من نوع عشري (double).
static void Main(string[] args)
{
double a,b;
Console.Write("Insert a number: ");
a = double.Parse(Console.ReadLine());
Console.Write("Insert another number: ");
b = double.Parse(Console.ReadLine());
Console.WriteLine("The maximum is: {0}",Math.Max(a,b));
Console.WriteLine("Written By Hammam!");
}نتيجة تشغيل البرنامج للمُدخلات -3 و -1.9 هي:
Insert a number: -3 Insert another number: -1.9 The maximum is: -1.9 Written By Hammam!
3.15 متغيرات وبيانات من نوع رمز (char) – תווים
3.15.1 التعامل مع الرموز
الرموز والحروف هي نوع بيانات ومُعطيات نحصل عليها من لوحة المفاتيح وهي مُعرفة بالاسم char.
تعريف مُتغير من نوع char:
char x ;
إعطاء قيمة بدائية للمُتغير (איתחול):
1. استعمال الفاصلة العليا ' ' مثال:
char tav = '$';
2. استعمال الكود الرقمي للرمز (حسب جدول ASCII)
char tav = (char) 36;
لا يمكن تخزين الرقم الصحيح (int) داخل مُتغير من نوع char لذلك يجب أن نحول الرقم الى نوع رمز (char) بواسطة casting كما تعلمنا سابقا.
استقبال قيمة الى مُتغير من نوع char:
ch = char.Parse(Console.ReadLine());
يتم استقبال رمز واحد فقط.
طباعة مُعطيات من نوع رمز (char):
Console.WriteLine(x); // x مُعرف على أنه char
يتم طباعة قيمة x وهو الرمز المحفوظ داخل x .
Console.WriteLine((char)36);
يتم طباعة الرمز الملائم للرقم 36 وهو $ . (حسب جدول الأرقام للرموز ويسمى ASCII)
في الطباعة نستطيع استعمال {0} و {1} كما تعلمنا ذلك مع أنواع المُعطيات الأخرى.
static void Main(string[] args)
{
char rmz;
Console.Write("Insert a character: ");
rmz = char.Parse(Console.ReadLine());
Console.WriteLine("Your char is: {0}",rmz);
}نُشغل البرنامج وندخل له المُدخل التالي: E ونحصل على :
Insert a character: E Your char is: E
يمكن للمُستخدم أن يُدخل رمزاً واحدا ثم يضغط Enter . مثال: * ثم Enter أو كما أدخلنا الرمز E ثم Enter ، ولكن لو أدخل المُستخدم أكثر من رمز قبل أن يضغط Enter يصبح لدينا خطأ برمجي (Error) وذلك لأن الحاسوب لا يستطيع تحويل جملة نصية (فيها أكثر من رمز) الى النوع char
من هنا نستنتج أن العملية char.Parse(Console.ReadLine()); تستقبل رمزا واحداً فقط ثم Enter .
إذا أردنا استقبال عدة رموز متتالية يُدخلها المُستخدم دون أن يضغط بينها Enter فعلينا أن نتجنب استعمال Console.ReadLine ( ) لأنها تقرأ كل الرموز على أنها جملة نصية واحدة، لذلك علينا استعمال الأمر التالي:
Console.Read();
وهو أمر يستقبل رمزا واحداً فقط وليس سطراً، ولكن علينا تحويل ما نستقبله إلى char لأن هذه العملية تستقبل الرمز على أنه عدد صحيح ( int ) لرمز واحد. أي الأمر يكون:
tav1 = (char)Console.Read(); tav2 = (char)Console.Read(); tav3 = (char)Console.Read();
هذه الطريقة لاستقبال عدة رموز مع بعضها البعض دون ضغط Enter بينها.
3.15.2 جدول الكود ASCII
هو جدول فيه كود (رقم صحيح) لكل رمز من لوحة المفاتيح وهو جدول مُكون من 128 رمزاُ مُختلفاً والتي أرقامها (أكوادها) من 0 حتى 127 مرتبه ومتسلسلة بتسلسل منطقي مُرتب، أي أن الأرقام 0 – 9 مُتسلسلة بتسلسل منطقي. وكذلك الأحرف الصغيرة مرتبه الواحدة مباشرةً تلو الأخرى وكذلك الأحرف الكبيرة.
أمثله على بعض الأرقام للرموز:
| الرمز | الكود | الرمز | الكود | الرمز | الكود |
|---|---|---|---|---|---|
| 0 | 48 | a | 97 | A | 65 |
| 1 | 49 | b | 98 | B | 66 |
| 2 | 50 | c | 99 | C | 67 |
| 3 | 51 | d | 100 | D | 68 |
| ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
| 9 | 57 | z | 122 | Z | 90 |
وبما أن هذا الجدول يتيح لنا كود لكل رمز (رقم صحيح لكل رمز) فإن هذا يُمكننا من إجراء عمليات حسابية على الرموز وخاصة أنها مُتسلسلة.
الجدول الكامل موجود في المُلحقات. (مُلحق 2 في آخر الكتاب)
3.15.3 العمليات الحسابية في الرموز (char)
يمكن جمع وطرح وضرب أرقام (كود) الرموز والتي هي من نوع int (كود الرمز هو int أي عدد صحيح)، ومن الجدير معرفته أن التعبير الذي فيه عدد صحيح (int) ورمز (char) يكون نوعه int (الناتج يكون int)، ثم يجب أن ننتبه أنه علينا التحويل (casting) الى char .
static void Main(string[] args)
{
char tav,next_tav;
Console.Write("Insert a character:");
tav = char.Parse(Console.ReadLine());
//next_tav = tav + 1 ; خطأ لانه سيحاول حفظ عدد صحيح
next_tav = (char)(tav + 1);
Console.WriteLine("your char:{0} \nnext char:{1}",tav,next_tav);
}نشغل البرنامج للمُدخل: G
Insert a character:G your char:G next char:H
العمليات الحسابية بين الرموز يتم التعامل معها بواسطة التعامل مع كودها (رقمها الصحيح)، كذلك التفاضل بينها (المقارنة !=,==,>=,<=,<,> ) مثلا:
'a' + 'b'
هنا يتم جمع كود الرمز ’a‘ مع كود الرمز ’b‘ والاجابة ستكون عدد صحيح أي من نوع int
أمثلة للتعامل مع الرموز (char) وارقامها حسب جدول ASCII:
| الأمر | شرح |
|---|---|
| Console.WriteLine('a'); | يطبع a على الشاشة (لأنها قيمة من نوع char) |
| Console.WriteLine(a); | Error ! لأن a مُتغير غير مُعرف، فالحاسوب يظن أن a مُتغير لذلك يجب أن يكون مُعرف وله قيمة كي لا يكون Error. اذا كان مُعرفاً فان الحاسوب سيطبع القيمة المُخزنة داخل المُتغير a |
| Console.WriteLine('a'+'b'); | سيطبع 195 التي هي: 98 + 97 حيث أن 98 هي كود ’b‘ وحيث أن 97 هي كود ’a‘ |
| Console.WriteLine('a'+ 0); | يطبع 97 وهو كود ’a‘ |
| Console.WriteLine(97); | سيطبع 97 |
| Console.WriteLine((char)97); | سيطبع a |
| Console.WriteLine('a'+'0'); | سيطبع 145 والذي هو مجموع كود ’a‘ (97) مع كود ’0‘ (48) |
| Console.WriteLine('a'+'b'+"c"); | سيطبع 195c وذلك لان الجمع بين الرموز يؤدي الى جمع أعداد صحيحة لأرقامها (للكود) أما الزائد قبل الجملة النصية فهو لصق تسلسلي. |
| Console.WriteLine((char)('a'+3)+"c"); | سيطبع dc وذلك لأنه يجمع كود a (97) مع الرقم 3 أي نحصل على 100 ثم نحولها الى رمز وهو d ثم الزائد هو لصق تسلسلي. |
اكتب برنامج يستقبل من المُستخدم رمزا ويطبع على الشاشة إذا كان هذا الرمز يمثل أحد أحرف اللغة الإنجليزية. (ملاحظة: على البرنامج أن يطبع جملة توضيحية ان الرمز حرف إذا كان المُدخل أحد أحرف اللغة الإنجليزية بغض النظر إن كان الحرف صغيراً small letter أم كبيراً capital letter)
static void Main(string[] args)
{
char ch;
Console.Write("insert a character: ");
ch = char.Parse(Console.ReadLine());
if ((ch >= 'a' && ch <= 'z') || (ch>='A' && ch<='Z'))
Console.WriteLine("It is a letter");
else
Console.WriteLine("It isn`t a letter");
}بعض النتائج بعد تشغيل البرنامج:
insert a character: t It is a letter
insert a character: D It is a letter
insert a character: # It isn`t a letter
اكتب برنامج يستقبل من المُستخدم حرفاً انجليزياُ وإذا كان هذا الحرف صغيراُ يحوله إلى حرف كبير أما إذا كان حرفا كبيرا فيحوله الى حرف صغير. وعلى البرنامج أن يطبع جملة توضيحية فيها الحرف الذي استقبلناه والحرف بعد التحويل.
إذا ادخل المستخدم: ’7‘ و ’2‘ و ’1‘ يطبع البرنامج 10