ויקימחשבים
Register
Advertisement

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

הצורך בלולאות[]

בפעולות חשבוניות, ראינו דוגמה להמרה בין סוגי מעלות שונים כיצד להמיר ממעלות ב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;
}



Thumbs up

עכשיו תורך:

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




לולאת 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;
}



Thumbs up

עכשיו תורך:

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




לולאת 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



Thumbs up

עכשיו תורך:

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




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

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

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");


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