יסודות התכנות בשפת C#‎ · פרק 6 — פקודות לולאה⌂📚🏠
פרק 6

פקודות לולאה

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

נלמד כיצד לחזור על פקודות בשתי דרכים:

  1. לולאת while
  2. לולאת for

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

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

6.1 לולאת while

עלינו לזכור תמיד ולהעלות על דעתנו ש-while פירושה כל עוד.

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

מבנה לולאת while:

פקודות ערך התחלתי   ;

while ( תנאי הלולאה )
{
        ....
        ....
    פקודות לחזרה *
        ....
        ....
}

(*) פקודות הלולאה כוללות פקודה שמשפיעה על תנאי הלולאה. (פקודת קידום).

מתי נשתמש בלולאת while?:

אפשר להשתמש בלולאת while במקרים הבאים:

  1. פקודות לולאה המותנות בתנאי מסוים (בלי מונה), שהן בדרך כלל קליטת נתונים עם תנאי עצירה, למשל קליטת מספרים עד שנקלוט את המספר השלילי הראשון (קליטת מספר שלילי היא תנאי העצירה). (זה השימוש הנפוץ והמומלץ בלולאת while).
    באופן כללי, אם השתמשנו ב-while במקרה זה (תנאי עצירה), כדאי שנקלוט נתונים פעם אחת מחוץ ללולאה, לפני ה-while, כלומר לפני שנגיע לתנאי הלולאה.
  2. פקודות לולאה המותנות במונה מסוים ( i למשל), שבהן אנו מציבים פקודת אתחול למונה לפני while, מציבים את התנאי בסוגריים ( ) אחרי המילה while, ואז עלינו להציב פקודות שמשנות את ערך המונה (מקדמות או מחזירות אותו) בתוך הפקודות המיועדות לחזרה שנמצאות בתוך הסוגריים המסולסלים, כדי להשפיע על התנאי כך שהחזרה תיפסק בשלב מסוים (אחרי מספר מסוים של פעמים).
אתחול המונה ;

while ( תנאי הלולאה )
{
        ....
        ....
    פקודות לחזרה
        ....
        ....
    פקודת קידום למונה.
}
  1. פקודות לולאה אינסופיות.
  2. פקודות לולאה התלויות בהתרחשות אירוע מסוים, הקשורה בהרמת דגל מסוים flag (תוצאה מסוימת).
שאלה 6.1: במחשב של מרים התקלקל לחצן הכפל, ומרים רוצה לבנות תוכנית שקולטת שני מספרים שלמים חיוביים ומדפיסה על המסך את מכפלתם. כתוב את התוכנית הזאת עבור מרים.

פתרון:

static void Main(string[] args)
{
  int num1, num2, i=1, result=0;
  Console.Write("Insert a number: ");
  num1 = int.Parse(Console.ReadLine());
  Console.Write("Insert another number: ");
  num2 = int.Parse(Console.ReadLine());

  while(i<=num2)
  {
      result = result + num1;  // חיבור מצטבר
      i++;                     // i=i+1;
  }
  Console.WriteLine("{0} * {1} = {2}",num1,num2,result);
}

תוצאת הרצת התוכנית עבור הקלטים 3 ו-7:

Microsoft Visual Studio Debug Console
Insert a number: 3
Insert another number: 7
3 * 7 = 21
שאלה 6.2: פתור שוב את התרגיל הקודם, אבל התוכנית צריכה לקלוט שני מספרים שלמים כלשהם (לא בהכרח חיוביים) ולהדפיס את מכפלתם. (בלי להשתמש בפעולת הכפל).
שאלה 6.3: כתוב תוכנית שקולטת מן המשתמש שני מספרים שלמים ומדפיסה את כל המספרים הזוגיים שבין שני המספרים האלה (כולל הקצוות). (הדפס כל מספר בשורה חדשה)
הערה: לא הכרחי ששני המספרים יהיו שונים, לא הכרחי שהמספר הקטן יינתן ראשון, וגם המספרים יכולים להיות שליליים.

פתרון:

static void Main(string[] args)
{
   int num1, num2, i,max;
   Console.Write("insert the first number: ");
   num1 = int.Parse(Console.ReadLine());
   Console.Write("insert the second number: ");
   num2 = int.Parse(Console.ReadLine());
   i = Math.Min(num1, num2);
   max = Math.Max(num1, num2);
   while (i<=max)
   {
       if(i%2==0)
           Console.WriteLine(i);

       i++;
   }
}

תוצאת פעולת התוכנית עבור הקלט 3 ו-−4

Microsoft Visual Studio Debug Console
insert the first number: 3
insert the second number: -4
-4
-2
0
2
שאלה 6.4: כתוב תוכנית שקולטת שני מספרים שלמים חיוביים ומדפיסה על המסך את תוצאת הפעולה ab . אסור להשתמש במחלקה Math
שאלה 6.5: כתוב תוכנית שקולטת 10 ציונים של התלמיד, והתוכנית צריכה להדפיס את הדוח הבא:
  • מספר המקצועות שבהם יש אי-הצלחה (מתחת ל-55).
  • מספר המקצועות שבהם יש הצלחה. (55 ומעלה).
  • ממוצע התלמיד.
  • הציון הגבוה ביותר שקיבל התלמיד.
  • הציון הנמוך ביותר שקיבל התלמיד.
שאלה 6.6: כתוב תוכנית שקולטת מספרים חיוביים או 0 ועוצרת כאשר מוזן המספר השלילי הראשון. התוכנית צריכה להדפיס את הדברים הבאים:
  • המספר הכולל של המספרים שהוזנו בסדרה בלי המספר השלילי (כלומר כמות המספרים שאינם שליליים).
  • ממוצע המספרים שאינם שליליים (כלומר ממוצע המספרים שאינם שליליים).
  • המספר הגדול ביותר בסדרה זו.
שאלה 6.7: כתוב תוכנית שקולטת מן המשתמש שני מספרים שלמים ומדפיסה את כל המספרים הזוגיים שבין שני המספרים האלה (כולל הקצוות). יש להדפיס אותם בשורה אחת, ובין מספר למספר פסיק, ואילו אחרי המספר האחרון באה נקודה.
הערה: לא הכרחי ששני המספרים יהיו שונים, לא הכרחי שהמספר הקטן יינתן ראשון, וגם המספרים יכולים להיות שליליים.
דוגמה: אם הוזנו 8 ו-−3 יודפס: -2,0,2,4,6,8.

פתרון:

static void Main(string[] args)
{
    int num1, num2, i,max;
    Console.Write("insert the first number: ");
    num1 = int.Parse(Console.ReadLine());
    Console.Write("insert the second number: ");
    num2 = int.Parse(Console.ReadLine());
    i = Math.Min(num1, num2);
    max = Math.Max(num1, num2);
    if (max % 2 != 0)
        max = max-1;
    while (i<=max)
    {
        if(i%2==0 && i!= max)
            Console.Write("{0},",i);
        else if(i%2==0 && i==max)
            Console.WriteLine("{0}.", i);
        i++;
    }
}

תוצאת הרצת התוכנית שלמעלה עבור הקלט 9 ו-−11

Microsoft Visual Studio Debug Console
insert the first number: 9
insert the second number: -11
-10,-8,-6,-4,-2,0,2,4,6,8.
שאלה 6.8: כתוב תוכנית שקולטת מספר מן המשתמש ומדפיסה על המסך אם מספר זה ראשוני או לא. דוגמה: אם קלטנו את המספר 9 היא תדפיס Not prime, ואילו אם קלטנו את המספר 29 היא תדפיס Prime
(מספר ראשוני הוא מספר שמתחלק חלוקה שלמה רק בעצמו וב-1).

6.2 לולאת for

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

for)פקודת אתחול;תנאי הלולאה;פקודת קידום(125847{....פקודות לחזרה36....}פקודות מחוץ ללולאה(המשך התוכנית) *9

פקודת האתחול (פקודה מספר 1) מתבצעת רק פעם אחת בהתחלה, לפני בדיקת התנאי (בלי קשר לשאלה אם התנאי מתקיים או לא), ואז אנו בודקים את התנאי (2). אם התנאי מתקיים (true), אנו נכנסים לביצוע הפקודות לחזרה (3), ואחרי ביצוע הפקודות לחזרה (3) אנו חוזרים ומבצעים את פקודת הקידום (פקודה 4, שהיא פקודת שינוי המונה), ואז בודקים שוב את התנאי (5). אם התנאי מתקיים (true) אנו נכנסים לביצוע פקודות הלולאה (6) ואחריהן מבצעים את פקודת הקידום (7). תמיד אחרי ביצוע פקודת הקידום אנו בודקים את התנאי (8), ואם התנאי מתקיים ממשיכים בלולאה וכך הלאה. אבל אם התנאי אינו מתקיים (הפך ל-false), לא ניכנס אל הסוגריים המסולסלים לביצוע פקודות הלולאה, אלא נדלג עליהם ונגיע אל הפקודות שמחוץ ללולאה (נקפוץ אל מחוץ ללולאה) ונמשיך את התוכנית (פקודות 9 * )

שאלה 6.9: כתוב תוכנית שקולטת מן המשתמש מספר שלם ומדפיסה על המסך את המשפט הבא: Hello Hammam, החוזר על עצמו כמספר הפעמים שהזין המשתמש.

פתרון:

static void Main(string[] args)
{
    int i, n;
    Console.Write("Insert a number: ");
    n = int.Parse(Console.ReadLine());
    for (i =1;i<=n;i++)
        Console.WriteLine("Hello Hammam");
}

6.3 השוואה בין לולאת for ללולאת while

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

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

פקודת אתחול למונה ;while (תנאי הלולאה){....פקודות לחזרה....פקודת קידום, כלומרשינוי ערך המונה}for (פקודת אתחוללמונה;תנאי הלולאה;פקודת קידום, כלומרשינוי ערך המונה){....פקודות לחזרה....}

נכתוב לולאה של 10 פעמים:

לולאה של 10 פעמים בצורת for
int i;
for(i=1;i<=10;i++)
 Console.WriteLine("Hammam");
לולאה של 10 פעמים בצורת while
int i;
i = 1;
while(i<=10)
{
  Console.WriteLine("Hammam");
  i++;
}
שאלה 6.10: כתוב תוכנית שקולטת 10 ציונים ומדפיסה על המסך את ממוצע הציונים האלה.
  1. בעזרת while
  2. בעזרת for

פתרון:

(א)

static void Main(string[] args)
{
    int mark,i=1,sum=0;
    double avg ;

    while(i<=10)
    {
        Console.WriteLine("Insert a mark: ");
        mark = int.Parse(Console.ReadLine());
        sum += mark;
        i++;
    }
    avg = (double)sum / 10;
    Console.WriteLine("The average is: {0}",avg);
}

(ב)

static void Main(string[] args)
{
    int mark,i,sum=0;
    double avg ;

    for(i=1;i<=10;i++)
    {
        Console.WriteLine("Insert a mark: ");
        mark = int.Parse(Console.ReadLine());
        sum += mark;
    }
    avg = (double)sum / 10;
    Console.WriteLine("The average is: {0}",avg);
}
שאלה 6.11: כתוב תוכנית שקולטת מספר שלם חיובי או אפס, מחשבת את העצרת של מספר זה ומדפיסה אותה על המסך בצורה הבאה:
<number>!=<result>

למשל:

אם קלטנו את המספר 5, הפלט יהיה: 5!=120

תזכורת:

העצרת במתמטיקה: אם n הוא מספר שלם חיובי או אפס (n טבעי), אזי העצרת היא:
0! = 1
n! = (1)(2)⋯(n−2)(n−1)n
5! = 5 x 4 x 3 x 2 x 1 = 120
6! = 6x5x4x3x2x1=6x5!=720
n! = n x (n−1)!

פתרון:

static void Main(string[] args)
{
    int n,res=1,i;
    Console.Write("Insert a positive number: ");
    n = int.Parse(Console.ReadLine());
    if (n == 0)
        Console.WriteLine("{0}!=1", n);
    else
    {
        for (i = 1; i <= n; i++)
            res = res * i;

        Console.WriteLine("{0}!={1}", n, res);
    }
}

טבלת מעקב לתוכנית העצרת:

טבלת מעקב כאשר קולטים את הקלט n=5.

n=5
הפקודהnresiהתנאיתנאי הלולאההפלט
int n,res=1,i;1
Console.Write("Insert a positive number: ");1Insert a positive number:
n = int.Parse(Console.ReadLine());51
if (n == 0)51F
else51
i = 1;511
i <= n511T
res = res * i;511
i++;512
i <= n512T
res = res * i;522
i++;523
i <= n523T
res = res * i;563
i++;564
i <= n564T
res = res * i;5244
i++;5245
i <= n5245T
res = res * i;51205
i++;51206
i <= n51206F
Console.WriteLine("{0}!={1}", n, res);512065!=120

6.4 הפקודה break

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

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

for(;תנאי הלולאה;){פקודות הלולאה...............if(תנאי אחר(מצב מסוים))break;פקודות הלולאה..............}פקודה ראשונה מחוץ ללולאה(מחוץ למסגרת הלולאה)while(תנאי הלולאה){פקודות הלולאה...............if(תנאי אחר(מצב מסוים))break;פקודות הלולאה..............}פקודה ראשונה מחוץ ללולאה(מחוץ למסגרת הלולאה)

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

דוגמה 6.1
for (int i = 1; i <= 100; i++)
{
    Console.WriteLine(i);
    if (i == 5)
        break;
}
int i = 1;
while(true)
{
    Console.WriteLine(i);
    if (i == 5)
        break;
    i++;
}

שני הקטעים האלה מדפיסים את המספרים מ-1 עד 5 (כולל 1 ו-5)

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

פתרון:

static void Main()
{
  double total = 0, salary;
  int i;
  for (i = 1; i <= 12; i++)
  {
      Console.Write("Insert your salary in month {0}: ", i);
      salary = double.Parse(Console.ReadLine());
      if (salary == 0)   // העובד אינו עובד עוד בחברה
          break;
      total += salary;
  }
  if (i < 13)      // i!=13
      Console.WriteLine("You worked only {0} months,and you earned:{1}",i-1,total);
  else
      Console.WriteLine("You earned a {0} in this year.",total);
}

הרצת התוכנית במקרה שבו מגיעים לביצוע הפקודה break:

Microsoft Visual Studio Debug Console
Insert your salary in month 1: 50
Insert your salary in month 2: 100
Insert your salary in month 3: 350
Insert your salary in month 4: 0
You worked only 3 months,and you earned:500

6.5 הפקודה continue

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

הפקודה continue היא פקודה שעוצרת את ביצוע הסיבוב הנוכחי (החזרה שאנו נמצאים בה), אך היא אינה עוצרת את הלולאה, אלא מצביע ביצוע הפקודות קופץ אל סוף קטע פקודות הלולאה וחוזר מחדש (אם לבדיקת התנאי ב-while ואם לפקודת הקידום ב-for)

דוגמה 6.2
for(int i=1;i<=10;i++)
 {
     if (i == 5)
         continue;
     Console.Write("{0} ",i);
 }
Microsoft Visual Studio Debug Console
1 2 3 4 6 7 8 9 10

מדפיס את כל המספרים מ-1 עד 10 (כולל 10) חוץ מן המספר 5

שאלה 6.13: כתוב תוכנית שמחשבת את חילוק המספר 100 בעשרה מספרים שלמים שנקלוט מן המשתמש.
static void Main()
{
  int i=1,num;
  while(i<=10)
  {
    Console.Write("Insert a number: ");
    num = int.Parse(Console.ReadLine());
    if (num == 0)
        continue;
    Console.WriteLine("100/{0} = {1}",num,100.0/num);
    i++;
  }
}

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

6.6 סדרות

6.6.1 סדרה חשבונית

זו סדרת מספרים שיש בה חוקיות (קשר) מוגדרת: ההפרש בין כל שני איברים עוקבים הוא הפרש קבוע ושווה ל-d . האיבר הראשון בסדרה מסומן a1 ואילו האיבר שמיקומו n מסומן באות an

a1 , a2 , a3 , a4 , a5 , …, an
a2 − a1 = d ➔ a2 = a1 + d
a3 − a2 = d ➔ a3 = a2 + d

נוכל להגיע לחוק הבא:

an = a1 + (n − 1)d

סכום האיברים עד האיבר מספר n הוא:

Sn = n2(a1 + an)
דוגמה 6.3

הסדרה הבאה:

7,10,13,16,….

האיבר הראשון הוא 7 והפרש הסדרה d = 3

סכום 3 האיברים הראשונים הוא: 7+10+13 כלומר 30

האיבר מספר 37 הוא: 115, וזאת לפי החוק הבא:

a(37) = 7+(37−1)·3 = 115

סכום 37 האיברים הראשונים הוא: 2257, לפי החוק הבא:

S(37) = 372 ·(7+115) = 2257

יש חוקים נוספים לסכום איברי הסדרה עד האיבר n והם:

Sn = n[2a1 + (n−1)d]2
Sn = n(a1 + an)2
Sn = n[2an − (n−1)d]2

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

שאלה 6.14: נתונה הסדרה החשבונית הבאה: 317 , 300 , 283 …
בעזרת כתיבת תוכנית מתאימה (בלי להשתמש בחוקי המתמטיקה לסדרות)
  1. מצא את האיבר מספר 10.
  2. איזה איבר הוא האיבר השלילי הראשון?
כתוב תוכנית שפותרת בעיה זו, ואחר כך השווה את התשובות לתוצאות שתקבל מן החוקים.
static void Main(string[] args)
{
   int a1 = 317, d = -17, sum,ai=0,ai_1,flag=1;
   int i;
   ai_1 = a1;
   for (i = 2; i <= 10 || flag ==1; i++)
   {
       ai = ai_1 + d;    // סדרה חשבונית
       if(ai<0)
       {
         Console.WriteLine("The first negative element is {0}",ai);
         Console.WriteLine("His order is {0}",i);
         flag = 0;
       }
       ai_1 = ai;
       if(i==10)
           Console.WriteLine("a10={0}", ai);
   }
}

תוצאת ההרצה:

Microsoft Visual Studio Debug Console
a10=164
The first negative element is -6
His order is 20

הפתרון בעזרת חוקי המתמטיקה הוא:

(א) d=300 − 317 = −17 ➔ a10 = 317 + (10−1)·(−17) = 164

(ב) נפתור את אי-השוויון הבא: an < 0, כלומר נפתור את הביטוי הבא: 317+(n−1)·(−17) < 0, נסדר ונפתור ונקבל n > 19.64, ומאחר ש-n מספר שלם, התשובה היא n=20 והאיבר הוא

a20 = 317+(20−1)·(−17) = −6
שאלה 6.15: כתוב תוכנית שקולטת מן המשתמש את האיבר הראשון של סדרה חשבונית ואת הפרש הסדרה (d). התוכנית מחשבת ומדפיסה את 20 האיברים הראשונים בסדרה. (בין איבר לאיבר יש פסיק, ואחרי האיבר האחרון עליה להדפיס נקודה).
static void Main(string[] args)
{
    int a, d, i;
    Console.Write("insert the first element: ");
    a = int.Parse(Console.ReadLine());
    Console.Write("insert the difference: ");
    d = int.Parse(Console.ReadLine());
    for (i = 1; i <= 20 ; i++)
    {
        if(i!=20)
            Console.Write("{0},",a);
        else
            Console.WriteLine("{0}.",a);
        a = a + d;
    }
}

תוצאת הרצת התוכנית עבור הקלטים a1=317 ו-d = −17 היא:

Microsoft Visual Studio Debug Console
insert the first element: 317
insert the difference: -17
317,300,283,266,249,232,215,198,181,164,147,130,113,96,79,62,45,28,11,-6.
שאלה 6.16: כתוב תוכנית שקולטת מן המשתמש את האיבר הראשון (a1) של סדרה חשבונית ואת הפרש הסדרה (d). כמו כן התוכנית קולטת את מספר האיברים (n) שהמשתמש רוצה להדפיס על המסך, מדפיסה אותם, מחשבת את סכומם ומדפיסה אותו.
static void Main(string[] args)
{
   int a, d,n,sum=0,i;
   Console.Write("insert the first element: ");
   a = int.Parse(Console.ReadLine());
   Console.Write("insert the difference: ");
   d = int.Parse(Console.ReadLine());
   Console.Write("insert the number of elements you want: ");
   n = int.Parse(Console.ReadLine());

   for (i = 1; i <= n ; i++)
   {
       sum += a;
       if(i!=n)
           Console.Write("{0},",a);
       else
           Console.WriteLine("{0}.",a);
       a = a + d;
   }
   Console.WriteLine("sum={0}",sum);
}

תוצאות הרצת התוכנית עבור הקלטים: a1 = −4 ו-d=5, ואנו רוצים את 5 האיברים הראשונים ( n=5 ).

Microsoft Visual Studio Debug Console
insert the first element: -4
insert the difference: 5
insert the number of elements you want: 5
-4,1,6,11,16.
sum=30

6.6.2 סדרה הנדסית

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

a1
a2 = a1 · q
a3 = a2 · q = a1 · q · q = a1 · q2
a4 = a3 · q = a2 · q · q = a1 · q · q · q = a1 · q3
➔ an = a1 · qn−1

סכום הסדרה ההנדסית הוא:

Sn = a1(qn − 1)q − 1
דוגמה 6.4
נתונה הסדרה הבאה: 3,12,48,192,…
כתוב תוכנית שמדפיסה את 10 האיברים הראשונים ומחשבת את סכומם.
static void Main()
{
    int i,a1=3,q=4,ai=a1,sum=0;
    for(i=1; i<=10;i++)
    {
        sum += ai;
        if (i != 10)
            Console.Write("{0},", ai);
        else
            Console.Write("{0}.", ai);
        ai = ai * q;
    }
    Console.WriteLine("\nThe Sum (S10) = "+sum);
}

תוצאת הרצת התוכנית:

Microsoft Visual Studio Debug Console
3,12,48,192,768,3072,12288,49152,196608,786432.
The Sum (S10) = 1048575

6.6.3 סדרות כלליות

סדרת פיבונאצ׳י:

סדרת פיבונאצ׳י היא סדרת מספרים שלמים וחיוביים, שבה כל איבר הוא סכום שני האיברים שלפניו. הסדרה מתחילה משני איברים התחלתיים, 1 ו-1 (יש מי שמתחילים מ-0 ו-1).

הסדרה היא:

1,1,2,3,5,8,13,21,34,……

אפשר לכתוב את חוקיותה בעזרת נוסחת נסיגה כך:

a1 = 1
a2 = 1
an = an−1 + an−2
דוגמה 6.5
כתוב תוכנית שקולטת מן המשתמש מספר טבעי המייצג מספר סידורי. התוכנית מדפיסה על המסך את ערך האיבר המתאים למספר הסידורי בסדרת פיבונאצ׳י.
למשל, אם הזנו 1 יודפס על המסך 1, ואם הזנו 6 יודפס על המסך 8 ...
static void Main(string[] args)
{
    int i, n,an=1,an_1=1,an_2=1;
    Console.Write("Insert a number: ");
    n = int.Parse(Console.ReadLine());
    if(n==1 || n==2)
        Console.WriteLine("a{0} = 1",n);
    else
    {
        for (i = 3; i <= n; i++)
        {
            an = an_1 + an_2;
            an_2 = an_1;
            an_1 = an;
        }
        Console.WriteLine("a{0}={1}",n,an);
    }
}

תוצאת הרצת התוכנית עבור הקלט 10 היא:

Select Microsoft Visual Studio Debug Console
Insert a number: 10
a10=55
שאלה 6.17: כתוב תוכנית שקולטת מן המשתמש מספר טבעי ומדפיסה על המסך את כל איברי סדרת פיבונאצ׳י, מן האיבר הראשון עד האיבר שמיקומו הוא המספר הטבעי שקלטנו.
מדפיסים את האיברים זה לצד זה, ובין איבר לאיבר פסיק, חוץ מן האיבר האחרון שאחריו מציבים נקודה.
למשל, אם קלטנו את המספר 7 נדפיס: 1,1,2,3,5,8,13.

6.7 לולאה בתוך לולאה

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

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

דוגמה 6.6
אנו רוצים, בעזרת שתי לולאות של פקודות חזרה, להדפיס 7 שורות של כוכביות, כך שבכל שורה יהיו 10 כוכביות.
static void Main(string[] args)
{
   int i, j;
   for(i=1;i<=7;i++)
   {
       for(j=1;j<=10;j++)
           Console.Write("*");
       Console.WriteLine();
   }
}
המסך
**********
**********
**********
**********
**********
**********
**********

הפקודה Console.Write("*"); מתבצעת בלולאה הפנימית 10 פעמים (מ-j=1 עד j=10) בכל פעם שנכנסים ללולאה החיצונית (לכל i מ-i=1 עד i=7), כלומר פקודה זו מתבצעת 7·10 פעמים, כלומר 70 פעמים.

שאלה 6.18: כתוב תוכנית שקולטת מן המשתמש תו לחזרה ומספר שלם המייצג את מספר שורות החזרה, כך שהתו חוזר בכל שורה מספר פעמים לפי מספר השורה. למשל, אם קלטנו את התו $ ואת המספר 5 עלינו לקבל את הדבר הבא:
static void Main(string[] args)
{
   int i, j,num;
   char ch;
   Console.Write("Insert a character: ");
   ch = char.Parse(Console.ReadLine());
   Console.Write("Insert a number: ");
   num = int.Parse(Console.ReadLine());

   for(i=1;i<=num;i++)   // (i=0;i<num;i++)
   {
       for(j=1;j<=i;j++)
           Console.Write("{0}",ch);
       Console.WriteLine();
   }
}
Microsoft Visual Studio Debug Console
Insert a character: $
Insert a number: 5
$
$$
$$$
$$$$
$$$$$
שאלה 6.19: כתוב תוכנית שקולטת מן המשתמש מספר טבעי גדול מ-1 ומדפיסה כוכביות בצורת משולש שווה-שוקיים, שבו אורך התיכון לבסיס (היורד מראש המשולש אל הבסיס) מורכב ממספר כוכביות השווה למספר שהזין המשתמש. למשל, אם קלטנו את המספר 5 נקבל:
המסך
*
**
***
****
*****
****
***
**
*
שאלה 6.20: קלוט מספר מן המשתמש והדפס את המספרים מ-1 עד המספר שקלטת, כך שבכל שורה נדפיס מספר המתאים למספר השורה, והוא חוזר באותה שורה לפי מיקום השורה.
למשל, אם קלטנו 5:
המסך
1
22
333
4444
55555
שאלה 6.21: קלוט מספר מן המשתמש והדפס שורות של מספרים, כך שבכל שורה יופיעו מספרים בכמות השווה למיקום השורה. (המספרים שנדפיס צריכים להיות עוקבים, מ-1 ומעלה, בלי חזרות)
הדפס שורות במספר השווה למספר שקלטת מן המשתמש
למשל, אם קלטנו 5 נדפיס
המסך
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
המאם ותד (أ. همام وتد) — כל זכויות הספר שמורות למחבר. הספר נכתב בערבית, ותרגם אותו לעברית פהד גאנם. המהדורה העברית מתפרסמת באישור המחבר, עם תיקונים שאישר. ליצירת קשר עם המחבר: hammam4112@gmail.com