Professional Documents
Culture Documents
3
Introduction to C# مقدمح نهثزمجح تانسً شارب
ممدمة للبرمجة
بالسي شارب
3
الكتاب :ممدمة للبرمجة بالسً شارب
ممدمة للبرمجة
بالسي شارب
محمود سليمان
ٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
المحتوى :
٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
عن الكتاب
هذا الكتاب ُم َع ّد للمبتدئٌن لكً ٌساعدهم على فهم أساسٌات لؽة السً شارب بطرٌمة
ّ
مبسطة وسهلة ،وال ٌشترط أن ٌكون الماريء له أي معرفة مسبمة بالبرمجة ،وأهم
خطوة بجانب المراءة هً التطبٌك العملً المستمر لتحصل على أكبر لدر من الفهم
واإلستٌعاب والتحصٌل.
عن اللغة
ت لؽة السً شارب لؽة بسٌطة جدا وسهلة وحدٌثة ولها أؼراض كثٌرة ،فهً ُ
ط ّو ِر ْ
بواسطة شركة ماٌكروسوفت ( ) Microsoftبمٌادة أندرٌس هٌلسبرج ،اللؽة ت ُم ِكنن من
عمل تطبٌمات للوٌب والهاتؾ وسطح المكتب ،وتعمل شركة ماٌكروسوفت على
تطوٌرها دائما ،وهً واحدة من أشهر لؽات البرمجة وأكثرهم إستخداما.
ولؽة سً شارب ( ) C#هً تطوٌر وإمتداد للؽة C++و ،Cوهً تعمل بالبرمجة
كائنٌة التوجه بشكل كلً.
إذا اكتشفت أي خطؤ فً هذا الكتاب رجاء اعلمنً وراسلنً على البرٌد اإللكترونً
Mahmoudsoliman781@yahoo.com
7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ممدمة
إن سً شارب إحدى لؽات البرمجة المصممة للعمل على البنٌة التحتٌة المشتركة للؽات
البرمجة تسمى
معنى هذا المصطلح أنها ت ُتٌح للمبرمج إمكانٌة إستخدامها إلنتاج مكتبات تتوافك مع
المواصفات والخصائص الشائعة للبنٌة التحتٌة أي انه ٌحتوي على الكود التنفٌذي الذي
ٌتٌح له استخدام شتى لؽات البرمجة عالٌة المستوى علً منصات عمل مختلفة.
2
Introduction to C# مقدمح نهثزمجح تانسً شارب
ثم تتحول الحروؾ إلى أصفار وآحاد ( لؽة اآللة ) لكً ٌفمها الكمبٌوتر وٌتم ذلن بـ :
فكل حرؾ من ( Aإلى ) Zوكل رلم من ( 0إلى ) 9وكل رمز فً الكمبٌوتر مثل
& ^ @ # $له عدد عشري ٌناظره ثم ٌتحول إلى أصفار وآحاد فً النهاٌة لكً ٌفهمه
الكمبٌوتر .
9
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٔ -بت = ( ٔ \ ٓ )
( Fieldsحمول ) -تتكون من حروؾ او أرلام فمثال ت ُعبِ ّرعن اسم الشخص أو عمره.
( Big Dataبٌانات ضخمة ) -كم هائل من البٌانات التً ت ُنت َج فً العالم ٌومٌا.
ٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
إطار العمل
( ) The .Net Framework
الـ ( دوت نت ) .Netهً إطار عمل أو منصة لتنفٌذ التطبٌمات وتحتوي على مكتبات
توفر العدٌد من االمكانٌات التً تستخدم لبناء تطبٌمات كبٌرة بالسً شارب سواء
تطبٌمات للوٌب أو لسطح المكتب أو الهاتؾ سواء ( windows ، ios ، android
) phoneوذلن من خالل xamarinوهً عبارة عن منصة لتطوٌر تطبٌمات
الهواتؾ المحمولة حٌث ٌعمل التطبٌك الذي أُنشًء بواسطتها على كل أنظمة تشؽٌل
ص ِم َمت لتكون منصة عمل لمختلؾ التطبٌمات ،تستطٌع إستخدامها الهواتؾ ،الـ ُ .Net
فً بناء تطبٌمات من خالل اللؽات اآلتٌة :
وهً تحتوي على كل المكتبات المبنٌة فً هذه اللؽات وبها كل الموارد التً تمكنن من
إنشاء تطبٌك من خاللها.
ٌ - (Garbage Collector) GCجمع البٌانات المهملة واالماكن الؽٌر مستخدمة فً
الذاكرة وٌموم بحذفها وتنمٌة الذاكرة فٌجعلها تعمل بكفاءة أكثر.
ٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ألن السً شارب من اللؽات عالٌة المستوى فتحتاج إلى لؽة وسٌطة لبل أن تتحول إلى
لؽة اآللة.
ثانٌا عندما ٌُنَفَذ البرنامجٌ ،مر على معالج اخر ٌُعرؾ بــ ( JIT ) just-in-timeوهذا
أٌضا ٌكون بداخل CLR
وٌعمل على ترجمة اللؽة الوسٌطة فً الملؾ التنفٌذي إلى لؽة اآللة (.)0 , 1
مالحظة :
أي أمر ٌؤخده الكمبٌوتر ٌتحول إلى اللؽة التً ٌفهمها الكمبٌوتر وٌستطٌع التعامل معها
وهو ال ٌفهم ؼٌرها وهً ( )0 , 1أي شًء ٌتحول إلى األصفار واآلحاد.
ٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
C# Source Code
C# Compiler
CLR / GC / JIT
Operating System
ٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
وهً جزء من الـ CLRوهً عبارة عن آداة تستطٌع تشؽٌل اكثر من لؽة برمجة معا
بمكتبات مختلفة.
وتحتفظ باالساسٌات بداخلها وعندما تعمل أى لؽة تعود هذه اآلداة لتلن االساسٌات
الخاصة بهذه اللؽة لكً تعمل على إطار العمل حٌث أن كل لؽة برمجة ٌكون لها لواعد
خاصة بها فً الكتابة وٌكون لكل لؽة العدٌد من المكتبات التً تحتوي على تعرٌؾ لكل
شئ خاص باللؽة.
https://msdn.microsoft.com/ar-sa/library/
إن لم تستطع فهم هذه المعلومات فال بؤس ،ستفهمها فٌما بعد ،فمحتوى الكتاب ؼٌر
معتمد علٌها ،لكنً تعم ّدت لولها لكً تعرؾ كٌؾ ٌعمل البرنامج الذي تكتب علٌه الكود
وماذا ٌحدث مع الكود الذي تكتبه وما ٌحدث وراء الشاشة وكٌؾ ٌفهمه الكمبٌوتر
وٌظهر على شكل برنامج له واجهه وٌستطٌع المستخدم العادي التعامل معه ،سنبدأ فً
بناء هٌكل أول برنامج فً لؽة السً شارب .
ٌمكننا كتابة الكود على أي محرر نصوص وٌكون إمتداد الملؾ الذي نكتب به الكود
( ) .cs
ٌمكنن أن ت ُ ِ
حم َل أي إصدار منه.
ٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
سٌفتح أمامن
using System;
namespace + اسم البرنامج
First_project فمثال إذا اسمٌت البرنامج
:ًسٌكون كالتال
namespace First_project
{
Class Program
{
static void Main(string[] agrs)
{
Console.WriteLine("Hello World");
}
}
}
ٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
بعد اإلنتهاء من كتابة الكود سنضؽط على كلمة Startلكً نموم بمعالجة للكود و
تنفٌذه.
وتُكت َب هذه الجملة فً آخر سطر فً الكود فً دالة الـ ) (... Main
namespace First_project
{
Class Program
{
)static void Main(string[] agrs
{
;)"Console.WriteLine("Hello World
;) (Console.ReadKey
}
}
}
ٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
اتفمنا فً البداٌة على أن لؽة السً شارب ( ) C#إنما هً مبنٌة على اللؽتٌن C++و C
وتعمل بشكل كلً بالبرمجة كائنٌة التوجه.
إذا ما معنى البرمجة كائنٌة التوجه؟ وماهو إختالؾ السً شارب عن السً؟ وما هً
تمنٌات البرمجة؟
وهً كانت عبارة عن أن الكود ٌُكتب فً صفحة واحدة وبعض االجزاء فً الكود لابلة
للتكرار بدون شئ ٌجعلنا نستؽنً عن هذا التكرار فً جزء معٌن من الكود ،فمثال أنن
تكتب بعض االسطر من الكود لتنفٌذ عملٌة معٌنة ثم تُكمل الكود وبعدها تمابلن مشكلة
تحتاج إلى نفس العملٌة السابمة لكن فً جزء مختلؾ من البرنامج ،حٌنها ال تستطٌع إال
أن تعٌد كتابة هذا الجزء مرة أخرى ،وأٌضا عملٌة البحث عن االخطاء كانت صعبة
جدا وتؤخذ الكثٌر من الولت ،كود ٌحتوي على آالؾ االسطر فلم ٌكن من السهل التعامل
مع الكود فً عملٌات التعدٌل وكان الكود ؼٌر مرتبُ ،و ِج َدت فكرة البرمجة الخطٌة
لحل المشاكل المتعلمة بالرٌاضٌات ولتسهٌل حلها.
ٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
وأخٌرا ظهرت تمنٌة جدٌدة فً كتابة الكود ت ُم ِكنَن من تنظٌم الكود وأختصرت جدا فً
حجم الكود وأصبح مرتبا وسه ّل عملٌات البحث عن األخطاء وساعد المطورٌن على
العمل بؤرٌحٌة ووفرت الكثٌر من الولت والجهد أٌضا ،وأصبح كل شًء منفصال عن
اآلخر حٌث تتم عملٌة التعدٌل والتؽٌٌر فً الكود بدون حدوث أخطاء مترتبة على هذا
التؽٌٌر ،وأُضٌفت الكثٌر من التمنٌات التً تحافظ على البٌانات وتؽلٌفها وإخفاء البٌانات
والتحكم الكامل بها ،ومن اللؽات التً تعمل بالبرمجة كائنٌة التوجه (البرمجة الشٌئٌة)
لؽة C++و C#و Javaو Pythonومعظم لؽات البرمجة الحدٌثة.
Namespace
ال تشؽل تفكٌرن بمعنى كلمة ،classسنفهمه فٌما بعد ،كل ما أرٌدن أن تعرفه عن الـ
classأنه ٌمكن أن ٌحتوي على أكثر من دالة وٌمكن إنشاء أكثر من classفً نفس
المشروع ،إذا نحتاج إلى شئ لٌجمع كل هذه الـ classesمع بعضها ،سنضعهم بداخل
Namespaceفٌكون الكود مرتب أكثر.
ٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
Main
تسمى الدالة األساسٌة التً ٌبدأ منها البرنامج فً تنفٌذ الكود ،فمثال إذا كتبت مئات
العملٌات واإلجراءات خارج الدالة االساسٌة فلن ٌتم تنفٌذهم أوال بل ٌبدأ البرنامج فً
تنفٌذ ما بداخل الدالة األساسٌة.
سنفهم معنى كلمة string[ ] argsفً الفصل الخاص بالدوالٌُ ،مكن اإلستؽناء عنها
فً دالة الـ ،Mainنستطٌع كتابة ألواس الدالة بدون كتابتها.
ٕٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
اإلدخال واإلخراج
( ) Input and Output
; using System
namespace First_project
{
Class Program
{
)static void Main(string[ ] agrs
{
;) (Console.ReadLine
}
}
}
ٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
وٌجب ان نضع فاصلة منموطة فً نهاٌة كل جملة فً البرنامج ( ; ) وإال سٌحدث خطؤ.
ٔ -خطؤ فً طرٌمة كتابة الكود ( ) Syntax errorوذلن ٌكون خطؤ فً لواعد
كتابة الكود.
ٕ -خطؤ منطمً ( ) Logic errorوفً هذه الحالة ٌكون الكود مكتوب بطرٌمة
صحٌحة كماعدة ولكنه ؼٌر منطمً مثل لسمة واحد على صفر.
ٖ -خطؤ أثناء التشؽٌل ( ) Runtime errorهذا الخطؤ ٌحدث أثناء تشؽٌل
البرنامج ،مثل وجود فائض فً البٌانات ال ُمد َخلَة.
نسٌان الفاصلة المنموطة ٌُعد خطؤ فً طرٌمة الكتابة أي ( .) Syntax error
; using System
namespace First_project
{
Class Program
{
)static void Main(string[ ] agrs
{
; )" Console.WriteLine(" C#
}
}
}
ٕٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
وٌمكن أن نكتب فمط ) ( Writeلكن األسطر التً تلٌها فً عملٌة الطباعة ستكون
متالصمة بها.
وفً هذه الحالة سٌطبع + Hello Worldأول ُمد َخل للدالة بعد الفاصلة
وإذا أردنا طباعة ثانً ُمدخل سنكتب ,1-وحٌنها لن ٌعرض أول ُمدخل وسٌعرض
المٌمة 20
مثال ٕ :
; ) Console.WriteLine(" x = ,2} , y = {0} and z = ,1- " , 10 , 20 , 30
سٌطبع
ٖٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
) Concatinatoin( -2الدمج
لكن هذه الطرٌمة ثابتة وماهو مكتوب أوال سٌعرض أوال بعكس الطرٌمة السابمة انت من
ٌتحكم فٌما سٌظهر أوال وسٌعرض الكل .
سٌكون الناتج....
Hello World 520
سٌعرضها بهذا الشكل ولن ٌجمع الرلمٌن فهذه األداة ( )+بعد النص فً الطباعة لٌس
أداة جمع إنما هً أداة للدمج بٌن النصوص فهو ٌتعامل مع األرلام التً بعد النص على
أنها نص ولٌست رلم فمنطمٌا ال ٌمكن إضافة رلم على نص ،لكن إذا أتى الرلمان لبل
جملة الطباعة فسٌجمع الرلمٌن أوال وٌموم بالعملٌة الحسابٌة بطرٌمة عادٌة جدا.
توجد بعض العالمات تسمى " " Escape Sequenceالتً لد تساعدن فً عملٌة
الطباعة لتخرج النص بشكل منسك أو إنذار عند عملٌة ما خطؤ.
ٕٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
ٕ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
أنواع البيانات
( ) Data Types
البٌانات التً ت ُخزن فً الذاكرة ٌجب أن ٌكون لها نوع حتً ٌتعرؾ علٌها مترجم اللؽة،
فمثال تكون نصوص أو حرؾ أو عدد صحٌح أو عدد عشري وٌجب أن نحدد نوعها
أوال وإال لن ٌتعرؾ علٌها المترجم وسٌحدث خطؤٌ ،وجد العدٌد من االنواع ولكن
بالتؤكٌد لن تسخدم كل شًء ،فمط ما تحتاج إلٌه فً برنامجن...
ٕٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
المتغيرات
( ) Variables
المتؽٌر هو عبارة عن اسم لمكان تخزٌن البٌانات فً الذاكرة ،والذاكرة عبارة عن خالٌا
وكل خلٌة تُعادل ٔ بت ،وت ُ َح َدد المساحة التً تؤخذها البٌانات فً الذاكرة من خالل
نوعها وتتؽٌر لٌمة المتؽٌر بإستمرار كلما أدخلنا له لٌمة جدٌدة ،كما ٌمكننا تسمٌة
المتؽٌر بؤي اسم نرٌده لكن ال نستطٌع تسمٌة متؽٌرٌن بنفس األسم ،وٌجب أن تكون
المٌمة التً ستُخزَ ن تتناسب مع نوع المتؽٌر.
Variable_Name
ونُسمً هذا المكان فً الذاكرة لكً نستطٌع الوصول إلى البٌانات مرة أخرى بسهولة،
فهو بمثابة صندوق توضع به هذه البٌانات .
ٕ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;int num = 5
;"string name = "123Mahmoud
;float num2 = 34.5f
;'char c = 'a
;double num3 = 34.5
}
}
}
ومتؽٌر من النوع ( ) floatرلم ٌحتوي على عالمة عشرٌة ونكتب فً آخره ( ) fلكً
ٌتعرؾ المترجم على أنه ،floatألن المٌمة االفتراضٌة لألعداد الكسرٌة هً .double
ثم عرفنا متؽٌر من النوع ( ٌ ) charؤخذ حرؾ وٌوضع بٌن عالمة تنصٌص فردٌة.
: Int خطؤ
: int صح
ٖٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
;int a=7
;int A =7
فإنهما فً هذه الحالة متؽٌران مختلفان ،وٌجب مراعاة الدلة فً كتابة نوع المتؽٌر
والتعامل معه بشكل صحٌح وإال سٌحدث خطؤ فً البرنامج ولن ٌتعرؾ على نوع
المتؽٌر.
;using System
namespace First_program
{
class Program
{
) (static void Main
{
; int num1=5
; int num2=10
; int sum
; sum = num1 + num2
" = Console.WriteLine("sum of two numbers
;)+sum
}
}
}
وإذا كنت ترٌد تعرٌؾ أكثر من متؽٌر من نفس النوع فمن الممكن أن نعرفّه بهذه
الطرٌمة...
ٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
مالحظة :
فمثال :
تسمية المتغير
ٌجب أن ٌكون اسم معبر عن نوع البٌانات التً ستُخزن فمثال إذا كان اسم او ُ
عمر
شخص.
;string Name
;int Age
ٕٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
!#$%^&-=+)(?
لكن هنان بعض الكلمات المحجوزة فً اللؽة،ٌمكننا أن نسمً المتؽٌر بؤي اسم نرٌده
... التً ال نستطٌع تسمٌة المتؽٌر بنفس اسمها
ٖٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
static
ٖ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
كل متؽٌر نعرفّه ٌكون له نطاق ومجال ٌُرى فٌه فً الكود فإما أن ٌكون :
( Localمحلً ) :وٌكون ذلن فً نطاق محدد ونحن نحدد مدى رإٌة مترجم
اللؽة له فً بالً الكود من خالل لوسٌن المجموعة } {
( Globalشامل أو عام ) :وٌكون مرئً فً كل الكود داخل الـ classأي
ٌكون فً بداٌة الـ .class
مالحظة :عندما تعطً لٌمة إبتدائٌة للمتؽٌر فإنه ٌستخدمها فمط فً حالة أنن لم تُدخل
له لٌمة أخرى.
مثال :
1
Global
2
3
Local
ٖٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً هذه الصورة ٌكون المتؽٌر xعام ،أي مرئً فً كل الكود الذي فً هذا الـ class
الذي ٌُسمى Test
ب حرؾ xفً أي مكان فً الصورة تحت اسم الـ classسٌظهر لن المتؽٌر فإذا ُكتِ َ
xلكن بشرط أن ٌكون داخل مجال الـ classأي أنه ال ٌمع بٌن خارج أول لوس
وآخر لوس للـ classكما ٌشٌر السهم ( ) 1فً الصورة .وال ٌجوز إعادة تعرٌؾ
عرؾ ُمسبما حٌث أنه متؽٌر عام داخل الـ
متؽٌر آخر بنفس أسم المتؽٌر xألنه ُم ّ
.class
المتؽٌر zهو األلل شمولٌة فٌهم حٌث أنه ال ٌُت َ َعرؾ علٌه خارج الموسٌن المحٌطٌن
به كما ٌشٌر السهم ( .) 3
كل لوس مجموعة هو عبارة عن مرحلة ومستوى كلما صعد المتؽٌر أعلى خارج
األلواس كلما زادت شمولٌته ومعرفته فً أجزاء أخرى فً الـكود.
الثابت ( ) Constant
الفرق بٌن الثابت والمتؽٌر أن الثابت لٌمته ثابته لن تتؽٌر طوال البرنامج
أما المتؽٌر فٌمكن تؽٌٌر لٌمته ،إذا حاولنا تؽٌٌر الثابت سٌحدث خطؤ فً البرنامج.
ٖ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
: ٕتمارٌن
ٖ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
مساحة أكبر ( ) 8 byte
عدد صحٌح ;long x
;x=y
حٌث أن حجم المتؽٌر ( ٙٗ ) xبت وحجم المتؽٌر ( ٖٕ ) yبت فٌمكن للمتؽٌر ذو
الحجم األكبر أن ٌحتوي على المتؽٌر ذو الحجم األلل بدون أي حدوث عملٌة فمد
للبٌانات .أما إذا حاولت فعل العكس فً الحالة الطبٌعٌة فسٌحدث خطؤ وٌحدث فمد
للبٌانات.
ٖ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
إذا حاولت وضع الصندوق فً الشكل ( ) 2فً الصندوق فً الشكل ( ) 1لن ٌحدث
أي خطؤ ألن الصندوق فً الشكل ( ) 1أكبر من الصندوق اآلخر ،لكن فً حالة عكس
هذه العملٌة سٌحدث خطؤ ألن الصندوق فً الشكل ( ) 2أصؽر فً الحجم.
2 1
وفً حالة األعداد ٌمكننا وضع المٌم الكسرٌة floatأو doubleبداخل متؽٌرات نوعها
intأو longبشرط تؽٌٌر نوعها .
مثال ٔ:
;long x
;int y
ٓٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال ٕ:
; int x = 10
; float y = 3.0f
; x = ( int ) y
وفً هذه الحالة فإن المتؽٌر ال ُمضٌؾ ٌستطٌع إستمبال المتؽٌر الضٌؾ.
تحول المتؽٌر إلى النوع تحول المتؽٌر إلى النوع أي أنها تحول المتؽٌر
longحٌث أن النوع intحٌث أن النوع int إلى النوع shortحٌث
longحجمه 64بت أي حجمه ٕٖ بت أي ٗ أن النوع shortحجمه
2باٌت باٌت ٔٙبت أي ٕ باٌت
تذكر أن :
ّ
إذا جاء حرؾ uلبل هذه األنواع من البٌانات
معنى ذلن أن هذه األنواع تستطٌع أخذ لٌمة موجبة فمط ،وحرؾ uإختصار لـ
.unsigned
ٔٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثل
decimal ToDecimal(String)
float ToSingle(String)
double ToDouble(String)
short ToInt16(String)
int ToInt32(String)
long ToInt64(String)
ushort ToUInt16(String)
uint ToUInt32(String)
ulong ToUInt64(String)
ٕٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
فمثال إذا أردنا إدخال لٌمة لمتؽٌر نوعه intمن خالل المستخدم :
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;int num
;)) (num = int.Parse(Console.ReadLine
}
}
}
هذا الكود معناه أنه ٌوجد متؽٌر من النوع ( ) intوسٌؤخد لٌمته من المستخدم بواسطة
الدالة ) ( ReadLineلكن هذه الدالة ال تمبل إال نصوص ،لذا سنجعلها تمبل أعداد
صحٌحة من خالل دالة ) (.Parse
وآخرا سنضع كل هذا داخل المتؽٌر الذي نرٌد إدخال المٌمة له كما فً المثال السابك.
أو
; ) ) (num = Convert.ToInt32(Console.ReadLine
ٖٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
التعليمات
( ) Comments
التعلٌمات هً عبارة عن شرح موجز لجزء معٌن من الكود البرمجً فٌجعل الكود سهل
المراءة والفهم ،وٌتجاهل المترجم التعلٌمات وال ٌتعامل معها نهائٌا فهً مجرد مالحظات
أو تنوٌه ٌكتبه المبرمج لنفسه أو لمن ٌعمل بعده ،إذا ُو ِج َد فٌها خطؤ نحوي أو منطمً فال
ٌهم فلن ٌحدث أي خطؤ.
مثال :
;using System
namespace First_program
{
class Program
{
) (static void Main
{
int num; // this is the first variable
}
}
}
ٗٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
أي أنه ٌمكن أن نكتب مالحظات فً أكثر من سطر ،فٌكون هذا الجزء من الكود ؼٌر
مرئً بالنسبة للمترجم.
مثال :
;using System
namespace First_program
{
class Program
{
)(static void Main
{
;int num
/* this is the first variable
this is the first variable
this is the first variable
this is the first variable */
}
}
}
أٌضا ال ٌجب أن ننشؽل بالتعلٌمات كثٌرا ،ت ُكتب التعلٌمات فً االجزاء المهمة التً
تحتاج إلى توضٌح فمط.
٘ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
المعامالت الرياضية
الجمع ( ) +
الطرح ( ) -
الضرب ( * )
المسمة ) ( /
مثال :
بفرض أن ....
ٗٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
A%B=1
A++ = 6
A-- = 4
مثال :
;using System
namespace First_program
{
class Program
{
)(static void Main
{
;int num1 = 10
;int num2 = 8
;int sum
;)sum=(num1++) + ( ++num2
;)Console.WriteLine(sum
//result=19
ٗ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
;)Console.WriteLine(num1
//result =11
;)Console.WriteLine(num2
//result =9
}
}
}
مثال :
;using System
namespace First_program
{
class Program
{
)(static void Main
{
;int A=10
;int B=8
;int sum
ٗ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
صٌن مع
إذا ُو ِج َد متؽٌران نوعهما stringوبٌنهما عالمة الجمع فإنها ستدمج النَ َ
بعضهما.
مثال :
; ) Console.WriteLine( x + y
سٌطبع :
Hello World
ٌساوي ( == )
ال ٌساوي ( =! )
أكبر من ( > )
ألل من ) < (
أكبر من أو ٌساوي ) => (
ألل من أو ٌساوي ) =< (
ٗ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
بإفتراض أن ...
A = 10 , C = 10 and B = 5
A == C
A>B
A != B
B<A
A >= C
B <= A
مالحظة :
عالمة = لٌست عالمة ٌساوي إنما تسمى تعٌٌن أو تخصٌص ( .) assignment
A=5
أو
A=B
معنى هذا أن لٌمة الجانب األٌمن للعالمة (=) تنتمل إلى الجانب األٌسر.
والمتؽٌر ٌ Bوضع بداخل المتؽٌر Aوتصبح لٌمة المتؽٌر Aنفس لٌمة المتؽٌر B
ولٌمة المتؽٌر Bال تتؤثر وتظل كما هً.
ٓ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System;
namespace First_program
{
class Program
{
static void Main( )
{
int num1 = 10;
int num2 = 8;
num1 = num2;
Console.WriteLine( num1 );
//2 = الناتج
Console.WriteLine( num2 );
// 2 = الناتج
}
}
}
٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
المعامالت المنطمية
) && ( ٌ : Logical ANDجب أن تكون المٌمتٌن صحٌحتٌن
) || ( ٌ : Logical ORجب أن تكون إحدى المٌمتٌن صحٌحة
) ! ( ٌ : Logical NOTعكس المٌمة ،فإذا كانت صحٌحة فً األصل تنفٌها األداة
وتصبح خطؤ والعكس.
وسنفهم المعنى أكثر عندما نصل إلى " الجمل الشرطٌة ".
المعامالت الثنائٌة التً تتعامل مع البت ( ) Bit
&
|
^
أي أنها تتعامل مع البٌانات على شكل النظام الثنائً ( .) Binary System
مالحظة :
أي حرؾ أو رلم ٌتم تحوٌله داخل الكمبٌوتر إلى النظام الثنائً أي إلى أصفار وآحاد
( )0111001010010110فكما ذكرت فهذه تسمى لؽة اآللة والكمبٌوتر ال ٌفهم
ؼٌرها.
ٌتم تحوٌل األرلام العشرٌة إلى النظام الثنائً بهذه الطرٌمة :
مً بالنظام الثنائً. ُ ُ
ٕ أس صفر إلى ٕ أس ما ال نهاٌة ،لذا س َ
ٕ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
وٌتم جمع كل المٌم التً تُك ِو ّن المٌمة ال ُمعطاة ،والمٌمة التً نؤخذها نضع مكانها 1والتً
لم نستخدمها نضع مكانها .0ال ٌشترط تكرار معٌن لألساس ٕ ،فمط ما تحتاج إلٌه
إلخراج المٌمة بالنظام الثنائً ،أو ٌُمكنن أن تمسم المٌمة ال ُمعطاة على العدد ٕ وبالً
المسمة ٌُك ِو ّن المٌمة بالنظام الثنائً.
مثالٔ :
ح ِول المٌمة ٔ9إلى النظام الثنائً.
ٖ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٗ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
-فً حالة ( | )
= A |B
عند جمع 1و 0بإستخدام | فإن الناتج
00101
ٌكون ،1وٌكون الناتج 0فً حالة
واحدة ...إذا كان الجمع بٌن 0و .0 |
10100
=ــــــــــــــــ
10101
إذا A | B = 21
فً حالة ( ^ )
٘٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
=
=+
=-
=*
=/
=%
=&
=^
=|
مثال :
A += Bتعنً أن المتؽٌر Aستُجمع لٌمته على المتؽٌر Bثم سٌوضع ناتج الجمع
بداخل .A
A=A+B
* / %ت ُح َ
سب من الشمال إلى الٌمٌن وأٌهم ٌؤتً أوال فتحدث عملٌته أوال.
ت ُح َ
سب من الشمال إلى الٌمٌن وأٌهم ٌؤتً أوال فتحدث عملٌته أوال. - +
== ت ُح َ
سب من الشمال إلى الٌمٌن وأٌهم ٌؤتً أوال فتحدث عملٌته أوال. =!
مثال :
(6/2+5)*3%7–1
الناتج 2 :
)4/2+6*3-5%5-1*(3-1
الناتج 8 :
٘7
Introduction to C# مقدمح نهثزمجح تانسً شارب
النمطة ( دوت ) –> ( ) .تستخدم للوصول إلى الدوال والمتؽٌرات والـ classes
;) (System.Console.WriteLine
( ) تُستخدم مع الدوال ،أي دالة ٌجب أن تحتوي على هذٌن الموسان أثناء اإلنشاء
واإلستدعاء ،وأٌضا نستخدمها عند تحوٌل أنواع البٌانات.
تمارٌن :
إذا كان معن كوب ماء وكوب آخر من الشاي واردت أن تبدل الماء بالشاي والعكس،
ستؤتً بكوب ثالث فارغ لكً ٌحتوي على احد النوعٌن إلى أن تبدل الكوبٌن اآلخرٌن.
;using System
namespace First_program
{
class Program
٘2
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
static void Main( )
{
int num1=10;
int num2=15;
int temp;
temp = num1;
num1 = num2;
num2 = temp;
Console.WriteLine(num1);
//num1=15
Console.WriteLine(num2);
//num2 =10
}
}
}
: تمارٌن
٘9
Introduction to C# مقدمح نهثزمجح تانسً شارب
n2 = double.parse(Console.ReadLine( ) ) ;
n3 = double.parse(Console.ReadLine( ) ) ;
n4 = double.parse(Console.ReadLine( ) ) ;
n5 = double.parse(Console.ReadLine( ) ) ;
average = ( n1 + n2 + n3 + n4 + n5 ) /5 ;
Console.WriteLine( average ) ;
}
}
}
ٙٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
if
هً عبارة عن لرارات لائمة على شروط ،فإذا تحمك الشرط ٌُنفذ الكود الذي بداخل
جملة التحكم ( .) if
مثال:
وهكذا ...
) الشرط ( if
code
مثال :
) if ( grade>=85
; )" Console.WriteLine(" Excellent
نكتب ifثم نفتح لوسٌن لكتابة الشرط بداخلهما ونكتب بداخلها الكود المراد تنفٌذه.
وهً تنفذّ سطر فردي تحتها فمط فً حالة عدم وضع لوسٌن مجموعة.
ٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
أما إذا أردنا كتابة أكثر من أمر وأكثر من سطر نكتب الكود بداخل } {.
)"if ( your_name=="Mahmoud
{
;)"Console.WriteLine("Hello Mahmoud
; "your_name="Mahmoud"+"Soliman
}
ومعنى الكود أنه إذا كانت درجتن أكبر من أو تساوي ٘ 2سٌُنَفَذ الكود الذي بداخل جملة
ifوفً هذه الحالة سٌطبع " ،" Excellentفٌما عدا ذلن لن ٌُنفذها.
ونستطٌع كتابة أكثر من شرط بداخلها ،فمثال إذا كنا نرٌد فحص بٌانات شخص كاملة،
مثل ( اسمه ،عمره ،جنسه ،رلم تلٌفونه )
نحدد إذا ُو ِج َد خطؤ فً أحد هذه الشروط ٌكمل تنفٌذ الكود أو ال.
) ! ( && , || , ^ ,
ٕٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
المعامالت المنطمٌة ( ^ ) وتعنً ( ) XORأي أنه لكً ٌتم تنفٌذ الكود الذي بداخل if
ٌجب أن ٌكون الجانبان مختلفٌن أي أن أحدهما صحٌح واآلخر خطؤ ،إذا كان ناتج
الشرط فً الجانبٌن خطؤ أو كان ناتج الشرط فً الجانبٌن صحٌح فلن ٌتم تنفٌذ الكود
أٌضاٌ .جب أن ٌكونا مختلفٌن .
مثال :
) "phone == "00000000
إذا فناتج الشرط ٌكون صحٌحا أما إذا كانت أحدهما خطؤ فٌكون ناتج الشرط خطؤ ،ثم
هذا الناتج ٌكون ُمدخل للشرط الذي بعده أي ٌكون ٌسار الـ ( || ) صحٌحا وٌسارها أٌا
ٌكن فٌكون ناتج الشرط صحٌح لكلٌهما ألن ( || ) تحتاج جانب واحد صحٌح على
األلل فٌكون الناتج النهائً صحٌحا لهذا الشرطٌ ،تبمى آخر فحص وهو الـ phone
وناتج الشرط الذي على ٌساره صحٌح وبما أن أداة الشرط ( || ) فٌكون الناتج النهائً
لجملة ifصحٌح فٌتم تنفٌذ ما بداخلها.
1
&&
0
--------
)(0
||
1
-------
)(1
&&
1
----------
)(1
إذا كانت جملة الشرط عبارة عن متؽٌر من النوع ( ) boolوكتبنا الجملة بدون وضع
أي عالمات تحدد الشرط وكتبنا المتؽٌر الذي ٌحمل المٌمة فمط فستظل هذه المٌمة ثابتة
فلو كانت trueفإن ifدائما ستُنفَذ ،أما إذا كانت falseفلن ٌتم تنفٌذ ما بداخل ifأبدا.
ٗٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
;bool variable=false
) if( variable
{
;)" Console.WriteLine(" C#
}
جملة الشرط تلمائٌا تكون بهذا الشكل ( )variable == trueعندما ٌكون المتؽٌر من
النوع ( ) boolلو لم نكتب لٌمة trueأو falseفً الشرط.
وإذا أردنا النفً فً جملة الشرط نضع عالمة تعجب لبل المتؽٌر المراد نفً لٌمته
( ! ).
فً هذه الحالة لن ٌُنَفذ الكود الذي بداخل الموسٌن ألن ناتج الشرط trueوالمٌمة التً
ٌحملها المتؽٌر فً االصل .false
أما إذا أردت أن ٌتم تنفٌذ الكود فً حالة أن المتؽٌر ٌحمل المٌمة falseفٌجب أن تكون
جملة الشرط هكذا...
) if( ! variable
أو
) if( variable == false
٘ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
else
ت ُنَفذّ هذه الجملة عندما ٌكون الشرط الذي فً جملة ifخطؤ ،لكن إن كان الشرط صحٌحا
فلن تُنفذ جملة .else
مثال :
;int num=5
) if( num == 2
;)"Console.WriteLine("this is true
else
;)"Console.WriteLine("this is false
إذا أردنا كتابة أكثر من سطر داخلها فٌجب وضع لوسٌن } {.
ٙٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
:مثال
int number = 5 ;
if ( number == 2 )
{
// else الشرط خطؤ فلن ٌُنَف ّذ وسٌنفذ ما بداخل
Console.WriteLine("this is true");
}
else
{
if ( number > 1 )
{
number += 3 ;
if ( number < 10 )
{
number += 5 ;
}
else
{
number -= 10 ;
}
}
Console.WriteLine(number);
}
// ٖٔ سٌطبع
ٙ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
معنى هذا الكود أنه ٌفحص لٌمة المتؽٌر أوال فإذا كانت ٕ سٌطبع this is trueإذا
كانت ؼٌر ذلن فإنه ٌدخل إلى elseفٌجد بداخلها جملة شرط أخرى وٌفحص المٌمة
التً بداخل المتؽٌر هل المٌمة أكبر من ٔ؟
إذا كانت كذلن فٌدخل إلى ifوتزٌد لٌمة المتؽٌر بممدار ٖ ثم ٌفحص المتؽٌر مرة أخرى
هل لٌمته ألل من ٓٔ؟ إذا كانت ألل فٌنفذّ ما بداخلها وتزٌد لٌمة المتؽٌر بممدار ٘ ولو
لم تكن لٌمته ألل من ٓٔ فلن ٌنفذ جملة ifهذه وٌنزل إلى جملة elseوتنمص لٌمة
المتؽٌر بممدار ٓٔ وبعد ذلن ٌطبع لٌمة المتؽٌر فً أول جملة elseالتً بداخلها كل
ُجمل الشرط هذه.
ٙ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
if …..else if
using System;
namespace First_program
{
class Program
{
static void Main( )
{
Console.WriteLine("enter your grade");
int grade = int.Parse(Console.ReadLine( ));
if ( grade == 50 )
Console.WriteLine(" your grade=50");
else if ( grade == 60 )
Console.WriteLine("your grade=60");
else if ( grade == 70 )
Console.WriteLine("your grade=70");
else if ( grade == 80 )
Console.WriteLine("your grade=80");
else if ( grade == 90 )
Console.WriteLine("your grade=90");
else
ٙ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
Console.WriteLine("you didn't success if
;)"! your grade less than 50
}
}
}
}
سٌفحص أول متؽٌر ٌُدخله المستخدم فإذا تحمك أول شرط سٌنفذه ولن ٌنفذ أي شًء آخر
وإذا لم ٌتحمك سٌتجه إلى الشرط الذي ٌلٌه ثم الذي ٌلٌه إال أن ٌتحمك الشرط ،إذا كانت
كل الشروط وكل االحتماالت خطؤ سٌتجه إلى elseوٌنفذ ما بداخلها.
تمارٌن :
اكتب برنامج ٌفحص الرلم الذي ٌُدخله المستخدم وٌعرض نوع الرلم إذا كان عددا
زوجٌا أم فردٌا.
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;)) (int number = int.parse(Console.ReadLine
) if( number%2 == 0
{
;)"Console.WriteLine("this number is Even
}
ٓ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
else
{
;)"Console.WriteLine("this number is Odd
}
}
}
}
Inline Condition
ٌوجد نوع آخر من الجمل الشرطٌة وتكتب فً سطر واحد وتعمل عمل : if
; int x =10
هذا الكود معناه أن فً حالة أن xأكبر من ٘ وألل من ٕٓ أطبع trueما عدا ذلن
اطبع .false
وٌمكننا إستمبال المٌمة الناتجة من هذه العملٌة فً متؽٌر من نفس نوع البٌانات الخارجة،
فً هذا الشرط تكون النواتج من النوع stringفٌمكننا إستمبالها فً متؽٌر نوعه string
ٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
string str = ( x > 5 && x < 20 ) ? " True " : " False " ;
Console.WriteLine( str );
: الناتج
True
: ٕ مثال
int num = 20 ;
Console.WriteLine( num );
-------------------------------------------
: الناتج
25
7ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
switch
هً جملة شرطٌة ت ُستخدم للتؤكد من ال ُمدخالت ما إذا كانت صحٌحة أم خاطئة مثل if
If Switch
تستطٌع التعامل مع أكثر من عملٌة ال تستطٌع التعامل إال مع عملٌة واحدة
بداخل الشرط الواحد . بداخل الشرط
ال نستطٌع استخدام == > أو < أو &
%بداخلها فهً محددة .
تكون صعبة فً عملٌات المراءة وفهم تكون سهلة فً عملٌة المراءة والفهم
الكود فً حالة الشروط الكثٌرة جدا للكود أكثر من if
وعند إستخدام كم كبٌر من االرلام
للفحص عنها ٌُفضل إستخدام switch
ٌفضل إستخدامها فً حالة العملٌات أسرع من ifفً حالة إستخدام االرلام
البسٌطة والتً ال تحتوي على أشٌاء المحددة النها تتوجه مباشرة إلى
محددة فهً شمولٌة أكثر ،على ك ٍل الشرط الصحٌح وتنفذه .
هً الشائعة فً اإلستخدام لل ُجمل
الشرطٌة .
ٖ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
int x = 10 ;
switch( x )
{
case 5:
Console.WriteLine(" this is number 5 ");
break;
case 3:
Console.WriteLine(" this is number 3 ");
break;
case 10:
Console.WriteLine(" this is number 10 ");
break;
case 2:
Console.WriteLine(" this is number 2 ");
break;
default:
7ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
... مثال عند المٌمة كذا أو كذا،إذا كنا نرٌد الكشؾ عن أكثر من لٌمة فً نفس الحالة
.ّنفذ
:مثال
default:
Console.WriteLine("Didn't pass");
7٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
;break
}
فً حالة إذا كان التمدٌر ٓ٘ سٌطبع ممبول وإذا كان ٘ 2أو ٘ 9سٌطبع امتٌاز
ألن عند عدم كتباتها فهذا معناه أنه فً هذه الحالة أو التً تلٌها "إذا كان الشرط صحٌح"
نفذّ .فٌحدث خطؤ ألنه ٌتولع وجود حالة بعدها ٌكشؾ عنها ،فكٌؾ ٌُنفذ وال توجد حالة
بعدها؟!
7ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
حلمات التكرار
( ) Loop Statements
هً عبارة عن تكرار جزء معٌن من الكود لعدد معٌن من المرات ،وهً مهمة جدا
النها توفر الولت والمجهود ،تنفٌذ هذه الجملة ٌعتمد على شرط وطالما الشرط ٌتحمك
فهً ت ُنَفَذّ وتنتهً ثم تبدأ مرة أخرى إلى أن تصل إلى نهاٌة الشرط ،وٌتم إستخدامها عن
طرٌك بعض ال ُجمل التً تستخدم فً عملٌة التكرار.
while
) شرط ( while
{
}
مثال :
77
Introduction to C# مقدمح نهثزمجح تانسً شارب
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;int i = 1
) while( i < 10
{
;) Console.WriteLine( i
لكن إذا كتبناها بدون عملٌة الزٌاده فستظل تعمل بدون تولؾ ألن الشرط دائما صحٌح
طالما المٌمة لن تتؽٌر ،وستكون حلمة ال نهائٌة .
فٌجب أن نزود لٌمة المتؽٌر بالممدار الذي نرٌده ،فمثال إذا لولنا
i++سٌزٌد بممدار ٔ
i+=2سٌزٌد بممدار ٕ
i+=3سٌزٌد بممدار ٖ
وهكذا....
}
}
}
}
لنكتبه بصورة صحٌحة :
;using System
namespace First_program
{
class Program
{
72
Introduction to C# مقدمح نهثزمجح تانسً شارب
1 2 3 4 5 6 7 8 9
ثم سٌتولؾ عمل الحلمة ألنها وصلت لنهاٌة الشرط ،حٌث أن الشرط لن ٌتحمك ألن ٓٔ
لٌست ألل من ٓٔ عندها سٌتولؾ الشرط وتتولؾ حلمة التكرار.
ٌمكننا وضع الشرط الذي نرٌده وبالزٌادة التً نرٌد وكتابة أي كود بداخل جملة التكرار
وسٌتم تنفٌذه طالما أن الشرط صحٌح.
تمارٌن :
;using System
namespace First_program
{
79
Introduction to C# مقدمح نهثزمجح تانسً شارب
class Program
{
static void Main( )
{
char alphapet = 'A';
while( alphapet<= 'Z' )
{
Console.WriteLine(alphapet);
alphapet++;
}
}
}
}
: أو ٌمكننا كتابتها بهذا الشكل
using System;
namespace First_program
{
class Program
{
static void Main( )
{
char alphapet = 65;
while(alphapet<= 90)
{
Console.WriteLine(alphapet);
alphapet++;
}
}
}
}
2ٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
هذا فً حالة إذا أردنا حروؾ الهجاء فً حالة الحروؾ الكبٌرة أما إذا أردناها فً حالة
الحروؾ الصؽٌرة سنبدأ بـ 97ونضع الشرط ألل من أو ٌساوي ٕٕٔ.
a
b
.
.
z
do….while
وجملة التكرار هذه تختلؾ عن السابمة فً أنها تنفذ الكود الذي بداخلها أوال بعد ذلن
تفحص الشرط وتتؤكد ما إذا كان صحٌحا أم خطؤ حتى إذا كان الشرط ؼٌر صحٌح فإنها
تنفذ الكود مرة واحدة فمط على األلل.
ٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
Console.WriteLine( i );
i++;
}
while( i < 10 ) ;
}
}
}
: إذا تتكون جملة التكرار هذه من
.) ( الشرطwhile + ) ممدار الزٌادة ( العداد+ do + لٌمة إبتدائٌة للمتؽٌر
: تمارٌن
أكتب برنامج ٌؤخذ األرلام والرموز والحروؾ وٌطبع الرلم العشري الممابل لها فً الـ
.ascii
using System ;
namespace ConsoleApplication1
{
class Program
{
static void Main( )
{
char check ;
do
{
Console.Write( " enter character : " ) ;
check = char.Parse( Console.ReadLine( ) ) ;
int decim = check ;
Console.WriteLine( decim ) ;
}
while ( true ) ;
}
}
}
2ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
for
وتُكتب الجملة فً سطر واحد بخالؾ الجمل السابمة التً كانت ٌُكتب كل جزء منها فً
مكان مختلؾ فً الكود.
مثال:
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;bool question=true
;int choice
)while(question==true
ٌمكننا اإلستؽناء عن ( // ) ==true
النها تلمائٌا تكون trueفً الشرط إذا لم نؽٌرها بـ false
{
ٖ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
choice=int.parse(Console.ReadLine());
switch(choice)
{
case 1:
statement;
break;
case 2:
statement;
break;
case 3:
statement;
break;
default:
question=false;
break;
}
}
}
}
}
لتوضٌح الفرق بٌنهماfor مثال على
using System;
namespace First_program
{
class Program
{
static void Main( )
{
for( int number=1 ; number<=10 ; number++ )
{
2ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Console.WriteLine(number);
}
}
}
}
وتكون حلمات متداخلة وٌمكننا إستخدام،وٌمكننا إستخدام بداخلها جملة تكرار أخرى
. إذا أحتجنا إلٌهاif بداخلها جملة
2٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
بشرط أن نكتب المٌمة اإلبتدائٌة والشرط والعداد بداخلها وٌمكنا كتابة المٌمة اإلبتدائٌة
فولها ،وإذا لم نكتب شًء وتركناها هكذا فستكون حلمة ال نهائٌة ال تتولؾ.
) ; ; (for
مثال:
أكتب برنامج ٌبحث عن رلم ٌدخله المستخدم من بٌن االرلام من ٔ إلى ٓٓٓٔ إذا وجده
ٌطبع هذا الرلم.
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;)) (int search = int.Parse(Console.ReadLine
) for( int i = 1 ; i<= 1000 ; i++
{
) if ( i == search
{
;)Console.WriteLine("the number is "+i
}
}
}
}
}
2ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
توجد بعض الكلمات التً تستخدم بداخل جملة التكرار مثل :
مثال :
;using System
namespace First_program
{
class Program
{
) (static void Main
{
) for( int i = 1 ; i<=10 ; i++
{
) if( i == 4
;break
;) Console.WriteLine( i
}
}
}
}
عندما تكون لٌمة المتؽٌر بـ ٗ سٌخرج من حلمة التكرار ولن ٌكمل وسٌطبع فمط...
ٔ
ٕ
ٖ
27
Introduction to C# مقدمح نهثزمجح تانسً شارب
1 2 3 5 6 7 8 9 10
لكن ٌجب أن تكون بداخل حلمةif وتُكتب أٌضا معswitch تُكتب معbreak إذا كلمة
.تكرار
22
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
29
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌصعد إلى forاألولى ٌزود لٌمة iبممدار ٔ وطالما أن الشرط صحٌح فإنه سٌظل
ٌكرر هذه العملٌة إلى أن ٌكون شرط forاألولى خطؤ.
عندما تكون لٌمة i=1سٌدخل إلى forالثانٌة وتكون لٌمة j=1فٌطبع ناتج ضرب i , j
ثم ٌزود لٌمة jبممدار ٔ فتكون ٕ وٌضرب i*jوهكذا إلى أن تكون لٌمة j=12فٌطبع
ناتج الضرب ألننا تضمنا فً الشرط ( ألل من أو ٌساوي ) وبعدها تزٌد لٌمة j=13
فٌكون الشرط فً هذه الحالة خطؤ ألن ٖٔ لٌست ألل من أو تساوي ٕٔ.
فتتولؾ هذه الحلمة وٌصعد إلى forاألولى وتزٌد لٌمة ثم ٌدخل ٌنفذ ٕٔ عملٌة تكرار
أخرى وٌظل ٌكرر إلى أن تكون لٌمة i = 13حٌنها سٌكون الشرط خطؤ وسٌتولؾ.
1*1 , 1*2 , 1*3 , 1*4 , 1*5 , 1*6 , 1*7 , 1*8 , 1*9 , 1*10 , 1*11 ,
1*12
2*1 , 2*2 , 2*3 , 2*4 , 2*5 , 2*6 , 2*7 , 2*8 , 2*9 , 2*10 ,
2*11 , 2*12
وهكذا....
أي أن كل عملٌة واحدة ألول forتعادلها ٕٔ عملٌة لـ forالتً بداخلها فً هذا الكود.
ٓ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
forالخارجٌة تعبر عن عدد الصفوؾ و forالتً بداخلها تعبر عن عدد األعمدة ،فً
هذا المثال ٌوجد ٙأعمدة و ٙصفوؾ ،ال ٌشترط أن ٌكون عدد األعمدة ٌساوي عدد
الصفوؾ .نالحظ أن الشكل ٌبدأ بعمود واحد ثم ٌزٌد بممدار ٔ (" * ") فً كل صؾ
جدٌد.
;using System
namespace First_program
{
class Program
{
) (static void Main
{
) for( int i = 1 ; i<=6 ; i++
{
) for( int j = 1 ; j<= i ; j++
{
;) "*" (Console.Write
}
;) (Console.WriteLine
}
}
}
}
ٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً ذلن المثال حددنا له الشرط فً جملة التكرار الثانٌة أال تتكرر إال إذا كان عدد
األعمدة ألل من أو ٌساوي عدد الصفوؾ ،فمثال الصؾ األول ٌطبع نجمة واحدة
والصؾ الثانً ٌطبع نجمتٌن وفً الصؾ الثالث ٌطبع ثالث نجوم وهكذا إلى أن تتولؾ
حلمة التكرار الخارجٌة.
أثناء الطباعه نجعل األعمدة تُطبع بجانب بعضها حتى ٌخرج لً هذا الشكل أي أننا ال
نطبع فً دالة ) ( WriteLineبل نطبع داخل الحلمة الخاصة باألعمدة بـ ) ( Writeفمط
وعندما ٌُنهً الشرط فً الحلمة الخاصة باألعمدة ٌخرج منها فٌجد دالة ) (WriteLine
كً ٌنزل إلى صؾ جدٌد ألن هذا الصؾ لد أنتهى.
ٌمكننا كتابة الكود بؤكثر من طرٌمة فمثال ٌمكننا كتابته بهذا الشكل ...
;using System
namespace First_program
{
class Program
{
) (static void Main
{
) for( int i = 1 ; i<=6 ; i++
{
ٕ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
Console.Write( "*" );
Console.WriteLine( );
}
}
}
}
9ٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
فً هذا الشكل نحتاج إلى طباعة مسافات على الجانب األٌسر أوال ونالحظ أن هذه
المسافات تمل بممدار ٔ مع كل صؾ جدٌد ،إذا سنطبع مسافات وأعمدة وصفوؾ،
سنحتاج إلى forللصفوؾ بداخلها حلمتٌن تكرار أحدهما للمسافات واألخرى لألعمدة.
;using System
namespace First_program
{
class Program
{
) (static void Main
{
) for( int i = 1 ; i<=8 ; i++
{
) for( int k = 1 ; k<=8 –i ; k++
{
;) " " (Console.Write
}
) for( int j = 1 ; j<=i ; j++
{
ٗ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
Console.Write( "*" );
Console.WriteLine( );
}
}
}
}
: مثال
using System;
namespace First_program
{
class Program
9٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
static void Main( )
{
for( int i = 1 ; i<=8 ; i++ )
{
for( int k = 1 ; k<=8 - i ; k++ )
{
Console.Write( " " );
}
for( int j = 1; j<= i*2-1 ; j++ )
{
Console.Write( "*" );
}
Console.WriteLine( ); /*
* لكً ٌنزل إلى سطر جدٌد مع نهاٌة كل صؾ لد أكتملت دورته/
}
}
}
}
9ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System;
namespace First_program
{
class Program
{
static void Main( )
{
for( int i = 1 ; i<=12 ; i++ )
{
for( int k = 1 ; k < =12 - i ; k++ )
{
Console.Write( " " );
}
97
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً هذا المثال أردنا طباعة مثلث متساوي السالٌن لذا ضاعفنا األعمدة ،فجعلنا حلمة
التكرار الخاصة باألعمدة تدور إلى ضعؾ عدد الصفوؾ .ثم أنمصنا منها ٔ لٌكون
رأس المثلث نجمة واحدة ولٌست ٕ.
ثم بدأنا من منتصؾ الصفوؾ بعدما أنتهٌنا من المثلث متساوي السالٌن لتتكون الشجرة.
هذه األمثلة فمط لتجعلن متمكن من إستخدام حلمات التكرار بداخل بعضها.
92
Introduction to C# مقدمح نهثزمجح تانسً شارب
foreach
تستخدم أٌضا للتكرار لكن هذه الجملة تستخدم فً حالة وجود مجموعة من البٌانات
المرتبطة معا و ُمخزنة معا بداخل ُم َج َّمع من البٌانات مثل المصفوفة " ." Array
} ; { code
مثال:
;using System
namespace First_program
{
class Program
{
) (static void Main
{
; } int[ ]arr = new int[ 5 ] { 1 , 2 , 3 , 4 , 5
) foreach( int i in arr
{
;) Console.WriteLine( i
}
}
}
}
المصفوفات
( ) Arrays
; [ حجم المصفوفة ] +نوع البٌانات = new +اسم المصفوفة [ ] نوع البٌانات .
ٌجب أن نحدد حجم المصفوفة أثناء التعرٌؾ ،وكل عنصر هو عبارة عن متؽٌر بداخل
المصفوفة.
أُضٌفت كلمة newبداخل السً شارب وهً تعبر عن أن المصفوفة دٌنامٌكٌة أي
ٌجوز تؽٌٌر حجمها ،فعند تؽٌٌر حجمها تؤخذ نسخة من المصفوفة المدٌمة وتنشًء
ٓٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مصفوفة جدٌدة بنفس الحجم الذي حددته ،حٌث أن المصفوفة سابما كانت حجمها ثابت
ؼٌر لابل للتعدٌل ،أما حالٌا ٌجوز تؽٌٌر حجمها متى أردنا.
لكً نشٌر إلى عنصر معٌن بداخل المصفوفة نكتب اسم المصفوفة وموضع العنصر
بداخل المصفوفة ،نكتب موضع العنصر بداخل لوسٌن ] [.
وٌبدأ ترلٌم المصفوفة من صفر حٌث ٌكون أول عنصر فً المصفوفة ترلٌمه صفر.
مثال :
معنً هذه الجملة أننا أنشؤنا مصفوفة بداخلها عشرة عناصر (متؽٌرات)
من النوع ( ،)intوٌمكننا إجراء أي عملٌة علٌهم ،جمع أو طرح أو لسمة أو ضرب أو
أي عملٌةٌ ،مكننا أن نعطً لعناصر المصفوفة لٌم إبتدائٌة بهذه الطرٌمة...
; int * + arr = new int *10+ , 1 , 4 , 12 , 65 , 14 , 16 -
سٌضع هذه المٌم فً أول ٙخالٌا من المصفوفة ،أما بالً العناصرمن المصفوفة
سٌضع لها لٌمة إفتراضٌة صفر.
ٔٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
arr*0+ 1
arr*1+ 4
]arr*2 12
arr*3+ 65
arr*4+ 14
arr*5+ 16
arr*6+ 0
arr*7+ 0
arr*8+ 0
arr*9+ 0
مثال :
إذا أردنا إجراء عملٌة جمع على العنصر الخامس فً المصفوفة ونضٌؾ على لٌمة
العنصر المٌمة ٕٓ ،إذا سٌكون العنصر رلم ٗ ألن المصفوفة تبدأ بصفر.
; arr* 4 + += 20
وٌمكننا أٌضا إضافة عنصر بداخل المصفوفة إلى عنصر آخر بداخلها
ٕٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال:
;arr*2+ = arr*1+
معنى هذه الجملة أن لٌمة العنصر الثانً فً المصفوفة نُ ِس َخت فً العنصر الثالث،
وأصبحت لٌمة العنصر الثالث بنفس لٌمة العنصر الثانً.
;arr*5+ += arr*2+
فً هذه الجملة أ ُضٌفت لٌمة العنصر الثالث إلى لٌمة العنصر السادس و ُوضع ناتج
الجمع بداخل العنصر السادس.
;arr*3+ /= arr*4+
وهكذا ...
نفترض أننا أنشؤنا مصفوفة بهذه الطرٌمة ونرٌد تؽٌٌر مساحتها :
كلمة Arrayهً عبارة عن ٌ classحتوي بداخله على دالة تستطٌع إعادة تعٌٌن حجم
المصفوفة فتنسخ محتوى المصفوفة المدٌمة وتُدخله فً المصفوفة الجدٌدة ،حٌث تنشًء
مصفوفة جدٌدة بالحجم الجدٌد.
: Resizeهً دالة التعدٌل وإعادة تعٌٌن حجم المصفوفة ،وهً دالة جاهزة فً اللؽة.
وٌتم التعامل مع العناصر داخل المصفوفة من خالل حلمات التكرار forأو foreach
أو .while
مثال :
ٗٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
;) ] Console.WriteLine( num[ counter
}
}
}
}
: lengthهً خاصٌة تُرجع أو تحسب لنا حجم المصفوفة ،كان من الممكن أن نكتب
المساحة بشكل مباشر لكن من المفضل أن نكتب الجملة بهذا الشكل حتى إذا تؽٌرت
المساحة فلن نضطر إلى تؽٌٌرها فً كل الشروط المتعلمة بهذه المصفوفة ،فهذه
الخاصٌة تحسبها تلمائٌا .وسنعرؾ ماهً الخصائص فٌما بعد.
; ) Console.WriteLine( count
أنشؤنا عداد لكً ٌدور على عناصر المصفوفة ،ثم ٌطبع محتوى المصفوفة.
مثال :
أنشًء مصفوفة مكونة من 15عنصر وأجعل المستخدم ٌدخل لٌم لهذه العناصر ،ثم
أضؾ المٌمة 5إلى لٌمة العنصر العاشر وأطبع كل لٌم العناصر.
;using System
namespace First_program
{
class Program
{
) (static void Main
{
٘ٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مالحظة— ال ٌجوز أن تبدأ العداد بصفر وأن تجعله ٌزٌد بممدار ٔ ثم تكتب فً الشرط
ألل من أو ٌساوي ( لٌمة حجم المصفوفة ) ،النن إذا كتبت أو ٌساوي فؤنت تمول أن
المصفوفة تحتوي على عدد العناصر الموجودة ٔ+وفً هذه الحالة سٌحدث خطؤ ألنن
إذا بدأت مصفوفة مكونة من ٓٔ عناصر بصفر وانتهٌت بالمٌمة ٓٔ سٌكون عدد
العناصر ٔٔ ولٌس ٓٔ وسٌحدث خطؤ اثناء ولت التشؽٌلٌ ،جب أن تبدأ بصفر وتنتهً
بـ 9
ٔٓٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: تمارٌن
class Program
{
{
arr[counter]=int.Parse(Console.ReadLine));
}
فكرة البرنامج أننا سنجري عملٌة تبدٌل بٌن كل عنصرٌن متمابلٌن ،وسنظل نُ ِ
جري هذه
العملٌة إلى أن نصل إلى منتصؾ المصفوفة ،أي أنه ستحدث عملٌة التبدٌل 5مرات
ولٌس 10ألننا لو أجرٌنا عملٌة التبدٌل 10مرات سترجع المصفوفة إلى ما كانت علٌه
فً السابك.
1 2 3 4 5 6 7 8 9 10
ٔ مع ٓٔ
ٕ مع 9
ٖ مع 2
ٗ مع 7
٘ مع ٙ
لو جعلنا الـ forتدور إلً ما بعد منتصؾ المصفوفة فإنها ستبدلهم مرة أخرى.
لن ٌإثر ذلن فً شًء ألن النوع intال ٌمبل إال أعداد صحٌحة فخارج المسمة سٌكون
عدد صحٌح وسٌتجاهل االعداد العشرٌة فناتج لسمة 12على ٌ 2ساوي ،5وسٌكون فً
منتصؾ المصفوفة رلم على ٌمٌنه 5أرلام وعلى ٌساره 5أرلام ،سنبدل الٌمٌن بالٌسار
والمنتصؾ لن ٌتؤثر ألنه فً كل الحاالت سٌظل فً المنتصؾ.
ٔٓ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
إذا أردت أن تبدل الثالثة أرلام التً على ٌمٌن الصفر بالثالثة التً على ٌساره ،هل
سٌتؤثر مكان الصفر؟
الجواب ال ،نفس الفكرة لن ٌتؤثر مكان العنصر الذي فً منتصؾ المصفوفة ذات الحجم
الفردي.
وأنشؤنا متؽٌر لٌحمل المٌمة مإلتا حتى تتم عملٌة التبدٌل ووضعنا به أول عنصر ثم
وضعنا آخر عنصر فً مكان أول عنصر ،بعدها وضعنا المٌمة التً بداخل المتؽٌر
المإلت فً مكان آخر عنصر وهكذا.
مثال ٕ:
ٔٓ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
) ] if( arr[ i ] > arr[ j
{
;int temp
; ] temp = arr[ i
; ] arr[ i ] = arr[ j
; arr[ j ] = temp
}
}
}
}
}
}
فكرة هذا البرنامج أننا نمارن كل عنصر بالذي ٌلٌه فإذا كان ما ٌلٌه ألل منه فإنه سٌب ِدل
المٌمتٌن ببعضهما.
وكما عرفنا ،تتم عملٌة التبدٌل بٌن لٌمتٌن عن طرٌك وجود متؽٌر ثالث ٌحمل لٌمة
أحدهما حتى تتم عملٌة التبدٌل.
تمارٌن :
أكتب كود ٌجعل المستخدم ٌبدل بٌن لٌمتٌن من خالل فهرس هذه المٌم فً المصفوفة،
المصفوفة مكونة من ٓٔ عناصر.
; using System
namespace ConsoleApplication
{
class Program
ٓٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
static void Main ( )
{
int [ ] arr = new int * 10 + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 - ;
int temp ;
for ( int i = 0 ; i < 10 ; i++ )
{
for ( int j = i ; j < 10 ; j++ )
{
}
}
}
}
}
}
ٔٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌجب أن تحدد عدد األعمدة والصفوؾ التً بها فمساحتها تساوي عدد الصفوؾ فً عدد
األعمدة.
مثال :
هذه المصفوفة تحتوي على ٖ صفوؾ وٖ أعمدة وأٌضا ٌبدأ ترلٌم الصؾ أو العمود من
صفر.
معنى هذا الكود أننا أنشؤنا مصفوفة ثنائٌة اسمها arrوبها ٘ صفوؾ و ٗ أعمدة.
ٕٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
فمثال إذا أردنا تخزٌن لٌمة فً مكان محدد فً المصفوفة فإننا نحدد مكان الصؾ
والعمود.
مثال :
فً حالة تخزٌن المٌمة ٓٓٔ بداخل هذه المصفوفة ،نحدد بؤي صؾ و بؤي عمود
وبتاللً الصؾ مع العمود نضع المٌمة ،تماما كالرسم البٌانً للمحورٌن ( س ،ص ).
; arr[ 2 , 1 ] = 100
صؾ 0
صؾ ٔ
صؾ ٕ
100
صؾ 3
صؾ 4
ٖٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
using System;
namespace First_program
{
class Program
{
static void Main( )
{
string [ , ] arr = new string [ 4 , 3 ] ;
فً عملٌة تعرٌؾ المصفوفة ٌجب أن نحدد لها عدد الصفوؾ واألعمدة أو أن نؤخذ
.لٌمتهما من المستخدم
: مثال
using System;
namespace First_program
{
class Program
{
static void Main( )
{
int row = int.Parse( Console.ReadLine( ) ) ;
int col = int.Parse( Console.ReadLine( ) ) ;
ٔٔٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: تمارٌن
.أنشًء مصفوفة ٖ * ٖ لتخزٌن مرتبات موظفٌن ثم أطبع أعلى مرتب وألل مرتب
using System;
namespace First_program
{
class Program
{
static void Main( )
{
int row=3;
int col=3;
int max_value = 0 ;
int mini_value ;
int [ , ] arr = new int[ row , col ];
for( int i = 0 ; i< row ; i++ )
{
for( int j = 0 ; j< col ; j++ )
ٔٔ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
arr[ i , j ]=int.Parse(Console.ReadLine());
}
}
mini_value = arr[ 0 , 0 ];
max_value = arr[ i , j ] ;
}
if ( arr[ i , j ] < mini_value)
{
mini_value = arr[ i , j ] ;
}
}
}
Console.WriteLine("the maximum salary="+max_value);
Console.WriteLine("the minimum salary="+mini_value);
ٔٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
}
تمارٌن :
أنشًء مصفوفتٌن مساحتهما ٖ * ٖ ثم أضرب المصفوفتٌن فً بعضهما وخزن ناتج
الضرب فً مصفوفة جدٌدة.
مالحظة :
عند ضرب مصفوفتٌن فإن كل صؾ فً المصفوفة األولى ( ٔ ) ٌُضرب فً كل أعمدة
المصفوفة الثانٌة ( ٕ ).
مصفوفة ٔ مصفوفة ٕ
فت ُ َ
ضرب المصفوفتان بهذه الطرٌمة :
ٔٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main( )
{
int multi = 1 , temp = 0 ;
int [ , ]arr = new int[ 3 , 3 ] ;
int [ , +arr2 = new int[ 3 , 3 ] ;
int [ , +arr3 = new int[ 3 , 3 ] ;
Console.WriteLine("---------Enter values of array 1--------");
for( int i = 0 ; i<3 ; i++ )
{
for( int j = 0 ; j<3 ; j++ )
{
Console.Write(" [ " + i + " , " + j + " ] = ");
arr[ i , j ] = int.Parse(Console.ReadLine( ));
}
}
Console.WriteLine("---------Enter values of array 2--------");
for( int i = 0 ; i<3 ; i++ )
{
for( int j = 0 ; j<3 ; j++ )
{
Console.Write(" [ " + i + " , " + j + " ] = ");
arr2* i , j ] = int.Parse(Console.ReadLine( ));
}
}
for( int k = 0 ; k<3 ; k++ )
{
for( int i = 0 ; i<3 ; i++ )
{
for( int j = 0 ; j<3 ; j++ )
{
ٔٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
: تمارٌن
.X O أكتب برنامج بإستخدام المصفوفات لتنفٌذ لعبة
X-O
X X O
X O X
O X O
ٔٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
using System;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
const char player1 = 'x', player2 = 'o', empty = ' ';
char*,+ game = new char*3, 3+;
char winner = ' ';
int pos1;
int pos2;
bool choice = true ;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (choice == true)
{
Console.WriteLine(" X Playing ");
Console.WriteLine(" enter your positions ");
pos1 = int.Parse(Console.ReadLine());
pos2 = int.Parse(Console.ReadLine());
if (pos1 > 2 || pos2 > 2)
{
Console.WriteLine("\t \t wrong position");
j--;
}
else if (game*pos1, pos2+ == 'o' || game*pos1, pos2+ =='x')
{
ٕٔٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
choice = true ;
}
}
for (int a = 0; a < 3; a++)
{
for (int b = 0; b < 3; b++)
{
switch (game[a, b])
{
case player1:
Console.Write("X");
break;
case player2: Console.Write("O");
break;
case empty:
Console.Write(" ");
break;
}
if (b < 2)
Console.Write(" | ");
}
if (a < 2)
{
Console.WriteLine();
Console.WriteLine(" ------");
}
}
Console.WriteLine(); Console.WriteLine();
for(int k=0;k<3;k++)
{
ٕٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
for(int g=0;g<1;g++)
{
if (game[k , g]=='x' && game[k , g+1+ == 'x'
&& game[k , g+2+ == 'x')
{
Console.WriteLine("\t \t X Wins ");
winner = player1;
break;
}
else if (game[g , k] == 'x' && game*g+1 , k]== 'x'
&& game*g+2 , k] == 'x')
{
Console.WriteLine("\t \t X Wins ");
winner = player1;
break;
}
else if(game*0,0+=='x' && game*1,1+=='x' &&
game*2,2+=='x')
{
Console.WriteLine("\t \t X Wins ");
winner = player1;
break;
}
else if(game*2,0+=='x' &&
game*1,1+=='x' && game*0,2+=='x')
{
Console.WriteLine("\t \t X Wins ");
winner = player1;
break;
}
ٕٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
if (winner == player1 || winner == player2)
break;
}
for(int k=0;k<3;k++)
{
for(int g=0;g<1;g++)
{
if(game*k,g+=='o' && game*k,g+1+=='o'
&& game*k,g+2+=='o')
{
Console.WriteLine("\t \t O Wins ");
winner = player1;
break;
}
else if(game[g,k]=='o' &&
game*g+1,k+=='o' && game*g+2,k+=='o')
{
Console.WriteLine("\t \t O Wins ");
winner = player1;
break;
}
else if(game*0,0+=='o' && game*1,1+=='o'
&& game*2,2+=='o')
{
Console.WriteLine("\t \t O Wins ");
winner = player1;
break;
}
else if(game*2,0+=='o' && game*1,1+=='o'
ٕٔٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
&& game*0,2+=='o')
{
Console.WriteLine("\t \t O Wins ");
winner = player1;
break;
}
}
if (winner == player1 || winner == player2)
break;
}
if (winner == player1 || winner == player2)
break;
}
if (winner == player1 || winner == player2)
break;
}
if (winner != player1 && winner != player2)
Console.WriteLine("\t \t Draw ");
Console.WriteLine(); Console.WriteLine();
ٕٔ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
;)"Console.Write("o
;break
case empty:
;)" "(Console.Write
;break
}
)if (j < 2
;)" | "(Console.Write
}
)if (i < 2
{
;) (Console.WriteLine
;)"Console.WriteLine("------
}
}
;) (Console.WriteLine
}
}
}
ٌُمكن تنفٌذ اللعبة بشكل أبسط من هذا لكن لم نتطرق لهذه األجزاء إلى اآلن لذا فهذا كان مجرد
تطبٌك على المصفوفات فكل ما ٌهمنا هو إتمانها أكثر ومعرفة كٌفٌة عملها.
ٕٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
النصوص
( ) Strings
وٌُمكنن أن تضٌؾ أي لٌمة من النوع stringأو charعلى لٌمة المتؽٌر الذي ٌكون
من النوع string
;string name1 = "mahmoud" , name2="soliman", name3
;name3 = name1 + name2
أو ٌمكننا أن نضٌؾ النص أو الحرؾ الجدٌد على المدٌم بطرٌمة مباشرة.
ٕٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
;"string name ="Mahmoud
;"name +=" Soliman
;) Console.WriteLine( name
الناتج :
Mahmoud Soliman
وٌُمكنن أن تؤخذ المٌم من المستخدم بالطرٌمة العادٌة.
أول حرؾ فً النص ٌؤخذ الترلٌم ( 0 ) indexكما فً المصفوفة ألنه كما للت هو
عبارة عن مصفوفة من الحروؾ.
مثال :
;"string x = "Hello
eo
-لمعرفة عدد حروؾ نص معٌن نستخدم الخاصٌة ( .) Length
;) Console.WriteLine( x.Length
الناتج :
5
ٕٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
أبحث عن الحرؾ mفً نص ٌُدخله المستخدم.
) (static void Main
{
;) (string search = Console.ReadLine
;bool check = false
)for (int i = 0; i < search.Length; i++
{
) 'if ( search[ i ] == 'm
;check = true
}
)if (check == true
;)" Console.WriteLine("exist
else
;)"Console.WriteLine("not exist
}
فً هذا الكود عرفنا متؽٌر نوعه stringثم أخذنا لٌمته من المستخدم ،وعرفنا متؽٌر
نوعه ٌ boolؤخذ المٌمة trueأو flaseولد مررت له لٌمة إبتدائٌة falseأي أن
الحرؾ الذي نبحث عنه ؼٌر موجود إال أن نجده ،ثم أنشؤنا حلمة بإستخدام forوعداد
ٌبدأ من المٌمة صفر إلى ألل من المٌمة search.Lengthوالتً تُمثل حجم النص أو
عدد حروفه .من الممكن أن تسؤل نفسن لماذا ال نكتب عدد حروؾ النص بشكل
مباشر؟! ببساطة ألنه فً بعض البرامج ال نعرؾ عدد حروؾ النص ألنها تؤتً من
ال ُمستخدم فال ٌُمكن التولع بحجم النص ،وٌُفض ّل دائما إستخدام هذه الخاصٌة فً حالة
المصفوفات.
وبداخل الحلمة forنستخدم شرط أنه إذا ُو ِج َد الحرؾ الذي نبحث عنه نجعل لٌمة
المتؽٌر check = true
ولو لم ٌجده فتظل لٌمته بـ falseكما كانت وهذه فائدة أن تمرر لٌمة إبتدائٌة بـ .false
ٕٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
وبعد أن تنتهً الحلمة نستخدم شرط آخر لنتؤكد هل تؽٌرت لٌمة checkأي هل الحرؾ
الذي نبحث عنه موجود أم ال.
مثال :
استمبل نص من المستخدم ثم أعكس هذا النص.
Hello ------> olleH
) (static void Main
{
;) (string str = Console.ReadLine
; ;string str2 = string.Empty
;] char[ ] x = new char[ str.Length
)for (int i = 0; i < str.Length; i++
{
;] x[ i ] = str[ str.Length - 1 - i
;str2 += x* i +
}
;) Console.WriteLine( str2
}
أخذنا المٌمة من المستخدم ثم أنشؤنا مصفوفة نوعها charأي من النوع حرؾ وٌكون
حجمها نفس حجم النص ولذلن أستخدمنا الخاصٌة str.Lengthلكً ترجع لنا حجم
النص ،ثم أنشؤنا حلمة وجعلنا كل حرؾ من نهاٌة النص ٌُخزَ ن فً بداٌة المصفوفة.
وأنشؤنا متؽٌر آخر نوعه stringلكً نُعٌد فٌه تخزٌن الحروؾ التً تؤتً من
المصفوفة.
مالحظة :
string.emptyهذه لتفرٌػ المتؽٌر من أي لٌم موجودة بهذا المكان ُمسبما.
ٖٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
النص
المصفوفة x
o
أو ٌمكننا اإلستؽناء عن المصفوفة التً من النوع charلكنً تعمدّتُ كتابتها بهذه
الطرٌمة لتعرؾ طرٌمة التعامل مع النص والمصفوفة التً من النوع charوأنهما
متماثالن.
) (static void Main
{
;) (string str = Console.ReadLine
; ;string str2 = string.Empty
)for (int i = 0; i < str.Length; i++
;] str2 += str* str.Length - 1 - i
;) Console.WriteLine( str2
}
تمارٌن :
أمامن مصفوفة مكونة من * 1, 4, 5, 8, 8, 9, 9, 0 +أطبع أكبر عدد مكون من رلمٌن
متجاورٌن.
فً هذا المثال ٌكون الناتج 99
) (static void Main
{
;int* + arr = , 1, 4, 5, 8, 8, 9, 9, 0 -
;int max = arr*0+
ٖٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
عرفنا
عرفنا المتؽٌر maxنوعه intلكً ٌحمل أكبر لٌمة موجودة ،ثم ّ فً هذا الكود ّ
المتؽٌر resونوعه stringلكً ٌحمل كل عنصرٌن متجاورٌن ألننا سنضطر إلى دمج
كل عنصرٌن متجاورٌن وال ٌمكن الدمج إال فً النصوص لذا سنستمبل كل متؽٌر والذي
ٌلٌه ثم سنحولهم إلى نصوص من خالل الدالة ) ( ToStringوبذلن ٌتحول الرلمٌن إلى
نص ثم ندمجهم ونخزنهم فً المتؽٌر ،resبعد ذلن نُح ِو ّل النص المكون من الرلمٌن
المدمجٌن إلى أعداد صحٌحة مرة أخرى لكً نستطٌع ممارنتهم بؤالعداد األخرى ،ألنه
ال ٌمكن ممارنة نص بعدد صحٌح.
توجد الكثٌر من الخصائص والدوال الجاهزة الخاصة بالنصوص.
ٕٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Console.WriteLine(x.ToLower());
c# is a programming language
Console.WriteLine( x.Substring( 6 , 13 ) );
.فً هذه الدالة نحدد بداٌة ونهاٌة الممطع الذي نرٌده من النص
a programming
.أو ٌمكننا تحدٌد البداٌة فمط وتكون نمطة النهاٌة هً نهاٌة النص
Console.WriteLine( x.Substring( 6 ) );
a programming language
Console.WriteLine(x.Replace("pro","PRO"));
C# is a PROgramming language
ٖٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
أكتب برنامج ٌح ِول النص إلى النظام الثنائً ( .) Binary System
;using System
namespace Test
{
class Program
{
) (static void Main
{
;"string str = "Mahmoud soliman
; string result
;int bin = 0
;) Console.WriteLine( str فً هذه العملٌة المتؽٌر bin
)for (int i = 0; i < str.Length; i++ ٌؤخذ المٌمة العددٌة للحرؾ
{ المحدد من النص.
;result = string.Empty
;] bin = str[ i
;)" >Console.Write(str[ i ] + " = " + bin + " ---
) while ( bin != 0
{
;result = ( bin % 2 ).ToString( ) + result
;bin /= 2
}
;)" " Console.WriteLine(result +
}
} عملٌة تحوٌل الرلم إلى النظام
} الثنائً من خالل أخذ بالي
} المسمة له على 2ثم لسمته على
2
كل حرؾ ٌكون له لٌمة عددٌة صحٌحة مناظرة له كما ذكرت فً ممدمة الكتاب والنص هو
عبارة عن مجموعة من الحروؾ حتى المسافة الفارؼة تُعد حرفا فإننا نؤخذ المٌمة العددٌة لكل
حرؾ ونحولها إلى النظام الثنائً ونطبع لٌمة أول حرؾ بالنظام الثنائً ثم نفرغ المتؽٌر الذي
نجمع فٌه المٌم التً تكون بالنظام الثنائً لٌكون ُمهٌَّؤ إلستمبال لٌمة الحرؾ الذي ٌلٌه.
ٖٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
البرمجة كائنٌة التوجه هً عبارة عن طرٌمة لكتابة الكود لكنها جعلت الكود أسهل
وأختصرت فٌه كثٌرا ووفرت من الولت والمجهود بشكل كبٌر جدا فهً تتعامل مع كل
شًء على أنه كائن وهذا الكائن له صفات ووظائؾ فمثال اإلنسان هو كائن له صفات
تمٌزه ووظائؾ ٌموم بها.
الطول ) : لون العٌن : فمثال من صفاته ( لون البشرة :
وهكذا....
إذا فكل كائن من نفس النوع ٌمتلن نفس اسم الصفات واألفعال لكن بتفاصٌل مختلفة ،أي
تختلؾ بٌانات هذه الصفات واألفعال ألن لكل كائن صفاته وأفعاله الخاصة به.
فالبرمجة كائنٌة التوجه لامت على هذا األساس ،فمثال إذا كنت ترٌد إنشاء حساب على
مولع الفٌس بون ،عند إدخال بٌاناتن هل ٌكتب لن مصمم المولع كود برمجً خاص
بصفحتن عند إنشائن لحساب على المولع؟ بالطبع ال ،عندما تنشًء حسابا لن فإنن
تؤخد نسخة من المولع األصلً لكن البٌانات مجردة أي بدون بٌانات وتمألها أنت
ببٌاناتن الخاصة،
ٖ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً ذلن الولت أنت أخذت كائن ( نسخة ) من المولع وأدخلت فٌه بٌاناتن أنت ،وشكل
المولع ووظائفه متشابهه تماما عند كل الناس والبٌانات المجردة أٌضا متشابهه عند كل
الناس فمثال هو ٌطلب منن تحدٌد الجنس والعمر وهكذا وأنت تدخل بٌاناتن ،هذه هً
البٌانات المجردة أي أنها ال تزال ال تحتوي على لٌم ،وأي شخص جدٌد ٌرٌد إنشاء
حساب فإنه سٌؤخذ نفس النسخة من المولع وٌمألها ببٌاناته الخاصة.
وهذه هً الطرٌمة التً بنٌت علٌها لؽة السً شارب كما لولنا فً ممدمة الكتاب.
إذا أٌن ٌكتب الكود الذي ٌؤخذ منه الكائن نسخة من البٌانات التً بداخله؟
وتكمن لوة الـ classفً عملٌة تسمى عملٌة تؽلٌؾ البٌانات ،أي ٌحدد من ٌستطٌع
الوصول إلى البٌانات والتعامل معها.
وسنتحدث عن كل شًء ٌخص البرمجة كائنٌة التوجه والـ .classلكن أوال سنتحدث
عن طرق الوصول للبٌانات أو التؽلٌؾ.
ٖٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
التغليف
( ) Encapsulation
توجد ٘ أنواع لتؽلٌؾ البٌانات فً لؽة السً شارب ،أو تسمى طرق الوصول للبٌانات.
فً هذه الحالة نحتاج إلى حماٌة بعض البٌانات التً تكون بداخل الـ classمثال من
ٌستطٌع رإٌتها والتعامل معها بداخل المشروع ،فمن الممكن أن تكون بعض البٌانات لـ
classمرئٌة فً classآخر وبعض البٌانات ؼٌر مرئٌة وال ٌمكن التعامل معها إال
بداخل الـ classالذي ُكتِ ْ
بت بداخله فمط ،المبرمج ٌحدد من ٌستطٌع رإٌة البٌانات بداخل
المشروع سواء classفً نفس الـ namespaceأو classفً namespaceأخرى
بداخل المشروع.
ٖٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
public - 1
البٌانات التً تكون من هذا النوع فإنها ستكون مرئٌة فً كل المشروع وٌستطٌع أي
classداخل namespaceأو أي namespaceأخرى رإٌتها والتعامل معها.
مثال :
;using System
namespace First_program
{
class Program
{
) (static void Main
{
;) (Program2 pro = new Program2
;pro.x = 10
}
}
class Program2
{
;public int x
}
}
ٖٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
كل ما علٌن معرفته فً هذا الكود أننا استطعنا إسناد لٌمة للمتؽٌر Xفً الـ class
اآلخر ،Programوأستطعنا رإٌته والتعامل معه .وٌتم الوصول إلى محتوى الـ class
من خالل كائن أو نسخة () objectمن هذا الـ classثم النمطة ()dot( ).
private – 2
هذا النوع ٌجعل إستخدام البٌانات التً من نفس نوعه تمتصر على الـ classالمكتوبة
ٌحرم إستخدام البٌانات التً من نوعه إلى أي classآخر حتى لوبداخله فمط ،أي أنه ّ
classفً نفس ال namespaceوٌمكننا التعامل مع البٌانات التً من هذا النوع بداخل
الـ classالذي ُكتبت به فمط ،ولو حاولنا تنفٌذ الكود السابك على النوع privateفإن
المترجم سٌخرج لن خطؤ أنه ال ٌمكن الوصول لهذا المتؽٌر بسبب الحماٌة التً ٌمتلكها.
ٖٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
protected – 3
وهذا النوع معناه أنه ال ٌمكننا رإٌة البٌانات وال التعامل معها فً أي classآخر إال إذا
ث الـ classالذي ُكتِ ْ
بت بداخله البٌانات التً من هذا النوع .وسنفهم مفهوم الوراثة ُو ِر َ
الحما.
;using System
namespace First_program
{
class Program : Prog
{
) (static void Main
{
; ) (Program p = new Program
; p.x = 10
}
}
class Prog
{
; protected int x
}
}
النمطتان تعنً أن الـ " Program " classلد ورث الـ " prog " classوٌمكنه
التعامل مع البٌانات التً بداخله كؤنها ُكتِبت بداخله لكن لٌس كل البٌانات ،فمط المسموح
به ،مثل publicو ،protectedإلى اآلن ،وعندما نصل إلى الوراثة سنفهم كل شًء
عنها.
ٓٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٔٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
internal – 4
وهً تعنً أننا نستطٌع رإٌة البٌانات التً من هذا النوع فً كل الـ assemply
للبرنامج
نستطٌع رإٌة البٌانات والتعامل معها فً كل الـ assemplyلكن ٌجب أن ٌكون الـ
classالذي ُكتِبَت بداخله موروث للـ classالذي سنستخدمها فٌه.
ٕٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Static
المتؽٌرات والدوال التً بداخل الـ classوٌكون نوعها staticتكون ثابتة أي أنه ال
ٌمكن التعامل معها إال من خالل اسم الـ classنفسه.
نستخدم staticعندما نرٌد التعامل مع الدالة أو الحمل خارج الـ classبدون الحاجة
إلى أخذ نسخة منه ( ) objectفمثال الدالة ) ( WriteLineهً دالة staticداخل
Consoleوالـ Consoleهو الـ classالخاص بدوال اإلدخال واإلخراج .فعند
إستدعاء هذه الدوال نستخدم اسم الـ classمباشرة بدون أن نؤخذ منه نسخة.
والدالة الرئٌسٌة ٌجب أن تكون من النوع ،staticوأي دالة نرٌد إستدعائها مباشرة فً
دالة من النوع ٌ staticجب أن تكون .staticبإختصار أي نوع staticال نستطٌع
التعامل معه مباشرة إال من خالل نوع staticآخر ،لكن ٌمكن التعامل مع المتؽٌرات
التً من نوع staticمن خالل الدوال ،حتى لو لم تكن الدالة staticلكن العكس خطؤ،
أي أننا ال نستطٌع إستخدام متؽٌر لٌس staticمع دالة نوعها .static
مثال :
;using System
namespace First_program
{
class Program
{
;int x
) (static void Main
{
;x = 10
ٖٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
using System;
namespace First_program
{
class Program
{
static int x;
static void Main( )
{
x = 10;
}
}
}
static فً هذه الحالة ٌجوز إسناد لٌمة للمتؽٌر والتعامل معه بشكل طبٌعً ألن نوعه
.static والدالة نوعها
using System;
namespace First_program
{
class Program
{
static int x;
void name( )
{
x = 4;
ٔٗٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
// من خالل الدالة فً الحالة العادٌةstatic ٌجوز إسناد لٌمة للمتؽٌر الذي من النوع
}
static void Main( )
{
}
}
}
: ٕ مثال
using System;
namespace First_program
{
class A
{
public static int x ;
}
class B
{
public static void variables()
A.x = 5 ;
}
}
}
ٔٗ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
الدوال
( ) Methods or Functions
تحدثنا فً ممدمة الكتاب عن الدوال أو الوظائؾ وما عملها ،لبل وجود فكرة الدوال كنا
إذا أردنا إستخدام جزء معٌن من الكود الذي كتبناه مرة أخرى فكان ٌجب كتابته ثانٌة
كلما أحتجنا إلٌه ،فكان ٌؤخد ولت ومجهود ،فلما ال نكتب جزء معٌن من الكود مرة
واحدة ونستخدمه متى أحتجنا إلٌه؟!
نكتب الكود الذي نرٌد إستخدامه أكثر من مرة ،أي كود نرٌد تنفٌذه .والدوال تُستخدم
ت فكرة الدوال لبل وجود البرمجة إلعطاء لٌم لخواص الـ classوالتعامل معهاُ .و ِج َد ْ
كائنٌة التوجه ،والدوال عامل رئٌسً فً البرمجة فال ٌمكن اإلستؽناء عنها.
ب بداخلها ،ما عدا نوع واحد من الدوال ( ) voidالأي دالة ٌكون لها لٌمة عائدة ِلما ُك ِت َ
ٌعٌد لٌمة ،معنى لٌمة عائدة أن الدالة كلها ٌكون لها لٌمة واحدة ٌمكن إستخدامها
وإدخالها فً عملٌات أخرى ،سنفهم معنى المٌم العائدة بمثال .أوال سنعرؾ طرٌمة
تعرٌؾ الدالة.
{
}
ٔٗٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
}
طرٌمة الوصول تعنً صالحٌات إستخدام الدالة ،أٌن نستخدمها ومن ٌستطٌع
إستخدامها.
توجد طرق لكتابة أسماء أعضاء الـ classسواء كان متؽٌر أو دالة ،هً مجرد طرق
متعارؾ علٌهاٌ ،مكننا التؽاضً عن هذه الطرق وكتابتها بالشكل الذي نرٌد ،لكن ٌُفضل
كتابتها بهذه الطرق.
ٌكون أول حرؾ من االسم حرؾ كبٌر ( ) Capitalوإذا كانت الكلمة مكونة من
ممطعٌن فٌكون أول حرؾ من الممطع األول كبٌر وأول حرؾ من الممطع الثانً كبٌر
مثل :
UserName
أو User_Name
ٔٗ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
وفً هذه الحالة ٌكون أول حرؾ من الممطع األول صؽٌر و أول حرؾ من الممطع
الثانً كبٌر مثل :
userName
passWord
وهكذا...
UpperCase – 3
هذه الحالة تكون كل حروؾ االسم كبٌرة وتستخدم مع االسماء التً تمتلن حروؾ للٌلة
مثل حرفٌن أو ثالث ومع الثوابت.
مثال :
;int GPA
وهكذا ...
ٌجب أن ٌكون اسم الدالة متصل وال تفصله مسافة فمثال ال نستطٌع تسمٌة دالة أو متؽٌر
بهذا الشكل user name
النه توجد مسافة تفصل االسم وهذا ال ٌجوز ،وفً حالة األسماء التً تتكون من أكثر
من ممطع مثل ... First Nameنستخدم ( _ ) فتكون .First_Name
ٔٗ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
هذه األنواع تعنً أن نوع الدالة ٌكون من نفس نوع المٌمة العائدة منها فمثال إذا كانت
الدالة intإذا ٌجب أن تعٌد لٌمة صحٌحة ولو كانت ٌ stringجب أن تعٌد نص أو
كلمةٌ float ،جب أن تعٌد لٌمة كسرٌة bool .تعٌد trueأو falseوهكذا...
سنفهم معنى المٌمة العائدة للدالة لكن مإلتا حاول أن تتعلم كٌفٌة بناء هٌكل الدالة وماذا
ٌُكت َب بداخلها وكٌؾ تُست َخ َدم.
بعد كتابة الدالة واإلنتهاء منها كٌؾ نستخدمها وكم مرة نستخدمها؟
عن طرٌك إستدعاءها بإسمها فمط ونستدعٌها بعدد المرات التً نرٌد ،نستطٌع
إستدعاءها وإستخدامها مالٌٌن المرات بدون إعادة كتابة الكود المكتوب بداخلها.
اتفمنا أن الدالة ٌكون لها لٌمة واحدة عائدة ما عدا نوع واحد فما هو؟
هذا النوع هو voidأي ال ترجع أي شًء وال ٌكون لها لٌمة نستطٌع إستخدامها فً
عملٌات أخرى ،أي عندما ننتهً من تنفٌذ الدالة ال نرٌد منها أي شًء آخر.
مالحظة :
سنستخدم الـ classالرئٌسً وسنكتب بداخله الدوال التً نرٌدها .سنُ َ
طبِ ّك علٌه "مإلتا".
وٌكون بداخله الدالة الرئٌسٌة التً ٌبدأ تنفٌذ الكود منهاٌ .مكننا كتابة الدالة الجدٌدة فوق
الدالة الرئٌسٌة ( ) Mainأو تحتها ،ال ٌوجد فرق.
ٔٗ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
}
هذا هو الشكل الذي سنعمل علٌه .
مثال:
لبل البدء فً كتابة الكود ٌجب أن نحلل السإال أوال ،بعدها نكتب الخوارزمٌات لهذه
المسؤلة " الخوارزمٌات أي نحدد خطوات الحل خطوة بخطوة ونحل المسؤلة بطرٌمة
جبرٌة " ،إذا سرنا على هذا النمط فلن نواجه أي صعوبة فً كتابة أي كود.
نرٌد إنشاء دالة تطبع Hello Worldهل نحتاج لٌمة لهذه الدالة فٌما بعد؟ هل سنجري
علٌها أي عملٌة؟ جمع أو طرح أو لسمة أو سنؤخذ لٌمتها ندخلها فً دالة أو متؽٌر آخر؟
إذا كان الجواب ال ...فلن نحتاج أن ٌكون لها لٌمة عائدة وستكون نوع الدالة .void
ونسمٌها باالسم الذي نرٌد لكن ٌفضل أن ٌكون اسم معبر عن الوظٌفة التً تموم بها
الدالة ،مثال إذا كانت دالة طباعة ..نسمٌها مثال printأو showأو viewأي اسم
نرٌده فلن ٌحدث هذا فارق فً أي شًء.
مالحظة :
طرٌمة الوصول لن تصنع فارق هنا ،ألننا لن نستخدم الدالة فً classخارجً إنما
سنستخدمها بداخل الـ classالمكتوبة بداخله فلن ٌفرق ما إذا كانت publicأو
privateأو protectedالكل سٌان فً هذا الولت .اتفمنا أن هذا لمجرد التطبٌك
مإلتا فمط وبعدما ننتهً من تعلم كتابة الدوال والتعامل معها سنتعلم كٌؾ نستخدمها فً
أكثر من classآخر.
ٓ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
;using System
namespace ConsoleApplication1
{
class Program
{
)(public void print
{
; )"Console.WriteLine("Hello World
}
}
}
عندما تفتح visual studioفؤنت تجد classمكتوب والدالة الرئٌسٌة التً ٌبدأ تنفٌذ
الكود منها مكتوبة بداخله.
فنستدعً الدالة التً أنشؤناها بواسطة كتابة اسمها فً الدالة الرئٌسٌة وبما أن الدالة
الرئٌسٌة نوعها staticفٌجب أن تكون الدالة التً سنكتبها نوعها staticأٌضا حتى
تستطٌع الدالة الرئٌسٌة رإٌتهاٌ ،مكننا إستدعائها بطرٌمة أخرى عن طرٌك إنشاء كائن
من هذا الـ classلكن عندما نصل إلى شرح الـ classوكٌفٌة التعامل معه وطرٌمة
إنشاءه سنتعلم كل شًء ٌخص الدوال وكل طرق التعامل معها بداخل الـ .class
حالٌا أي دالة نوعها ٌ staticجب أن ٌكون ما سنستدعٌه بداخلها سواء دالة أخرى أو
متؽٌر من نفس نوعها ..أي .static
} { The code
ٔ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
;using System
namespace ConsoleApplication1
{
class Program
{
)(public static void print
{
;)"Console.WriteLine("Hello World
}
) (static void Main
{
; ) ( print
}
}
}
عند كتابة اسم الدالة ونُش ِؽل البرنامج سٌذهب إلى المكان الذي كتبنا فٌه كود الدالة وٌتم
تنفٌذ ما بداخلها.
فً عملٌة إنشاء الدالة إذا كنا سنستخدم متؽٌرات فً هذه الدالة فٌمكن أن نمرر هذه
المتؽٌرات للدالة أثناء التعرٌؾ وتسمى فً هذا الولت ( )Parametersال ٌوجد حد
معٌن لعدد مدخالت دالة " " parametersفمط ما سنستخدمه وما نحتاج إلٌه ،وهذه
المدخالت عند إستدعاء الدالة سنضطر إلى تمرٌرلٌمها إلى الدالة حتى تحدث العملٌة
التً نرٌدها من الدالة ،وإعطاء ُمد َخل للدالة هو أمر إختٌاري لكن هنان بعض الدوال
ضل تمرٌر ُمدخالت لها إلجراء عملٌات علٌها وتمٌٌز كل دالة عن األخرى. ٌُف َ
فمثال عند تسجٌل الدخول لحساب فٌس بون فإنن تدخل البرٌد االلكترونً وكلمة
المرور ،فهذه البٌانات التً تدخلها تكون ُمدخل لدالة تفحص كلمة المرور والبرٌد
االلكترونً الخاصٌن بن ال ُمسجلٌن على لواعد البٌانات.
ٕ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( parameter1,parameter2,…… )
: مثال
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Print_Sum( int num1 , int num2 )
{
int sum = num1 + num2 ;
Console.WriteLine( sum ) ;
}
static void Main( )
{
int number1 , number2 ;
number1 = int.Parse(Console.ReadLine() ) ;
number2 = int.Parse(Console.ReadLine() ) ;
print( number1 , number2 ) ;
}
}
}
ٖٔ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً هذا الكود أنشؤنا الدالة وأنشؤنا لها ُمدخلٌن وتمت عملٌة الجمع بداخل الدالة ،ثم
أستدعٌنا دالة جمع الرلمٌن فً الدالة الرئٌسٌة ،لكن الدالة التً أنشؤناها تؤخذ ُمدخلٌن لذا
سنضطر إلى تعرٌؾ متؽٌرٌن وتمرٌرهما إلٌها ولد أخذنا لٌم المتؽٌرات من المستخدم،
عند تشؽٌل البرنامج وعندما ٌصل المترجم إلى السطر الذي استدعٌنا به الدالة ٌذهب
إلى هذه الدالة أٌا كان مولعها فً الكود وٌنفذ ما بداخلها.
الدالة التً من النوع voidال نستطٌع عمل أي عملٌات علٌها فال ٌمكن أن ندخلها فً
أي عملٌة أخرى وال نستطٌع إجراء عملٌة طباعة علٌها بإستخدام دالة
) (Console.WriteLine
ال نستطٌع تمرٌرها إلى متؽٌر أو فعل أي شًء فٌها ألنها لٌس لها لٌمة عائدة.
ماذا إذا أردنا أن نستخدم لٌمة ناتج الجمع ونسندها إلى متؽٌر آخر؟
إذا سٌكون نوع المٌمة العائدة من هذه الدالة intفٌكون نوع الدالة .int
وٌجب فً هذه الحالة أن نستخدم الكلمة المحجوزة فً اللؽة returnفً نهاٌة الكود
نكتب المٌمة العائدة من هذه الدالة ،وكل دالة ٌكون لها لٌمة واحدة فمط عائدة.
مثال :
;using System
namespace ConsoleApplication1
{
ٗ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
class Program
{
) public static int Print_Sum( int num1 , int num2
{
; int sum = num1 + num2
; return sum
}
) (static void Main
{
; int number1,number2
; )) (number1 = int.Parse(Console.ReadLine
; )) (number2 = int.Parse(Console.ReadLine
; int temp = print( number1 , number2 ) + 100
; ) Console.WriteLine( temp
}
}
}
فً هذا الكود أنشؤنا الدالة وأصبح نوعها intأي المٌمة العائدة منها intالدالة كاملة فً
ذلن الولت هً عبارة عن لٌمة واحدة ٌمكن أن نفعل بها أي شًء ،وأستدعٌناها فً
الدالة الرئٌسٌة ومررنا لها ال ُمدخالت التً عرفناها وأخذنا لٌمهم من المستخدم ،بعد ذلن
مررنا الدالة كاملة إلى متؽٌر ،إذا هذا المتؽٌر حالٌا ٌحمل لٌمة الدالة .ثم أضفنا إلى لٌمة
الدالة ٓٓٔ ،فمثال إذا أدخل المستخدم ٕٓ وٖٓ سٌكون ناتج الدالة ٓ٘ وسٌضٌؾ علٌها
ٓٓٔ ثم سٌضع المٌمة الجدٌدة فً المتؽٌر .temp
ماذا لو كانت العملٌة التً ستتم فً الدالة هً لسمة ولٌست جمع إذا فٌوجد إحتمال أن
ٌكون ناتج المسمة عدد كسري ،فٌجب أن نؽٌر نوع الدالة لنفس نوع المٌمة العائدة منها.
أي ٌكون نوعها floatأو .double
٘٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مالحظة
" أما إثناء إستدعاء الدالة وتمرٌرParameters " ُمدخالت الدالة أثناء اإلنشاء تسمى
." Arguments " لٌم لها فتُسمى ال ُمدخالت
: مثال
using System;
namespace ConsoleApplication1
{
class Program
{
public static int Max_Value( int num1 , int num2 )
{
if ( num1 > num2 )
return num1;
else if ( num2 > num1 )
return num2 ;
else
return 0 ;
}
static void Main( )
{
int number1 , number2;
number1 = int.Parse(Console.ReadLine( ));
number2 = int.Parse(Console.ReadLine( ));
Console.WriteLine(Max_Value( number1 , number2 ) ;
ٔ٘ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
}
: تمارٌن
2ٔ = ٗ األساس ٖ واألس
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Power( int Base_num , int power_num )
{
int result = 1;
for ( int i = power_num ; i > 0 ; i-- )
{
result *= Base_num ;
}
Console.WriteLine( result );
}
static void Main( )
{
int Base = int.Parse(Console.ReadLine( ) );
int Power = int.Parse(Console.ReadLine( ) );
ٔ٘7
Introduction to C# مقدمح نهثزمجح تانسً شارب
الناتج :
64
; ) Math.Pow ( 2 , 6
سٌخرج لن نفس النتٌجة لكن ٌجب أن تعتمد على نفسن فً مرحلة التعلم وتتعلم كٌؾ
تنشئ دوال بنفسن .
تمارٌن :
أكتب دالة تؤخذ رلم من المستخدم وتعٌد الجذر التربٌعً لهذا الرلم إن ُوجد.
;using System
namespace ConsoleApplication1
{
class Program
{
) public static void SQRT( int num
{
ٔ٘2
Introduction to C# مقدمح نهثزمجح تانسً شارب
: تمارٌن
أكتب دالة تؤخذ من المستخدم مصفوفة ورلم معٌن ثم ترجع عدد مرات تكرار هذا الرلم
.فً تلن المصفوفة
using System;
namespace ConsoleApplication1
{
class Program
{
public static int count_item( int [ ]arr, int num )
{
ٔ٘9
Introduction to C# مقدمح نهثزمجح تانسً شارب
int count = 0;
for ( int i = 0 ; i < arr.Length ; i++ )
{
if ( num == arr [ i ] )
{
count++;
}
}
return count;
}
static void Main( )
{
int [ ] x = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 1 , 4 , 7 , 9 , 4 , 5 }
}
}
: تمارٌن
تؤخذ المٌمة األولى والعملٌة التً تتم سواء ضرب أو،أكتب دالة لتنفٌذ العملٌات الحسابٌة
جمع أو لسمة ثم تؤخذ المٌمة الثانٌة وتعٌد ناتج العملٌة التً ستتم وتحدد من لِبل
.ال ُمستخدم
using System;
namespace ConsoleApplication1
{
class Program
ٔٙٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
static float Math_Operation(float operand1, char operation,
float operand2)
{
ٔٙٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
)static void sum(int a,int b,int c
{
;)Console.WriteLine(a + b + c
}
) (static void Main
{
;)sum(a(7, b(3, c(5, d(2,4) ) ) ), 5, 2
}
}
}
الناتج ٔٗ :
فً هذا الكود أنشؤنا ٘ دوال ،كل دالة لها وظٌفة مختلفة عن األخرى ،فالدالة " "aتؤخذ
لٌمتٌن ثم تعٌد المٌمة األكبر فٌهما والدالة " "bتؤخذ لٌمتٌن ثم تعٌد ناتج جمعهما ،والدالة
" "cتؤخذ لٌمتٌن وتعٌد ناتج طرحهما والدالة " "dتؤخذ لٌمتٌن وتعٌد ناتج ضربهما،
والدالة " "sumتؤخذ ثالث لٌم وتطبع ناتج جمعهم.
وفً دالة الـ Mainأستدعٌنا الدالة sumوهً تؤخذ ثالث لٌم كما ذكرت ،ثم مررنا لها
الدالة aوبعد ذلن مررنا للدالة aالمٌمة 7والمٌمة األخرى كانت عبارة عن الدالة b
ومررنا للدالة bالمٌمة ٖ والمٌمة األخرى كانت عبارة عن الدالة cومررنا لها المٌمة ٘
والمٌمة األخرى كانت عبارة عن الدالة dومررنا للدالة dالمٌمتٌن ٕ وٗ.
عند تنفٌذ هذا الكود فإن الدوال الداخلٌة هً التً تُنفَذ أوال وبما أن هذه الدوال ذات لٌمة
عائدة فإن كل دالة تُعٌد لٌمة واحدة فمط .وتكون هذه المٌمة هً ال ُمدخل اآلخر للدالة التً
تسبمها .
فً هذا المثال الدالة dتؤخذ المٌمتٌن ٕوٗ ووتعٌد ناتج ضربهما أي 2إذا تكون المٌمتان
اللتان ممرناهما للدالة cهما ٘ و ، 2ثم تعٌد الدالة cناتج طرحهما فتعٌد المٌمة ، ٖ-
وبذلن تكون المٌم الممررة إلى الدالة bهً ٖ و ، ٖ-ثم تعٌد الدالة bناتج جمعهما
فتعٌد المٌمة صفر ،وبذلن تكون المٌم الممررة للدالة aهً صفر و 7وتعٌد الدالة a
المٌمة األكبر فٌهما فتعٌد المٌمة ، 7
وبذلن تكون المٌم التً ُم ِررت للدالة sumهً ( 7 , 5 ,2) :
وتطبع ناتج جمعهم فٌكون ٗٔ
ٖٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ref
عندما نمرر لٌم للدالة فإننا نؤخذ نُسخة من هذه المٌم وٌحدث التؽٌٌر فٌها أما المٌم
.األساسٌة فً ذاكرة الكمبٌوتر لم ٌحدث بها أي تؽٌٌر ولم تتؤثر
فمثال إذا أردنا تنفٌذ عملٌة تبدٌل بٌن لٌمتً متؽٌرٌن عن طرٌك دالة فإنه سٌبدل المٌم
.لكن سٌبدلها فً النُسخة فمط ولٌس فً المتؽٌرات األصلٌة
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Swap( int num1 , int num2 )
{
int temp=num1;
num1=num2;
num2=temp;
}
static void Main( )
{
int number1 = 10 , number2 = 20;
Swap ( number1 , number2 ) ;
Console.WriteLine("number1 = " + number1);
Console.WriteLine("number2 = "+number2);
}
}
}
ٔٙٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: الناتج
number1 = 10;
number2 = 20;
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Swap( ref int num1 ,ref int num2 )
{
int temp = num1;
num1 = num2;
num2 = temp;
}
static void Main( )
{
int number1 = 10 , number2 = 20;
Swap ( ref number1 , ref number2 ) ;
Console.WriteLine("number1 = " + number1);
Console.WriteLine("number2 = "+number2);
}
}
}
ٔٙ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
: الناتج
number1 = 20;
number2 = 10;
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Swap( ref int num1 ,ref int num2 )
{
num1 = 40 ;
num2 = 30 ;
}
static void Main( )
{
int number1=10,number2=20;
Swap ( ref number1 , ref number2 ) ;
Console.WriteLine("number1 = " + number1);
Console.WriteLine("number2 = "+number2);
}
}
}
: الناتج
number1 = 40;
number2 = 30;
ٔٙٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
المٌم الجدٌدة لن تإثر فً المتؽٌرات ألننا مررنا للمتؽٌرات لٌم مرجعٌة فً الدالة والمٌم
.ُوضعت فً المتؽٌرات األصلٌة ال النُسخ
: تمارٌن
using System;
namespace ConsoleApplication1
{
class Program
{
public static int Swap( ref int num1 )
{
num1 = num1*num1 ;
return num1;
}
static void Main( )
{
int number1 = 10;
Swap ( ref number1 ) ;
Console.WriteLine("number1 = " + number1);
}
}
}
: الناتج
number1 = 100
ٔٙ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
out
إذا أنشؤنا دالة تؤخذ ُمدخلٌن ووأردنا إستدعاء هذه الدالة فً دالة أخرى أو أي مكان فً
الكود ،ومررنا متؽٌرات للدالة فً االستدعاء لكننا لم نعطً لٌم لهذه المتؽٌرات ونرٌد
أن نؤتً بالمٌم من الدالة نفسها ،فً الحالة العادٌة هذا ال ٌجوز وٌجب أن نعطً لٌم
للمتؽٌرات التً سنمررها ك ُمدخالت للدالة حتً إذا أدخلنا لهذه المتؽٌرات لٌم بتدائٌة فً
الدالة.
إلستخدام المٌم التً أستخدمناها فً الدالة ٌجب أن نحدد له أنه سٌؤتً بمٌم ل ُمدخالت
الدالة من الدالة نفسها.
ٔٙ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System;
namespace ConsoleApplication1
{
class Program
{
public static void fun_name( out int num1 ,out int num2 )
{
num1 = 200 ;
num2 = 100 ;
}
static void Main( )
{
int number1 , number2;
fun_name( out number1 , out number2 ) ;
Console.WriteLine("number1 = " + number1);
Console.WriteLine("number2 = "+number2);
}
}
}
: الناتج
number1 = 200
number2 = 100
فإنه سٌتجاهلها وٌستخدم المٌم الخارجٌةnumber1 , number2 حتى لو أدخلنا لٌم لـ
.التً تؤتً من الدالة
ٔٙ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
using System;
namespace ConsoleApplication1
{
class Program
{
public static void fun_name( out int num1 ,out int num2 )
{
num1 = 200 ;
num2 = 100 ;
}
static void Main( )
{
int number1 = 60 , number2 = 30 ;
fun_name ( out number1 , out number2 ) ;
Console.WriteLine("number1 = " + number1);
Console.WriteLine("number2 = "+number2);
}
}
}
: الناتج
number1 = 200
number2 = 100
ٔ7ٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
الخط الذي تحت المتؽٌرٌن لحظة إسنادهما للدالة ٌُعنً أنه ٌجب أن نعطً لهما لٌم ولت
تعرٌفهما.
مثال :
ٗ * ٖ * ٕ * ٔ = ٕٗ
ٔٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
using System;
namespace ConsoleApplication1
{
class Program
{
public static void factorial ( int num )
{
int fact=1;
if( num<=0 )
Console.WriteLine( 0 );
else
{
for(int i=1 ; i<=num ; i++)
{
fact *= i ;
}
Console.WriteLine(fact);
}
}
static void Main( )
{
int number = int.Parse( Console.ReadLine( ));
factorial(number) ;
}
}
}
ٔ7ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
params
تستخدم كلمة paramsعندما ال نعلم عدد ُمدخالت ( ) parametersالدالة وعدد
ال ُمدخالت فً هذه الدالة ٌُعبر عن حجم المصفوفة.
مثال :
;using System
namespace ConsoleApplication1
{
class Program
{
) public static int Max_Value_in_array ( params int [ ] arr
{
; int max=arr*0+
)for( int i =0 ; i < arr.Length ; i++
) if ( arr [ i ] > max
;] max = arr[ i
; return max
}
) (static void Main
{
Console.WriteLine ( Max_Value_in_array ( 3 , 4 , 5 , 6 , 7
;) ) , 8 , 1 , 2 , 3 , 4 , 5
}
}
}
الناتج :
2عدد ُمدخالت الدالة ٌكون ؼٌر محدود أي ٌمكننا تمرٌر العدد الذي نرٌده لكن مع كل
ُمدخل نضٌفه ٌزٌد حجم المصفوفة بممدار ٔ ،فمثال حجم المصفوفة فً هذا الكود
سٌكون ٔٔ ،وسٌطبع المٌمة األكبر فً هذه المصفوفة.
ٖٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌوجد نوع من الدوال ٌسمى الدالة العائدة ،أي التً تُستدعى بداخل نفسها
إذا أ ُستدعت دالة بداخل نفسها فإنها تظل تستدعً نفسها إلى أن تولفها بشرط ،لذا فٌجب
تحدٌد شرط لها لكً تتولؾ.
سننفذ نفس برنامج المضروب بها ،بدون إستخدام loop
;using System
namespace ConsoleApplication1
{
class Program
{
) public static int factorial ( int num
{
) if( num<=0
; return 0
لتولؾ الدالة عند هذا الرلم else if ( num==1 ) //
; return 1
else
;))return ( num * factorial(num-1
}
) (static void Main
{
ٗٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٓٔ
ٌجب أن ٌكون نوع الدالة أي نوع ؼٌر voidفال ٌُمكن أن ٌكون ،voidألن طرٌمة
عمل هذا النوع من الدوال هو أنها تستدعً نفسها مرة أخرى بداخل نفسها فإذا كان
نوعها voidفإننا لن نستطٌع عمل أي عملٌة علٌها فنحن هنا نحتاج إلى أن نضرب
الرلم فً لٌمة الدالة ونطرح ٔ من الرلم إلى أن ٌصل الرلم ال ُمدخل إلى ٔ.
فإذا أدخل المستخدم صفر أو لٌمة ألل من الصفر بالسالب فإنها سترجع صفر،
وإذا أدخل رلم ٘ فإنها ستضرب الرلم ؾ لٌمة الدالة نالص ٔ وتستدعً نفسها مرة
أخرى فٌكون الرلم ٗ ثم ٖ ثم ٕ وتتولؾ وتعٌد ناتج ضرب هذه المٌم مع بعضها فتكون
لٌمة الدالة كلها تساوي ٘ * ٗ * ٖ * ٕ أي ٕٓٔ.
مثال :
أحسب مجموع األرلام من رلم ٌدخله المستخدم إلى رلم أكبر ٌحدده المستخدم أٌضا
بدون إستخدام .loop
namespace ConsoleApplication1
٘ٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
class Program
{
public static int sum ( int start , int end)
{
if( start>end ) // لتولؾ الدالة عند هذا الرلم
return 0 ;
else
return ( start + sum(start+1 , end));
}
static void Main( )
{
int start = int.Parse( Console.ReadLine( ));
int end = int.Parse( Console.ReadLine( ));
Console.WriteLine ( sum ( start , end ) ) ;
}
}
}
: مثال
أنشًء دالة تؤخذ مصفوفة ك ُمدخل وتخرج أكبر لٌمة بهذه المصفوفة بدون إستخدام
.حلمات تكرار
using System;
namespace ConsoleApplication19
{
class Program
{
static int max = int.MinValue;
static void fun(int[ ] arr, int low)
ٔ7ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
)if (low < arr.Length
{
)if (arr[low] > max
;]max = arr[low
;)fun(arr, ++low
}
else
;)Console.WriteLine(max
}
)static void Main(string[ ] args
{
;}int[ ] x = {-123,-565,-3555,-293,234,987,265
;)fun(x, 0
}
}
}
الناتج :
987
فً هذا المثال عرفنا متؽٌر ٌسمى maxووضعنا به لٌمة إبتدائٌة وهذه المٌمة تؤتً من
خالل ( ) int.MinValueوتكون هذه المٌمة هً أصؽر لٌمة ٌمكن أن ٌحملها متؽٌر
من النوع ٌُ ،intمكنن وضع لٌمة إبتدائٌة صفر لكن بإفتراض أن األعداد المتواجدة فً
المصفوفة كلها سالبة ففً هذه الحالة لن ٌكون هنان رلم سالب أكبر من الصفر وٌكون
الناتج صفر وهذه النتٌجة خاطئة ،ثم أنشؤنا دالة voidوكان من الممكن أن تكون intثم
تُعٌد لٌمة الـ maxمن خالل كلمة ،returnوهذه الدالة تؤخذ مصفوفة نوعها int
وتؤخذ أٌضا أصؽر indexفً المصفوفة التً سنعمل علٌها ودائما ما ٌكون الصفر،
ونكتب الشرط الذي نرٌد أن تتولؾ الدالة عنده ،متى تتولؾ الدالة ؟! عندما نصل إلى
آخر indexفً المصفوفة أي أن المتؽٌر الذي ٌسمى lowعندما ٌصل إلى آخر
indexفإنها تتولؾ بعد هذه العملٌة .فمثال إذا كان حجم المصفوفة 7فتكون آخر لٌمة
ٔ77
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌصل إلٌها المتؽٌر lowهً ، 6ثم بعد ذلن نتحمك من المٌم الموجودة بالمصفوفة ما إذا
كانت أكبرمن لٌمة الـ maxأم ال ،وأي لٌمة أكبر من المٌمة الحالٌة للـ maxإذا ستكون
لٌمة الـ maxهً هذه المٌمة الجدٌدة ثم نستدعً الدالة داخل نفسها لكن نجعل المتؽٌر
ٌ lowزٌد بممدار 1حتى ٌنتمل إلى الـ indexالذي ٌلٌه وهكذا إلى أن ٌكون الشرط
الخارجً خطؤ وبذلن تتولؾ الدالة عن إستدعاء نفسها وٌتم تنفٌذ ما بداخل elseوتطبع
آخر لٌمة وصل إلٌها المتؽٌر .max
مثال :
أنشًء دالة تؤخذ مصفوفة ك ُمدخل وتخرج أكبر لٌمة بهذه المصفوفة.
;using System
namespace ConsoleApplication1
{
class Program
{
) public static int Max_Value_in_array ( int [ ] arr
{
; int max=arr*0+
)for(int i = 0 ; i < arr.Length ; i++
;)) (arr[i]=int.Parse(Console.ReadLine
)for( int i =0 ; i < arr.Length ; i++
) if ( arr [ i ] > max
;] max = arr[ i
; return max
}
) (static void Main
{
; int * +x=new int*10+
; ) ) Console.WriteLine ( Max_Value_in_array ( x
}
ٔ72
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
ٌمكن للدالة أن تؤخذ مصفوفة وٌتم التعامل معها بطرٌمة عادٌة جداٌ .تم إدخال المصفوفة
كـ ( ُ ) Parameterمدخل للدالة ،فً هذه الحالة نحن ال نعلم حجم المصفوفة لذا توجد
خاصٌة إلٌجاد حجم المصفوفة .Lengthفنستخدمها وحٌنما ننشًء المصفوفة فً دالة
الـ Mainونمررها للدالة ٌجب أن نحدد الحجم وحٌنها هذه الخاصٌة ستحسب حجم
المصفوفة فً الدالة بعدها ت ُ ِمرر اسم المصفوفة التً أنشؤتها فً دالة ال Mainك ُمدخل
مرر اسم المصفوفة فمط. للدالة ،نُ ِ
تمارٌن :
ٔ79
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌوجد ثالثة أنواع من البٌانات ٌمكنهم إستمبال أي بٌانات من أي نوع ،سواء كانت
البٌانات رلم صحٌح أو كسر أو نص أو حرؾ أو أي نوع آخر ،لكن ٌوجد فرق بٌن
الثالثة أنواع.
object
كل أنواع البٌانات هً عبارة عن ( ) objectفٌمكنه أن ٌؤخذ بٌانات من أي نوع.
وهو الـ classالرئٌسً لكل أنواع البٌانات وٌكون فً لاعدة هرم أنواع البٌانات.
لكن ( ) objectال ٌفهم معنى البٌانات التً بداخله ،فال ٌمكنه إجراء أي عملٌة على ما
بداخله مع متؽٌر آخر.
مثال :
ال ٌمكن ألي نوع بٌانات آخر من األنواع المعروفة أن ٌحمل لٌمة متؽٌر من النوع
objectألن نوعه ٌعتبر ؼٌر معلوم ،هو فمط ٌحمل بٌانات بداخله لكن ال ٌعلم نوعها.
فال ٌمكنه التعامل إال مع objectمثله .لكن ماذا لو أردنا تخزٌن المٌمة التً تؤتً من
متؽٌر نوعه ٌ objectجب فً ذلن الولت أن نحولها لنفس النوع الذي ستخزن فٌه،
فمثال لو أردنا تنفٌذ نفس العملٌة السابمة سنضطر إلى تحوٌل الـ xإلى نفس نوع الـ .y
ٓٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
; object x = y
فمثال :
;x = 4
; ) Console.WriteLine( x
الناتج :
4
ٌمكن أن ٌكون المٌمة العائدة من دالة من النوع objectإذا كنا ال نعرؾ النوع الراجع
تحدٌدا.
وٌمكن للم ُدخل أٌضا أن ٌكون من النوع .objectفً حالة أننا ال نعرؾ المٌمة التً
سٌدخلها للدالة هل هً نص أم حرؾ أم رلم.
;using System
namespace ConsoleApplication1
{
class Program
ٔٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
public static object fun ( params object [ ] arr )
{
return arr*3+ ;
}
static void Main( )
{
Console.WriteLine ( fun ( 3 , 4 , "aa" , 's' , true , 8 , 1 , 3.44
, 3 , 4 , 5 ) );
}
}
}
: الناتج
والدالة تعٌد لٌمة، لذا ٌمكنها أن تحتوي على أي نوع بداخلهاobject المصفوفة نوعها
فالمٌمة العائدة منها إذاobject من نفس نوع المصفوفة وبما أن المصفوفة نوعها
. object ستكون من النوع
.أكتب دالة لطباعة هذه المصفوفة التً أدخلنا فٌها البٌانات سابما
using System;
namespace ConsoleApplication1
{
class Program
{
public static void fun ( params object [ ] arr )
{
foreach( object i in arr )
Console.WriteLine ( i ) ;
}
static void Main( )
ٔ2ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
; ) fun ( 3 , 4 , "aa" , 's' , true , 8 , 1 , 3.44 , 3 , 4 , 5
}
}
}
is
هً كلمة محجوزة للتؤكد من نوع البٌانات .
مثال :
; object x =10
; " objext y = " aa
) if ( x is int
{
;)" Console.WriteLine(" Yes
}
فً هذا المثال سٌنفذ جملة الطباعة التً بداخل ifألن الشرط صحٌح.
ٖٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
var
هً مثل objectلكن ٌوجد بعض اإلختالفات بٌنهم.
فمثال عند تعرٌؾ متؽٌر نوعه varال ٌمكن تؽٌٌر المٌمة التً بداخله لنوع آخر.
مثال :
; var x = 3
هو ٌمبل نوع واحد فمط فعندما مررنا له المٌمة ٖ فهو ٌتعامل مع المتؽٌرعلى أنه int
وٌجب أن نمرر له لٌمة أثناء تعرٌؾ المتؽٌر.
فال ٌجوز أن نعرؾ المتؽٌر من النوع varبدون تمرٌر لٌمة له فً مرحلة التعرٌؾ.
خطؤ ; var x
مثال :
; string y = x
وٌمكننا إجراء أي عملٌة علٌه طالما أننا نستخدمه مع متؽٌرات من نفس نوعه.
لكن إذا أدخلناه فً متؽٌر من نوع آخر فٌجب أن نحول نوعه أوال لنفس النوع الجدٌد.
مثال :
; var x = 3.4f
ٗٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
مالحظة :المٌم الكسرٌة ٌكون نوعها تلمائٌا ،doubleإذا أردناها أن تكون floatفإننا
نكتب حرؾ fبجانب المٌمة.
ال ٌستخدم لتعرٌؾ الدوال أو حتى المصفوفات ،فهو ٌستخدم لتعرٌؾ المتؽٌرات فمط
بداخل الدوال.
dynamic
هو عبارة عن نوع بٌانات ٌستطٌع أن ٌخزن أي شئ بداخله وتستطٌع أن تؽٌر لٌمته
ألي نوع ترٌده وأن تدخله فً أي عملٌة ترٌدها .هذا النوع ال ٌتعرؾ على ما بداخله إال
ولت التشؽٌل.
; " dynamic c =" ttt
; " string s = c + " aaa
;c=6
; int n = c-3
;) Console.WriteLine( s +" "+ n
الناتج :
tttaaa 3
حتى إذا ُوجد خطؤ فإنه ال ٌتعرؾ علٌه إال عند التشؽٌل ألنه ٌترجم ما بداخله فً ولت
التشؽٌل فمط.
مثال :
; string y = x
: تمارٌن
أكتب دالة لتسجٌل عملٌة دخول إلى نظام أو مولع له برٌد إلكترونً وكلمة سر
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Login ( string _Email , string _Password )
{
if ( _Email == " Mahmoud@gmail.com " && _Password
==" mahmoud12345 ")
Console.WriteLine(" welcome ");
else
Console.WriteLine( " invalid data ");
}
static void Main( )
{
string E_Mail = Console.ReadLine ( );
string password= Console.ReadLine ( );
Login ( E_Mail , password );
}
}
}
ٔ2ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Classes
ذكرت مسبما نبذة عن البرمجة كائنٌة التوجه وعن ماهٌة الـ classسنتعلم كٌؾ نُنشًء
الـ .class
عندما نُنشًء classفإننا نُنشًء نوع من البٌانات التى نستطٌع أخذ عدد ؼٌر محدود
من النسخ من هذا النوع الواحد ،ولد شرحت مثال لمولع الفٌس بون ،فمثال صفحتن
الشخصٌة تكون عبارة عن classبه كل بٌاناتن الشخصٌة ،وعند تسجٌل الدخول ٌكون
classبه دوال لتنفٌذ عملٌة الدخول ،كل شخص ٌكون له بٌاناته الخاصة أي أن كل
شخص لد أخذ نسخة من هذا الـ classومألها ببٌاناته الخاصة.
إذا كنت ترٌد إنشاء برنامج أو مولع وٌوجد علٌه مستخدمون وكل مستخدم له بٌانات
بؤنواع مختلفة مثل العمر واالسم وتارٌخ المٌالد ،...كٌؾ ستربط كل هذه البٌانات
بمستخدم واحد؟!
ضل أن
نكتب كلمة classثم اسم الـ ٌُ ،classمكن أن نسمٌه بؤي اسم نرٌده ،لكن ٌُف َ
ٌكون اسم ٌُع ِب ّر عما ٌموم به هذا الـ class
class Name
{
}
ٔ27
Introduction to C# مقدمح نهثزمجح تانسً شارب
نكتب بداخله كل الدوال التً نحتاجها لتنفٌذ عملٌة معٌنة ،والمتؽٌرات التً سنستخدمها،
المتؽٌرات التً بداخل الـ classؼالبا ما تكون privateونستخدمها من خالل الدوال،
وٌكون نوع الدالة .publicالطرٌمة ال ُمتعارؾ علٌها أن ٌُكتب أول حرؾ من اسم
الـ classبحرؾ كبٌر ،مثل class Login
مثال :
;using System
namespace ConsoleApplication1
{
class First
{
}
class Program
{
) (static void Main
{
}
}
}
ٔ22
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌمكننا إنشاإه عن طرٌك كتابته مباشرة كما فعلت ،لكن ٌُفضل أن ٌكون كل classفً
صفحة مستملة لكً ٌكون شكل الكود منظم وسهل فً المراءة والتعدٌل.
نذهب إلى اسم المشروع على الفٌجوال ستودٌو ثم نضؽط ضؽطة ٌمٌن بالمإشر فتظهر
لائمة بها كلمة Addونضؽط على classونسمٌه ونضؽط ،enterهكذا نكون لد
أنشؤنا .class
(ٔ)
ٔ29
Introduction to C# مقدمح نهثزمجح تانسً شارب
(ٕ)
لكً نؤخذ نسخة من هذا ال classبكل البٌانات التً بداخله " المسموح الوصول إلٌها
فمط " نكتب اسم الـ classثم اسم المتؽٌر ،لكن فً هذه الحالة ٌسمى كائن ( ) object
ولٌس متؽٌر.
;using System
namespace ConsoleApplication1
{
class First
{
; string name
ٓٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
{
}
}
Class
}
تستخدم الكلمة المحجوزة newلخلك كائن جدٌد ،واسم الـ ٌ classتبعه لوسٌن ٌسمى
ُ " ( constructorمشٌد " ) سنعرؾ ماهو ال ُمشٌد الحما ،كل ما علٌن معرفته مإلتا أن
هذه طرٌمة تعرٌؾ الـ classوأخذ نسخة منه أو إنشاء كائن جدٌد منه.
عندما نُنشًء كائن ( )objectمن classفإنه فً ذلن الولت ٌحتوي على كل خواص
هذا الـ classالمسموح له رإٌتها.
-نستطٌع الوصول إلى كل خصائص الـ classمن خالل "اسم الكائن ()object
متبوعا بنمطة " ( ) .
ٔٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
بعد ذلن عرفَنا الخصائص التً بداخله وإذا أردنا رإٌتها خارج هذاclass أوال أنشؤنا
، كما عرفنا مسبماpublic ٌجب أن ٌكون نوعهاclass الـ
ٔ9ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ثم أخذنا نسخة "كائن" ( )objectمن هذا الـ classومررنا لٌم لهذه البٌانات المجردة.
كما اتفمنا البٌانات التً تكون بداخل الـ classتكون مجردة أي أنها ال تحتوي على
لٌمة.
this
الكلمة المحجوزة thisتستخدم بداخل الـ classوتستطٌع رإٌة كل ما بداخل الـ class
وتعمل كؤنها كائن من هذا الـ classفنستخدمها بداخل الدوال التً بداخل الـ classلكن
ؼٌر مسموح إستخدامها بداخل دوال من النوع staticوال تستطٌع رإٌة المتؽٌرات أو
الحمول التً تكون من النوع .static
ٖٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
; this.Mobile_number = mobile
}
}
class Program
{
) (static void Main
{
;) (Employee emp = new Employee
emp.add_employee ( "ali", 30 , 5000 ,
;)""+201111111111
إلضافة موظؾ آخر //
emp.add_employee ( "john" , 34 , 6000
;)","+201222222222
وهكذا//
}
}
}
أنشؤنا دالة وٌجب أن ٌكون نوعها publicلكً تُرى خارج الـ classولكً نستطٌع
التعامل معها ،وبها ال ُمدخالت التً سنمرر لٌم من خاللها لخصائص الـ classأي
للموظؾ كما فً المثال.
بعدها أنشؤنا كائن من هذا الـ classثم أستدعٌنا الدالة التً تضٌؾ البٌانات ومررنا لها
تعرؾ متؽٌرات فً الدالة
ّ المٌم بشكل مباشرٌ .مكنن أن تؤخذ البٌانات من ال ُمستخدم بؤن
الرئٌسٌة ثم تؤخذ لٌم لها من المستخدم ثم تمرر هذه المتؽٌرات للدالة.
ٗٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
( Constructorال ُمشيد )
هو عبارة عن دالة وٌكون بنفس اسم الـ classلكنه ال ٌرجع أي بٌانات
أي ال ٌكون له لٌمة عائدة " " Return valueمثل intأو Stringوال حتى .void
تعمل هذه الدالة تلمائٌا عندما نؤخذ نسخة من هذا الـ ٌُ classكتب فً هذه الدالة لٌم
إبتدائٌة نرٌد أن نمررها لمتؽٌر ما ومن الممكن أن نمرر له مدخالت أثناء اإلنشاء
كالدالة تماما ،وٌوجد أكثر من نوع للـ .constructor
) (public + Class_Name
{
}
مثال :
class Test
{
; public int id
;public string name
) (public Test
{
;this.id = 1
;"this.name = "ali
٘ٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
class Program
{
static void Main( )
{
Test T = new Test( ); // Default constructor.
Console.WriteLine("My id is "+T.id + "and my name is " +
T.name );
// My id is 1 and my name is ali
}
}
فٌجب تمرٌرclass وهو ٌؤخذ ُمدخالت مثل الدالة تماما وعند أخذ نسخة من هذا الـ
.ُمدخالت له حتى ٌتم تنفٌذه
: مثال
class Employee
{
string Name ;
int Age ;
ٔ9ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
; int Salary
; string Mobile_number
public Employee( ) // default constructor
} {
) public Employee( string name , int age
{ // Parameterized constructors
; Name = name
; Age = age
}
public void add_employee ( string name , int age ,
) int salary,string mobile
{
; this.Name = name
; this.Age = age
; this.Salary = salary
;this.Mobile_number = mobile
}
}
هذا ال ُمشٌد عندما تؤخذ نسخة من الـ classفإنه ٌعمل تلمائٌا وٌطلب منن أثناء تعرٌؾ
الكائن أن تضع لٌم إبتدائٌة للبٌانات التً أدخلتها فً ال ُمشٌد أثناء إنشاإه لكن إذا لم تدخل
له مدخالت فلن ٌطلب منن أي شًء ،وبالطبع هذه المٌم اإلبتدائٌة هً مجرد لٌم مإلتة
ٌمكنن تؽٌٌرها ،فمثال إذا أستدعٌت الدالة التً تُدخل البٌانات فالبٌانات الجدٌدة التً
أدخلتها هً التً ستُخزن ،البٌانات التً بداخل ال ُمشٌد هً مإلتة وتُخزن فمط فً حالة
أنن لم تدخل أي بٌانات أخرى للمتؽٌر.
هكذا ٌكون شكل ال ُمشٌد أثناء إستدعاإه أو أثناء تعرٌؾ كائن جدٌد.
ٔ97
Introduction to C# مقدمح نهثزمجح تانسً شارب
) Copy Constructor ( -ٖ
) كائن آخرObject ( ) كائن إلىObject ( وهذا النوع وظٌفته هً أنه ٌنسخ لٌم من
. ك ُمدخلclass كائن أو نسخة من الـobject وأثناء تعرٌفه ٌؤخذ،class من نفس الـ
: مثال
using System;
namespace Copy_Constructor
{
class Program
{
static void Main(string[ ] args)
{
employee e = new employee(10, "John", 3000);
employee em = new employee( e );
em.print( );
// Employee id : 10 , Employee name : John ,
// Employee salary : 3000
}
}
class employee
{
int id;
string name;
int salary;
public employee(int _id, string _name, int _salary)
{
this.id = _id;
this.name = _name;
this.salary = _salary;
}
ٔ92
Introduction to C# مقدمح نهثزمجح تانسً شارب
( Destructorالهدام )
اله ّدام عكس ال ُمشٌد ،هو أٌضا عبارة عن دالة تعمل تلمائٌا بعد إنتهاء البرنامج ،ووظٌفته
أنه ٌهدم أي كائن لم ٌُست َخ َدم أو كائن أ ُستخ ِد َم لكن لم ٌعد له حاجة أو كائن لم ٌُست َخ َدم،
وهو لٌس كال ُمشٌد تحتاج أن تستدعٌه .هو ٌعمل فور إنتهاء البرنامج دون إستدعاء وال
ٌحتاج إلى ( ،) Access modifierوكل ٌ classكون له destructorواحد فمط.
} { ) ( ~ Class_Name
مثال :
class Employee
{
ٔ99
Introduction to C# مقدمح نهثزمجح تانسً شارب
string Name;
int Age;
int Salary;
string Mobile_number;
public Employee( ) // default constructor
{ }
public Employee( string name , int age )
{
Name = name ;
Age = age ;
}
public void add_employee ( string name , int age , int salary ,
string mobile )
{
this.Name = name ;
this.Age = age ;
this.Salary = salary ;
this.Mobile_number = mobile ;
}
~Employee ( )
{
GC.Collect( ) ;
}
}
ٕٓٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Properties
get , set
الموصالت ( ) Accessors
الحمول التً تكون بداخل الـ classتكون محمٌة ومخفٌة على المستخدم وال ٌستطٌع
الوصول إلٌها ،لكن ماذا لو كنا نرٌد تمرٌر لٌم لهذه الحمول من خارج الـ classبدون
أن نتعامل مع الحمول بشكل مباشر أو بدون دوال؟
فً هذا الولت سنستخدم setو getوهما عبارة عن كلمتٌن محجوزتٌن فً اللؽة حٌث
تُمكنن setمن وضع لٌم لهذه الحمول أي للكتابة فمط ،و getتُمكنن من لراءة البٌانات
التً تكون بداخل الحمل أي تكون للمراءة فمط.
ّ
الموصالت : ٌوجد ثالثة طرق للوصول إلى هذه
Public
Private
Protected
ّ
الموصالت تعامل معاملة الدوال.
فنحن نتحكم َمن ٌستطٌع تمرٌر لٌم للحمول و َمن ال ٌستطٌعَ ،من ٌمكنه رإٌتها و َمن ال
ٌمكنه.
ٕٔٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
دخل لٌمة لمرتبوتُستخدم setفً تحدٌد المٌمة التً ٌُدخلها المستخدم ،فمثال إذا كنت ست ُ ِ
لكن هذه المٌمة ؼٌر منطمٌة مثل مرتب موظؾ ٔ جنٌة فً الشهر فؤنت ٌمكنن أن
تتحكم فً مدى المٌم الداخلة وٌجب أن ٌُدخل المستخدم لٌم فً المدى المطلوب لكً
تُخزن بداخل الحمل " المتؽٌر فً الـ " classفالمٌم تؤتً أوال عن طرٌك setوإذا كان
الشرط خطؤ فلن تُخزن فً الحملٌُ ،مكنن تحدٌد شرط لبل إستمبال المٌم بداخل setأو ال
تضع شروط ،فالشرط لٌس إضطرارٌا لكن للتؤكد من المٌم فمط لبل تخزٌنها.
مثال :
class Employee
{
; private string Employee_Name
; private int Employee_Age
; private int Employee_Salary
public string Name
{
set
{
;Employee_Name = value
}
get
{
;return Employee_Name
}
}
public int Salary
{
set
{
) if ( value <1000
{
; )" Console.WriteLine (" invalid data
}
ٕٕٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
else
{
; Employee_Salary = value
}
}
get
{
; return Employee_Salary
}
}
}
معنى الكود أن :
أوال أنشؤنا classثم عرفّنا فٌه الحمول ( " األسم ،العمر ،المرتب " ) وطرق
الوصول إلٌهم ،privateثم أنشؤنا خصائص لكً نتعامل مع هذه الحمول ونمرر لها لٌم
أو نمرأ منها هذه المٌم.
الخصائص ( " األسم ،المرتب " ) ٌتم إنشاء الخصائص تبعا للحمول التً نرٌد
للمستخدم التعامل معها بشكل ؼٌر مباشر فننشًء خاصٌة لكل حمل على حدة ،وتسمى
الخاصٌة بؤي اسم نرٌده لكن ٌُفضل بؤن تكون باسم لرٌب من اسم الحمل لكً نمٌزها.
ّ
الموصالت ( ،) set , getوال ٌشترط كتابة setو getمعا فً نفس ثم ننشًء
الخاصٌة ،بل ٌمكننا جعل هذا الحمل للمراءة فمط وعندها نستخدم getفمط ،أو للكتابة
فمط فنستخدم setأو كلٌهما.
نمرر المٌمة للحمل من خالل كلمة valueوهً كلمة محجوزة فً اللؽة تؤخذ المٌمة التً
تؤتً من المستخدم وتمررها للحمل المشار إلٌه وٌجب أن تكون المٌمة من نفس نوع
الحمل او المتؽٌر.
فً خاصٌة الـ Salaryأنشؤنا شرطا لكً نتؤكد من المٌمة التً تؤتً من المستخدم هل
هً فً المدى المطلوب وفً حالة كانت فً المدى المطلوب تُخزن بداخل الحمل أما إذا
كانت خارج المدى فال تُخزن.
وفً getنَسترجع المٌمة التً بداخل الحمل من خالل الكلمة المحجوزة .return
ٖٕٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
الوراثة
( ) Inheritance
الوراثة بالمعنى العامً هو أن ٌرث الشخص بعض الصفات أو األشٌاء الخاصة بؤبٌه أو
أحد ألاربه ،كذلن األمر فً البرمجة ،عندما ٌرث classما classآخر فإنه ٌرث منه
كل الدوال والمتؽٌرات أو الصفات الخاصة بهذا الـ classوٌصبح الـ classالوارث
ٌسمى أبن والـ classالموروث ٌسمى أب.
والوراثة هً من أهم مباديء السً شارب وهً تسهل وتختصر علٌنا الكثٌر من الولت
والجهد ،فعندما نرث classما فإننا نستخدم كل شئ بداخل هذا الـ classبدون الحاجة
إلى كتابتها مرة أخرى فً الـ classالجدٌد.
مالحظة :
ٌ employeeوجد به حمل لألسم والعمر والعنوان والمرتب وبعض الدوال ،وفً
managerنحتاج أٌضا هذه الحمول باإلضافة إلى بعض الحمول األخرى ،فهل سنكرر
نفس الحمول؟
الوراثة جعلتنا نستؽنى عن هذا التكرار وٌمكننا وراثة الـ classالذي نحتاج الصفات
التً بداخله ونستخدمها كٌفما نشاء.
ٕٗٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
األبنclass الوراثة المتعددة تعنً أن ٌرث الـ، ال تدعم الوراثة المتعددةC# لؽة الـ
. آخرclass أكثر من
: مثال
using System ;
namespace ConsoleApplication1
{
Class Employee
{
public string _Name ;
public int _Salary ;
public int _Age ;
public void show_data ( )
ٕٓ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
_Name = name ;
_Salary = salary ;
_Age = age ;
} الحمول الـخاصة
public string Mang_name class A بالـ
{
get
{
return _Name ;
}
}
}
class Product : Manager
{
Console.WriteLine(" show product data ");
}
class Program
{
static void Main ( )
{
Manager child = new Manager( ) ;
string n=Console.ReadLine( ) ;
int ag = int.Parse( Console.ReadLine ( ) ) ;
int sal = int.Parse( Console.ReadLine( ) ) ;
child. Enter_Data ( n , sal , ag ) ;
Console.WriteLine ( child.emp_name ) ;
Product p = new Product ( ) ;
ٕٓٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
}
معنى هذا الكود أن :
ٌمكن للـ classاألبن رإٌة الخواص التً بداخل الـ classاألب التً ٌكون الوصول
إلٌها publicأو protectedأو internalأو protected internalماعدا
.private
ٕٓ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
إخفاء الدالة
إذا كان ٌوجد classاسمه Aثم ورثه classآخراسمه Bوكان ٌوجد فً الـ class A
دالة اسمها ) ( printوترٌد إنشاء دالة بنفس األسم فً الـ class Bفٌمكنن إنشاء الدالة
وإستخدام الكلمة المحجوزة ،newلو لم تستخدم newوكتبت نفس الدالة بنفس االسم
لن ٌحدث خطؤ لكن سٌظهر لن تحذٌر وٌكتب لن البرنامج أن تستخدم كلمة newفً
الدالة التً تكون فً الـ classاألبن التً تكون بنفس أسم الدالة التً فً الـ classاألب
حتى تُخفً الدالة التً فً الـ classاألب وتعمل على الدالة الجدٌدة.
مثال :
class A
{
) (public void print
{
;)" Console.WriteLine(" Hello
}
}
class B : A
{
) (public new void print
{
;)" Console.WriteLine(" C#
}
}
أما فً حالة أنن أردت إستخدام نفس الدالة التً فً الـ class Aبالكود الذي بداخلها فً
الـ class Bنكتب نفس الدالة وكلمة newثم نكتب بداخل الدالة الكلمة المحجوزة
) ( ،base.printالكلمة المحجوزة baseتعمل على الـ classاألب ،تؤخذ نسخة منه
ٕٓ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
ً األب ما عدا الحمول أو الدوال التclass " أي أنها ترى كل ما بداخل الـobject"
.private ٌكون الوصول إلٌها
: مثال
class A
{
public void print( )
{
Console.WriteLine(" Hello ");
}
}
class B : A
{
public new void print( )
{
base.print( );
}
}
class Program
{
static void Main( )
{
B child = new B( );
child.print( );
}
}
Hello : سٌطبع
ٕٓ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Interface
ٌمكننا إنشاء الـ interfaceمن خالل الكلمة interfaceوهً كلمة محجوزة فً
اللؽة.
الطرٌمة المتعارؾ علٌها فً تعرٌؾ الـ interfaceأن أول حرؾ من اسم الـ
ٌ interfaceكون حرؾ iثم ٌتبعه بالً االسم الذي ترٌده ،هذا ؼٌر ضروري لكنها
الطرق المتداولة والمتعارؾ علٌها فً تعرٌفه.
interface emp1
{
; ) ( void print1
; ) int sum ( int x , int y
ٕٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
interface emp2
{
void print2 ( ) ;
int multi ( int x , int y ) ;
}
class A : emp1 , emp2
{
public void print2 ( )
{
Console.WriteLine( " employee 2 " ) ;
}
public void print1 ( )
{
Console.WriteLine( " employee 1 " ) ;
}
public int sum ( int x , int y)
{
return x + y ;
}
public int multi ( )
{
return x * y ;
}
}
ثمAdd أو ٌمكننا إنشاإه من خالل الضؽط على اسم المشروع ونضؽط على كلمة
Interface ونختارNew item نختار
ٕٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
interface functions
void eat( );
void drink( );
class أنه أمكننا إستخدام نفس الدالة بنفس األسم فً أكثر منinterface أهمٌة الـ
.interface وبؤكثر من تنفٌذ من خالل وراثة الـ
ٕٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Polymorphism
الـ polymorphismتُعد من أهم مفاهٌم البرمجة كائنٌة التوجه ،والمعنى العام لها أننا
ٌمكننا إعادة إستخدام الدالة بنفس األسم داخل نفس الـ classأو classآخر بعدد المرات
التً نرٌدها.
OverLoading -1
هً عبارة عن إنشاء أكثر من دالة بداخل نفس الـ classبنفس األسم ،لكن بشروط
معٌنة.
لنفترض أنه توجد دالة أسمها printوال تؤخذ ُمدخالت ونرٌد إنشاء دالة أخرى اسمها
printفً هذه الحالة ٌجب أن نضٌؾ لها ُمدخل واحد على األلل مثل ) print ( int x
حتى نمٌزها عن األخرى فً ولت اإلستدعاء وال ٌحدث تشتت للمترجم ،الدالتان بنفس
األسم فكٌؾ ٌفرق بٌنهما؟!
فهو ٌعتبر الدالة التً تستدعٌها مجهولة ألنه لم ٌعرؾ أي منهما تمصد ،لكن عند إضافة
ُمدخل فحٌنها سٌذهب إلى التً لصدتها أهً التً بمدخل أم ال.
لكن لن نضٌؾ ُمدخل لن نستخدمه بؽرض إضافة دالة جدٌدة بنفس األسم فهذا ؼٌر
صحٌح ،تضٌؾ فمط ما تحتاج إلٌه فعلٌا فً الكود وما تستخدمه فمط.
أما إذا فً حالة أن الدالتٌن ٌؤخذان ُمدخل فٌجب أن نؽٌر نوع أحدهما ،فمثال إذا كانت
الدالة ) sum ( int xفٌجب أن ٌكون نوع ال ُمدخل فً الدالة الجدٌدة أي نوع ؼٌر ،int
من الممكن أن ٌكون floatأو doubleأو .long
ٕٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
بإختصار ال ٌجب أن ٌكون هنان دالتان متماثلتان فً نفس الـ ٌ ،classجب أن ٌوجد
إختالؾ فً ُمدخالت أحدهما على األلل.
فً ولت إستدعاء الدالة و فور فتح لوس الدالة أثناء اإلستدعاء فإن برنامج الفٌجوال
ستودٌو ٌوضح لن أنه توجد دالتان بنفس األسم لكن أحدهما ال تؤخذ ُمدخالت بٌنما
األخرى تؤخذ ُمدخل وٌجب أن تمرر لها ال ُمدخل عند إستدعائها فً حالة أنن أخترت
إستدعاء من تؤخذ ُمدخل وٌجب أن ٌكون من نفس النوع الذي حددته ،ونختار بٌنهما من
خالل األسهم ألعلى وألسفل.
ٕ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System ;
namespace ConsoleApplication1
{
class Calculator
{
public void sum ( int x , int y )
{
Console.WriteLine( x + y );
}
public void sum ( int x , float y )
{
Console.WriteLine( x + y );
}
}
class Program
{
static void Main( )
{
Calculator ca = new Calculator ( );
ca.sum( 3 , 4 );
ca.sum( 5 , 4.2f );
//. float ألن ال ُمدخلf أضفنا حرؾ
}
}
}
ٕٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Overriding -2
تتم عملٌة الـ overrideفً الوراثة ،فً حالة وجود دالة ما فً classاسمه
employeeوورثت هذا الـ classفً classاسمه managerوترٌد إنشاء دالة
بداخل managerبنفس األسم فهذه تسمى .override
وتستخدم الكلمة المحجوزة فً اللؽة " " virtualفً الدالة التً فً الـ classاألب،
والكلمة المحجوز " " overrideفً الدالة التً بنفس األسم داخل الـ classاألبن.
وتكون الدالتان متماثلتٌن تماما ،فً األسم وعدد ال ُمدخالت ونوع ال ُمدخالت ،وجسم
الدالة أو الكود الذي بداخل الدالة فً الـ classاألب أو األبن تكتب به ما تشاء أو
الوظٌفة التً ترٌد تنفٌذها بالدالة.
مثال :
; using System
namespace ConsoleApplication1
{
class Employee
{
{
Console.WriteLine( " Show data of manager " );
}
}
class Program
{
static void Main ( )
{
Manager M = new Manager ( );
M.print ( ); // show data of Manager
Employee E = new Employee ( );
E.print ( ); // show data of employee
}
ٕٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
abstract
ً ) وعندما تؤتMethod ( أو الدالةclass هً عبارة عن كلمة محجوزة تؤتً مع الـ
ٌكونclass ) أو نسخة من هذا الـobject ( فال ٌمكننا أن نؤخذ كائنclass مع الـ
. أخرىclasses أ ُنشًء لكً ٌخدم.فمط للوراثة
: مثال
using System ;
namespace ConsoleApplication1
{
abstract class Emp
{
public int x ;
}
class Man : Emp
{
public int num
{
set
{
x = value ;
}
get
{
ٕٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
; return x
}
}
}
class Program
{
) ( static void Main
{
; ) ( Emp e = new Emp
خطؤ ،ال نستطٌع أخذ نسخة منه //
; ) ( Man m = new Man
; m.num = 2
سٌطبع ٕ Console.WriteLine( m.num ) ; //
}
}
}
إذا الـ classالذي ٌكون abstractممنوع التعامل المباشر معه فٌما عدا الوراثة.
وعند كتابة كود الدالة فً الـ classاألبن ...نكتب نفس رأس الدالة ونكتب override
عوضا عن abstractثم نكتب الكود.
ٕٕٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
. أي ال تكون دالة مجردةvirtual ٌجب أن نكتب كود الدالة التً تكون: virtual
. أي تكون مجردةabstract ٌجب أال نكتب كود الدالة التً تكون: abstract
: مثال
using System ;
namespace ConsoleApplication1
{
abstract class Emp
{
public abstract void print ( ) ; // abstract method
public virtual void view ( ) // virtual method
{
Console.WriteLine( " Hello " ) ;
}
}
class Manager : Emp
{
public override void print ( )
{
Console.WriteLine( " Show " ) ;
}
public override void view ( )
{
Console.WriteLine( " Hi " ) ;
}
}
ٕٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
sealed
تؤتً مع تعرٌؾ الـ classesوالدوال ( .) methodsعندما تؤتً مع الـ classفهذا
ٌعنً أنه ممنوع وراثة هذا الـ ،classلكن ٌمكننا التعامل معه بطرٌمة عادٌة ونستطٌع
أخذ نسخ منه أو كائن ( .) object
مثال :
sealed class A
{
}
class B : A
{
}
سٌحدث خطؤ أثناء معالجة الكود ألنه ال ٌمكن وراثة الـ classالذي ٌكون sealed
فالدالة التً تكون sealedفهذا ٌعنً أنه ال ٌمكن عمل overrideلهذه الدالة فً
classآخر.
مثال :
class A
{
) ( public sealed override void print
{
; ) " Console.WriteLine( " C#
}
}
class B : A
ٕٕٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
) ( public override void print
{
; ) " Console.WriteLine( " Hello
}
}
سٌحدث خطؤ أثناء معالجة الكود ألنه ال ٌمكن عمل overrideلدالة .sealed
فائدة sealedأنها تمنع إعادة إستخدام محتوٌات الـ classفً classآخر أو إعادة
إستخدام دالة بنفس األسم ونفس ال ُمدخالت فً classآخر.
partial
هً كلمة محجوزة فً اللؽة وتؤتً كلمة partialمع الـ classesوأٌضؤ مع الـ
interfaceومع structوسنتطرق لشرح الـ structالحما.
معناها أنه ٌمكننا تمسٌم الـ classأو الـ interfaceعلى أكثر من ملؾ .أي ٌمكننا كتابة
classبؤسم و classآخر بنفس األسم وبدوال مختلفة ،بالطبع هذا ال ٌجوز فً الحالة
العادٌة لكن ٌكون متاحا عندما نستخدم .partial
نكتب كل classفً مكان أو ملؾ مستمل عن اآلخر وبنفس األسم وبدوال مختلفة لكن
عند أخذ نسخة من هذا الـ classفإننا فً هذا الولت نتعامل مع classواحد أي أنه
ٌستدعً كل الدوال التً تكون فً كل الملفات معا.
مثال :
; using System
namespace ConsoleApplication1
{
ٖٕٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٕٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
partial interface Ifunction
{
void print ( ) ;
}
partial interface Ifunction
{
void view ( ) ;
}
partial interface Ifunction
{
void show ( ) ;
}
class Test : Ifunction
{
public void print ( )
{
Console.WriteLine( " One " ) ;
}
public void view ( )
{
Console.WriteLine( " Two " ) ;
}
public void show ( )
{
Console.WriteLine( " Three " ) ;
}
}
ٕٕ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
تمارٌن :
أكتب برنامج لتخزٌن بٌانات موظفٌن ( .) id, name , age , salary
;using System
namespace Test
{
class employee
{
ننشًء classاسمه employeeوبما أننا سنخزن بٌانات
;employee[ ] emp أكثر من موظؾ أي أكثر من أوبجٌكت لهذا الكالس فإننا
;int size سنستخدم الـ arrayألن الـ objectsكلهم من نفس النوع
;int index أي كلهم classواحد وسنؤخذ منه أوبجٌكت ،فنحدد حجم
;int id وعرفنا المتؽٌر
ّ المصفوفة من خالل الـ ،constructor
ٌعبر عن الـ indexالذي سنضٌؾ بداخله. indexحٌث أنه ّ
;int age
;string name
;int salary
} {) (public employee
)public employee(int size
{
;this.size=size
;index = 0
;]emp=new employee[size
}
)public void add_employee(int id,string name,int age,int salary
{
;bool check = false هذه دالة اإلضافة حٌث أن كل ٌ indexكون
)for(int i=0;i<index;i++ بداخله أوبجٌكت ٌحمل
{ id,name,age,salaryأي البٌانات الخاصة
به ،وبعدما نضٌؾ بٌانات موظؾ جدٌد نزٌد
)if(emp[i].id==id
الـ indexبممدار 1لٌتحرن إلى المكان الذي
{ ٌلٌه فً المصفوفة ،لكن أوال نتحمك ما إذا كان
;check=true الـ idموجود مسبما أم ال.
;break
ٕٕٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
if (check == true)
{
Console.WriteLine(" THis id is exist !! , please use an new id");
}
else
{
emp[index] = new employee();
emp[index].id = id;
emp[index].age = age;
emp[index].name = name;
emp[index].salary = salary;
++index;
}
}
public void search(int id)
{
bool check = false;
int emp_index = 0;
for(int i = 0; i<index ; i++)
{
if(emp[i].id==id)
{
check=true; هذه الدالة للبحث عن موظؾ معٌن من
emp_index=i; الخاص به فإذا كان موجودid خالل الـ
break; فإنها تطبع البٌانات الخاصة به
}
}
if(check==true)
ٕٕ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
Console.WriteLine("\t This employee is exist");
Console.WriteLine("\t Employee id : "+emp[emp_index].id);
Console.WriteLine("\t Employee name :
"+emp[emp_index].name);
Console.WriteLine("\t Employee age :
"+emp[emp_index].age);
Console.WriteLine("\t Employee salary :
"+emp[emp_index].salary);
}
else
{
Console.WriteLine("\t \t This employee not exist");
}
}
public void delete(int id)
{
bool check=false;
هذه الدالة لحذؾ بٌانات موظؾ من
int emp_index=0; الخاص بهid المصفوفة من خالل الـ
for(int i=0;i<index;i++)
{
if(emp[i].id==id)
{
check=true;
emp_index=i;
break;
}
}
if (check == true)
{
ٕٕ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٕ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Struct
هو عبارة عن بناء نوع جدٌد من البٌاناتٌ ،شبه الـ classفً التعرٌؾ لكن توجد بعض
اإلختالفات بٌنهما.
class struct
ٌ -دعم الوراثة -ال ٌدعم الوراثة
ٌ -كون value typeولٌس
ٌ -كون reference typeوعند reference typeمثل الـ class
أخذ نسخة منه نستخدم الكلمة ،عندما إستخدامه ال تحتاج إلى
المحجوزة . new كلمة . new
وبما أنه value typeفهو أسرع
ٌ -مكن إعطاء لٌم إبتدائٌة للحمول من الـ classألنه ٌخزن inline
التً بداخله أو بنظام الـ . stack
; ( int x = 10ممبول ).
-ال ٌمكن إعطاء لٌم إبتدائٌة
للحمول التً بداخله
; ( public int x = 5هذا ؼٌر
ممبول).
ٌ -كون كل أعضاإه publicإلنن
لو أخفٌتهم لن تستطٌع إستخدامهم .
ٖٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
برنامج،class عندما ترٌد إنشاء برنامج ال ٌحتاج إلى خواص الـstruct تستخدم الـ
. وهو ٌُ َع ّد بناء نوع جدٌد من البٌانات،تُخزن به بعض البٌانات وربطها ببعضها
: مثال
struct Test
{
public int x ;
public int y ;
public float z ;
}
class Program
{
static void Main( )
{
Test t ;
t.x = 5;
t.y =7 ;
t.z = 9.9f ;
Console.WriteLine( t.x + t.y + t.z ) ;
}
:ٕ مثال
using System ;
namespace ConsoleApplication1
{
class TestClass
{
public int num1 ;
}
ٕٖٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
struct TestStruct
{
public int num2 ;
}
class Program
{
static void Main ( )
{
TestStruct s1 = new TestStruct( ) ;
TestStruct s2 = s1 ;
s1.num2 = 100 ;
s2.num2 = 200 ;
TestClass c1 = new TestClass ( ) ;
TestClass c2 = c1 ;
c1.num1 = 300 ;
c2.num1 = 400 ;
Console.WriteLine( s1.num2 ) ;
Console.WriteLine( s2.num2 ) ;
Console.WriteLine( c1.num1 ) ;
Console.WriteLine( c2.num1 ) ;
}
}
}
: الناتج
100
200
400
400
ٕٖٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
لم تتؽٌر المٌم فً حمول الـ structفكؤنه ٌؤخذ نسخة من المٌم الحمٌمٌة وٌؽٌر بها أما
التؽٌٌر الحمٌمً فً المٌم فً الذاكرة العشوائٌة لم ٌحدث .بٌنما تؽٌرت المٌم فً حمول الـ
classألنه ٌعمل بـالـ ( referenceالمرجع) أي تتؽٌر المٌم األصلٌة ولٌست النسخة
منها.
ٖٕٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Namespace
ٌتم إستخدامها عن طرٌك الكلمة المحجوزة namespaceثم األسم الذي نرٌده ونكتب
بداخلها كل الـ classesالتً نرٌد.
فمثال إذا أردنا إستدعاء كل الـ classesالتً بداخل Systemوإستدعاء دالة اإلخراج
أٌضا من Consoleفٌكون اإلستدعاء بهذا الشكل :
; ) (System.Console.WriteLine
ٖٕ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System ;
using Demo ;
namespace Test
{
class Program
{
static void Main ( )
{
Demo.Prog1 p1 = new Demo.Prog1 ( ) ;
p1.view( ) ;
Asd a = new Asd( ) ;
a.show( ) ;
Prog1 p2 = new Prog1 ( ) ;
p2.view ( ) ;
}
}
class Prog1
{
public void view( )
{
Console.WriteLine( " I'am Namespace Test Class Prog1 " ) ;
}
}
}
namespace Demo
{
class Prog1
{
public void view ( )
ٕٖٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
Console.WriteLine( " I'am Namespace Demo Class Prog1 " ) ;
}
}
class Asd
{
public void show ( )
{
Console.WriteLine(" I'am Namespace Demo Class Asd " ) ;
}
}
}
ً فclass لكً ٌذهب إلى الـDemo.Prog1 كتبتMain فً أول سطر داخل دالة الـ
namespace بنفس األسم فً الـclass التً أحددها ألنه ٌوجدnamespace الـ
ً الذي كان فclass كان سٌذهب إلى الـnamespace فلو لم أحدد الـ،الرئٌسٌة
: مثال
using System ;
using Test1.Test2 ;
namespace Test1
{
class Program
{
ٕٖ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٖ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
اإلستثناءات واألخطاء
( ) Errors and Exceptions
هً تلن األخطاء التً ٌمع بها المستخدم أو تحدث فً البرنامج أثناء تشؽٌله ،ولها العدٌد
من األشكال ،لكن ٌمكننا أن نتحكم فً ما سٌحدث عندما ٌمع أي خطؤ ،فمثال عند لسمة
أي رلم على صفر فهذا ؼٌر صحٌح وسٌحدث خطؤ ،أو عند إدخال لٌمة لمتؽٌر من نوع
مختلؾ عن نوع المتؽٌر مثل إدخال حرؾ أو نص فً متؽٌر نوعه intأو إضافة لٌم
بداخل مصفوفة أكثر من عدد عناصرها فكل هذه أخطاء ،توجد العشرات من األخطاء.
ٌجب أن ٌكون الكود تحت تحكمنا الكامل به وال نترن مجاال إلحتمالٌة حدوث أي خطؤ.
حماٌة الكود من األستثناءات التً تحدث ٌكون عن طرٌك .try , catch :
try
نكتب بداخلها الكود أو البرنامج المراد تنفٌذه ودائما ما ٌتبعها catchمعناها فً حالة
حدوث أي خطؤ أو إستثناء نفذّ ما بداخل الـ ٌ .catchمكنن أن تشبهها بـ if / elseحتى
ٌتضح لن كٌفٌة عملها فمط.
catch
تلتمط األخطاء فً حالة حدوثها وٌمكننا كتبة أي كود نرٌد تنفٌذه فً حالة حدوث خطؤ
ما.
وٌمكن أن نستخدم أكثر من جملة catchمتتالٌة.
ٕٖ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
finally
نكتب بداخلها كود نرٌد تنفٌذه فً حالة حدوث خطؤ أم ال ،فما بداخلها سٌُنَفذّ تحت أي
ظرؾ وٌمكننا كتابتها أو اإلستؽناء عنها ،فال ٌشترط كتابتها فً الكود مثل catchبعد
.try
ٌجب أال ٌخلو أي كود لنا بدون كتابة try , catchحتى نتجنب أي أخطاء.
توجد العدٌد من الـ classesالخاصة باألخطاء فً الـ " System " namespace
مثل :
ٕٓٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System ;
namespace ConsoleApplication1
{
class Program
{
static void Main ( )
{
try
{
int x = 5 ;
int y = 0 ;
Console.WriteLine( x / y ) ;
}
catch ( Exception Ex )
{
Console.WriteLine( Ex.message ) ;
}
finally
{
Console.WriteLine( " finished " );
}
}
}
}
ٕٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً هذا البرنامج كتبنا الكود فً tryثم كتبنا catchوأخذنا كائن أو نسخة من الـ class
الذي ٌسمى Exceptionثم نطبع الرسالة التً بداخله عندما ٌحدث خطؤ ،هذا الـ class
شمولً أكثر فهو ٌعمل على أي خطؤ ٌحدث بعكس الـ classesاألخرى تظهر األخطاء
التً تعبر عنها فمط.
فمثال ٌ DivideByZeroExceptionظهر الخطؤ الذي ٌحدث عند المسمة على صفر
فٌما عدا ذلن لن ٌعمل .أما ٌ Exceptionظهر أي خطؤ ٌحدث فً البرنامج.
ٌمكنن أال تؤخذ نسخة من أي classوتطبع رسالة خاصة بن.
مثال :
try
{
; int x = 8
; int y = 9
; ) Console.WriteLine( x + y
}
catch
{
; ) " Console.WriteLine( " Error
تطبع أي شئ ترٌده أن ٌظهر عند حدوث أي خطؤ //
}
ٕٕٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
using System ;
namespace ConsoleApplication1
{
class Program
{
static void Main ( )
{
try
{
int x = 8 ;
int y = 3 ;
Console.WriteLine( x / y ) ;
}
catch ( DivideByZeroException D )
{
Console.WriteLine( D.message ) ;
}
catch (StackOverflowException S )
{
Console.WriteLine( S.message ) ;
}
catch (OverflowException O )
{
Console.WriteLine( O.message ) ;
}
catch (Exception E )
{
Console.WriteLine( E.message ) ;
}
}
}
}
ٕٖٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Collections
فمثال كانت المصفوفة ٌجب أن نحدد لها الحجم أثناء إنشائها وإذا أكتملت عناصرها
وأمتألت فال نستطٌع إضافة عنصر آخر وأنه ٌجب تحدٌد نوع المصفوفة وتكون كلها
من نفس النوع أي أنه إما تكون كل العناصر intأو stringأو floatوهكذا .أما فً
الـ collectionsنستطٌع إضافة أي عنصر من أي نوع وحجم المصفوفة ٌكون
دٌنامٌكً أي أنه ٌزٌد تلمائٌا كلما أضفنا عنصر جدٌد.
; using System.Collections
ٕٗٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Array List
هو عبارة عن ٌ classخلك مصفوفة " " Arrayلكن ٌزٌد حجمها كلما أضفنا عنصر
جدٌد بها ،وٌمكنه إستمبال أي نوع من البٌانات دون الحاجة إلى تعرٌؾ نوعه وٌمكن
المزج بٌن هذه البٌانات من حٌث النوع فٌمكننا إضافة stringثم العنصر الذي ٌلٌه
ٌكون intوهكذا ،وٌتم إستدعاء هذا الـ classبالطرٌمة العادٌة.
إذا أردنا إنشاء مصفوفة دٌنامٌكٌة أي ٌتؽٌر حجمها كلما أضفنا عنصر نستخدم
ArrayListونؤخذ منه نسخة ونعمل على الدوال التً بداخله التً تمكننا من التحكم فً
المصفوفة بشكل كامل.
أخذنا من الـ classنسخة أي أنشؤنا مصفوفة جدٌدة واسمها " ." arr
ومن الممكن أن نحدد حجم المصفوفة أٌضا من خالل تمرٌر المٌمة للـ constructor
فٌعطً للمصفوفة لٌمة إبتدائٌة فمثال إذا حددت حجم المصفوفة 10وأمتألت وأردت أن
تضٌؾ العنصر جدٌد سٌزٌد حجمها تلمائٌا وذلن من خالل كلمة newفهً تنشًء
مصفوفة جدٌدة أكبر وتنسخ بها كل بٌانات المصفوفة المدٌمة ثم تُحذؾ المصفوفة
المدٌمة بالـ Garbage Collectorالذي ٌعمل تلمائٌا.
ٕ٘ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
تؤخذ المٌمة وتضعها كحجمset فهً تُمثِل الـCapacity أو من خالل الخاصٌة
: ًالمصفوفة كاآلت
: مثال
using System ;
using System.Collections ;
namespace Test
{
class Program
{
static void Main ( )
{
ArrayList arr = new ArrayList ( ) ;
arr.Add( " Hello " ) ;
arr.Add( 100 ) ;
arr.Add( ' R ' ) ;
arr.Add( 2,71 ) ;
foreach ( object i in arr )
{
Console.WriteLine( i ) ;
}
}
}
}
فؤحد األؼراض األساسٌة للـforeach لعرض محتوٌات المصفوفة نستخدم-
وبما أن العناصر التً بداخل المصفوفة.collectios هو إستخدامها مع الـforeach
ٕٗٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
لٌست من نفس النوع فال ٌمكننا تحدٌد نوع العدّاد الذي ٌدور على العناصر بداخل
المصفوفة " " iبنوع مثل intأو ،stringفنحدده بؤنه objectأو varأو .dynamic
-لمعرفة عدد عناصر المصفوفة الحالٌة فً حالة أنن لم تحدد لها حجم معٌن ،نستخدم
رجع حجم المصفوفة. الخاصٌة Countفهً تُمثِل getوت ُ ِ
سنعمل على نفس المثال السابك :
; ) Console.WriteLine( arr.Count
-فً حالة أنن أردت إدخال عنصر فً مكان محدد فً المصفوفة نستخدم الدالة "
) ( " Insertوهذه الدالة تؤخذ المكان الذي تحدده للعنصر ولٌمة العنصر.
لكن ٌجب أن ٌكون المكان الذي تحدده موجود فعلٌا فً المصفوفة حالٌا ،أي أنه ٌوجد
عنصر فً هذا المكان لبل ذلن ألنن لو حددت موضع اإلدخال مكان لعنصر ؼٌر
موجود فسٌحدث خطؤ.
حجم المصفوفة ،5فال ٌجوز أن تُدخل موضع لعنصر أكبر من 4ألن الترلٌم فً
المصفوفة ٌبدأ من صفر.
هذا فً حال تواجد عناصر فً المصفوفة ،لو لم ٌوجد عناصر فً المصفوفة فال ٌمكنن
أن تضع مكان للعنصر فً الدالة Insertأكبر من صفر.
ٕٗ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌبدأ البحث عن الموضع المحدد من المكان صفر إلى أن ٌجده وٌزٌد حجم المصفوفة
بممدار عدد العناصر الجدٌدة فإذا كان ٌوجد عنصر فً هذا المكان ستنتمل كل العناصر
التً على ٌمٌنه بممدار خانة واحدة لكل عنصر فً جهة الٌمٌن فً الذاكرة.
; ) arr.RemoveAt( 3
-لحذؾ عنصر معٌن عن طرٌك لٌمة العنصر ولٌس موضعه فً المصفوفة سنستخدم
الدالة ) ( Removeوتؤخذ لٌمة العنصر فمط.
; ) Remove( R
مثال :
; ) arr.AddRange( test
ٕٗ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
; ) RemoveRange( 2 , 5
إذا كان عندن مصفوفة وترٌد نسخ بعض العناصر من مصفوفة أخرى ...تستخدم
) ( GetRangeوهً تؤخذ موضع أول عنصر تبدأ بنسخه وتؤخذ آخر موضع تنتهً
عنده.
; ) Test=arr.GetRange( 1 , 4
سخ العناصر من الموضع ٔ إلى الموضع ٗ فً المصفوفة المدٌمة " " arrإلى ستُن َ
المصفوفة الجدٌدة التً تسمى " ." Test
; ) (arr.Clear
Stack
ٕٗ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
وأول عنصر ٌضاؾ هو آخر عنصر ٌخرج فٌتم عرض البٌانات التً بداخله بطرٌمة
عكسٌة.
تعمل معظم التطبٌمات الضخمة بنظام الـ stackكالبحث فً جوجل حٌث تظهر لن أوال
آخر عملٌة بحث لمت بها ،كما فً تطبٌك الفٌس بون تظهر لن فً ممدمة البحث آخر
عملٌة بحث لمت بها مسبما.
كما تعمل به الذاكرة المإلتة أٌضا.
ٌمكنن أن تفهم كٌفٌة عمل الـ stackبوضوح من خالل الشكل اآلتً :
إذا أردت إخراج الكرة ( ٔ ) ٌجب أن تُخرج كرة ( ٖ ) أوال ثم كرة ( ٕ ) إلى أن
تصل إلى الكرة ( ٔ ) .
إخراج إدخال
3
2
1
ٕٓ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
-إلضافة عنصر بداخل الـ stackنستخم الدالة ) ( Pushوهً تؤخذ لٌمة العنصر فمط.
; ) Test.Push( 12
; ) Test.Push( 2.71
; ) Test.Push( False
سٌبدأ بآخر لٌمة دخلت فً الـ stackفهو ٌعرض بٌاناته بطرٌمة عكسٌة.
False -
2.71 -
H-
12 -
ٕٔ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
عند إخراج لٌمة من الـ stackثم حذفها منه سنسنخدم الدالة ) ( Popوال تؤخذ الدالة أي
ُمدخالت ،تُخرج آخر عنصر دخل إلى الـ stackوتحذفه.
; ) (Test.Pop
إذا أردنا إظهار آخر لٌمة دخلت فً الـ stackبدون حذفها نستخدم الدالة ) (.Peek
; ) ) (Console.WriteLine( Test.Peek
; ) (Test.Clear
-إذا أردنا التؤكد من وجود عنصر معٌن فً الـ stackنستخدم الدالة ) (Cotains
وترجع إما trueأو falseأي العنصر موجود أو ؼٌر موجود فً الـ .stack
; ) Console.WriteLine( Test.Count
; using System
; using System.Collections
namespace ConsoleApplication1
{
class Program
{
ٕٕ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
Console.WriteLine( st.Count );
foreach( string i in st )
Console.WriteLine( i );
st.Pop( );
Console.WriteLine( st.Count );
foreach( string i in st )
Console.WriteLine( i );
}
}
}
عناصر ثم طبعنا عدد العناصر الموجودة بالـ5 وأدخلنا بهstack فً هذا الكود أنشؤنا
ثم حذفنا آخر عنصر دخل إلى الـ، بعدها طبعنا كل العناصر بدون حذفها،stack
. وطبعنا عدد العناصر مرة أخرى ثم طبعنا كل العناصرstack
.حاول أن تُخرج ناتج هذا الكود بدون أن تنفذه على البرنامج
ٕٖ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
Queue
الـ queueهو عبارة عن classداخل الـ Collectionsوهو ٌشبه الـ stackحٌث أنه
مصفوفة أٌضا ،ؼٌر أن الـ ٌ queueتعامل مع البٌانات بطرٌمة مختلفة للٌال عن الـ
.stack
تتم إضافة العناصر من آخر المصفوفة وتتم عملٌة الحذؾ أو اإلخراج من أول
المصفوفة ،أي أن آخر عنصر ٌُضاؾ هو آخر عنصر ٌُحذؾ "ٌخرج" ،وأول عنصر
ٌضاؾ هو أول عنصر ٌُحذؾ "ٌخرج" وٌتم عرض البٌانات التً بداخله بطرٌمة عادٌة
ولٌست عكسٌة مثل الـ ،stackوٌسمى الـ queueبــ ) First in First Out ( FIFO
أي أن من ٌُضاؾ أوال ٌخرج أوال .فهو ببساطة ٌشبه الطابور َمن ٌؤتً أوال ٌذهب أوال.
إذا أردت إخراج الـ 2فٌجب أن تُخرج الـ 1أوال ألنه ُخ ِزنَ فً الـ queueلبلها.
معظم دوال الـ queueتشبه دوال الـ .stack
ٕٗ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
-إلظهار أول عنصر ٌخرج من الـ queueبدون حذفه نستخدم دالة ) (Peek
;) (qu.Peek
ٕ٘٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
( ) Generics
الـ genericتتٌح لن إستخدام الـ classesوالدوال بدون الحاجة إلى تعرٌؾ نوعها
مإلتا حتى لحظة إدخال لٌم لها .وهذا ٌجعل األداء فً البرنامج أعلى وٌمكنن أن
تستبدل الـ classesالتً استخدمتها فً الـ collectionsبالـ genericفهً متماثلة
تمرٌبا.
;using System.Collections.Generic
> <List
هذا الـ classهو عبارة عن مصفوفة دٌنامٌكٌة تشبه الـ ArrayListفً الـ
،collectionsوٌتم تعرٌفها بهذا الشكل :
هذا الكود معناه أننا أنشؤنا مصفوفة اسمها arrونوعها .intوتستطٌع إستمبال بٌانات
من النوع intفمط كما حددنا مسبما .وكلما أدخلنا عناصر أكثر ٌزٌد حجمها تلمائٌا.
ٕ٘ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
arr.Add( 5 );
arr.Add( 2 );
وبها دوال إضافٌة لٌستArrayList وبها معظم الدوال التً شرحتها مسبما فً الـ
وتستخدم هذه الدالة فً ترتٌب المصفوفةSort( ) مثلArrayList موجودة فً الـ
.تصاعدٌا
arr.Sort( );
. وتستخدم هذه الدالة لعكس عناصر المصفوفةReverse( ) وتوجد بها أٌضا دالة
arr.Reverse( );
using System ;
using System.Collections.Generic ;
namespace ConsoleApp
{
public class Employee
{
string name ;
string mobile ;
public string _Name
{
get
{
return _Name ;
}
}
ٕ٘7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕ٘2
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
فً هذا الكود أنشؤنا classاسمه Employeeوبداخله حمل األسم ورلم التلٌفون،
وأنشؤنا ٌ constructorؤخذ األسم ورلم التلٌفون وٌضع المٌم فً الحمول ،ثم عملٌة
overrideللدالة ToStringوهً دالة جاهزة فً اللؽة لطباعة النصوص ،وجعلناها
ترجع األسم ورلم التلٌفون.
وأنشؤنا Listوٌكون نوع الـ Listهو Employeeأي الـ classفهو ٌُع ّد كنوع بٌانات
جدٌد ،ولكً نستطٌع إضافة عناصر للـ Listمن نفس نوع الـ Employeeنستخدم
newثم نكتب اسم الـ constructorونمرر له ال ُمدخالت ،وفً عملٌة الطباعة
نستخدم foreachوٌكون نوع العدّاد إما اسم الـ classالذي ٌُع ّد نوع بٌانات والبٌانات
التً ستُطبع ستكون من نفس نوعه أو نستخدم objectأو varأو .dynamic
> <Stack
ٌعمل الـ generic stackبنفس كٌفٌة عمل الـ collection stackأول عنصر ٌدخل
فً المصفوفة هو آخر عنصر ٌخرج منها وآخر عنصر ٌدخل فً المصفوفة هو أول
عنصر ٌخرج منها .وبه نفس الدوال التً فً الـ .collection stack
; ) s.Push( 10
; ) s.Push( 20
; ) (s.Pop
ٕ٘9
Introduction to C# مقدمح نهثزمجح تانسً شارب
s.Peek( ) ;
Console.WriteLine( s.Count ) ;
Queue< >
حٌث العنصرcollection queue بنفس كٌفٌة عمل الـgeneric queue ٌعمل الـ
وبه نفس الدوال.الذي ٌدخل المصفوفة أوال ٌخرج أوال ومن ٌدخل آخرا ٌخرج آخرا
.collection queue التً فً الـ
q.Enqueue( 1 ) ;
q.Enqueue( 3 ) ;
q.Enqueue( 20 ) ;
q.Dequeue( ) ;
Console.WriteLine( q.Count ) ;
ٕٙٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
> <LinkedList
هً عبارة عن سلسلة مترابطة من العناصر ،تكون هذه العناصر مرتبطة مع بعضها
من خالل مإشرات فكل عنصر ٌُشٌر إلى مكان العنصر اآلخر الذي ٌلٌه ،تكون هذه
العناصر ُمخزنة بطرٌمة عشوائٌة فً الذاكرة بعكس المصفوفة التً تحجز عدد من
االماكن فً الذاكرة بطرٌمة متتالٌة.
أما المصفوفة فهً أسرع فً عملٌات البحث والوصول إلى العناصر ال ُمخزَ نة بها،
والـ linkedListال تمتلًء أبدا ،فكلما أضفت عنصر تضٌفه هً فً السلسلة بشكل
مباشر فهً لٌس لها حجم ثابت ،أما المصفوفة ٌجب أن تحدد لها الحجم ولو لم تحدد لها
سخ بها المصفوفة شؤ مصفوفة جدٌدة بحجم أكبر وت ُن َ
الحجم فإنه كلما تُدخل عنصر بها ت ُن َ
المدٌمة ثم ت ُح َذؾ المدٌمة من خالل الـ ( .GC ) Garbage collector
أما الـ LinkedListال ٌكون لها حجم ثابت فكلما أضفت عنصر بها تشٌر إلٌه فمط
وعندئ ٍذ ٌضاؾ إلى السلسلة مباشرة ،فالسلسلة الفردٌة ٌكون لها مإشر واحد ٌُشٌر إلى
العنصر الذي بعده .وهً كما للت ؼٌر موجودة فً الـ Genericsلكن شرحتها حتى
تستطٌع أن تفهم كٌفٌة عمل السلسلة المزدوجة.
ٕٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
لنفترض أنه توجد سلسلة بها هذه العناصر ( ) 1 , 2 , 3 , 4 , 5ستكون بهذا الشكل :
head
tail null
nullهً كلمة محجوزة فً اللؽة وتعنً ال شًء ،أي أنه ال ٌوجد شًء بعد العنصر
األخٌر فً السلسلة.
فً حالة أن السلسلة ال ٌوجد بها عناصر فٌكون ٌ head , tailإشران على .null
وكما نرى كل عنصر ٌُشٌر إلى العنصر الذي بعده إلى أن نصل إلى آخر عنصر فً
السلسلة حٌث ٌُشٌر إلى .null
-فً حالة اإلضافة فً بداٌة السلسلة إضافة عنصر ( ) 6سٌكون بهذا الشكل :
head
6 tail
null
سنجعله ٌُشٌر إلى أول عنصر فً السلسلة وبعد ذلن نجعل الـ ٌ headإشر علٌه وبذلن
ٌرتبط بالسلسلة وٌكون العنصر 6هو أول عنصر فً السلسلة.
ٕٕٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
-فً حالة اإلضافة فً منتصؾ السلسلة أو فً أي موضع آخر بخالؾ البداٌة والنهاٌة :
tail
6 null
نجعل العنصر الجدٌد ٌُشٌر إلى العنصر التالً للموضع الذي حددناه.
head
null
6
وآخرا نجعل العنصر الذي ٌسبك الموضع المحدد أن ٌُشٌر إلى العنصر الجدٌد وهكذا
ٌضاؾ إلى السلسلة.
لو جعلنا العنصر الذي ٌسبك المكان المحدد أن ٌُشٌر أوال على العنصر الجدٌد ستمع
السلسلة من بعد هذا المكان ولن ٌبمى بها سوا العناصر التً تسبك الموضع المحدد.
ٖٕٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
tail 6
null
tail 6
null
ٕٗٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
tail 6
null
سنجعل العنصر الذي ٌسبك العنصر األخٌر ٌإشر مباشرة على nullوبذلن ٌصبح هو
آخر عنصر فً السلسلة أي الـ .tail
-فً حالة الحذؾ من منتصؾ السلسلة أو أي مكان فً السلسلة بخالؾ البداٌة والنهاٌة:
أوال نحدد موضع العنصر الذي سنحذفه ثم نجعل العنصر الذي ٌسبمه ٌشٌر إلى العنصر
الذي ٌلً العنصر الذي سنحذفه.
لنفترض أنه توجد سلسلة بها العناصر التالٌة ( ) 1 , 2 , 3 , 4 , 5
tail null
ٕ٘ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕٙٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
هً نفس السلسلة الفردٌة لكن اإلختالؾ بٌنهما أن المزدوجة ٌكون لها مإشران ولٌس
مإشرا واحدا ،مإشر ٌشٌر إلى العنصر الذي بعده واآلخر ٌشٌر إلى الذي لبله.
; ) (> LinkedList < DataType > Name = new LinkedList < DataType
;) (> LinkedList < int > Link = new LinkedList < int
-فً حالة اإلضافة من البداٌة نستخدم الدالة ) ( AddFirstوهً تؤخذ لٌمة العنصر
فمط.
; ) Link.AddFirst( 10
-فً حالة اإلضافة فً نهاٌة السلسلة نستخدم الدالة ) ( AddLastوهً تؤخذ لٌمة
العنصر فمط.
; ) Link.AddLast( 20
; ) Console.WriteLine( Link.Count
ٕٙ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
-للبحث عن عنصر معٌن نستخدم الدالة ) ( Containsوتؤخذ لٌمة العنصر وهً تُرجع
trueأو .false
; ) ) ( Console.WriteLine( Link.Contains
; ) (Link.RemoveFirst
; ) (Link.RemoveLast
-لحذؾ عنصر معٌن نستخدم الدالة ) ( Removeوهً تؤخذ العنصر الذي ترٌد حذفه،
ولو تكرر العنصر أكثر من مره فإنها تحذؾ أول عنصر تجده فً السلسلة الذي ٌحمل
هذه المٌمة.
مثال :
; ) Link.Remove( 3
ٕٙ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
: تمارٌن
ٕٙ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕ7ٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
) public void insert( int id , string name , string mobile , int age
{
دالة إلدخال بٌانات المرٌض .
;bool check=false
) for ( int i = 0; i < P.Count; i++
{
) if ( id == P.ElementAt( i ).id
{
الدالة ) ( ElementAtإلرجاع البٌانات المحددة سواء كانت
( ) name , id , moblie
من خالل ترلٌم ( فهرس ) المرٌض ( العنصر ) فً المصفوفة.
فنبحث عن الرلم التسلسلً الجدٌد هل ٌطابك رلم تسلسلً لدٌم؟
إذا كان الرلم موجود من لبل فلن تتم عملٌة إضافة بٌانات المرٌض
حٌث ٌكون لكل مرٌض رلم تسلسلً ال ٌتكرر لمرٌض آخر.
;check = true
}
else
;check = false
}
) if ( check == true
{
;)" ! Console.WriteLine(" this id ( "+id+" ) is exist before , try again
}
else
ٕٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
P.Enqueue( new patient( id , name , mobile , age ) );
) Enqueue ( ك ُمدخل للدالةconstructor لتنفٌذ الـnew تُكتب
constructor فٌُن َفذّ الـ
.وتكون البٌانات التً دخلت إلٌه ُمدخل للدالة
}
}
ٕ7ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
class Program
{
static void Main( )
{
try
{
patient pat = new patient( );
int id;
string name;
string mobile;
int age;
while (true)
{
Console.WriteLine("Enter 1 to insert patient data");
Console.WriteLine("Enter 2 to search on patient data");
Console.WriteLine("Enter 3 to delete patient data");
Console.WriteLine("Enter 4 to show all patient data");
Console.WriteLine(); Console.Write("Your choice is : ");
int i = int.Parse(Console.ReadLine( ));
switch ( i )
{
case 1:
ٕ7ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Console.Write(" id : ");
id = int.Parse(Console.ReadLine( ));
Console.Write(" name : ");
name = Console.ReadLine( );
Console.Write(" mobile : ");
mobile = Console.ReadLine( );
Console.Write(" age : ");
age = int.Parse(Console.ReadLine( ));
pat.insert(id, name, mobile, age);
break;
case 2:
Console.Write("\t enter patient id :");
id = int.Parse(Console.ReadLine( ));
Console.WriteLine(pat.Search(id));
Console.WriteLine( );
break;
case 3:
pat.delete( );
break;
case 4:
pat.print( );
break;
ٕ7٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
default:
Console.WriteLine(" false choice ");
Console.WriteLine( );
break;
}
}
}
catch( Exception Ex )
{
Console.WriteLine( Ex.Message );
}
}
}
}
ٕ7ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
هياكل البيانات
( ) Data structures
البحث ( ) Searching
0 1 2 3 4 5 6 7 8 9
4 2 12 8 34 76 9 15 16 100
هذه الطرٌمة فً البحث ؼٌر عملٌة وبطٌئة فً الحاالت التً تكون فٌها المصفوفة ذات
مساحة كبٌرة جدا ألنه ٌمر على كل عناصر المصفوفة ،لذا فتكون كفاءة البرنامج ألل
ألنه ٌستهلن ولت أطول.
ٕ77
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
عنصر وأضؾ لها لٌم عشوائٌة ثم أجعل ال ُمستخدم15 أنشًء مصفوفة ُمكونة من
.linear search ٌبحث عن لٌمة معٌنة بها بإستخدام
using System;
namespace First_program
{
class Program
{
static void Main( )
{
int[ ] arr = new int[ 15 ];
Random r = new Random( );
for ( int i = 0; i < arr.Length; i++ )
{
arr[ i ] = r.Next( ) % 10;
}
bool check = false;
int search = int.Parse(Console.ReadLine( ));
for( int i = 0 ; i <arr.Length ; i++ )
{
if (arr[ i ] == search)
{
Console.WriteLine(" Exist ");
check = true;
break;
}
}
if (check == false)
Console.WriteLine(" Not Exist ");
}
ٕ72
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
}
فً هذا الكود أنشؤنا مصفوفة بها 15عنصر ثم أستخدمنا Randomوهو عبارة class
ٌُستخدم لتولٌد لٌم عشوائٌة وأخذنا منه كائن ( )objectوأستدعٌنا الدالة ) ( Nextلتؤتً
لنا بالمٌم العشوائٌة وأستخدمنا " " %لنحدد المدى الذي ٌؤتً بالمٌم العشوائٌة منه ،فمثال
إذا كتبنا %10فإنه ٌو ِل ّد لٌم من 0إلى 10فمط ،وإذا كانت %50سٌو ِل ّد لٌم من 0إلى
50فمط وهكذا ،أو ٌُمكنن تحدٌد مدى معٌن وتختار نمطة البداٌة والنهاٌة من خالل
الدالة ) .Next( Start_Point , End_Point
وهو ٌموم على طرٌمة أنه ٌمسم المصفوفة إلى نصفٌن وٌمارن العنصر الذي تبحث عنه
بالعنصر الذي ٌكون فً منتصؾ المصفوفة فإذا كان أكبر منه فإنه ٌتجاهل كل العناصر
األلل منه وٌنتمل إلى العناصر األكبر من منتصؾ المصفوفة ثم ٌمسمهم إلى نصفٌن
وٌمارن منتصؾ المصفوفة الجدٌد بالعنصر الذي تبحث عنه فإذا كان ألل فإنه ٌتجاهل
الشك الً به عناصر أكبر وٌنتمل إلى العناصر األلل وٌظل ٌمسم العناصر وٌظهر
منتصؾ جدٌد وٌمارنه مرة أخرى مع العنصر الذي نبحث عنه إلى أن ٌصل إلٌه أو أنه
ٌكون ؼٌر موجود فً المصفوفة كلها ،فهذه الطرٌمة أفضل فً عملٌات البحث عندما
تكون المصفوفة كبٌرة ،هذا فً حالة أن المصفوفة كانت ُمرتبة ولو لم تكن ُمرتبة فٌجب
ترتٌبها أوال لتعمل علٌها هذه الطرٌمة.
ٌُمكنن ترتٌب العناصر بؤي طرٌمة تعرفها.
أو ٌمكنن إستخدام الدالة ) Sort( array_nameوهً دالة جاهزة داخل class
الـ Arrayتُستخدم لترتٌب المصفوفة ونمرر للدالة اسم المصفوفة المراد ترتٌبها فمط.
ٕ79
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
.binary search بإستخدام20 أبحث عن المٌمة
ًمنتصؾ المصفوفة األصل
20 >12
1 3 6 8 12 15 16 18 20 27
20 27
20
: مثال
using System;
namespace ConsoleApplication3
{
class Program
{
static void Main( )
{
int[ + arr = new int*10+;
Random r = new Random( );
ٕ2ٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕ2ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
فً هذا الكود عرفّنا نمطة البداٌة ومررنا لها لٌمة إبتدائٌة صفر ونمطة النهاٌة وهً
تساوي طول المصفوفة نالص ،1ألنها تعبر عن الـ ( indexالترلٌم ) حٌث ٌكون آخر
indexطول المصفوفة نالص ،1ثم جئنا بمنتصؾ المصفوفة حٌث ٌكون مجموع
نمطتً البداٌة والنهاٌة ممسوما على ،2ثم نمارن العنصر الذي نبحث عنه بؤول منتصؾ
للمصفوفة فإذا كان هو نفس العنصر فٌتولؾ وٌطبع Existما عدا ذلن سٌمارنه هل
العنصر الذي نبحث عنه أكبر من المنتصؾ أو ألل ،إذا كان ألل فإنه سٌتجاهل كل
العناصر التً أكبر من منتصؾ المصفوفة وتصبح نمطة النهاٌة الجدٌدة هً منتصؾ
المصفوفة نالص ،1ونمطة البداٌة تظل كما هً ( صفر ) مإلتا.
ثم ٌخرج منتصؾ جدٌد للمصفوفة وتحدث علٌه نفس العملٌة وإذا كان العنصر الذي
نبحث عنه أكبر من المنتصؾ الجدٌد فستكون نمطة البداٌة الجدٌدة هً المنتصؾ الجدٌد
زائد ،1وتكون نمطة النهاٌة تحتفظ بآخر لٌمة ُم ِررت إلٌها طالما أن لٌمتها لم تتؽٌر.
وتظل تتكرر هذه العملٌة إلى أن ٌجد العنصر الذي تبحث عنه فً حالة أنه موجود فً
المصفوفة.
وهً تؤخذ ولت ألل ألنها ال تمر على كل العناصر فً المصفوفة.
ٕٕ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
الترتيب ( ) Sorting
هً عبارة عن عملٌة ترتٌب للبٌانات وٌوجد العدٌد من طرق الترتٌب ،منها :
ٔBubble Sort -
ٌتم الترتٌب بهذه الطرٌمة من خالل ممارنة كل عنصر بالذي ٌلٌه فإذا كان العنصر الذي
ٌلٌه أصؽر منه فإنه ٌبدل المٌمتٌن ببعضهما ثم ٌبدأ فً ممارنة العنصر الثانً بالثالث
وإذا كان العنصر الثالث أصؽر من الثانً فإنه سٌبدل المٌمتٌن وهكذا إلى أن ٌتم ترتٌب
المصفوفة أو السلسلة التً بها البٌانات وهذه الطرٌمة هً من أسهل طرق الترتٌب لكنها
تؤخذ ولت أطول وال ٌُفض ّل إستخدامها فً حالة البٌانات الكثٌرة جدا.
) ] if ( arr[ j ] > arr[ j+1
) ] swap ( arr[ j ] , arr[ j+1
ٖٕ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
1 3 , 4 , 9 , 10 , 1 , 5 , 23
2 3 , 4 , 9 , 10 , 1 , 5 , 23
3 3 , 4 , 9 , 10 , 1 , 5 , 23
2
4 3 , 4 , 9 , 10 , 1 , 5 , 23
5 3 , 4 , 9 , 1 , 10 , 5 , 23
6 3 , 4 , 9 , 1 , 5 , 10 , 23
7 3 , 4 , 9 , 1 , 5 , 10 , 23
: مثال
.Bubble أكتب برنامج لترتٌب مصفوفة بطرٌمة
using System;
namespace Buuble_Sort
{
class Program
{
static void buuble( int[ ] arr )
{
for (int i = 0 ; i < arr.Length-1 ; i++)
ٕ2ٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
for (int j = 0; j < arr.Length-1; j++)
{
if (arr[ j ] > arr[ j+1 ])
{
int temp = arr[ j ];
arr[ j ] = arr[ j+1 ];
arr[ j+1 ] = temp;
}
}
}
}
static void Main(string[ ] args)
{
int[ + x = , 5, 6, 2, 4, 1, 9, 3, 0 -;
buuble( x );
foreach ( int i in x )
Console.Write( i +" ");
}
}
}
: الناتج
[0,1,2,3,4,5,6,9 ]
ٕ2٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌتم الترتٌب بهذه الطرٌمة من خالل البحث عن أصؽر عنصر فً المصفوفة أو السلسلة
وتبدٌله مع أول عنصر فً المصفوفة ثم نبحث عن أصؽر فً المصفوفة لكن نبدأ من
بعد أول موضع فً المصفوفة ألننا بالفعل حصلنا على أصؽر عنصر فً المرة األولى
ثم نبدله مع العنصر الذي ٌكون فً الموضع الثانً فً المصفوفة وهكذا ...إلى أن ٌتم
ترتٌب المصفوفة.
* 9 , 3 ,4 , 23 , 10 , 1 , 5 +
ٕ2ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
.Selection أكتب برنامج لترتٌب مصفوفة بطرٌمة
using System;
namespace Selection_Sort
{
class Program
{
static void Selection(int[ ] arr)
{
for (int i = 0; i < arr.Length - 1; i++)
{
int mini_index = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[ j ] < arr[ mini_index ])
mini_index = j;
}
int temp = arr[ mini_index ];
arr[ mini_index ] = arr[ i ];
arr[ i ] = temp;
}
}
static void Main(string[ ] args)
{
int[ + x = , 5, 6, 2, 4, 1, 9, 3, 0 -;
Selection( x );
foreach ( int i in x )
Console.WriteLine( i );
}
}
}
ٕ27
Introduction to C# مقدمح نهثزمجح تانسً شارب
تتم عملٌة الترتٌب بهذه الطرٌمة بإفتراض أن المصفوفة عبارة عن جزئٌن ،جزء ُمرتب
والجزء اآلخر ال ،بحٌث أن أول عنصر فً المصفوفة ٌُع ّد أول جزء ُمرتب فٌها ثم
ننتمل إلى العنصر الذي ٌلٌه فإذا كان أصؽر منه فنبدّل العنصرٌن ببعضهما ثم ننتمل إلى
العنصر الثالث ونمارنه ببالً العناصر ونضعه فً مكانه الصحٌح وٌتم نمل بالً
العناصر الؽٌر ُمرتبّة إلى الٌمٌن خطوة واحدة لكل عنصر ،وتتكرر هذه العملٌة إلى أن
ٌتم ترتٌب المصفوفة.
* 9 , 3 ,4 , 23 , 10 , 1 , 5 +
ٕ22
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
.insertion أكتب برنامج لترتٌب مصفوفة بطرٌمة
using System;
namespace insertion_sort
{
class Program
{
public static void insertion(int[ ] arr)
{
for (int i = 1; i < arr.Length; ++i)
{
int key = arr[i];
int j = i - 1;
while ( j >= 0 && arr* j ] > key )
{
arr[ j + 1 ] = arr[ j ];
j = j - 1;
}
arr[ j + 1 ] = key;
}
}
static void Main(string[ ] args)
{
int[ + x = , 6 , 7 , 2 , 3 , 5 , 1 , 0 };
insertion( x );
foreach ( int i in x )
Console.WriteLine( i );
}
}
}
ٕ29
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٌتم الترتٌب بهذه الطرٌمة من خالل تمسٌم المصفوفة إلى نصفٌن وتمسٌم كل نصؾ
منهما إلى نصفٌن وهكذا ...حتى نحصل على كل عنصر فردي ثم بعد ذلن نعٌد دمجهم
مرة أخرى لكن بطرٌمة مرتبة ،فتظل الدالة التً ترتبهم تستدعً نفسها بداخل نفسها فً
النصؾ األٌسر واألٌمن حتى ٌتم ترتٌب المصفوفة كاملة.
ٕٓ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
: مثال
.Merge أكتب برنامج لترتٌب مصفوفة بطرٌمة
using System;
namespace Merge_Sort
{
class Program
{
static void merge( int [ ]arr, int left, int middle, int right)
{
int size1 = middle - left + 1;
int size2 = right - middle;
int [ +L = new int *size1+;
int [ +R = new int *size2+;
for (int i = 0; i < size1; ++i)
{
L[ i ] = arr[ left + i ];
}
for (int j = 0; j < size2; ++j)
{
R[ j ] = arr[ middle + 1 + j ];
}
int index1 = 0, index2 = 0;
int k = left;
while (index1 < size1 && index2 < size2)
{
if (L[ index1 ] <= R[ index2 ])
{
arr[ k ] = L[ index1 ];
index1++;
}
ٕ9ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
else
{
arr[ k ] = R[ index2 ];
index2++;
}
k++;
}
while (index1 < size1)
{
arr[ k ] = L[ index1 ];
index1++;
k++;
}
while (index2 < size2)
{
arr[ k ] = R[ index2 ];
index2++;
k++;
}
}
static void sort(int [ ]arr, int left, int right)
{
if (left < right)
{
int middle = ( left + right ) /2;
sort(arr, left, middle);
sort(arr , middle+1, right);
merge(arr, left, middle, right);
}
}
ٕ9ٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٕ9ٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Stack
الـ stackهو عبارة عن نظام معٌن أو طرٌمة معٌنة لتخزٌن البٌانات وإسترجاعها وال
ٌهم ما إذا كانت هذه البٌانات ستكون بـ Arrayأو ، Linked Listفمثال نفرض أنها
مصفوفة ،فتتم إضافة العناصر من آخر المصفوفة وتتم عملٌة اإلخراج أٌضا من آخر
المصفوفة ،أي أن آخر عنصر ٌُضاؾ هو أول عنصر ٌخرج ،وأول عنصر ٌضاؾ هو
آخر عنصر ٌخرج فٌتم عرض البٌانات التً بداخله بطرٌمة عكسٌة ،وتعمل موالع
وتطبٌمات ضخمة بنظام الـ stackمثل google , youtube , facebookحٌث أن
آخر عملٌة بحث لمت بها تكون فً لمة عملٌات البحث.
إخراج إدخال
3
2
1
ٕٗ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
Stack
4
3
2
1
0
Top -1
ٕ٘9
Introduction to C# مقدمح نهثزمجح تانسً شارب
Stack
4
3
2
1
-1
وعند إضافة عنصر للـ stackفإنه تزٌد لٌمة المتؽٌر Topبممدار 1أوال ثم تُضاؾ
المٌمة الجدٌدة ،وآخر لٌمة ٌصل إلٌها الـ Topهً حجم المصفوفة .1-
ٕ9ٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Stack
3 5000
2 4000
1 3000
0 2000
-1
نُ ِ
خرج المٌمة أوال ثم تنمص لٌمة المتؽٌر Topبممدار 1
فً هذا المثال ستخرج المٌمة 6000أوال ثم ٌنزل الـ Topإلى العنصر الذي بعده.
تظل لٌمة الـ Topتمل كلما أخرجنا عنصر من الـ stackإلى أن ٌصبح الـ stack
فارغ مجددا ،أي تكون لٌمة الـ Topسالب .1
ٕ97
Introduction to C# مقدمح نهثزمجح تانسً شارب
Stack
Top 3 5000
2 4000
1 3000
0 2000
-1
....وهكذا
: مثال
using System;
namespace ConsoleApplication4
{
class Program
{
static void Main( )
ٕ92
Introduction to C# مقدمح نهثزمجح تانسً شارب
{
Stack s = new Stack( 9 );
s.Push(1);
s.Push(7);
s.Push(5);
s.Push(4);
Console.WriteLine(s.Pop( )); // 4
Console.WriteLine(s.Pop( )); // 5
Console.WriteLine(s.Pop( )); // 7
s.Push(2);
Console.WriteLine(s.Pop( )); // 2
Console.WriteLine(s.Pop( )); // 1
Console.WriteLine(s.Pop( )); // stack is empty
}
}
class Stack
{ متؽٌر لحساب عدد
int top; stack عناصر الـ
int count;
int[ ] arr;
public Stack(int size) ) Constructor ( ُمشٌ ّد
{ ،stack ٌؤخذ مساحة الـ
top = -1; ونضع به المٌمة اإلبتدائٌة لـ
count = size; 1 بسالبTop
ٕ99
Introduction to C# مقدمح نهثزمجح تانسً شارب
else
;return false
}
) (bool is_Full دالة تفحص ما إذا كان
{ الـ stackممتلًء أم ال
) if ( top == count – 1
;return true
else
;return false دالة تضٌؾ عناصر فً الـ
} stackفتتؤكد أوال ما إذا كان
) public void Push( int value ممتلًء أم ال ،ألنه ال ٌجوز
{ ممتلًء إضافة عناصر به وهو
هذا مجرد شكل أولً للـ stackلٌُب ٌَن لن كٌفٌة تنفٌذه فمطٌُ ،مكنن أن تضٌؾ به الدوال
التً ترٌدها وتُعد َّل به كٌفما تشاء.
ٖٓٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Queue
الـ ٌ queueشبه الـ stackؼٌر أن الـ ٌ queueتعامل مع البٌانات بطرٌمة مختلفة للٌال
عن الـ .stack
تتم إضافة العناصر من آخر المصفوفة وتتم عملٌة الحذؾ أو اإلخراج من أول
ضاؾ هو آخر عنصر ٌُح َذؾ "ٌخرج" ،وأول عنصر المصفوفة ،أي أن آخر عنصر ٌُ َ
ضاؾ هو أول عنصر ٌُح َذؾ "ٌخرج" وٌتم عرض البٌانات التً بداخله بطرٌمة عادٌة ٌُ َ
ولٌست عكسٌة مثل الـ ،stackوٌسمى الـ queueبــ ) First in First Out ( FIFO
أي أن من ٌُضاؾ أوال ٌخرج أوال .فهو ببساطة ٌشبه الطابور َمن ٌؤتً أوال ٌذهب أوال.
إذا أردت إخراج الـ 2فٌجب أن تُخرج الـ 1أوال ألنه ُخ ِزنَ فً الـ queueلبلها.
مثلما كان ٌوجد متؽٌر فً الـ ٌُ stackستخدم فً عملٌات اإلدخال واإلخراج اسمه Top
فٌوجد أٌضا فً الـ queueمتؽٌرات تُستخدم لعملٌات اإلدخال واإلخراج لكن فً الـ
stackاإلدخال واإلخراج كان ٌحدث من نفس المكان فكان له مدخل واحد وأٌضا
المدخل كان نفسه هو المخرج أما فً الـ queueاألمر مختلؾ للٌال حٌث تدخل
البٌانات من مكان وتخرج من مكان آخرٌُ ،مكنن أن تشبهه بالطابور ،أول شخص
ٌخرج من الطابور هو أول شخص فً الطابور ثم الذي ٌلٌه وهكذا ،وإذا أراد شخص ما
الدخول فً الطابور فإنه ٌمؾ فً آخر الطابور ،إذا ٌوجد مكان للدخول ومكان مختلؾ
للخروج من الطابور ،فً هذه الحالة سنحتاج إلى متؽٌرٌن ولٌس متؽٌر واحد ،متؽٌر
مسئول عن إدخال العناصر ومتؽٌر مسئول عن إخراجها.
ٌُمكنن تسمٌة المتؽٌرات بؤي اسم فهً مجرد متؽٌرات.
ٖٔٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
First -1
Last -1
-عند إضافة أول عنصر فً الـ ٌ queueتحرن المتؽٌر Lastإلى أول خانة فً الـ
queueأي تزٌد لٌمته بممدار 1فتصبح 0وذلن هو أول ترلٌم فً المصفوفة.
Last = 0
120
First -1
تظل لٌمة المتؽٌر Firstكما هً سالب 1ألننا لم نخرج أي لٌم فٌظل والؾ خارج
الـ .queue
-عند إضافة عنصر آخر للـ queue
Last = 4
First -1
ٕٖٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
وهكذا...
ٌمتلًء الـ queueفً حالة أن الـ ٌ Lastساوي طول الـ queueنالص 1والـ First
ٌساوي سالب .1
-عند إخراج عنصر من الـ queueتزٌد لٌمة الـ Firstبممدار 1أي تصبح لٌمته 0
وعندها ٌخرج أول عنصر فً الـ .queue
وعند إخراج عنصر آخر تحدث نفس العملٌة فتزٌد لٌمة الـ Firstبممدار 1فً كل مرة
ُخرج العنصر التالً.
وٌ ِ
Last = 4
First = 4
فً الحالة العادٌة ال ٌُمكنن أن تضٌؾ عنصر آخر طالما أن الـ ٌ Lastمؾ عند آخر
خانة فً الـ queueحتى إذا كان الـ queueفارغ.
ٌوجد نوع آخر من الـ ٌُ queueسمى Circular queueوفً هذا النوع تستطٌع
إضافة عناصر أخرى حتى إذا كان الـ ٌ Lastمؾ عند آخر خانة فً الـ queueفهو
سٌعمل بطرٌمة دائرٌة فإذا كان أول عنصر فً الـ queueلد خرج فإن الـ ٌ Lastعود
إلى أول خانة وٌُضٌؾ فٌها.
ٖٖٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
89
110
10
70
35
19
80 65
100
7
First = 4
فً هذه الحالة إذا أردت إضافة عنصر جدٌد فٌجب أن ترجع لٌمة الـ Lastإلى 0مرة
أخرى
ٖٗٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
Last = 0
0
17
89
110
10
70
35
19
80 65
100
7
First = 4
ٖٓ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
First = 0
0
30
10
7
: مثال
using System;
namespace ConsoleApplication4
{
class Program
{
static void Main( )
{
Queue q = new Queue(5);
q.Enqueue(12);
q.Enqueue(5);
q.Enqueue(8);
Console.WriteLine( q.Dequeue());
Console.WriteLine(q.Dequeue());
Console.WriteLine(q.Dequeue());
q.Enqueue(12);
q.Enqueue(10);
Console.WriteLine(q.Dequeue());
}
}
class Queue
{
int first;
int last; متؽٌر لحساب عدد عناصر
int count = 0; وتزداد لٌمتهqueue الـ
كلما أضفنا عنصر وتمل
int length;
لٌمته كلما أخرجنا عنصر
int[ ] arr;
ٖٓ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٓ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٓ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
LinkedList
هً عبارة عن سلسلة مترابطة من العناصر ،تكون هذه العناصر مرتبطة مع بعضها
من خالل مإشرات فكل عنصر ٌُشٌر إلى مكان العنصر اآلخر الذي ٌلٌه ،تكون هذه
العناصر ُمخزنة بطرٌمة عشوائٌة فً الذاكرة بعكس المصفوفة التً تحجز عدد من
االماكن فً الذاكرة بطرٌمة متتالٌة.
أما المصفوفة فهً أسرع فً عملٌات البحث والوصول إلى العناصر ال ُمخزَ نة بها،
والـ linkedListال تمتلًء أبدا ،فكلما أضفت عنصر تضٌفه هً فً السلسلة بشكل
مباشر فهً لٌس لها حجم ثابت ،أما المصفوفة ٌجب أن تحدد لها الحجم ولو لم تحدد لها
سخ بها المصفوفة الحجم فإنه كلما تُدخل عنصر بها تُنشَؤ مصفوفة جدٌدة بحجم أكبر وتُن َ
المدٌمة ثم تُح َذؾ المدٌمة من خالل الـ ( .GC ) Garbage Collector
أما الـ LinkedListال ٌكون لها حجم ثابت فكلما أضفت عنصر بها تشٌر إلٌه فمط
وعندئ ٍذ ٌضاؾ إلى السلسلة مباشرة.
ٖٓٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
لنفترض أنه توجد سلسلة بها هذه العناصر ( ) 1 , 2 , 3 , 4 , 5ستكون بهذا الشكل :
head
tail null
nullهً كلمة محجوزة فً اللؽة وتعنً ال شًء ،أي أنه ال ٌوجد شًء بعد العنصر
األخٌر فً السلسلة.
فً حالة أن السلسلة ال ٌوجد بها عناصر فٌكون ٌ head , tailإشران على .null
وكما نرى كل عنصر ٌُشٌر إلى العنصر الذي بعده إلى أن نصل إلى آخر عنصر فً
السلسلة حٌث ٌُشٌر إلى .null
-فً حالة اإلضافة فً بداٌة السلسلة إضافة عنصر ( ) 6سٌكون بهذا الشكل :
head
6 tail
null
سنجعله ٌُشٌر إلى أول عنصر فً السلسلة وبعد ذلن نجعل الـ ٌ headإشر علٌه وبذلن
ٌرتبط بالسلسلة وٌكون العنصر 6هو أول عنصر فً السلسلة.
ٖٔٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
-فً حالة اإلضافة فً منتصؾ السلسلة أو فً أي موضع آخر بخالؾ البداٌة والنهاٌة :
tail
6 null
نجعل العنصر الجدٌد ٌُشٌر إلى العنصر التالً للموضع الذي حددناه.
head
null
6
وآخرا نجعل العنصر الذي ٌسبك الموضع المحدد أن ٌُشٌر إلى العنصر الجدٌد وهكذا
ٌضاؾ إلى السلسلة.
لو جعلنا العنصر الذي ٌسبك المكان المحدد أن ٌُشٌر أوال على العنصر الجدٌد ستمع
السلسلة من بعد هذا المكان ولن ٌبمى بها سوى العناصر التً تسبك الموضع المحدد.
ٕٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
tail 6
null
tail 6
null
ٖٖٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
tail 6
null
سنجعل العنصر الذي ٌسبك العنصر األخٌر ٌإشر مباشرة على nullوبذلن ٌصبح هو
آخر عنصر فً السلسلة أي الـ .tail
-فً حالة الحذؾ من منتصؾ السلسلة أو أي مكان فً السلسلة بخالؾ البداٌة والنهاٌة:
أوال نحدد موضع العنصر الذي سنحذفه ثم نجعل العنصر الذي ٌسبمه ٌشٌر إلى العنصر
الذي ٌلً العنصر الذي سنحذفه.
لنفترض أنه توجد سلسلة بها العناصر التالٌة ( ) 1 , 2 , 3 , 4 , 5
tail null
ٖٗٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
مثال :
;using System
namespace ConsoleApplication5
{
class node
{ ٌعبر عن العنصر الذي سٌُضاؾ إلى السلسلة أنشؤنا ّ class
;public int data وأنشؤنا به ٌ constructorؤخذ البٌانات ك ُمدخَل له وٌضٌفها
;public node next فً العنصر وعرفّنا مإشر وٌكون من نفس النوع الذي
)public node(int data سٌإشر علٌه وبما أنه سٌإشر على ( nodeعنصر ) فٌجب
{ أن ٌكون من نفسه نوعه لذا سٌكون نوعه ) node ( class
;this.data = data
}
}
class list
{ ٌعبر عن السلسلة وسٌكون به الدوال أنشؤنا ّ class
;node head, last الخاصة بالسلسلة وعرفّنا المإشر head, lastوٌكون
)public void insert_at_last(int data من نفس النوع الذي سٌإشر علٌه وبما أنه سٌإشر
{ على ( nodeعنصر ) فٌجب أن ٌكون من نفسه
;)node n = new node (data ال نوعه لذا سٌكون نوعه nodeفالعنصر الواحد
)if (head == null ٌوجد به بٌانات فمط بل ٌوجد به أٌضا مإشر ٌإشر
على العنصر الً ٌلٌه.
{
; head = n
; last = n
أنشؤنا دالة اإلضافة من النهاٌة وتؤخذ البٌانات ،فً
} حالة أن السلسلة ال ٌوجد بها عناصر أي أن الـ head
else ٌساوي nullنستدعً الـ constructorالذي أنشؤناه
{ فً node classونمرر له البٌانات ونجعل الـ head
; n.next = null ٌإشر علٌه ،أما إذا كان ٌوجد بها عناصر بالسلسلة
; last.next = n نجعل مإشر الـعنصر الجدٌد ٌإشر على nullثم
; last = n ثم نجعل مإشر الـ ٌ lastإشر على العنصر الجدٌد
} نجعل العنصر الجدٌد lastأي آخر عنصر فً السلسلة
}
ٖ٘ٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٔٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٔ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٔ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
else
{
if (index == 0)
head = head.next;
else
{
node temp = head;
for (int i = 0; i < index - 1; i++)
{
temp = temp.next;
}
temp.next = temp.next.next;
}
}
}
public void remove_from_last( )
هذه الدالة لحذؾ عنصر من نهاٌة السلسلة
{
if (is_Empty( ))
Console.WriteLine(" \t list is empty");
else if (head == last)
{
head = null;
last = null;
}
else
{
node current;
current = head;
node prev = head;
while (current.next != null)
{
prev = current;
current = current.next;
ٖٔ9
Introduction to C# مقدمح نهثزمجح تانسً شارب
}
last = prev;
prev.next = null;
}
}
public void remove_from_first( ) هذه الدالة لحذؾ عنصر من بداٌة السلسلة
{
if (is_Empty( ))
Console.WriteLine("\t list is empty");
else if (head == last)
{
head = null;
last = null;
}
else
{
head = head.next;
}
}
public void Swap_every_two_node_at_all_node()
{
هذه الدالة لتبدٌل كل عنصرٌن مع بعضهما
node curr = head; فً السلسلة
int temp;
while (curr != null && curr.next != null)
{
temp = curr.data;
curr.data = curr.next.data;
curr.next.data = temp;
curr = curr.next.next;
}
}
ٖٕٓ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕٔ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕٕ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕٖ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕٗ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕ٘
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕٙ
Introduction to C# مقدمح نهثزمجح تانسً شارب
ٖٕ7
Introduction to C# مقدمح نهثزمجح تانسً شارب
li.swap_two_nodes(index1, index2);
break;
case 15:
li.clear( );
break;
case 16:
Console.WriteLine(" the maximum value in the list = " +
li.max( ));
break;
case 17:
Console.WriteLine(" the Minimum value in the list = " +
li.mini( ));
break;
case 18:
li.sort_list( );
break;
case 0:
Console.WriteLine("\t \t\t Thanks for your Time ");
break;
default:
Console.WriteLine(" False choice ");
break;
}
}
while ( choice != 0 );
}
catch ( Exception ex )
{
Console.WriteLine( ex.Message );
}
}
}
}
ٖٕ2
Introduction to C# مقدمح نهثزمجح تانسً شارب
وآخرا...
لدر لً التوفٌك فً كتابة هذا الكتاب وأتمنى أن ٌكون لد نال إعجابكم
الحمد هلل الذي ّ
وخرج بشكل ٌُرضً الماريء ،ولد كان الكتاب بمثابة رحلة علمٌة ممتعة لإلرتماء
بموضوع الكتاب لذلن بذلت الكثٌر من الجهد فً إخراجه على المستوى المطلوب،
ولكنً ال أستطٌع أن الول أنه كتاب شامل وٌتصؾ بالكمال ،ألن كل شًء نالص
وٌحتاج إلى المزٌد لٌصل إلى مستوى مرتفع من العلم والمعرفة.
وإن كان هللا لد وفمنً فً كتابة هذا الكتاب فإنً أعتبر ذلن مكافؤة من هللا تعوٌضا منه
عما بذلته فٌه من جهد ،ولد كان ذلن هدفً منذ البداٌة وأتشرؾ أننً وصلت إلٌه.
ٖٕ9