יסודות התכנות בשפת C#‎ · פרק 11 — פעולות סטטיות ופונקציות⌂📚🏠
פרק 11

פעולות סטטיות ופונקציות

11.1 מבוא כללי לפעולות ולפונקציות

נסקור כמה פעולות (פונקציות), שלכל אחת מהן יש שם, קלט ופלט.

(שמות הפעולות והמשתנים נבחרו באופן שרירותי והם בבחינת דוגמאות)

(1) פעולת ההעלאה בריבוע: F(x) = x2

F(x) = x2העלאה בריבועxx239

(2) פעולת הממוצע: avg(x,y)=(x+y)/2

avg(x,y)=x+y2ממוצעxy42(x+y)23

(3) פעולת הערך הקטן ביותר: H(x,y,z) = Min(x,y,z)

H(x,y,z) = Min(x,y,z)הערךהקטן ביותר2x0.5y1zMin(x,y,z)0.5

11.2 הפעולות בתכנות

פעולה (Method): היא קטע קוד שלם שיש לו שם והוא פועל למטרה מסוימת.

הפעולה יכולה לקבל ערכים מסוימים שנקראים פרמטרים (בתור הקלט) והיא יכולה לתת תוצאה (להחזיר תוצאה בתור פלט). את קטע הפקודות הזה אפשר לכנות גם פונקציה. כמו כן אנחנו יכולים לקרוא לפעולה (קריאה) מכל מקום שנרצה במהלך התוכנית שלנו.

הערות:

סוגי הפעולות הסטטיות:

(a) דוגמה לפעולות שאינן מקבלות קלט ואינן מחזירות פלט:

פעולה שכאשר קוראים לה היא מדפיסה על המסך שתי שורות של כוכביות. למשל ניתן לה את השם stars.

לפעולה הזאת אין קלט כלשהו ואין לה ערך מוחזר (אינה מחזירה ערך), אבל כשאנחנו קוראים לה היא מדפיסה על המסך שתי שורות של כוכביות.

stars

נלמד בהמשך איך לבנות אותה, אבל כעת נניח שיצרנו אותה ונראה איך היא פועלת כשקוראים לה.

למשל, אם נרצה לבנות תוכנית שמדפיסה את שמנו בין שורות של כוכביות, נכתוב כך:

static void Main(string[] args)
{
  stars();
  Console.WriteLine("Hammam");
  stars();
}

והתוצאה על המסך תהיה:

Microsoft Visual Studio Debug Console
***********
***********
Hammam
***********
***********

(b) דוגמה לפעולות שאינן מקבלות קלט ומחזירות פלט:

פעולת "הטלת קובייה", למשל ניתן לה את השם nrd .

לפעולה הזאת אין קלט כלשהו אבל היא מחזירה ערך (יש לה ערך מוחזר). כשאנחנו קוראים לה היא נותנת לנו ערך מוחזר שהוא מספר אקראי מן הקבוצה הבאה (1,2,3,4,5,6)

nrdמספר שלם אקראימ-1 עד 6הטלת קובייה

בקריאה לפעולה הזאת (הפעלת הפעולה) נקבל ערך שלם מ-1 עד 6 (כולל 1 ו-6)

למשל, בקריאה לה נקבל את המספר 6, ובקריאה נוספת נקבל 2, וכך הלאה....

(c) דוגמה לפעולות שמקבלות קלט ואינן מחזירות פלט:

פעולה שמקבלת מספר שלם (קלט) ומדפיסה על המסך את המילה Hi כמה פעמים, לפי המספר השלם שהוזן לפעולה הזאת. למשל ניתן לפעולה הזאת את השם y

yקלט מספרשלם

דוגמה:

3y(3)הפעולה y לא תחזיר ערךאבל היא תדפיס על המסךאת המילה Hi 3 פעמים כך:HiHiHi

דוגמה לקריאה לפעולה הזאת ולהפעלתה (הפעולה y) בתוך תוכנית:

static void Main(string[] args)
{
    int n = 2;
    y(3);
    Console.WriteLine("##########");
    y(n);
}

על המסך יודפס:

C:\Users\Hammam\source\repos
Hi
Hi
Hi
##########
Hi
Hi

דוגמה נוספת:

פעולת השהייה (delay) שנקרא לה delay ונבנה אותה למשל כך שתקבל בקלט שלה מספר שמבטא את משך ההמתנה ביחידות של מילישניות, והפעולה נמשכת את הזמן הזה עד שהמחשב עובר לביצוע הפקודה שאחרי הפעולה הזאת.

הפעולה הזאת אינה מחזירה ערך.

tdelay( t )פעולה שאינה מחזירה ערךבקריאה לה, אלא גורמתלהמתנה של המחשב למשךהזמן שהוזן לה.

(d) דוגמה לפעולות שמקבלות קלט ומחזירות פלט:

פעולה שמקבלת מספר עשרוני ומחזירה את ערכו המוחלט, נקרא לה absolute. הפעולה הזאת מקבלת מספר עשרוני בקלט שלה ומחזירה מספר עשרוני בפלט שלה, שהוא הערך המוחלט של מספר הקלט.

xabsolute(x)|x|

למשל:

-2.5absolute(x)2.5
absolute(4.8) => 4.8
absolute(-9) =>9
absolute(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();
}

התוצאה תהיה:

C:\Users\Hammam\source\repos
res=6
res=2.5
result is: 7

אחרי שהבנו מהם הסוגים האפשריים של הפעולות הסטטיות, נלמד איך אפשר לבנות וליצור את הפעולות האלה.

11.3 בניית הפעולה

נבנה את הפעולה מחוץ למסגרת הפעולה הראשית Main, והיא חייבת לכלול את הדברים הבאים:

לכל פעולה עלינו לקבוע את הדברים הבאים:

  1. טיפוס הנתונים שהפעולה הזאת מחזירה.
  2. שם הפעולה.
  3. טיפוס הנתונים שהפעולה הזאת מקבלת ושם המשתנים שבהם נשמרים הנתונים האלה מן הקלט.
  4. גוף ומבנה הפעולה (פקודות הפעולה).
  5. אם יש ערך שהפעולה הזאת מחזירה, חייבת להיות פקודת return (החזרה) לערך הזה בתוך גוף ומבנה הפעולה.
(1)(2)(3)staticטיפוס הנתוניםהמוחזרשם הפעולה(טיפוס הנתוניםבקלט){גוף ומבנה הפעולה(פקודות הפעולה)(4)(5)returnהערך שהפעולההזאת מחזירה;}
המילה השמורה static פירושה שהפעולה שייכת למחלקה (למחלקה כללית מסוימת) ואינה שייכת לעצם מסוים, כך שאנחנו יכולים להשתמש בה, להפעיל אותה ולקרוא לה בלי שתהיה שייכת לעצם (אין עצם שמפעיל אותה באמצעות פעולת הנקודה dot).

דוגמה: נבנה פעולת העלאה בריבוע למספרים שלמים (העלאה בחזקת 2):

הפעולה מקבלת מספר שלם שנשים בין הסוגריים ומעלה אותו בחזקת 2 (כלומר מחזירה את ריבועו).

static int Pow2(int x)
{
    return x * x;
}

(1) טיפוס הנתונים המוחזר:

זהו טיפוס הנתונים שהפעולה מחזירה למי שקרא לפעולה הזאת והפעיל אותה. טיפוס הנתונים המוחזר יכול להיות: int, double, char , string , int[] , bool , char[] ...

אם הפעולה הזאת אינה מחזירה ערך, נציב את טיפוס הנתונים void .

(2) שם הפעולה:

זה השם שאנחנו כותבים כדי לקרוא לפעולה ולהפעיל אותה. שם הפעולה לא יתחיל בספרה, אסור שיכיל תווים פרט לקו התחתון _, ואסור ששם הפעולה יהיה אחת מן המילים השמורות של השפה.

הפעולה פועלת מכל מקום שבו מופיע שמה (שבו קוראים לה), וראוי לציין שהיא אינה פועלת במקום שבו היא מוגדרת.

(3) טיפוס הנתונים בקלט:

הפרמטרים שהפעולה מקבלת, והם משתנים שמוגדר להם טיפוס. יש לבחור את שם הפרמטר ואת טיפוסו, ובקריאה לפעולה נשלחים ערכים שמוצבים בתוך הפרמטרים האלה. הפעולה יכולה לקבל פרמטר אחד, שניים, שלושה או יותר ....

למשל:

static void example (int num, double avg, int[] arr, string name)
{

}

אם הפעולה אינה מקבלת ערכים, לא נכתוב דבר בתוך הסוגריים והם יהיו ריקים ( ) .

(4) גוף ומבנה הפעולה (פקודות הפעולה):

גוף הפעולה הוא שורות תכנות ופקודות C#‎ (קוד), והפעולה מבצעת את השורות האלה כאשר קוראים לה.

אנחנו יכולים לכתוב הכול בגוף הפעולה (פקודות לולאה, מערכים, הגדרת משתנים, הדפסה, קליטת ערכים, פעולות, חישובים, קריאה לפעולה אחרת מתוך הפעולה הזאת, ואפילו אפשר לקרוא לפעולה עצמה מתוך הפעולה הזאת, כך שהיא קוראת לעצמה).

(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. כל משתנה שמוגדר בתוך הפעולה (הפונקציה) קיים רק בתוך הפעולה, ואי אפשר להשתמש בו מחוץ לפעולה הזאת (כי הוא אינו מוגדר מחוץ לה).
  2. אפשר להגדיר ולהשתמש באותו שם משתנה בכמה פעולות (כי בכל פעולה זה משתנה שונה, ואין לו קשר לשאר המשתנים שנושאים את אותו שם אבל בפעולות אחרות), וזאת מן הסיבה שצוינה בסעיף הקודם (סעיף 1)
  3. בקריאה לפעולה כדי להפעיל אותה, עלינו לכתוב את שמה ולשלוח לה את הפרמטרים הנדרשים בקלט שלה באופן שמתאים לטיפוס הפרמטרים האלה, ולפי אותו מספר ואותו סדר של הגדרת הפרמטרים האלה.

11.4 הפעלת הפעולות והשימוש בהן בתוך התוכנית הראשית 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
}

דוגמה:

(א) הגדר פעולה שמקבלת תו ומספר שלם ומחזירה את התו שהמספר הסידורי שלו גדול מזה של התו שהפעולה הזאת קיבלה, בשיעור המספר השלם שהיא קיבלה.

'A'3Nxtchr'D'
'e'1Nxtchr'f'
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);
}
C:\Windows\system32\cmd.exe
Insert your name: rb7i
your new name is: sb7i
Press any key to continue . . .
כללים ואזהרות:
  • קריאה לפעולה מחייבת אותנו לכתוב את שמה כפי שהוגדר, ולשלוח לה את הפרמטרים הנדרשים בסדר שנקבע לפי הגדרת קבלת הפרמטרים שלה ובאותה כמות (מספר) של פרמטרים.
  • אם הפעולה מחזירה ערך מסוים ואנחנו רוצים לשמור את הערך הזה, עלינו לאחסן אותו במשתנה שמתאים לטיפוס הערך המוחזר.
  • טיפוס הפרמטרים שנשלחים לפעולה בקריאה לה חייב להיות זהה לטיפוס שהוגדר לקליטתו כפרמטר בין הסוגריים בעת הגדרת הפעולה.

11.5 יישום ודוגמאות לבניית פעולות מן הסוגים השונים ולקריאה להן

(a) פעולות שאינן מקבלות קלט ואינן מחזירות פלט:

כדוגמה ראשונה אפשר להתייחס לפעולה הראשית שכתבנו ועבדנו איתה קודם כאל פעולה שאינה מקבלת קלט ואינה מחזירה פלט

static void Main( )
{
   Console.WriteLine("Hello everyone");
}

פעולה ששמה Main, והיא הפעולה הראשית, אינה מחזירה ערך (void) והיא רק מדפיסה על המסך את המשפט הבא: Hello everyone

דוגמה:

נבנה פעולה שמדפיסה על המסך מסגרת של כוכביות שכתוב בה Program By: Hammam, כחותמת שנוכל להשתמש בה בתוכנית הראשית. כלומר היא מדפיסה על המסך את הדברים הבאים:

*********************************************
***********   Program By: Hammam. ***********
*********************************************

ניתן לפעולה את השם stamp, והיא פעולה שאינה מקבלת קלט (אינה מקבלת נתונים) ואינה מחזירה ערך.

נבנה אותה כך:

static void stamp( )
{
    Console.WriteLine("*********************************************");
    Console.WriteLine("***********   Program By: Hammam. ***********");
    Console.WriteLine("*********************************************");
}

כעת, בכל פעם שנרצה להציב את המסגרת הזאת על המסך במהלך התכנות שלנו, נוכל לקרוא לפעולה. נקרא לפעולה בתוך התוכנית הראשית שלנו Main.

דוגמה לקריאה לפעולה בתוך התוכנית Main:

static void Main( )
{
    stamp();
    int x = 3;
    Console.WriteLine("our program is here ....");
    Console.WriteLine(x+2);
    stamp();
}

תוצאת הפעלת הפעולה Main היא:

C:\Users\Hammam\source\repos\ConsoleApp44\ConsoleApp44\bin\Debug\netcoreapp3.1\ConsoleApp44.exe
*********************************************
***********   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;
}

נכתוב את הפעולה הזאת כפעולה עצמאית מחוץ לתוכנית הראשית שלנו 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());
}

התוצאה תהיה:

C:\Users\Hammam\source\repos
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);
    }
}
C:\Windows\system32\cmd.exe
7&-4
Press any key to continue . . .

(d) פעולות שמקבלות קלט ומחזירות פלט:

למשל, אם נבנה את פעולת הערך המוחלט ונקרא לה Absolute, היא מקבלת מספר עשרוני ומחזירה את הערך המוחלט של המספר הזה.

Absolute(x) מחזירה את הערך המוחלט (מספר חיובי) של המספר העשרוני x .

num = Absolute(3);      =>   num = 3
num = 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));
}
C:\Windows\system32\cmd.exe
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 ?

התוצאה שתופיע על המסך היא:

C:\Windows\system32\cmd.exe
***
+++
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);
}

כעת מהי תוצאת הפעלת התוכנית?

התוצאה היא:

C:\Windows\system32\cmd.exe
***
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

דוגמה 11.1
(א) כתוב פעולה שמקבלת מערך של מספרים עשרוניים ומחזירה את המספר הגדול ביותר במערך הזה.
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);
}

תוצאת הפעלת התוכנית הראשית היא:

C:\Windows\system32\cmd.exe
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
דוגמה 11.2
(א) כתוב פעולה ששמה BuildArr, שמקבלת מספר שלם כפרמטר שמייצג את מספר איברי פיבונאצ'י הרצוי. על הפעולה להחזיר מערך שמספר התאים שלו (גודלו) זהה למספר שקיבלה, ובכל תאי המערך הזה יהיו מספרי סדרת פיבונאצ'י. (את סדרת פיבונאצ'י למדנו קודם בנושא הלולאות והסדרות).
(ב) כתוב פעולה ששמה 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
        }
    }
}
דוגמה 11.3
(א) כתוב פעולה ששמה Appearance, שמקבלת תו ומחרוזת, ועל הפעולה הזאת להחזיר את מספר הפעמים שהתו הזה מופיע במחרוזת.
(ב) כתוב תוכנית ראשית Main שקולטת מן המשתמש משפט ותו, ובעזרת הפעולה מן הסעיף הקודם על התוכנית להדפיס על המסך כמה פעמים התו הזה מופיע במשפט שקלטנו.
(ג) עבור הקלט הבא:
המחרוזת: Hammam והתו הוא: m
מה תהיה תוצאת הפעלת התוכנית? בנה טבלת מעקב.
פתרון:
מספור פקודות התוכנית בטבלת המעקב: פקודות הפעולה Appearance ממוספרות 1–8, ופקודות Main ממוספרות 9–15.
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));
}
C:\Windows\system32\cmd.exe
Insert a char: m
Insert a sentence: Hammam
The char m appears in Hammam 3 times!

טבלת המעקב בעמוד הבא.

מספר הפקודהsectavsentencecntii<6Sentence[i] == tav
9,10
11,12mInsert a char: m
13,14HammamInsert a sentence: Hammam
15The char m appears in Hammam
15->1mHammam
15->20
15->30
15->4true
15->6false
15->5,41true
15->6false
15->5,42true
15->6true
15->71
15->5,43true
15->6true
15->72
15->5,44true
15->6false
15->5,45true
15->6true
15->73
15->5,46false
15->8
The char m appears in Hammam 3 times!
תרגיל 1
(א) כתוב פעולה שמקבלת כפרמטר שני מערכים באורך 10 תאים שמכילים מספרים שלמים ומקבלת גם מספר שלם num. על הפעולה להחזיר את המערך שבו המספר num שקיבלה מופיע מספר גדול יותר של פעמים.
(ב) כתוב תוכנית ראשית שבה נבנים המערכים הבאים:
A={90,87,100,98,100,99,75,68,100,92};
B={80,100,93,95,80,58,85,80,75,80};

על התוכנית לקלוט מן המשתמש מספר ולהשתמש בפעולה מן הסעיף (א) כדי לקבל את המערך שבו המספר מופיע יותר פעמים, ואז הדפס את איברי המערך הזה.

תרגיל 2
(א) כתוב פעולה שמקבלת מערך של מספרים שלמים כפרמטר ומקבלת מספר שלם כפרמטר. הפעולה מחזירה את מספר הפעמים שהמספר מופיע בתאי המערך.
(ב) כתוב תוכנית ראשית Main שמגדירה את המערך n שמכיל את המספרים הבאים: {4,-3,4,8,2,-12,16,4,9,2,0} וקולטת מן המשתמש מספר שלם, ואז מדפיסה על המסך את מספר הפעמים שהמספר שקלטנו מן המשתמש מופיע במערך, בעזרת הפעולה מן הסעיף הקודם.
(ג) כתוב תוכנית ראשית אחרת Main שמגדירה את המערך n שמכיל מספרים אקראיים בתחום 1-6 (תוצאה של הטלת קובייה למשל) באמצעות Random וקולטת מן המשתמש מספר שלם, ואז מדפיסה על המסך את מספר הפעמים שהמספר שקלטנו מן המשתמש מופיע במערך, בעזרת הפעולה מן הסעיף (א).

11.7 סיכום ותרגילים פתורים

ולבסוף נביא סיכום של הכלל:

יש להכריז על הפעולה (להגדיר אותה) ולכתוב את פקודותיה כך:

voidintdoublecharboolint[ ]…הערך המוחזרstaticשם הפעולה(הפרמטרים שהפעולה מקבלתוטיפוס הפרמטרים האלה){גוף הפעולה.מכיל את פקודות הפעולה(הקוד)}
תרגיל 11.4
(א) כתוב פעולה שמקבלת שני מספרים שלמים ומחזירה את שטח המלבן ששני המספרים האלה הם אורכי צלעותיו.
aba*bהשטח =
static int AreaRec(int a, int b)
{
    int s;
    s = a*b;
    return s;
}

(ב) כתוב פעולה שמקבלת שני מספרים שלמים ומחזירה את שטח המשולש ששני המספרים האלה הם אורך הבסיס שלו ואורך הגובה לבסיס הזה.

xyx*y2השטח =
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!");
}
תרגיל 11.5
כתיבת פעולות חיצוניות סטטיות (static).
(א) כתוב פעולה חיצונית סטטית (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");
        }
    }
}
המאם ותד (أ. همام وتد) — כל זכויות הספר שמורות למחבר. הספר נכתב בערבית, ותרגם אותו לעברית פהד גאנם. המהדורה העברית מתפרסמת באישור המחבר, עם תיקונים שאישר. ליצירת קשר עם המחבר: hammam4112@gmail.com