המדריך השלם | |||||
|
|
תנאי בקרה
כלומר אם התנאי בתוך הסוגריים של משפט ה-if מתקיים ( ערך term הוא "אמת" כאשר ערך התנאי שונה מאפס), בצע את הפקודות המופיעות בין הסוגריים המסולסלים (expression a). אם התנאי לא מתקיים בצע את סדרת הפקודות המופיעות בין הסוגריים המסולסלים השניים (expression b) . הערה: אפשר גם ללא סוגריים מסולסלים אבל אז יתבצע רק המשפט הראשון שלאחר התנאי , בהנחה שהתנאי אמת. דוגמא 1:
הערה: משפטif יכול להופיע גם בתוך משפטelse - לדוגמא, בדוגמא זו, אם התנאי הראשון נכשל אזי המספר השני גדול או שווה למספר הראשון. כעת נשאל לאחר משפט else (למעשה - בתוך פסקת else) אם b גדול מ- a. אם לא - ברור לנו כי a ו- b שווים. נראה זאת בדוגמא הבאה. דוגמא 2:
אם מעוניינים שמתוך סדרת תנאים יבוצע רק אחד מהם נוכל להשתמש בתבנית הבאה. תבנית לשימוש בפקודת if else :
הערה: התנאי הראשון יהיה if והאחרון יהיה else. נבדק התנאי הראשון - אם הוא מצליח (ערכו אמת) מבוצע הבלוק המתאים לו. אם השני נכשל -עוברים ל- if הבא, אם הוא מצליח מבוצע הבלוק המתאים, אחרת עוברים ל- if הבא וכך הלאה. הערה: אם היינו משתמשים בפקודתif רגילה, כלומר יוצרים רצף של פקודות if ההבדל העיקרי הוא שגם אם פקודה if מצליחה הבלוק המתאים מבוצע אך ממשיכים לבדוק את שאר התנאים ואם גם בהם תנאי נוסף מתקיים מבצעים גם את הבלוק המתאים לו. זאת בניגוד לפקודת if else - שם אם תנאי אחד מתקיים שאר התנאים לא נבדקים ויוצאים מקטע קוד זה של בדיקות פקודות ה- if. דוגמא 3:
בפקודת ה-if נשתמש באופרטורים: > , < , >= , <= , == ,!= , !. תנאים מורכבים: עד כה הדגמנו תנאים פשוטים כמו: קטן מ, שווה ל, שונה מ- וכו'. כעת נראה איך ניתן לכתוב תנאים מורכבים על ידי שימוש באופרטורים לוגיים : וגם (&&) ,או (||). נמחיש על ידי דוגמא:
סדר ביצוע פעולות בביטויים לוגיים: ביטוי לוגי נבדק תמיד משמאל לימין עד אשר ניתן יהיה לקבוע בוודאות את ערך הביטוי - אמת או שקר. לדוגמא: נניח שערך הביטוי x > y הוא שקר ורשמנו If (x > y && y++) - ברור שערך הביטוי במשפט ה- if יהיה שקר, אך מאחר והביטוי נבדק משמאל לימין ומדובר בביטוי "וגם" (כל חלקיו צריכים להיות אמת על מנת שכולו יקבל ערך אמת) - הבדיקה תיפסק לאחר החלק הראשון ברגע שיסתבר שהוא שקר, ולכן החלק השני כלל לא ייבדק והמשתנה y לא יקודם באחד. משפט swich בדוגמא האחרונה הראנו בחירה מרובה על ידי משפט if מורכב. כעת נראה כיצד ניתן לפשט אותו ולאפשר דרך נוחה וברורה יותר לביצוע הפעולה באופן הבא: constant1- קבוע ראשון. .. .. constantn - הקבוע ה n.
switch מקבל משתנה או ביטוי ומחשב את ערכו. הערך המתקבל הוא קבוע (ערך מספרי או אלפבתי) והפקודה שמתאימה לקבוע שחושב מתבצעת, כלומר התוכנית פונה אל שורת ה- case המתאימה ומבצעת את הפקודות הכתובות אחריה עד שהיא מגיעה לפקודת break. מטרת הפקודה break היא למנוע את המשך ביצוע הפקודות הבאות ב- case-ים שבאים אחרי. אם הערך המתקבל ממשפט ה- switch אינו תואם לאף אחד מה- case-ים מתבצעות ההוראות שאחרי פקודת ה-defaut. הערה: הפקודה default לא חייבת להופיע אך במקרה זה אם הקבוע שחושב ב switch אינו תואם את אחד ה- case- ים לא יבוצע דבר. דוגמא 4:
וללא שימוש ב break נקבל: דוגמא 5:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
הביטוי המותנה ? התבנית של ? ;condition? exp1: exp2 לפני ה- ? ישנו תנאי ובאם התנאי מתקיים יש לבצע את הביטוי הראשון. אחרת (התנאי אינו מתקיים) יש לבצע את הביטוי השני (המופיע מיד לאחר הנקודותיים "": ). כמו כן ניתן להציב את הערך המתקבל במשתנה או לצורך הדפסה (בפקודה printf). בעצם ניתן לתרגם ביטוי זה למשפט if כך: if (condition)
דוגמא:exp1; else exp2;
דוגמא 6:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
לולאת for לולאות מאפשרות לבצע הוראה או בלוק הוראות בתוכנית מספר פעמים בהתאם לצרכינו. כאשר אנו מעוניינים כי בלוק של פקודות או פקודה בודדת יתבצעו מספר פעמים אנו משתמשים בלולאת for . לולאתfor נקראת גם לולאת אינקדס. הלולאה בנויה משלושה חלקים: 1. אתחול משתנים. 2. תנאי ביצוע. 3. קידום משתנים. מבנה הלולאה:
for (initialization ; boolean condition ; increment) { . . . } שלושת חלקי הלולאה מופרדים בניהם על ידי ; (נקודה פסיק). בחלק הראשון מתבצע אתחול משתנים, בחלק השני נבדק תנאי הלולאה - כאשר אם ערכו הבוליאני של תנאי זה אמת יבוצע גוף הלולאה ואם לא נצא מהלולאה ובחלק השלישי (המבוצע לאחר ביצוע גוף הלולאה ) מבוצע קידום משתנים. יש לציין כי האתחול מתבצע רק פעם אחת בכניסה ללולאה, אח"כ נבדק תנאי הלולאה ואם ערכו אמת מתבצע גוף הלולאה, אח"כ קידום משתנים ושוב בדיקת תנאי הלולאה וחוזר חלילה. הרוטינה תתבצע עד אשר לא יתקיים תנאי הלולאה ואז נמשיך בתוכנית לאחר לולאת ה- for. הערה: אפשר לוותר על הסוגריים אם גוף הלולאה מורכב משורת קוד אחת. דוגמא 7:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
השמטת חלקים בלולאה: לעיתים נרצה לוותר על אחד ממרכיבי הלולאה. כל אחד משלושת חלקי הלולאה (אתחול, תנאי לולאה, קידום) יכול להיות ריק. לדוגמא:
לא ניתן להשמיט את החלק של תנאי הלולאה כי אז נקבל לולאה אינסופית (למרות שניתן להתגבר על הבעיה באמצעות break, אך צורה זו פחות מקובלת). דוגמא 7.1:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
אין הכרח שקידום המשתנה יהיה באחד בכל איטרציה. לדוגמא:
קידום המשתנה הוא ב- 2. כמו כן אין הגבלה למשתנה אחד, כלומר אפשר לבצע אתחול של מספר משתנים, בדיקת תנאי לוגי על מספר משתנים וקידום של מספר משתנים יחד. לדוגמא:
רואים כי כאשר אנו עובדים עם מספר משתנים יש להקפיד על פסיקים בניהם. קינון לולאות: ניתן לבצע קינון לולאות, כלומר לולאה בתוך לולאה. יש להתייחס אל הלולאה הפנימית כמו אל פקודת ביצוע שכאשר היא מסתיימת עוברים לחלקה השלישי של לולאת ה- for החיצונית וקידום המשתנים (קידום המשתנים משמע שינוי ערכם אם עלי ידי הגדלה עצמית או הקטנה עצמית כמו בדוגמא האחרונה) ואח"כ שוב ביצוע גוף הלולאה החיצונית (שהיא בעצמה גם לולאה) וכך הלאה.. דוגמא 7.2:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
דוגמא 8:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
דוגמא 8.1:
לולאת while כמו לולאת for , לולאת while משמשת לחזרה על בלוק של פקודות (או פקודה בודדת) כאשר תנאי הלולאה מתקיים. ההבדל הוא שבלולאת for ידוע מספר החזרות על הלולאה בעוד שבלולאת whileפרמטר זה לא ידוע. מבנה הלולאה:
ראשית נבדק תנאי הלולאה ובאם התנאי מתקיים מבוצע גוף הלולאה. אם לא - יוצאים מהלולאה וממשיכים באופן סדרתי בתוכנית. שוב, אפשר לוותר על הסוגריים אם גוף הלולאה מורכב משורת קוד אחת. נחקה את התוכנית המדפיסה את המספרים מ 1 עד 10 על ידי לולאת while: דוגמא 9:
למעשה בתוכנית זו ידענו את מספר החזרות על גוף הלולאה ולכן ניתן לתרגם פקודת while ללולאת for כך:
דוגמא 10:
את לולאת ה-while בתוכנית זו לא ניתן לתרגם ללולאתfor מפני שמספר הפעמים שהמשתמש יקיש על מקש שונה מ 0 לא ידוע לנו ולכן במקרה זה מתאימה רק לולאת while. תנאים מורכבים בלולאה: כמו בחלק של תנאי הלולאה בלולאתfor יכולנו לרשום תנאי מורכב עם מספר משתנים כך גם בתנאי הלולאה של לולאת while (עשינו זאת על ידי שימוש באופרטורים הלוגים : וגם, או כך גם כאן). דוגמא:
לולאת do while כמו בלולאת while פשוטה, גם כאן יש תנאי ובאם הוא מתקיים גוף הלולאה מתבצע. ההבדל הוא שראשית מבוצע גוף הלולאה ורק לאחר מכן נבדק התנאי ובאם התנאי לא מתקיים ממשיכים בתוכנית לאחר לולאת do while. כלומר תמיד גוף הלולאה יבוצע לפחות פעם אחת. מבנה הלולאה:
דוגמא 11:
פקודת goto תווית(label): אוסף של פקודות המאוגדות ליחידה אחת תחת כותר מסוים, כותר זה נקרא תווית. מבנה התווית:
פקודת goto מאפשרת קפיצה למקום אחר בתוכנית (אל תווית בתוכנית). כללי תכנות מובנה אוסרים שימוש בפקודת goto (משום שהדבר מקשה על הבנת התוכנית ועלול לגרום לטעויות). הערה: ניתן להוכיח כי אפשר להמיר כל תוכנית המכילה goto לתוכנית ללא goto על ידי לולאת while. תבנית goto: goto label; כאשר label היא תווית. דוגמא 12:
יש לשים לב איפה ממקדים את התווית משום שהשפה c פועלת באופן סדרתי כלומר אם במהלך התוכנית יש תווית היא תבצע אותן לפי הסדר ולפעמים זה גורם לטעויות ,דוגמא לכך: דוגמא 12.1:
תיקון הטעות יכול להתבצע על ידי החלפת סדר התווית (כמו בדוגמא הקודמת) או על ידי פקודת return (תפקידה לקטוע את ריצת הפונקציה ולצאת ממנה). נלמד לעומק על פקודה זו בפרק על פונקציות המחזירות ערך. הפקודות break ו- continue הפקודות break ו-continue קשורות לשלושת הלולאות שהצגנו (for, while, do while). פקודת break מפסיקה את ביצוע הלולאה אפילו אם תנאי הלולאה מתקיים. לעומת זאת פקודתcontinue מדלגת על הפקודות שבגוף הלולאה עד לביצוע הבא של גוף הלולאה. תבנית לשימוש בפקודת break:
השימוש יעשה בגוף הלולאה בעזרת פקודת break ניתן לקטוע לולאות אינסופיות. נראה זאת בדוגמא הבא: דוגמא 13:
העבר את העכבר מעל הדוגמא כדי לראות הסבר מפורט
תבנית של הפקודה continue:
הפקודה continue מפסיקה את המחזור הנוכחי של הלולאה ומדלגת למחזור הבא.הוראות הלולאה (אם ישנן כאלו) מהפקודה continue ועד לסיומה של גוף הלולאה לא יבוצעו. דוגמא 14:
|