العمليات الساكنة والدوال
11.1 مقدمة عامة للعمليات والدوال – מבוא כללי לפעולות ולפונקציות
نستعرض بعض العمليات (الدوال) التي لكل منها اسم، مُدخلات ومُخرج.
(أسماء العمليات والمُتغيرات تم اختيارها بشكل اختياري وهي بمثابة أمثلة)
(1) عملية التربيع: F(x) = x2
- اسم العملية:
F - هدف العملية (عملها): الرفع للقوة 2 (تعمل تربيع).
- المُدخلات: رقم حقيقي واحد
x - المُخرج (النتيجة): الرقم المُدخل مرفوعا للقوة 2 ( x2 )
(2) عملية المُعدل: avg(x,y)=(x+y)/2
- اسم العملية:
avg - هدف العملية (عملها): حساب مُعدل رقمين.
- المُدخلات: رقمين حقيقيين وهما:
x,y - المُخرج (النتيجة): مُعدل الرقمين
xوy
(3) عملية القيمة الصُغرى: H(x,y,z) = Min(x,y,z)
- اسم العملية:
H - هدف العملية (عملها): إيجاد الرقم الأصغر.
- المُدخلات: 3 أرقام حقيقية
x,y,z. - المُخرج (النتيجة): تُعيد أصغر رقم من بين الأرقام المُدخلة.
11.2 العمليات في البرمجة – הפעולות בתכנות
العملية (פעולה/Method): هي مقطع برمجي كامل له اسم ويعمل لأجل هدف مُحدد.
العملية يمكنها الحصول على قيم مُعينة تسمى بارامترات (بمثابة المُدخلات) ويمكنها أن تُعطي نتيجة (تُعيد نتيجة بمثابة مُخرج). هذا المقطع من الأوامر يمكن تسميته أيضا دالة (פונקציה). كما أننا نستطيع النداء للعملية (استدعاء) من أي مكان نريد خلال برنامجنا.
ملاحظات:
- هناك عمليات لا تحصل على مُدخلات (لا يتم اعطاؤها بارامترات في مُدخلاتها) ولكننا نستطيع أن نستدعيها وأن نحصل على نتيجة (مُخرج).
مثال: عملية "القاء حجر النرد" هي عملية تختار رقماً صحيحاً بين 1 و 6 وتعيد هذا الرقم. - هناك عمليات لا تعيد لنا نتيجة ولكنها تطبع على الشاشة (مُخرجها هو طباعة على الشاشة وليس إعادة قيمة لمن يستدعي هذه العملية).
مثال: عملية تطبع على الشاشة جملة مُعينة.
مثال آخر: عملية تحصل في مُدخلاتها على مصفوفة أحادية البُعد وهذه العملية تطبع على الشاشة كل حدود المصفوفة.
أنواع العمليات الثابتة:
- (a) عمليات لا تأخذ مُدخلات ولا تعيد مُخرجات.
- (b) عمليات لا تأخذ مُدخلات وتعيد مُخرجات.
- (c) عمليات تأخذ مُدخلات ولا تُعيد مُخرجات.
- (d) عمليات تأخذ مُدخلات وتُعيد مُخرجات.
(a) مثال على عمليات لا تأخذ مُدخلات ولا تعيد مُخرجات:
عملية عند استدعائها تطبع على الشاشة سطرين من النجوم. مثلا نطلق عليها اسم stars.
هذه العملية ليس لها أي مُدخلات وليس لها أي قيمة مُعادة (لا تُعيد قيمة) ولكنها عندما نستدعيها تطبع على الشاشة سطرين من النجوم.
سنتعلم لاحقا كيف نبنيها، ولكننا الان نفرض أننا أنشأناها وسنرى كيف تعمل عند استدعائها.
مثلا إذا أردنا ان نبني برنامج يطبع اسمنا بين أسطر النجوم نكتب ما يلي:
static void Main(string[] args)
{
stars();
Console.WriteLine("Hammam");
stars();
}stars();— استدعاء العمليةstarsstars();— استدعاء العمليةstars
وستكون النتيجة على الشاشة ما يلي:
*********** *********** Hammam *********** ***********
(b) مثال على عمليات لا تأخذ مُدخلات وتعيد مُخرجات:
عملية "القاء حجر النرد"، مثلا نطلق عليها اسم nrd .
هذه العملية ليس لها أي مُدخلات ولكنها تُعيد قيمة (لها قيمة مُعادة)، عندما نستدعيها تعطينا قيمة مُعادة هي رقم عشوائي من المجموعة التالية (1,2,3,4,5,6)
عند استدعاء هذه العملية (تشغيل العملية) نحصل على قيمة صحيحة من 1 حتى 6 (يشمل 1 و 6)
مثلا عند استدعائها نحصل على الرقم 6 وعند استدعائها مرة أخرى نحصل على 2 وهكذا....
(c) مثال على عمليات تأخذ مُدخلات ولا تُعيد مُخرجات:
عملية تستقبل رقم صحيح (مُدخل) وتقوم بطباعة الكلمة Hi على الشاشة مكررة عددا من المرات حسب الرقم الصحيح المُدخل الى هذه العملية. مثلا نطلق على هذه العملية الاسم y
مثال:
مثال على استدعاء وتشغيل هذه العملية (العملية y) ضمن برنامج:
static void Main(string[] args)
{
int n = 2;
y(3);
Console.WriteLine("##########");
y(n);
}سيتم طباعة ما يلي على الشاشة:
Hi Hi Hi ########## Hi Hi
مثال آخر:
عملية انتظار (השהייה – delay) نسميها delay ونبنيها مثلا بحيث تأخذ بمُدخلاتها رقماً يُعبر عن مدة الانتظار بوحدات ميلي ثانية والعملية تستغرق هذه المُدة حتى ينتقل الحاسوب لتنفيذ الأمر الذي يلي هذه العملية.
هذه العملية لا تُعيد قيمة.
(d) مثال على عمليات تأخذ مُدخلات وتُعيد مُخرجات:
عملية تستقبل رقم عشري وتُعيد قيمته المُطلقة، نُسميها absolute. هذه العملية تأخذ رقما عشرياً في مُدخلاتها وتُعيد رقماً عشريا في مُخرجاتها الذي هو القيمة المُطلقة للرقم من المُدخل.
مثلا:
absolute(4.8) => 4.8absolute(-9) =>9absolute(0)=> 0سنبني برنامج فيه استدعاء للطريقة absolute :
static void Main(string[] args)
{
double x = 2.5, y= -7;
double res;
res = absolute(-6);
Console.WriteLine("res={0}",res);
res = absolute(x);
Console.WriteLine("res={0}", res);
Console.WriteLine("result is: {0}",absolute(y));
Console.ReadLine();
}النتيجة ستكون ما يلي:
res=6 res=2.5 result is: 7
بعد أن فهمنا ما هي الأنواع الممكنة للعمليات الثابتة سنتعلم كيف يمكننا بناء وإنشاء هذه العمليات.
11.3 بناء العملية – בניית הפעולה
نبني العملية خارج إطار العملية الرئيسية Main ويجب أن تحتوي على ما يلي:
لكل عملية يتوجب علينا تحديد ما يلي:
- نوع البيانات (טיפוס) التي تعيدها هذه العملية.
- اسم العملية.
- نوع البيانات (טיפוס) التي تحصل عليها هذه العملية واسم المُتغيرات التي تُخزن فيها هذه البيانات من المُدخلات.
- جسم ومبنى العملية (أوامر العملية).
- إذا كانت هناك قيمة تُعيدها هذه العملية يجب أن يكون هناك أمر
return(إعادة) لهذه القيمة داخل جسم ومبنى العملية.
static تعني أن العملية تتبع للفئة (لفئة عامة معينة) ولا تتبع لكائن مُعين، حيث نستطيع استعمالها وتشغيلها واستدعاءها بدون ان تكون تابعة لكائن (لا يشغلها كائن بواسطة العملية نقطة dot).مثال: نبني عملية تربيع للأعداد الصحيحة (الرفع للقوة 2):
العملية تستقبل رقم صحيح نضعه بين الأقواس وترفعه للقوة 2 (أي تُعيد تربيعه).
static int Pow2(int x)
{
return x * x;
}int— العملية تُعيد رقم صحيح.Pow2— اسم العملية.(int x)— العملية تحصل على رقم صحيح الذي يتم تخزينه داخل المُتغيرxمن نوعint.x * x— رقم صحيح تُعيده العملية.
(1) نوع البيانات المُعادة:
هو عبارة عن نوع البيانات التي تُعيدها العملية لمن استدعى هذه العملية وشغلها. نوع البيانات المُعادة يمكن أن يكون: int, double, char , string , int[] , bool , char[] ...
int[]مصفوفة كاملة من الأرقام الصحيحة.char[]مصفوفة كاملة من الرموز.
اذا كانت هذه العملية لا تُعيد قيمة فإننا نضع نوع البيانات void .
(2) اسم العملية:
هو الاسم الذي نكتبه لكي نستدعي العملية ونُشغلها. يجب أن لا يبدأ اسم العملية برقم، ويُمنع أن يحتوي رموزا عدا الخط السفلي _ ويُمنع أن يكون اسم العملية احدى كلمات اللغة المحفوظة.
العملية تعمل من كل مكان يكون فيه ظهور اسمها (حيث يتم استدعائها) ومن الجدير بالذكر أنها لا تعمل في المكان الذي فيه تعريفها.
(3) نوع البيانات المُدخلة:
البرامترات التي تحصل عليها العملية وهي متغيرات يتم تعريف نوعها. يجب اختيار اسم البرامتر ونوعه، وعند استدعاء العملية يتم ارسال قيم يتم وضعها داخل هذه البرامترات. العملية تستطيع أن تحصل على برامتر واحد، اثنان، ثلاثة أو أكثر ....
مثلا:
static void example (int num, double avg, int[] arr, string name)
{
}int num— البرامتر الأول الذي تأخذه العملية ونوعه، اسم البرامتر هوnum.double avg— البرامتر الثاني الذي تأخذه العملية ونوعه.int[] arr— البرامتر الثالث الذي تأخذه العملية ونوعه.string name— البرامتر الرابع الذي تأخذه العملية ونوعه.,— فاصلة.
اذا كانت العملية لا تأخذ قيماً فإننا لا نكتب أي شي داخل الأقواس ويكون فارغا ( ) .
(4) جسم ومبنى العملية (أوامر العملية):
جسم العملية هو أسطر من البرمجة وأوامر سي شارب (كود)، هذه الأسطر تنفذها العملية في حال تم استدعاء العملية.
نستطيع كتابة كل شيء في جسم العملية (أوامر تكرار، مصفوفات، نعرف مُتغيرات، طباعة، استقبال قيم، عمليات، حسابات، استدعاء عملية أخرى من داخل هذه العملية، وحتى يمكننا استدعاء العملية نفسها من داخل هذه العملية حيث تستدعي نفسها).
(5) الأمر return والقيمة التي تُعيدها العملية:
إذا كانت العملية تُعيد قيمة (حيث نُعرف نوع القيمة المُعادة قبل كتابة اسمها عند بناء العملية)، أي نوع القيمة المُعادة ليس void فانه يجب على العملية أن تحتوي على أمر return وتنتهي به والتي تعني أعد قيمة.
القيمة المُعادة بعد return يجب أن تكون ملائمة لنوع القيمة المُعادة الذي تم تعريفه قبل اسم العملية.
مثال:
اكتب عملية (دالة) التي تحصل على 3 أرقام صحيحة وتُعيد مُعدل هذه الأرقام
static double Avg3(int x, int y, int z)
{
double avg;
avg = (double)(x + y + z) / 3;
return avg;
}وبكتابة مُختصرة يمكن كتابة ما يلي:
static double Avg3(int x, int y, int z)
{
return (double)(x+y+z)/3;
}ملاحظات مهمة:
- كل مُتغير يتم تعريفه داخل العملية (الدالة) يكون موجوداً فقط داخل العملية ولا يُمكن استخدامه خارج هذه العملية (لأنه غير معرف خارجها).
- يمكن تعريف واستخدام نفس اسم المُتغير في عدة عمليات (لأنه يكون في كل عملية المُتغير مُختلف ولا علاقة له مع باقي المُتغيرات التي تحمل نفس اسمه لكن بعمليات أخرى) وذلك للسبب المذكور بالبند السابق (بند 1)
- عند استدعاء عملية لكي نُشغلها يجب أن نكتب اسمها وأن نُرسل لها البارامترات المطلوبة في مُدخلاتها بشكل يلائم نوع هذه البارامترات وحسب نفس عدد وترتيب تعريف هذه البارامترات.
11.4 تشغيل العمليات واستعمالها ضمن البرنامج الرئيسي Main – הפעלת הפעולות ושימוש בהן בתוך Main
بعد ان تعلمنا أن نبني العمليات، نستطيع أن نستعملها ونستدعيها (أن نشغلها) ضمن برنامج Main حيث تقوم بأداء وظيفتها. فمثلا إذا أردنا تشغيل عملية كتبناها مسبقا يجب أن نستدعيها وذلك بكتابة اسمها وارسال البارامترات المطلوبة لها (مُدخلاتها).
مثال:
static int Pow2(int x)
{
return x * x;
}
static void Main(string[] args)
{
int x, y, z;
x = Pow2(4); // x = 16
z = Pow2(-3); // z = 9
y = Pow2(z); // y = 81
Console.WriteLine("{0}", Pow2(2)); // سيتم طباعة 4
Console.WriteLine(Pow2(-5)); // سيتم طباعة 25
}مثال:
(أ) عرف عملية تحصل على رمز ورقم صحيح وتُعيد الرمز الذي رقمه التسلسلي أكبر من الرمز الذي استقبلته هذه العملية بمقدار الرقم الصحيح الذي استقبلته.
static char Nxtchr(char x, int n)
{
char newtav;
newtav = (char)((x + n) % 128); // %128 is for cycling
return newtav;
}(ب) اكتب برنامج Main يستخدم العملية Nxtchr لكي يستقبل اسم مستخدم (user name) ويطبع على الشاشة اسم مستخدم جديد مطابق للاسم الذي استقبله ولكن الحرف الأول في المستخدم الجديد هي ليست الحرف الأصلية ولكن الحرف التي تليها مباشرة
أمثله: اذا استقبلنا Karem نطبع Larem ، أما اذا استقبلنا Abed نطبع Bbed ، أما اذا استقبلنا Samir نطبع Tamir وأما اذا استقبلنا rb7i نطبع sb7i
static void Main(string[] args)
{
string name;
Console.Write("Insert your name: ");
name = Console.ReadLine();
name = Nxtchr(name[0], 1) + name.Substring(1, name.Length - 1);
Console.WriteLine("your new name is: {0}",name);
}Insert your name: rb7i your new name is: sb7i Press any key to continue . . .
- استدعاء عملية يتطلب منا أن نكتب اسمها كما تم تعريفها، وأن نرسل لها البارامترات المطلوبة بالترتيب المُحدد حسب تعريف تلقيها للبارامترات وبنفس كمية (عدد) البارامترات.
- إذا كانت العملية تُعيد قيمة مُعينة ونريد أن نحفظ هذه القيمة علينا تخزينها بمُتغير يُلائم نوع القيمة المُعادة.
- على نوع البارامترات المُرسلة للعملية عند استدعائها أن يكون مطابقا للنوع الذي تم تعريفه عند استقباله كبارامتر بين الأقواس عند تعريف العملية.
11.5 تطبيق وأمثلة لبناء العمليات من الأنواع المُختلفة واستدعائها – יישום ודוגמאות לבניית פעולות מן הסוגים השונים ולקריאה להן
(a) عمليات لا تأخذ مُدخلات ولا تعيد مُخرجات:
كمثال أولي يمكننا ان نعتبر العملية الرئيسية التي كنا نكتبها وتعاملنا معها سابقا عملية لا تأخذ مُدخلات ولا تُعيد مُخرجات
static void Main( )
{
Console.WriteLine("Hello everyone");
}void— لا تُعيد قيمة.Main— اسم العملية.( )— لا تأخذ مُدخلات.
عملية لها اسم وهو Main وهي العملية الرئيسية ولا تُعيد قيمة (void) وهي فقط تطبع على الشاشة الجملة التالية: Hello everyone
مثال:
نبني عملية تطبع على الشاشة اطاراً من النجوم فيه مكتوب Program By: Hammam كختم نستطيع استعماله في البرنامج الرئيسي. أي تطبع على الشاشة ما يلي:
********************************************* *********** Program By: Hammam. *********** *********************************************
نُسمى العملية stamp وهي عملية لا تأخذ مُدخلات (لا تأخذ بيانات) ولا تُعيد قيمة.
نبنيها على النحو التالي:
static void stamp( )
{
Console.WriteLine("*********************************************");
Console.WriteLine("*********** Program By: Hammam. ***********");
Console.WriteLine("*********************************************");
}- العملية لا تأخذ قيمة (بين الأقواس بعد اسم
stamp) أي لا يوجد أي بارامترات كمُدخلات. - العملية لا تُعيد قيمة لأننا كتبنا أن نوع البيانات المُعادة هو
void، وكما يظهر لدينا أن العملية لا تحتوي بداخلها الأمرreturn. - نكتب هذه العملية كعملية مستقلة خارج برنامجنا الرئيسي Main وليس داخله.
الان نستطيع كلما أردنا وضع هذا الإطار على الشاشة ضمن برمجتنا أن نستدعي العملية. نستدعي العملية ضمن برنامجنا الرئيسي Main.
مثال على استدعاء العملية ضمن برنامج Main كالتالي:
static void Main( )
{
stamp();
int x = 3;
Console.WriteLine("our program is here ....");
Console.WriteLine(x+2);
stamp();
}نتيجة تشغيل عملية Main هي ما يلي:
********************************************* *********** Program By: Hammam. *********** ********************************************* our program is here .... 5 ********************************************* *********** Program By: Hammam. *********** *********************************************
(b) عمليات لا تأخذ مُدخلات وتعيد مُخرجات:
نبني عملية "القاء حجر نرد" وهي عملية لا تأخذ مُدخلات ولكنها تُعيد لنا قيمة (تُعطي مُخرج) وهو رقم عشوائي من 1 الى 6. نطلق عليها مثلا اسم zhr (من كلمة حجر الزهر).
مبنى العملية هو:
static int zhr( )
{
int n;
Random rnd = new Random();
n = rnd.Next(1, 7);
return n;
}int— نوع المُعطيات المُعادة.zhr— اسم العملية.( )— اقواس فارغة أي أن العملية لا تأخذ باراميترات (لا تأخذ مُدخلات).return n;— العملية تُعيد قيمة (قيمةn) من نوعint.
نكتب هذه العملية كعملية مستقلة خارج برنامجنا الرئيسي Main وليس داخله.
الان نستطيع كلما اردنا القاء حجر نرد والحصول على رقم عشوائي من 1-6 أن نستدعي عملية zhr() دون أن نعطيها مُدخلات (ليس لها مُدخلات).
مثال:
static void Main( )
{
int n;
Console.Write("First attempt: ");
n = zhr();
Console.WriteLine(n);
Console.Write("Second attempt: ");
Console.WriteLine(zhr());
}n = zhr();— العملية لم تأخذ أي مُدخلات كما نلاحظ (بين الاقواس لا يوجد شيء) والعملية تُعيد قيمة أي لها قيمة حيث نخزن قيمتها بواسطة عملية التعويض = داخل المتغيرn.zhr()— العملية لها قيمة مُعادة والتي نطبعها مباشرة.
النتيجة ستكون:
First attempt: 1 Second attempt: 3
(c) عمليات تأخذ مُدخلات ولا تُعيد مُخرجات:
نبني عملية تحصل على رقمين صحيحين وتطبع هذين الرقمين بينهما الرمز &
class Program
{
static void PrntWithTav(int x, int y)
{
Console.WriteLine("{0}&{1}", x, y);
}
static void Main(string[] args)
{
PrntWithTav(7, -4);
}
}7&-4 Press any key to continue . . .
(d) عمليات تأخذ مُدخلات وتُعيد مُخرجات:
مثلا إذا بنينا العملية القيمة المطلقة ونسميها Absolute تأخذ رقما عشريا وتعيد القيمة المطلقة لهذا الرقم.
Absolute(x) تُعيد القيمة المُطلقة (عدد موجب) للرقم العشري x .
num = Absolute(3); => num = 3num = Absolute(-7.3); => num = 7.3يجب تعريف نوع (טיפוס) القيمة التي تُعيدها العملية (int, double, char, …) ولكن هنا العملية تُعيد عدد عشري (double) لأنها تستقبل عددا عشريا.
العملية Absolute نبنيها على النحو التالي:
static double Absolute(double x)
{
if (x >= 0)
return x;
else
return -x;
}يمكن تشغيلها على النحو التالي:
static void Main(string[] args)
{
Console.WriteLine(Absolute(-4));
}4 Press any key to continue . . .
تمرين:
نبني العملية التالية:
static int Elakbr(int x, int y)
{
if (x > y)
return x; // it returns x because x is bigger
else
return y; // it returns y because y is bigger or equal
}إذا أردنا استعمال هذه العملية (الدالة) واستدعاها بواسطة البرنامج التالي:
static void Main(string[] args)
{
Console.WriteLine("***");
Elakbr(3, 6); // it returns 6
Console.WriteLine("+++");
Elakbr(-1, -11); // it returns -1
}ماذا سيظهر على الشاشة بعد تشغيل البرنامج Main ؟
النتيجة التي ستظهر على الشاشة هي:
*** +++ Press any key to continue . . .
وذلك لأننا لم نستعمل القيمة التي تمت اعادتها من العملية، حيث لم نطبعها ولا حفظناها في مُتغير.
أما إذا أردنا استعمال القيمة المُعادة من العملية يمكننا التعديل على البرنامج على النحو التالي:
static void Main(string[] args)
{
int num;
Console.WriteLine("***");
num = Elakbr(3, 6); // it returns 6
Console.WriteLine(num);
Console.WriteLine("+++");
num = Elakbr(-1, -11); // it returns -1
num += 10;
Console.WriteLine(num);
}الان ما هي نتيجة تشغيل البرنامج؟
النتيجة هي:
*** 6 +++ 9 Press any key to continue . . .
11.6 عمليات ودوال تتعامل مع المصفوفات والجمل النصية – פעולות ופונקציות שמטפלות במערכים ובמחרוזות
11.6.1 العمليات والمصفوفات – הפעולות והמערכים
يمكننا ارسال المصفوفة للعملية كبارامتر كما أنه يمكننا أن نُعيد مصفوفة كناتج تفعيل العملية.
لإرسال المصفوفة كبارامتر علينا ان نضع نوع المصفوفة واسم البارامتر (اسم المصفوفة في العملية) في أقواس البارامترات المُتلقاه بواسطة العملية، مثلا اذا كانت العملية Example ستأخذ مصفوفة كبارامتر ولن تعيد أي قيمة سنكتبها على النحو التالي:
static void Example(int[] arr)
{
//هنا نكتب مبنى العملية
}نتذكر أننا دائما نستطيع معرفة طول المصفوفة بواسطة استعمال اسمها والعملية Length مثلا arr.Length سيكون عدد خانات المصفوفة arr (طولها).
يمكننا أن نجري عمليات على المصفوفات وأن تُعيد هذه العمليات قيما ويمكن أن تكون القيمة المُعادة مصفوفة أيضا، مثلا العملية Example تُعيد مصفوفة (نفترض لا تأخذ أي بارامترات رغم انه نستطيع أن نعرفها كعملية تأخذ بارامترات عند الحاجة) وستكون على النحو التالي:
static int[] Example()
{
int[] msfofa = new int[10];
//هنا نكتب مبنى العملية
return msfofa;
}كما يظهر لدينا على المصفوفة التي تعيدها العملية أن تكون موجودة (اما تتلقاها كبارامتر أو يتم تعريفها داخل العملية) ثم نستخدم أمر إعادة القيمة ونرسل المصفوفة بواسطة اسمها.
بالمثال رأينا مصفوفات من نوع عدد صحيح int [ ] ولكننا كنا نستطيع ان نجعل العملية تتلقى أي نوع من المصفوفات double [ ] و char [ ] الخ .. وكذلك بالنسبة للمصفوفة المُعادة يمكن أن تكون أي نوع مصفوفة.
لفهم الموضوع تطبيقيا سنضع أمثلة على ذلك بالصفحة التالية
11.6.2 العمليات والجمل النصية string – הפעולות והמחרוזות
يمكننا ارسال الجمل النصية للعملية كبارامتر كما أنه يمكننا أن نُعيد جُملة نصية كناتج تفعيل العملية.
يوجد أهمية لاستعمال العمليات بالتعامل مع الجمل النصية في البرمجة. سنرى بالأمثلة بالصفحة التالية عمليات فيها استعمال نوع البيانات جمل نصية.
11.6.3 أمثلة على عمليات ودوال تتعامل مع المصفوفات والجُمل النصية – דוגמאות לפעולות שמטפלות במערכים ובמחרוזות
سنضع أمثله لمسائل فيها عمليات تتعامل مع مصفوفات وجمل نصية ويتم استخدامها في البرنامج الرئيسي Main
static double MaxInArray(double[] nums)
{
double max = nums[0];
for(int i=1; i<nums.Length;i++)
{
if (nums[i] > max)
max = nums[i];
}
return max;
}(ب) اكتب برنامج رئيسي فيه يتم استقبال 12 رقم عشريا وتخزينها في مصفوفة واستعمال العملية من الفرع السابق لإيجاد وطباعة أكبر رقم في المصفوفة (أكبر رقم تم استقباله).
static void Main(string[] args)
{
double[] a = new double[12];
double max;
for(int i=0;i<12;i++)
{
Console.Write("Insert a number: ");
a[i] = double.Parse(Console.ReadLine());
}
max = MaxInArray(a);
Console.WriteLine("The maximum in the array is: {0}",max);
}نتيجة تشغيل البرنامج الرئيسي هي:
Insert a number: 11 Insert a number: 4 Insert a number: -2.5 Insert a number: 17.4 Insert a number: 32 Insert a number: -90 Insert a number: 32.7 Insert a number: -70 Insert a number: 1 Insert a number: 0 Insert a number: -1 Insert a number: 2 The maximum in the array is: 32.7
(ب) اكتب عملية اسمها PrntArr تستقبل مصفوفة وتطبعها على الشاشة.
(ج) استعمل العمليتان من الفرعين السابقيين لكتابة برنامج رئيسي يستقبل من المستخدم رقما صحيحا يمثل عدد حدود فيبوناتشي المرغوب طباعته على الشاشة ويطبع حدود فيبوناتشي المطلوب
using System;
namespace ConsoleApp1
{
class Program
{
static int[] BuildArr(int n)
{
int[] fib = new int[n];
if (n == 1) fib[0] = 1;
else if (n == 2)
{
fib[0] = 1;
fib[1] = 1;
}
else
{
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < n; i++)
{
fib[i] = fib[i - 1] + fib[i - 2];
}
}
return fib;
}
static void PrntArr(int[] arr)
{
for(int i=0;i<arr.Length;i++)
{
Console.Write("{0}|",arr[i]);
}
Console.WriteLine();
}
static void Main(string[] args)
{
int num;
Console.WriteLine("Insert a number: ");
num = int.Parse(Console.ReadLine());
int[] arr = new int[num]; // A
arr = BuildArr(num); // B
PrntArr(arr); // C
// we can remove rows A,B,C and use row D
PrntArr(BuildArr(num)); // D
}
}
}(ب) اكتب برنامج رئيسي Main يستقبل من المستخدم جُملة ورمزاً، وباستخدام العملية من الفرع السابق على البرنامج أن يطبع على الشاشة كم مرة يظهر هذا الرمز من الجملة التي استقبلناها.
(ج) للمُدخلات التالية:
الجملة النصية: Hammam والرمز هو: m
ماذا سيكون نتيجة تشغيل البرنامج؟ ابنِ جدول متابعة.
static int Appearance(char tav, string sentence)
{
int cnt = 0;
for (int i = 0; i < sentence.Length; i++)
{
if (sentence[i] == tav)
cnt++;
}
return cnt;
}
static void Main(string[] args)
{
string se;
char c;
Console.Write("Insert a char: ");
c = char.Parse(Console.ReadLine());
Console.Write("Insert a sentence: ");
se = Console.ReadLine();
Console.WriteLine("The char {0} appears in {1} {2} times!",c,se,Appearance(c,se));
}Insert a char: m Insert a sentence: Hammam The char m appears in Hammam 3 times!
جدول المتابعة في الصفحة التالية.
| رقم الأمر | se | c | tav | sentence | cnt | i | i<6 | Sentence[i] == tav | |
|---|---|---|---|---|---|---|---|---|---|
| 9,10 | |||||||||
| 11,12 | m | Insert a char: m | |||||||
| 13,14 | Hammam | Insert a sentence: Hammam | |||||||
| 15 | The char m appears in Hammam | ||||||||
| 15->1 | m | Hammam | |||||||
| 15->2 | 0 | ||||||||
| 15->3 | 0 | ||||||||
| 15->4 | true | ||||||||
| 15->6 | false | ||||||||
| 15->5,4 | 1 | true | |||||||
| 15->6 | false | ||||||||
| 15->5,4 | 2 | true | |||||||
| 15->6 | true | ||||||||
| 15->7 | 1 | ||||||||
| 15->5,4 | 3 | true | |||||||
| 15->6 | true | ||||||||
| 15->7 | 2 | ||||||||
| 15->5,4 | 4 | true | |||||||
| 15->6 | false | ||||||||
| 15->5,4 | 5 | true | |||||||
| 15->6 | true | ||||||||
| 15->7 | 3 | ||||||||
| 15->5,4 | 6 | false | |||||||
| 15->8 | |||||||||
| The char m appears in Hammam 3 times! |
(ب) اكتب برنامج رئيسي فيه يتم بناء المصفوفات التالية:
A={90,87,100,98,100,99,75,68,100,92};B={80,100,93,95,80,58,85,80,75,80};على البرنامج أن يستقبل من المستخدم رقما ويستخدم العملية من الفرع (أ) للحصول على المصفوفة التي يتكرر فيها الرقم ظهورا اكثر من المرات، ثم اطبع حدود هذه المصفوفة.
(ب) اكتب برنامج رئيسي Main يُعرف المصفوفة n والتي تحتوي على الأرقام التالية: {4,-3,4,8,2,-12,16,4,9,2,0} ويستقبل من المُستخدم رقما صحيحا ثم يطبع على الشاشة عدد مرات ظهور الرقم الذي استقبلناه من المُستخدم في المصفوفة وذلك بالاستعانة بالعملية من الفرع السابق.
(ج) اكتب برنامج رئيسي آخر Main يُعرف المصفوفة n والتي تحتوي على أرقاما عشوائية بالمجال 1-6 (نتيجة القاء حجر نرد مثلا) بواسطة استخدام Random ويستقبل من المُستخدم رقما صحيحا ثم يطبع على الشاشة عدد مرات ظهور الرقم الذي استقبلناه من المُستخدم في المصفوفة وذلك بالاستعانة بالعملية من الفرع (أ).
11.7 تلخيص وتمارين محلولة – סיכום ותרגילים פתורים
وأخيرا سنضع مُلخص للقانون:
يجب الإعلان (تعريف) العملية وكتابة أوامرها على النحو التالي:
static int AreaRec(int a, int b)
{
int s;
s = a*b;
return s;
}(ب) اكتب عملية تحصل على رقمين صحيحين وتُعيد مساحة المثلث الذي يشكل هذان الرقمان طول القاعدة فيه وطول الارتفاع على هذه القاعدة.
static double AreaTri(int x, int y)
{
double s;
s = (x * y) / 2.0;
return s;
}(ج) اكتب برنامج يسأل المستخدم مساحة أي يشكل يريد أن يحسب مساحته (مساحة مستطيل أم مساحة مُثلث) وتطلب منه رقمين يمثل كل واحد منهما المُدخلات المطلوبة لحساب المساحة وعلى البرنامج أن يطبع على الشاشة المساحة المطلوبة للشكل.
static void Main(string[] args)
{
char tav;
int num1, num2;
Console.Write("Insert the first number: ");
num1 = int.Parse(Console.ReadLine());
Console.Write("Insert the second number: ");
num2 = int.Parse(Console.ReadLine());
Console.Write("Shape area: for rectangle insert r for triangle insert t");
tav = char.Parse(Console.ReadLine());
if(tav=='r')
Console.WriteLine("The area is: {0}",AreaRec(num1,num2));
else if(tav=='t')
Console.WriteLine("The area is: {0}", AreaTri(num1, num2));
else
Console.WriteLine("you inserted wrong letter!");
}(أ) اكتب عملية خارجية ثابتة (static) اسمها IsBin تأخذ رقما صحيحاً وتُعيد true إذا كان الرقم يصلح أن يكون رقما في الميزان الثنائي بينما تُعيد false إذا كان الرقم الصحيح الذي حصلت عليه العملية لا يمكنه أن يكون رقما في الميزان الثنائي. (العملية تأخذ رقما صحيحا (int) وتُعيد قيمة true أو false (بولاينيه bool).)
(ب) اكتب عملية اسمها Bin2Dec تأخذ رقما صحيحاً وتعتمد على العملية من الفرع السابق لكي تفحص إذا كان الرقم يمكنه أن يكون في الميزان الثنائي أم لا، حيث أنه إذا كان يمكنه ان يكون في الميزان الثنائي فإنها تُعيد قيمة الرقم في الميزان العشري أما إذا كان الرقم لا يمكنه أن يكون في الميزان الثنائي فإن العملية ستُعيد القيمة 1- وتكتب على الشاشة أن الرقم لا يمكنه أن يكون في الميزان الثنائي.
(ج) اكتب عملية اسمها Dec2Bin تأخذ رقما صحيحاً في الميزان العشري وتحول هذا الرقم الى رقما في الميزان الثنائي وتُعيد هذا الرقم (إما كجملة string أو كرقم int حسب اختيارك).
(د) اكتب برنامج يسأل المستخدم في أي ميزان يريد ادخال رقم (إما عشري d أو ثنائي b) وعلى البرنامج أن يحوله على النحو التالي: إذا استقبلنا رقماً عشريا من المستخدم نحوله لرقم ثنائي ونطبع النتيجة. إذا استقبلنا رقما ثنائيا من المستخدم نحوله لرقم عشري ونطبع النتيجة.
using System;
namespace ConsoleApp109
{
class Program
{
// Part (A) **************************************
static bool IsBin(int num)
{
int digit;
digit = num % 10;
while (num > 0)
{
if (digit != 1 && digit != 0)
{
return false;
}
num = num / 10;
digit = num % 10;
}
return true;
}
// Part (B) **************************************
static int Bin2Dec(int num)
{
int dig = 0, weight = 1, result = 0;
if (IsBin(num))
{
while (num > 0)
{
dig = num % 10;
result += dig * weight;
num = num / 10;
weight *= 2;
}
return result;
}
else
{
Console.WriteLine("It`s can`t be binary");
return -1;
}
}
// Part (c) ***************************************
static string Dec2Bin(int num)
{
int d;
string res = "";
while (num > 0)
{
d = num % 2;
res = d + res;
num = num / 2;
}
return res;
}
// Part (d) ***************************************
static void Main(string[] args)
{
char x;
Console.WriteLine("Press d for decimal or b for binary");
x = char.Parse(Console.ReadLine());
if (x =='d')
{
Console.Write("Enter a decimal number: ");
Console.WriteLine("The number in binary is: {0}",Dec2Bin(int.Parse(Console.ReadLine())));
}
else if (x=='b')
{
Console.Write("Enter a binary number: ");
Console.WriteLine("The number in decimal is: {0}", Bin2Dec(int.Parse(Console.ReadLine())));
}
else
Console.WriteLine("You must press d or b");
}
}
}