أساسيات البرمجة بلغة السي شارب · الفصل 3 — أساسيات البرمجة في لغة C#‎יסודות התכנות בשפת C#‎ · יסודות התכנות בשפת C#‎⌂📚🏠
الفصل 3

أساسيات البرمجة في لغة C#‎

יסודות התכנות בשפת 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() { … }هنا نكتب أوامر برنامجنا.
ملاحظات:
  1. دائما اسم البرنامج الأساسي هو Main وهي العملية الرئيسية (פעולה – Method) التي منها يبدأ الحاسوب تنفيذ وتشغيل البرنامج. وبما أن محرر C#‎ موجه كائنات لذلك يجب أن تكون البرمجة ضمن class (كائن)، لذلك هذه العملية يجب أن تكون داخل كائن معين.
  2. لاختصار البرمجة والأوامر نستعمل using System كي لا نكتب كلمة System قبل كل كلمة Console.
  3. كل امر يجب ان ينتهي بفاصلة منقوطة ;

للتمرن على كتابة اول برنامج لنا سنتعلم أمر الطباعة على الشاشة التالي:

Console.Write(”جملة نصية“);

والأمر:

Console.WriteLine(”جملة نصية“);
مثال 3.1 — أول برنامج.
static void Main(string[] args)
{
    Console.WriteLine("Hello Class 10 .");
}

تشغيل البرنامج:

يتم تشغيل البرنامج بواسطة الضغط على Run أو F5 عندها ستظهر النتيجة على الشاشة Console ولكنها ستختفي في حال انتهاء عمل البرنامج مباشرةً ولن نستطيع رؤية النتائج لذلك مُفضل أن نضغط زر Ctrl مع F5 أو أن نضع الأمر التالي كآخر أمر في البرنامج:

Console.ReadLine();

نتيجة تشغيل البرنامج الأول هي:

Microsoft Visual Studio Debug Console
Hello Class 10 .
سؤال 3.1: ما هي نتائج تشغيل البرنامج التالي:
الحل:
static void Main(string[] args)
{
    Console.Write("My name is Hammam.");
    Console.Write("I am from Jatt.");
    Console.Write("My age is: 39.");
}

النتيجة هي:

Microsoft Visual Studio Debug Console
My name is Hammam.I am from Jatt.My age is: 39.
سؤال 3.2: أدخل تعديلات على البرنامج السابق لكي تحصل على النتيجة التالية:
Microsoft Visual Studio Debug Console
My name is Hammam.
I am from Jatt.
My age is: 39.

3.3 المتغيرات – משתנים

المُتغير: هو عبارة عن مكان في الذاكرة، تُحفظ فيه المعطيات والبيانات التي يتم استعمالها في البرنامج. لكل متغير يتم تخصيص مساحة محددة حسب نوع البيانات التي ستُحفظ فيه، ويتم إعطاء هذا المُتغير اسماً ملائماً وهذا الاسم يكون بمثابة عنوان لهذه المعطيات في الذاكرة حيثُ يُعرف مكان المُعطيات داخل الذاكرة حسب اسم المُتغير.

لكل متغير يوجد:

(a) نوع (טיפוס)

(b) اسم. (يُعرف مكانه في الذاكرة حسب الاسم الذي نعطيه إياه).

(c) قيمة. (المُعطيات أو البيانات المُخزنة في المُتغير (القيمة داخل الذاكرة)).

(a) نوع (טיפוס):

نوع المُتغير يحدد المساحة التي سيتيحها الحاسوب في الذاكرة للمتغير لتخزين البيانات فيه. الأنواع الأكثر شهرة هي:

نوع المُتغيرقيمتهمثالملاحظات
boolقيمة منطقية true أو falsex= false;حجمه 8 خانات (8 bit = 1 byte)
byteعدد صحيح من 0 حتى 255inp = 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 التي نستخدمها.

تعريف المُتغير يتم على النحو التالي:

< نوع المتغير > اسم المتغير ;
مثال 3.2
int n1;

في هذا المثال نوع المُتغير هو int (أعداداً صحيحة) واسم المُتغير هو n1.

هذا المُتغير ليست لديه قيمة ذات معنى (أي يحتوي على "قمامة" זבל).

مثال 3.3
double t ;

في هذا المثال نوع المُتغير هو double واسم المُتغير t.

هذا المُتغير ليست لديه قيمة ذات معنى (أي يحتوي على "قمامة" זבל).

يجب إعطاء المتغير قيمة بدائية أو قيمة نستقبلها من المُستخدم وذلك يتم باستخدام العملية =

العملية = (אופרטור =) : هي عملية تعويض القيم الموجودة على يمين الإشارة الى داخل (في) المتغير الموجود على يسار الإشارة.

إذا أعطينا المتغير قيمة بدائية يسمى ذلك "إعطاء قيمة بدائية" (אתחול) ويمكن أن يتم ذلك على النحو التالي:

(1) تعريف المُتغير.

(2) نُعطيه قيمة بدائية.

مثال 3.4
int x;
x = 4;

يمكننا كذلك أن نُعرف المُتغير ونعطيه قيمة بدائية (איתחול) معاً.

مثال 3.5
int x=-4;

كل متغير لا يُعطى قيمة بدائية، أو لا يتم ادخال قيمة فيه من المستخدم فإنه يحتوي على بيانات ليست ذات معنى (قمامة זבל).

مثال 3.6
int x = 4, y;
عنوانقيمة مُخزنة012345...712713714715..1020102110221023x4y"قمامة"
ملاحظة: يمكن تعريف أكثر من مُتغير بشكل مُنفرد أو إذا كانت المُتغيرات من نفس النوع أن نُعرفها في سطر واحد ("خبطة وحدة").
مثال 3.7
int x,y;
أو
int x;
int y;
مثال 3.8
int n;
double a;
مثال 3.9 — نريد تعريف متغيرين صحيحين x و y ونضع فيهما الأعداد الصحيحة 4 و -5 بالتلاؤم.

إمكانية حل (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;
عنوانقيمة مُخزنة012..412413414415..841842843844845..1023x4y-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 بالصيغه التاليه:

نوع المتغير.Parse(Console.ReadLine());
مثال 3.10
double.Parse(Console.ReadLine());

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

1. استقبال جمله نصيه:

اسم مُتغير من نوع string = Console.ReadLine();

(على المُتغير أن يكون مُعرفا مسبقاً قبل أن نستخدمه)

2. اي نوع اخر: (int, double, char,byte….):

اسم مُتغير من النوع المطلوب = نوع مُتغير.Parse(Console.ReadLine());

حيث نُحوّل الجملة النصية التي نستقبلها بالعملية Console.ReadLine()‎ الى نوع البيانات الملائمة بواسطة العملية Parse وهي عملية تحويل، ثم نُخزن هذه البيانات الى مُتغير قد قمنا بتعريفه سابقاً.

مثال 3.11 — استقبال رقم صحيح من المُستخدم وتخزينه في مُتغير اسمه x قد تم تعريفه في بداية البرمجة.
x = int.Parse(Console.ReadLine());
الأمرشرح
xتخزين في الذاكرة بعنوان x
int.Parseتحويل الجملة النصية الى نوع int
Console.ReadLine()استقبال جملة نصية
ملاحظات:
  1. على المُتغير أن يكون مُعرفاً مسبقاً قبل استخدامه.
  2. عملية التخزين بالذاكرة تتم بواسطة التعويض في متغير باستعمال العملية =
  3. نستقبل جملة نصية نحولها لمُعطيات ملائمة بواسطة Parse
  4. من المُفضل طباعة جملة إستعلامية على الشاشة للمستخدم قبل أن نستقبل منه مُعطيات، وذلك لكي يعرف المُستخدم ما هي المُعطيات التي يجب عليه إدخالها.
  5. من المُفضل طباعة جملة توضيحية على الشاشة للمستخدم مع طباعتنا للنتيجة، وذلك لكي يعرف المُستخدم ما هي هذه النتيجة وما الذي تُمثله.
تشديد: نريد أن نبني برنامجاً واضحاً للمُستخدم، لذلك علينا طباعة جمل توضيحية وجُمل استعلامية على الشاشة للمستخدم قبل أن نستقبل منه مُعطيات، وذلك لكي يعرف المُستخدم ما هي المُعطيات التي يجب عليه إدخالها وما هو معنى النتائج التي حصل عليها.

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

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

3.6 كتابة الملاحظات في البرنامج – תיעוד

يمكننا إضافة ملاحظات او تعليقات على البرنامج (بين الأوامر) دون أن نؤثر على البرمجة، هذه الملاحظات تشرح طريقتنا للحل أو تفسر بعض الأوامر والحاسوب لا يتطرق لها.

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

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

كذلك يمكننا الغاء أسطر من البرمجة إذا اضفناهما قبل هذه الأسطر.

مثال 3.12
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");
}

نتيجة التشغيل:

Microsoft Visual Studio Debug Console
Hammam
31
m

لكن إذا أردنا إلغاء فقرة كاملة أو إضافة ملاحظات ممتدة على أكثر من سطر وليس فقط سطر واحد نستعمل الرموز /* */ حيث يعتبر كل ما هو بين الرمز /* والذي يُغلقه */ ملاحظة ولا يأخذها الحاسوب بالكود ولا تُعتبر من البرنامج.

مثال 3.13
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 اسم مُتغير ;

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

string اسم مُتغير = ”جملة نصية“ ;
مثال 3.14
string name = "Hammam";

نستطيع أيضا:

string name;
name = "Hammam";
string اسم مُتغير ;
اسم المُتغير = Console.ReadLine( ) ;

ننتبه أن استقبال المُعطيات من نوع string يتم بواسطة Console.ReadLine()‎ ولا حاجة لأن نستعمل العملية Parse

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

مثال 3.15
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(اسم المُتغير);
سؤال 3.3: اكتب برنامج يستقبل من المستخدم اسمه الشخصي ثم يستقبل منه اسم العائلة ويطبع على الشاشة الاسم مع العائلة.
الحل:
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);
}

نتيجة تشغيل البرنامج للمدخلات التالية (الاسم الأول: همام أما الاسم الأخير: حمد) فهي:

Microsoft Visual Studio Debug Console
Please enter your first name:
Hammam
Please enter your last name:
Hamad
Hammam Hamad
تذكير: لتشغيل البرنامج نضغط على Run أو F5 ، لكن الشاشة Console ستختفي في حال انتهاء عمل البرنامج مباشرةً ولن نستطيع رؤية النتائج لذلك من المُفضل أن نضغط زر Ctrl مع F5 أو أن نضع الأمر التالي كآخر أمر في البرنامج: Console.ReadLine();

رموز خاصة للطباعة داخل الجملة باستعمال الخط المائل backslash:

الرمزالشرح
\nنزول المؤشر الى سطر جديد
\ttab افقي أي تقدم المؤشر عدة خانات للأمام
\vtab عمودي أي نزول المؤشر عدة خانات للأسفل
\"طباعة شطائر (لان الحاسوب قد يعتقد أنها نهاية الجملة)
\'طباعة فاصلة عليا
\\طباعة الخط المائل (backslash) (اذا اردنا طباعته لأنه قد يفهم على انه رمز خاص)
\0رمز null (لا يطبع الرقم 0)
\rإعادة المؤشر الى أول السطر
\aاصدار صوت (جرس)
\bbackspace (وضع فراغ للخلف أي ممحاه)
مثال 3.16
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!");
}

نتائج تشغيل البرنامج:

Microsoft Visual Studio Debug Console
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

مثال 3.17
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
}
ملاحظة: اذا سجلنا في بداية عملية Console.Write( ) الرمز @ قبل بداية كتابة الجملة فان الخط المائل (backslash) لن يتم التعامل معه على أنه رمز خاص مثال:
السطر الأول فيه Errors.
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 اسم مُتغير ;

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

int اسم مُتغير = عدد صحيح ;
مثال 3.18
int x = 6;

int birth_year;
birth_year = 1984;
int اسم مُتغير ;
اسم المُتغير = int.Parse(Console.ReadLine( )) ;

ننتبه أن استقبال المُعطيات من المُستخدم يكون من نوع string وذلك يتم بواسطة Console.ReadLine()‎ ولذلك نستعمل العملية Parse لكي نُحول المُعطيات من جملة نصية الى أعداد صحيحة يمكن التعامل معها بواسطة الحسابات والرياضيات (خاضعة لقوانين الحساب).

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

مثال 3.19
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(اسم المُتغير);
مثال 3.20
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);
}

نتيجة تشغيل البرنامج هي:

Microsoft Visual Studio Debug Console
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
تذكير: لتشغيل البرنامج نضغط على Run أو F5 ، لكن الشاشة Console ستختفي في حال انتهاء عمل البرنامج مباشرةً ولن نستطيع رؤية النتائج لذلك من المُفضل أن نضغط زر Ctrl مع F5 أو أن نضع الأمر التالي كآخر أمر في البرنامج: Console.ReadLine();

3.9 متغيرات وبيانات من نوع عدد عشري (double) – מספרים ממשיים

البيانات والمُعطيات من نوع double هي أعداد عشرية (تشمل الأعداد الصحيحة أيضاً)، دقة عرض الخانات العشرية تصل حتى 15 خانة بعد النقطة العشرية. من أجل تخزين هذه الأعداد في الذاكرة نحتاج الى 8 byte أي 64 bit وهي 64 خانة يُخزن بها الرقم بالميزان الثنائي (ميزان العَدّ لدى الحاسوب).

تعريف متغير من نوع double:

double اسم مُتغير ;

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

double اسم مُتغير = عدد ;
مثال 3.21
double a, b = -5, c = 2.5;
a = -14.678;
double اسم مُتغير ;
اسم المُتغير = double.Parse(Console.ReadLine( )) ;

ننتبه أن استقبال المُعطيات من المُستخدم يكون من نوع string وذلك يتم بواسطة Console.ReadLine()‎ ولذلك نستعمل العملية Parse لكي نُحول المُعطيات من جملة نصية الى أعداد عشرية double يمكن التعامل معها بواسطة الحسابات والرياضيات (خاضعة لقوانين الحساب).

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

مثال 3.22
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(اسم المُتغير);
سؤال 3.4: اكتب برنامج يستقبل من المُستخدم عدداً عشرياً (double) ويطبع له هذا العدد على الشاشة مع الجملة التالية:
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 :

Microsoft Visual Studio Debug Console
Please insert a number: 5
You inserted the number:
5
تذكير: لتشغيل البرنامج نضغط على Run أو F5 ، لكن الشاشة Console ستختفي في حال انتهاء عمل البرنامج مباشرةً ولن نستطيع رؤية النتائج لذلك من المُفضل أن نضغط زر Ctrl مع F5 أو أن نضع الأمر التالي كآخر أمر في البرنامج: Console.ReadLine();

طباعة عدد خانات مُحدد بعد الخانة العشرية (دقة عرض الرقم على الشاشة):

إذا طبعنا قيمة متغير من نوع double وكان يحتوي على عدد عشري له الكثير من الخانات بعد الفاصلة العشرية، فان دقة عرض الخانات تصل حتى 15 خانة بعد النقطة العشرية.

مثال 3.23 — طباعة قيمة double مع كسور عشرية.
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.");
}

عند تشغيل البرنامج سنحصل على:

Microsoft Visual Studio Debug Console
a=1.4142135623730951,b=10,c=3,d=3.3333333333333335,e=0.3
This code written by: Hammam Wattad.

ولكننا لا نريد دائما طباعة كل الفواصل العشرية (نريد دقة معينة) وذلك لكي نُسهل التعامل مع هذه المُعطيات، لهذا السبب نستطيع أن نُحدد عدد الخانات بعد الفاصلة العشرية بما يسمى دقة عرض الرقم العشري ويتم ذلك بواسطة استعمال الطريقة التالية:

نكتب داخل الأقواس المُتعرجة التي تضع قيمة المتغير داخل جملة نصية الإشارة التالية

عدد الخانات العشرية:F

مثلا: {0:F1} المُتغير سيتم عرضه بدقة خانة واحدة فقط بعد الخانة العشرية.

{0:F2} المُتغير سيتم عرضه بدقة خانتين بعد الخانة العشرية. وهكذا...

مثال 3.24 — نطبق ذلك على المثال السابق:
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.");
}

نتيجة التشغيل هي:

Microsoft Visual Studio Debug Console
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).

اصغر رقم:

70605040302010000 Dec0 Hex0 Bin

أكبر رقم:

7161514131211101255 DecFF Hex11111111 Bin

لكي نُعرف متغير من نوع بايت يجب كتابة اسم المتغير بعد كلمة byte وذلك للإعلان عنه. هذا يتم بالصيغة التالية:

byte اسم مُتغير ;

مثلا نريد تعريف متغير اسمه num من النوع byte:

byte num;

استقبال رقم من المستخدم لداخل متغير من نوع بايت يتم بواسطة الأمر التالي:

اسم المتغير = byte.Parse(Console.ReadLine());

على الرقم أن يكون صحيحا موجبا بالمجال 0 الى 255.

طباعة قيمة متغير اسمه num من نوع بايت تتم بواسطة Console.Write كما هو متبع. مثلا:

Console.WriteLine("the value of num is: {0}",num);

أو بواسطة عملية دمج النصوص + (لصق تسلسلي):

Console.WriteLine("the value of num is: "+num);
مثال 3.25
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);
}

نتيجة تشغيل البرنامج:

Microsoft Visual Studio Debug Console
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) علينا معرفة الحسابات التي تؤدي للحل أو الخوارزمية (الألغوريثم).

سؤال 3.5: اكتب برنامج يستقبل طول وعرض المستطيل ويطبع على الشاشة مساحة ومحيط المستطيل. ضع جمل استعلامية وتوضيحية.
الحل:

مُتغيرات:

متغيرات ادخال:

  • width من نوع double وهو مُتغير لاستقبال وتخزين عرض المستطيل.
  • length من نوع double وهو مُتغير لاستقبال وتخزين طول المُستطيل.

مُتغيرات إخراج:

  • area من نوع double وهو مُتغير نُخزن فيه مساحة المستطيل.
  • perimeter من نوع double وهو مُتغير نُخزن فيه محيط المُستطيل.

طريقة الحساب:

area= width*length ;
perimeter = 2 * (width + length) ;

الحل:

في المحرر يبدأ هذا البرنامج بالسطر 7، وأرقام الأسطر في جدول المتابعة التالي هي أرقام المحرر.
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 جدول المتابعة – טבלת מעקב

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

جدول المتابعة مكون من أعمدة وأسطر، حيث اننا نُخصص عمودا للأوامر (نسجل فيه رقم الأمر أو ننسخ الأمر اليه) وعموداً لكل متغير بالبرنامج وعموداً للمُخرجات (أو المعروض على الشاشة).

عدد الأسطر هو كعدد الأوامر التي تُنفذ (يجب عد التكرارية) حيث اننا نضع كل أمر في سطر.

في نهاية تنفيذ كل أمر (الموجود في السطر) نسجل في هذا السطر عند كل عمود ما هي قيمة المُتغيرات وما الذي تم طباعتهُ على الشاشة وذلك بانتهاء تنفيذ الأمر وهكذا

جدول المُتابعة يتم بناؤه إذا أعطي لدينا المُدخلات المُحتملة. (لكل إمكانية مُدخلات نستطيع بناء جدول متابعة)

مثال 3.26 — نسجل جدول متابعة للسؤال السابق (حساب مساحة ومحيط مستطيل) للمُدخلات التالية: عرض: 3 سم. طول: 4 سم.
#widthlengthperimeterareaפלט
9----
11----Please insert width:
123---
133---Please insert length:
1434--
163414-
173414-the perimeter is : 14
18341412
20341412the area is:12

3.12 قسمة أعداد صحيحة والتحويل (casting) وباقي القسمة (modulo) – חילוק שלמים, המרה ושארית

3.12.1 قسمة أعداد صحيحة والتحويل casting

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

العمليات الحسابية التي تتم بين الأعداد الصحيحة (int) ناتجها يكون int، ومن هنا فإن قسمة أعداد صحيحة هي بالضرورة عدد صحيح في لغة السي شارب.

مثال:

9 / 2 = 4intintint

أي تعبير مُكون من أعداد صحيحة هو عدد صحيح. لذلك لكي نحصل على إجابات دقيقة (عشرية) في القسمة علينا أن نُحول أحد الأعداد الى عدد عشري، حيث أن الحاسوب يعتبر أي تعبير جبري فيه عدد عشري هو تعبير جبري قيمته عشرية.

مثال 3.27
9 / 2 = 4
9.0 / 2 = 4.5
9 / 2.0 = 4.5

كذلك الأمر إذا استخدمنا المُتغيرات فان قسمة مُتغيرات نوعها int سيكون بالضرورة عددا صحيحا (int) حتى لو قمنا بتخزينه داخل مُتغير من نوع double.

مثال 3.28
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");
}
Microsoft Visual Studio Debug Console
result = 3
Written By:Hammam

لذلك يجب علينا تحويل ( casting ) نوع أحد المُعطيات ليكون عدد عشري double لأنها كلها من نوع عدد صحيح int وبذلك نضمن أن النتيجة تكون من نوع أعداد عشرية double لكن يجب أن ننتبه أننا لا نستطيع تخزينها في مُتغيرات من نوع int (Error) لأنه لا يُمكن تخزين عدد عشري double في مُتغير من نوع صحيح int لهذا السبب علينا تخزينها في مُتغير من نوع عشري double.

من هنا نصل إلى ان التحويل يسمى casting وبواسطته نستطيع تحويل مُعطيات من نوع إلى آخر حيث نضع النوع المطلوب داخل أقواس ( ) .

(double) 9 / 2 = 4.59.0 / 2 = 4.59 / (double)2 = 4.59 / 2.0 = 4.5
مثال 3.29
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);
}
Microsoft Visual Studio Debug Console
Example By:Hammam
result = 3.5
سؤال 3.6: اكتب برنامج يستقبل من المُستخدم عددين صحيحين. ويطبع على الشاشة جواب قسمة العدد الأول على الثاني. مثال: إذا استقبلنا العدد 9 والعدد 2 فإن الإجابة يجب أن تكون بالصيغة التالية: 9/2=4.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.");
}
Microsoft Visual Studio Debug Console
Insert the first number: 12
Insert the second number: 8
12/8 = 1.5
Written By: Hammam.

قسمة أي عدد صحيح على 10 يُعطي رقما ذو عدد خانات أقل بخانة حيث تُقتَطع خانة الآحاد بالرقم الأصلي وتكون النتيجة رقم جديد أقل بخانة (بدون خانة آحاده التي تم اقتطاعها).

قسمة أي عدد صحيح على 100 يُعطي رقما ذو عدد خانات أقل بخانتين حيث تُقتَطع خانة الآحاد والعشرات بالرقم الأصلي وتكون النتيجة رقم جديد أقل بخانتين (بدون خانة آحاده وعشراته التي تم اقتطاعهما).

مثال 3.30
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# هناك عملية تعطي باقي قسمة عدد صحيح على عدد صحيح آخر وهي: %

عملية % تسمى عملية باقي القسمة (مودولو - שארית) وهي عملية تعطينا باقي قسمة العدد الصحيح الأول على العدد الصحيح الثاني.

مثال 3.31
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

قوانين:

سؤال 3.7: اكتب برنامج يستقبل عددا صحيحا ويطبع على الشاشة باقي قسمة هذا العدد على سبعة.
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");
}
Microsoft Visual Studio Debug Console
Insert a number:
23
23 % 7 is 2
Written by Hammam
قانون: أي عدد مودلو 10 تكون النتيجة هي خانة الآحاد.
مثال 3.32
4 % 10 = 4415723 % 10 = 3320 % 10 = 0154 % 10 = 4
قانون: إذا كان a أصغر من b فإن: a % b = a مثال: 6 % 8 = 6
سؤال 3.8: لدى عبد اللطيف هواية جمع صدف البحر، يجمعها في صندوق بترتيب خاص. لدى عبد اللطيف أكياس، يتسع كل كيس منها لخمسة عشرة صدفة، حيث يضع كل 15 صدفة في كيس ويغلقه.
عندما يحصل عبد على صدفة يضعها مع الصدَف المتناثرة في الصندوق حتى تكتمل للعدد 15 فيضعها في كيس ويغلقه ويترك هذا الكيس في الصندوق، وإذا كان هناك باقي (لم تكتمل بعد لتصل الى 15 لكي يضعها في كيس) فإنه يتركها متناثرة في الصندوق حتى يكتمل العدد.
اكتب برنامج يستقبل من عبد عدد الصدف الكلي لديه في الصندوق وعلى البرنامج أن يطبع له كم كيس يجب أن يكون ممتلئً ومقفلاً داخل الصندوق وكم صدفة باقية بالصندوق دون كيس.
مثلا إذا كان مع عبد اللطيف 50 صدفة فالبرنامج يطبع انه يوجد بالصندوق 3 أكياس و5 صدفات بلا كيس.
15 صدفةبالكيس15 صدفةبالكيس15 صدفةبالكيس5 صدفات بالصندوقبدون كيس
الحل:
أرقام الأوامر في جدول المتابعة التالي هي 1–8، أي أسطر البرنامج من int seashells… حتى الأمر الأخير.
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

Microsoft Visual Studio Debug Console
Insert number of seashells: 50
Number of bags:3
Number of seashells without bags:5
Written By Hammam!

جدول المُتابعة:

رقم الأمرseashellsbagsremainderالشاشة
1
2Insert number of seashells: 50
350
4503
55035
65035Number of bags: 3
75035Number of seashells without bags: 5
85035Written By Hammam!
سؤال 3.9: اكتب برنامج يستقبل عددا صحيحاً ذو ثلاث خانات وعلى البرنامج أن يطبع على الشاشة ما يلي:
  • مجموع خانات العدد.
  • عدد جديد مُكون من ترتيب عكسي لخانات العدد الأصلي.
  • تربيع العدد الجديد (تربيع العدد المُكون من ترتيب عكسي لخانات العدد الأصلي).
مثلا إذا استقبلنا العدد 279 على البرنامج ان يطبع على الشاشة أن مجموع خانات الرقم هو (18) وأن الرقم الجديد (العكسي) هو (972) وأن تربيع الرقم العكسي هو: (944784)
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 يُعطينا النتيجة التالية:

Microsoft Visual Studio Debug Console
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);
Microsoft Visual Studio Debug Console
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;
مثال 3.33
res *= 5;هو نفس الأمرres = res * 5;

3.14 فئة العمليات الحسابية – המחלקה Math

لإجراء عمليات حسابية من نوع خاص هناك فئة مُعرفة داخل System (تكون ضمن برنامجنا عندما نكتب using System) .

مثال:

اسم الفئة التي سنستعملها لهذه الحسابات هو Math وتحتوي على الكثير من العمليات الحسابية.

طريقة استعمالها:

Math.اسم العملية ( المُتغيرات التي تعمل عليها العملية )
الأمرشرح
Mathاسم الفئة
.نقطة لإختيار عملية من ضمن الكثير من العمليات المُتاحة
Math.اسم العملية ( … )لها قيمة أي نتيجة لذلك نُخزن نتيجتها بالذاكرة (في مُتغير) أو نطبع هذه النتيجة
العمليةشرحمثال — العمليةمثال — النتيجة
Sqrt(n)عملية الجذر التربيعيMath.Sqrt(30.25)5.5
Abs(n)عملية القيمة المُطلقةMath.Abs(-2.7)2.7
Pow(n1,n2)عملية القوة n1n2Math.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).
سؤال 3.10: اكتب برنامج يستقبل من المُستخدم عددان عشريان ويطبع على الشاشة الأكبر بينهما.
الحل:
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 هي:

Microsoft Visual Studio Debug Console
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 اسم مُتغير ;
مثال 3.34
char x ;

إعطاء قيمة بدائية للمُتغير (איתחול):

1. استعمال الفاصلة العليا ' '   مثال:

char tav = '$';

2. استعمال الكود الرقمي للرمز (حسب جدول ASCII)

القوس (char) هو casting (تحويل).
char tav = (char) 36;

لا يمكن تخزين الرقم الصحيح (int) داخل مُتغير من نوع char لذلك يجب أن نحول الرقم الى نوع رمز (char) بواسطة casting كما تعلمنا سابقا.

استقبال قيمة الى مُتغير من نوع char:

المُتغير ch تم تعريفه سابقاً.
ch = char.Parse(Console.ReadLine());

يتم استقبال رمز واحد فقط.

طباعة مُعطيات من نوع رمز (char):

Console.WriteLine(x); // x مُعرف على أنه char

يتم طباعة قيمة x وهو الرمز المحفوظ داخل x .

Console.WriteLine((char)36);

يتم طباعة الرمز الملائم للرقم 36 وهو $ . (حسب جدول الأرقام للرموز ويسمى ASCII)

في الطباعة نستطيع استعمال {0} و {1} كما تعلمنا ذلك مع أنواع المُعطيات الأخرى.

سؤال 3.11: اكتب برنامج يستقبل من المُستخدم رمزاً ويطبعه على الشاشة.
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 ونحصل على :

Microsoft Visual Studio Debug Console
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 مُتسلسلة بتسلسل منطقي. وكذلك الأحرف الصغيرة مرتبه الواحدة مباشرةً تلو الأخرى وكذلك الأحرف الكبيرة.

أمثله على بعض الأرقام للرموز:

الرمزالكودالرمزالكودالرمزالكود
048a97A65
149b98B66
250c99C67
351d100D68
⋮⋮⋮⋮⋮⋮
957z122Z90

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

الجدول الكامل موجود في المُلحقات. (مُلحق 2 في آخر الكتاب)

3.15.3 العمليات الحسابية في الرموز (char)

يمكن جمع وطرح وضرب أرقام (كود) الرموز والتي هي من نوع int (كود الرمز هو int أي عدد صحيح)، ومن الجدير معرفته أن التعبير الذي فيه عدد صحيح (int) ورمز (char) يكون نوعه int (الناتج يكون int)، ثم يجب أن ننتبه أنه علينا التحويل (casting) الى char .

سؤال 3.12: اكتب برنامج يطلب من المُستخدم رمزا ثم يطبع على الشاشة الرمز الذي يليه.
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

Microsoft Visual Studio Debug Console
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 ثم الزائد هو لصق تسلسلي.
سؤال 3.13: (سؤال يدمج شروط – للعودة اليه بعد الانتهاء من فصل 4)
اكتب برنامج يستقبل من المُستخدم رمزا ويطبع على الشاشة إذا كان هذا الرمز يمثل أحد أحرف اللغة الإنجليزية. (ملاحظة: على البرنامج أن يطبع جملة توضيحية ان الرمز حرف إذا كان المُدخل أحد أحرف اللغة الإنجليزية بغض النظر إن كان الحرف صغيراً 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");
}

بعض النتائج بعد تشغيل البرنامج:

Microsoft Visual Studio Debug Console
insert a character: t
It is a letter
Microsoft Visual Studio Debug Console
insert a character: D
It is a letter
Microsoft Visual Studio Debug Console
insert a character: #
It isn`t a letter
سؤال 3.14: (سؤال يدمج شروط – للعودة اليه بعد الانتهاء من فصل 4)
اكتب برنامج يستقبل من المُستخدم حرفاً انجليزياُ وإذا كان هذا الحرف صغيراُ يحوله إلى حرف كبير أما إذا كان حرفا كبيرا فيحوله الى حرف صغير. وعلى البرنامج أن يطبع جملة توضيحية فيها الحرف الذي استقبلناه والحرف بعد التحويل.
سؤال 3.15: اكتب برنامج يستقبل ثلاث أرقام كرموز (char) وعلى هذا البرنامج أن يطبع على الشاشة مجموع هذه الأرقام الثلاثة. مثال:
إذا ادخل المستخدم: ’7‘ و ’2‘ و ’1‘ يطبع البرنامج 10
همام عبد اللطيف وتد — جميع حقوق هذا الكتاب محفوظة للمؤلف. النسخة الإلكترونية منشورة في fahed-lab.com بإذنه، مع تصحيحات وافق عليها. للتواصل مع المؤلف: hammam4112@gmail.com