שפת C/לולאות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
ביטול גרסה 88915 של 85.65.254.218 (שיחה)
ביטול גרסה 88914 של 85.65.254.218 (שיחה)
שורה 1:
{{שפת C}}
אמא של GUNNER1 זונה
 
''לולאות'' משמשות לחזרה על קטע קוד מספר פעמים. לולאה חוסכת בזמן כתיבת התוכנה ומסדרת את הקוד.
 
==הצורך בלולאות==
 
ב[[שפת C/פעולות חשבוניות|פעולות חשבוניות]], ראינו [[שפת C/פעולות חשבוניות#דוגמה: המרה בין סוגי מעלות שונים|דוגמה להמרה בין סוגי מעלות שונים]] כיצד להמיר ממעלות ב-Celsius למעלות ב-Fahrenheit. נניח שאנו רוצים להדפיס את התרגום למעלות Fahrenheit של מעלות ה-Celsius בערכים {{משמאל לימין|0, 2, 4, ..., 20}}. ננסה לעשות זאת כך:
<source lang = "c">
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);
</source>
 
קל לראות שמשהו בעייתי בקוד, והבעייתיות היתה גוברת לו היינו פועלים בתחום גדול יותר, לדוגמה {{משמאל לימין|0, 2, 4, ..., 100}}. בין היתר:
# הקוד ארוך ומסורבל מאד.
# תמיד ייתכן שהקוד כולל שגיאה כלשהי: ייתכן שטעינו בהעתקת הנוסחה הממירה, לדוגמה. כאן נצטרך לתקן את הקוד ב11 מקומות.
 
בפרק זה נלמד להשתמש בלולאות, המאפשרות לתרגם את הקוד הקודם לקוד תמציתי יותר:
<source lang = "c">
for(c = 0; c <= 20; c += 2)
{
f = 1.8 * c + 32;
 
printf("%d in Celsius is %d in Fahrenheit\n", c, f);
}
</source>
שתוצאתו דומה.
 
==לולאת while==
לולאת while היא לולאה הפועלת כל עוד תנאי מוגדר מתקיים.
אופן כתיבת הלולאה הוא:
<source lang = "c">
while(<condition>)
<action>
</source>
כאשר condition הוא [[שפת C/ביטויים בוליאניים ותנאים#ערכים בוליאניים|תנאי בוליאני]], ו-action הוא ביטוי (או [[שפת C/משתנים#טווח ההכרה של משתנים|בלוק]]) המתבצע כל עוד התנאי הבוליאני מתקיים.
 
התרשים הבא מראה את הלולאה בצורה גרפית:
[[תמונה:C_language_while.png|מרכז|100%|הלולאה while]]
 
 
לדוגמה, קטע הקוד הבא מדפיס את המספרים 1-20 (כל אחד בשורה):
<source lang = "c">
#include<stdio.h>
 
int main()
{
int i = 1;
 
while(i <= 20)
{
printf("%d\n",i);
i++;
}
 
return 0;
}
</source>
 
 
{{משימה|כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת while.}}
 
{{מוסתר|ta2 = left|פתרון|2=
<source lang = "c">
#include<stdio.h>
 
int main()
{
int i = 1;
 
while(i <= 20)
{
printf("%d\n", i);
i += 2;
}
 
return 0;
}
</source>
}}
 
==לולאת do while==
 
לולאה do-while דומה מאוד לקודמתה בהבדל קטן, שבו בכל פעם קודם מבוצע הביטוי, ורק לאחריו נבדק התנאי הבוליאני. אופן הכתיבה הוא:
<source lang = "c">
do
<action>
while(<condition>);
</source>
 
 
התרשים הבא מראה את הלולאה בצורה גרפית:
[[תמונה:C_language_do_while.png|מרכז|100%|הלולאה do-while]]
נשים לב שהביטוי יבוצע לפחות פעם אחת, גם אם התנאי אינו מתקיים.
 
 
לדוגמה, קטע הקוד הבא מדפיס את המספרים 1-20 (כל אחד בשורה):
<source lang = "c">
#include<stdio.h>
 
int main()
{
int i=1;
 
do
{
printf("%d\n",i);
i++;
}
while(i < 21);
return 0;
}
</source>
 
 
{{משימה|כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת do-while.}}
 
{{מוסתר|ta2 = left|פתרון|2=
<source lang = "c">
#include<stdio.h>
 
 
int main()
{
int i=1;
 
do
{
printf("%d ",i);
i += 2;
}
while(i < 20);
 
return 0;
}
</source>
}}
 
==לולאת for==
לולאת for תמציתית וגמישה יותר משתי האחרות, אך בעלת תחביר מסובך קצת יותר. אופן כתיבת הלולאה:
<source lang = "c">
for(<initialization>; <condition>; <increment>)
<action>
</source>
כאשר:
* initialization הוא פקודת (או פקודות) אתחול שיבוצעו פעם אחת בתחילת הלולאה.
* condition הוא תנאי שייבדק כל פעם לפני ביצוע action
* action הוא פקודה (או בלוק)
* increment הוא פקודה (או פקודות) שיבוצעו כל פעם לאחר ביצוע action
 
התרשים הבא מראה את הלולאה בצורה גרפית:
[[תמונה:C_language_for.png|מרכז|100%|הלולאה for]]
 
לדוגמה:
<source lang = "c">
for(i = 0; i < 3; i++)
printf("%d\n", i);
</source>
תדפיס למסך:
<source lang = "c">
0
1
2
</source>
 
 
{{משימה|כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת for.}}
 
{{מוסתר|ta2 = left|פתרון|2=
<source lang = "c">
#include<stdio.h>
int main()
{
int i;
 
for(i = 1; i <= 20; i += 2)
printf("%d\n",i);
 
return 0;
}
</source>
}}
 
==סכנות בתנאי העצירה==
 
כשכותבים לולאות, יש לוודא שתנאי העצירה אכן יתקיים בהכרח בוודאות - המהדר לא יעשה זאת בשבילנו. נתבונן, לדוגמה, בקטע הקוד הבא:
<source lang = "c">
for(i = 1; i <= 20 || i > 20; i++)
printf("Hello\n");
</source>
לולאה זו לא תעצר לעולם, שכן התנאי להמשך הלולאה תמיד יתקיים. כאשר קטע קוד זה יופעל, התוכנית תראה כאילו ש"קפאה".
 
==דוגמה לשילוב פלט/קלט, תנאים, ולולאות==
 
 
נסיים בתוכנית קטנה המדגימה את השימוש בתנאים ולולאות. התוכנית קולטת מהמשתמש שני מספרים, ומדפיסה הודעה האומרת מה היחס ביניהם. אחר כך היא שואלת את המשתמש אם הוא רוצה להמשיך ולתת שני מספרים נוספים, וכך הלאה, עד שהמשתמש בוחר להפסיק.
<source lang = "c">
#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;
}
</source>
להלן הסבר לתוכנית.
 
נתבונן ראשית במבנה של הקוד בתוך main. הקוד הוא למעשה כמעט כולו לולאת do-while:
 
<source lang = "c">
int c;
 
do
{
...
}
while(c == 1);
</source>
כלומר, עושים פעולה כלשהי כל עוד ערך c הוא 1. מתי נקבע ערכו של c? בתוך הלולאה, נוכל לראות את צמד השורות הבאות:
<source lang = "c">
printf("Please enter 1 to repeat, any other number to quit.\n");
scanf("%d", &c);
</source>
השורות מבקשות מהמשתמש להכניס ערך (הקובע האם להמשיך בתוכנית), וקולטות את הערך למשתנה c.
 
חוץ מכך, הלולאה מתחילה בשורות:
<source lang = "c">
int a, b;
 
printf("Please enter two numbers with a space between them:\n");
scanf("%d %d", &a, &b);
</source>
המבקשות מהמשתמש להכניס שני ערכים. לאחר שהוכנסו שני הערכים, השורות הבאות מדפיסות את היחס ביניהם:
<source lang = "c">
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");
</source>
{{שפת C|מוגבל}}
 
 
[[קטגוריה:שפת C|לולאות]]