פקודת if ב-Java

[4 בפברואר 2008] [36 תגובות]

מהי זרימת התוכנית ?

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

הפעם נלמד לשלוט בסדר ביצוע הפעולות(זרימת התוכנית), על ידי הפקודה if

בפקודת if, המחשב שואל את עצמו שאלה(לדוגמה: האם 1+1 שווה ל-2 ?). אם התשובה לשאלה היא "נכון",
הוא יבצע סדרת פעולות שנגדיר לו, אחרת(אם התשובה לשאלה היא "לא נכון") הוא לא יבצע פעולות אלה,
אלא ידלג עליהן וימשיך עם הפקודות שנמצאות אחריהן בקוד.

הערה: מעתה לתשובה "נכון" נתייחס כ-true(אמת) ולתשובה "לא נכון" נתייחס כ-false(שקר).

נקפוץ ישר לקוד:

if (1+1==2)
{
        System.out.println("Math is easy for me!");
        System.out.println("did you know that ?");
}

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

הפקודה if בנויה ממספר חלקים:

  1. המילה if
  2. השאלה (במקרה זה: 1+1==2)
  3. בלוק פקודות שיש לבצע (תחום בתוך סימני הבלוק: "{" ו-"}" )

נבחן את השאלה יותר לעומק:

החוק הראשון הוא שהשאלה תמיד מוקפת בסוגריים. החוק השני הוא שהתשובה לשאלה היא תמיד או
true או false. כלומר, התשובה היא משתנה בוליאני. אם אינך זוכר מהו משתנה זה, קרא את השיעור
על משתנים ב-java.

במקרה זה השאלה היא 1+1==2: אתם לא טועים, השתמשנו בשני סימני שיוויון("==") - אם היינו משתמשים
בסימן שיוויון אחד("="), המחשב היה חושב שהתכוונו להכניס את הערך 2 לתוך המשתנה 1+1 - וכנראה
שהוא היה מודיע לנו על טעות.

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

הבט בקוד הבא, ונסה לנחש האם המשפט יודפס למסך או לא:

int x = 50;
if (x==40)
{
        System.out.println("Yes! x = 40");
}

הערה חשובה: זוהי הפעם השנייה שחשוב לי להזכיר זאת: אין לכתוב את השאלה בעזרת הסימן "=" כך:
if (x=40) כי אז המחשב יהפוך את הערך של x ל-40, אך לא ישאל את השאלה שרצינו.

התשובה: כמובן שהמשפט לא יודפס למסך, מכיוון שהערך של x הופך ל-50 בשורה הראשונה ואז נשאלת השאלה
האם x שווה לערך 40. מכיוון שהתשובה לכך היא false - המחשב מחליט לדלג על פקודת ההדפסה.

אופרטורים נוספים

סימןשםדוגמה לשאלהתרגום לעברית
!=חוסר-שיוויוןif (x!=40)האם x שונה מ-40 ?
>גדול מ-if (x>40)האם x גדול מ-40 ?
>=גדול שווה מ-if (x>=40)האם x גדול או שווה ל-40 ?
<קטן מ- if (x<40)האם x קטן מ-40 ?
>=קטן שווה מ-if (x<=40)האם x קטן או שווה ל-40 ?

הפקודה else

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

קוד:

int x = 50;
if (x>60)
{
        System.out.println("Yes! x is larger than 60");
}
else
{
        System.out.println("No! x is NOT larger than 60");
}

במקרה זה, x שווה לערך 50 ולאחר מכן שואלים האם x גדול מ-60. מכיוון שהתשובה לשאלה זו היא false, המחשב מדלג על הבלוק הראשון(ולכן לא מדפיס למסך את המשפט הראשון). כעת המחשב מזהה את הפקודה else ומתחיל בביצוע כל הפקודות בבלוק שמתחת לפקודה, במקרה זה בבלוק יש רק פקודה אחת: הדפסת טקסט למסך.

תרגיל

הפקודה הבאה מגרילה ערך אקראי בין 1 ועד 10(כולל 1 וכולל 10) ומכניסה את הערך למשתנה x:

int x = (int) (Math.random()*10)+1;

בשלב זה, אין צורך לדעת כיצד הפקודה עובדת.

כתבו תוכנית המבצעת חידון חשבון פשוט. התוכנית תגריל שני מספרים(תוכלו לשמור אותם במשתנים x ו-y), תציג אותם למשתמש ותשאל אותו מהו הערך של חיבור שני המספרים(מהו x+y).

המשתמש יכניס את התשובה שלו והתוכנית תבדוק אם הוא צדק או טעה. אם צדק - תודפס המילה Right למסך, ואם לא - תודפס המילה Wrong.

פיתרון: פתרון לתרגיל חידון החשבון - כאן תמצאו פתרון מלא ומפורט - שלב אחר שלב.

סיכום

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

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

36 תגובות

  1. שלומי | 2/9/2008 8:49:58 AM

    לטל, שלום!

    הההוראות שאתה מביא כאן ממש מועילות ועוזרות לי!
    רק כמה דברים, בפקודה Console.readInt
    התוכנה שאני משתמש בה (blueJ) יש הודעת שגיאה:
    packge corejava does not exist
    מה לעשות?

  2. טל | 2/9/2008 12:22:07 PM

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

    העתק את הסיפרייה corejava(אפשר להוריד אותה מהשיעור על קלט\פלט) לסיפרייה של הפרוייקט שלך. לאחר מכן הרץ את BlueJ ואת התוכנית שלך כמו שנכתב בשיעורים.

    בדקתי את זה, זה עבד אצלי ב-BlueJ וזה אמור לפתור את הבעיה גם עבורך.

  3. שלומי | 2/11/2008 10:27:21 AM

    טל, תודה רבה, הפתרון שלך עזר לי!

  4. ניר | 3/15/2008 2:06:28 AM

    שלום,

    כאשר אני רושם int x = (Math.random()*10)+1;..

    הוא אומר שהוא לא יכול להפוך INT ל DOUBLE... למה אצלי הפונקציית RANDOM היא דאבל?

    תודה!

  5. טל | 3/15/2008 12:32:55 PM

    ניר, אתה צודק.

    הפונקציה RANDOM אכן מחזירה Double. יש להשתמש בשורה:

    int x = (int) (Math.random()*10)+1;

    תודה רבה, הטקסט תוקן גם כן.

  6. עדי | 7/7/2008 1:49:20 PM
    היי למה כאשר אנ רוצה לעשות if בתוך if ה-else שלי לא מאפשר זאת(שגיאת הידור) ניסיתי כבר עם סוגריים מסולסלות וזה עדיין ל עובד?
  7. טל | 7/8/2008 11:34:59 AM

    דבר ראשון תוודא שלכל פקודת if נפתחים ונסגרים סימני בלוקים {}, וגם לכל else נפתחים ונסגרים הסימנים האלו.

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

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

  8. אייל | 10/31/2008 2:24:42 PM

    כיצד אני מגריל מספר שלם בטווח כרצוני לדוגמא 16-140

  9. טל | 11/1/2008 8:11:29 AM
    ישנו פוסט שלם המוקדש לנושא: Random ב-Java
  10. שירלי | 12/9/2008 9:38:57 AM

    מותר לישלוח תשובה שלמה ?

     

  11. טל | 12/9/2008 11:55:55 AM

    מה הכוונה לשלוח תשובה שלמה?

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

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

    אז מה הייתה הכוונה?

  12. וסקו | 12/24/2008 6:16:23 AM

    הפתרון =]

    import corejava.*; 

    class hello  
    {  
     
            public static void main(String args[])
           {  
    int x = (int) (Math.random()*10)+1;

    int y = (int) (Math.random()*10)+1;

            System.out.println(x + "," + y);

    int z = Console.readInt("enter the sum of x and y:");

    if(z==(x+y))
      { System.out.println ("right");}
    else
    { System.out.println ("wrong");}
      

            }  

  13. טל | 12/27/2008 3:16:22 AM

    פיתרון נכון :) כל הכבוד!

    התחלתי לכתוב את השיעורים הבאים ורציתי לשאול אם מישהו מחכה להם? אם כן, אני אגביר את הקצב.

  14. מיכאל | 1/2/2009 6:42:30 AM

    אהלן,

    אני מחכה לשיעורים - כל הכבוד על הכתיבה!

  15. אלי | 1/3/2009 9:28:33 AM

    כן, גם אני אשמח ליראות עוד שיעורים ב JAVA :)

    *אגב אין עושים את הדבר הזה למטה שיש תמונה למטה וצריך לאמת את זה ?

  16. טל | 1/4/2009 3:24:48 PM

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

    @אלי - בקשר לתמונה שצריך לאמת, זה נקרא CAPTCHA וכתבתי על כך כאן: אדם או מכונה ?

  17. תמר | 1/5/2009 11:56:51 AM

     היי,

    יש אפשרות לפצל את פקודת if ליותר משורה אחת, במקרה והשורה ממש ממש ארוכה??

  18. טל | 1/5/2009 2:01:58 PM

    כן.

    פשוט להקיש Enter ולהמשיך את פקודת ה-IF (אני מניח שאת מדברת על התנאי של ה-IF) בשורה שאחרי.

    ניתן לעשות זאת לאורך מספר שורות כרצונך.

  19. שירן | 11/6/2009 10:00:14 AM
    לא הבנתי מתי אני צריכה לשים סוגריים מסולסלים בתכניות שאני רושמת ?
  20. טל | 11/9/2009 10:47:29 AM

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

    המשמעות כאן היא שאחרי IF ישנו בלוק של פעולות שיש לבצע (כך ה-IF יודע מה עליו להריץ במידה והתשובה היא אמת)

  21. ד.י. | 12/18/2009 5:29:50 AM

    בס"ד

    תודה רבה!

    כתבתי תוכנית ויש שגיאה ואני לא יודע מהי:

     

    import java.util.*;
     
    public class input
    {  
            public static void main(String[] args)
            {  
                Scanner console = new Scanner(System.in);
                System.out.println("אנא הכנס אות: ");  
               char ot = console.next().charAt(0);
                if ( ot = 'א' );  
    {  
            System.out.println("1");  
            } 
             console.close();    
        }
    }

     

    הוא מודיע שיש שגיאה בשורה זו:

                if ( ot = 'א' );  

  22. טל | 12/18/2009 5:54:39 AM

    @ד.י., טוב שאתה שואל, כי זאת טעות נפוצהאצל רבים.

    השתמשת בהשמה (סימן = אחד) במקום בהשוואה (שני סימני שווה ==).

    תחליף ל:

     if ( ot == 'א' );  

  23. ד.י. | 12/19/2009 11:51:42 AM

    בס"ד

    צודק... אופס...

    תודה רבה!

  24. לאה | 5/17/2010 9:11:08 AM

    הי

    אני מנסה להריץ את התוכנית

    /**
     * @(#)Operators.java
     *
     *
     * @author
     * @version 1.00 2010/5/17
     */
    //import packageName;
    import java.awt.*;
    import java.util.Scanner;

    public class Operators
     {

        public static void main (String [] args) {
         Scanner console =new Scanner(System.in);
         System.out.println("please insert any number");
         int x = console.nextInt();
         System.out.println("please insert additional number");
         int y = console.nextInt();
         System.out.println("please insert any action");
           String z = console.next();
            int p =x+y;
             int m =x-y;
              int c =x*y;
              // int ch= x/ch;
          if (z == "5" )
         {
           System.out.println(x);///x + "+" + y + "=" + x+y);
         }
         else
         {
          System.out.println(y);

        }
             console.close();

        }

        public void paint(Graphics g) {

        }
    }

    התוכנית מתקמפלת אבל כשאני מדבגת אותה נראה שהוא תמיד מגיע לELSE במקום לIF

    זה קורה כשהמשתנה -Z מוגדר כSTRING ולא כשהוא מוגדר כ INT

    מה יכולה להיות הסיבה ? תודה

     

  25. טל | 5/18/2010 8:55:47 PM

    על מנת להשוות מחרוזות (Strings) יש לבצע את הפעולה הבאה:

     

    if (z.equals("5"))

     

  26. תום | 8/21/2010 3:04:01 PM

    היי,

    תודה רבה על כל המדריכים והשיעורים, הם מאוד עוזרים :) 

  27. מה קורה | 12/5/2010 5:03:59 PM

    שאלה אפשר לדעת מה עושה console.readint

    מה זאת אומרת read מה זאת אומרת לקרוא את ה int לא לימדת את זה פה

  28. ET | 10/20/2011 1:41:19 PM

    תודה רבה על השיעורים האלה!!

    הייתה לי עבודה להגיש בג'אווה (משהו די בסיסי..) ולא ידעתי כלום ודי נכנסתי ללחץ...

    אתם יכולים להבין שמה שהציל אותי היו השיעורים האלה..

     

  29. iTay | 12/7/2011 8:33:55 AM

    תודה רבה אני גם הטספתי בבלוק של else 

    שהוא ידפיס גם את התוצאה הנכונה .

     

  30. שיר | 10/5/2012 7:11:36 AM

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

  31. ישראל | 10/21/2012 1:49:55 AM

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

    מקווה שתפתח לרמות גבוהות יותר!!!

    רציתי לבקש שתסביר קצת יותר על איך לעשות השוואה למחרוזת לדוגמה להשוות משתנה לתו "+"

    ושוב תודה רבה!!! 

  32. גיבור על | 11/13/2012 6:48:29 AM

    הי טל ,

    כל הכבוד על השיעורים,

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

    תודה,

    גיבור על

  33. adidas | 1/30/2013 11:15:08 AM

    היי :)

     

    איך עושים מערכת "וגם"בIF? 

    נגיד, אני צריכה לכתוב תוכנית שבה הIF יקיים שני תנאים, ואני לא זוכרת איך עושים את זה (זכור לי  משהו כזה):

    if (asarot>0 && meot<0)

    S.O.P (.....................) 

    זה נכון?

    תודה (: 

  34. יובל | 8/8/2013 9:00:08 AM

    שלום טל

    האם אפשר לתכנת בג'אווה גם דרך מקבוק

    תודה מראש 

  35. תומר | 12/5/2014 7:23:27 AM

    לטל שלום,

    זה כותב לי  error: 'else' without 'if'

        else 

        ^

    1 error

    מה לעשות? 

  36. תומר | 12/5/2014 7:32:29 AM
    ואני משתמש בתוכנת JCreator

התגובות נעולות