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

הצורך בלולאות עריכה

בפעולות חשבוניות, ראינו דוגמה להמרה בין סוגי מעלות שונים כיצד להמיר ממעלות ב-Celsius למעלות ב-Fahrenheit. נניח שאנו רוצים להדפיס את התרגום למעלות Fahrenheit של מעלות ה-Celsius בערכים 0, 2, 4, ..., 20. ננסה לעשות זאת כך:

c = 0;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 2;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 4;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 6;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 8;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 10;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 12;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 14;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 16;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 18;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

c = 20;
f = 1.8 * c + 32; 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);

קל לראות שמשהו בעייתי בקוד, והבעייתיות היתה גוברת לו היינו פועלים בתחום גדול יותר, לדוגמה 0, 2, 4, ..., 100. בין היתר:

  1. הקוד ארוך ומסורבל מאד.
  2. תמיד ייתכן שהקוד כולל שגיאה כלשהי: ייתכן שטעינו בהעתקת הנוסחה הממירה, לדוגמה. כאן נצטרך לתקן את הקוד ב11 מקומות.

בפרק זה נלמד להשתמש בלולאות, המאפשרות לתרגם את הקוד הקודם לקוד תמציתי יותר:

for (c = 0; c <= 20; c += 2)  
{
  f = 1.8 * c + 32;

  printf("%d in Celsius is %d in Fahrenheit\n", c, f);
}

שתוצאתו דומה.

לולאת while עריכה

לולאת while היא לולאה הפועלת כל עוד תנאי מוגדר מתקיים. אופן כתיבת הלולאה הוא:

while (<condition>)
  <action>

כאשר condition הוא תנאי בוליאני, ו-action הוא ביטוי (או בלוק) המתבצע כל עוד התנאי הבוליאני מתקיים.

התרשים הבא מראה את הלולאה בצורה גרפית:

 
הלולאה while


לדוגמה, קטע הקוד הבא מדפיס את המספרים 1-20 (כל אחד בשורה):

#include <stdio.h>

int main()
{
  int i = 1;

  while (i <= 20)
  {
    printf("%d\n",i);
    i++;
  }

  return 0;
}


 

עכשיו תורכם:

כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת while.


פתרון
#include <stdio.h>

int main()
{
  int i = 1;

  while (i <= 20)
  {
   printf("%d\n", i);  
   i += 2;
  }

 return 0;
}


לולאת do while עריכה

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

do 
  <action>
while (<condition>);


התרשים הבא מראה את הלולאה בצורה גרפית:

 
הלולאה do-while

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


לדוגמה, קטע הקוד הבא מדפיס את המספרים 1-20 (כל אחד בשורה):

#include <stdio.h>

int main()
{
  int i=1;

  do {
   printf("%d\n",i);
   i++;
  } while (i < 20);
  
  return 0;
}


 

עכשיו תורכם:

כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת do-while.


פתרון
#include<stdio.h>


int main()
{
  int i=1;

  do {
    printf("%d ",i);  
    i += 2;
  } while (i < 20);

  return 0;
}


לולאת for עריכה

לולאת for תמציתית וגמישה יותר משתי האחרות, אך בעלת תחביר מסובך קצת יותר. אופן כתיבת הלולאה:

for (<initialization>; <condition>; <increment>)
  <action>

כאשר:

  • initialization הוא פקודת (או פקודות) אתחול שיבוצעו פעם אחת בתחילת הלולאה.
  • condition הוא תנאי שייבדק כל פעם לפני ביצוע action
  • action הוא פקודה (או בלוק)
  • increment הוא פקודה (או פקודות) שיבוצעו כל פעם לאחר ביצוע action

התרשים הבא מראה את הלולאה בצורה גרפית:

 
הלולאה for

לדוגמה:

for (i = 0; i < 3; i++)
   printf("%d\n", i);

תדפיס למסך:

0
1
2


 

עכשיו תורכם:

כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת for.


פתרון
#include <stdio.h>
int main()
{
 int i;  

 for (i = 1; i <= 20; i += 2)
   printf("%d\n",i);

 return 0;
}


סכנות בתנאי העצירה עריכה

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

for (i = 1; i <= 20 || i > 20; i++)
  printf("Hello\n");

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

דוגמה לשילוב פלט/קלט, תנאים, ולולאות עריכה

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

#include <stdio.h>

int main()
{
  int c;

  do {
    int a, b;
    
    printf("Please enter two numbers with a space between them:\n");
    scanf("%d %d", &a, &b);

    if( a > b)
      printf("%d is bigger than %d.\n", a, b);
    else if ( a < b )
      printf("%d is bigger than %d.\n", b, a);
    else
      printf("The numbers are equal.\n");
      
    printf("Please enter 1 to repeat, any other number to quit.\n");
    scanf("%d", &c);
  } while (c == 1);
  
  return 0;
}

להלן הסבר לתוכנית.

נתבונן ראשית במבנה של הקוד בתוך main. הקוד הוא למעשה כמעט כולו לולאת do-while:

int c;

do
{
...
}
while (c == 1);

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

printf("Please enter 1 to repeat, any other number to quit.\n");
scanf("%d", &c);

השורות מבקשות מהמשתמש להכניס ערך (הקובע האם להמשיך בתוכנית), וקולטות את הערך למשתנה c.

חוץ מכך, הלולאה מתחילה בשורות:

int a, b;

printf("Please enter two numbers with a space between them:\n");
scanf("%d %d", &a, &b);

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

if( a > b)
  printf("%d is bigger than %d.\n", a, b);
else if ( a < b )
  printf("%d is bigger than %d.\n", b, a);
else
  printf("The numbers are equal.\n");

עצירה יזומה של לולאות עריכה

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

main()
{
  int i=1;
  while (i!=8)
  {
    if (i==2) 
      break;
    printf("%d",i);
    i++;
  }
return 0;
}

קטע קוד זה ידפיס 1.

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

main()
{
  int i=1;
  while (i!=8)
  {
    if (i==2) {
        i++;
      continue;
    } 
    printf("%d",i);
    i++;
  }
  return 0;
}

קטע קוד זה ידפיס 134567

אפשר להשתמש בפקודות אלה גם בלולאות מסוג do while ו-for.


הפרק הקודם:
ביטויים בוליאניים ותנאים
לולאות
תרגילים
הפרק הבא:
פונקציות