פתרון לתרגיל חידון החשבון

[4 בינואר 2009] [26 תגובות]

בשיעור פקודת if ב-Java התבקשתם לשלב את הידע שצברתם עד נקודה זו ולפתור את התרגיל הבא:

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

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

הפתרון 

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

  1. בניית המעטפת
  2. בחירת שני המספרים
  3. הצגת השאלה וקליטת תשובת המשתמש
  4. חישוב התשובה הנכונה
  5. השוואת התשובות

1. בניית המעטפת

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

class add
{
        public static void main(String args[])
        {		
        }
}

2. בחירת שני המספרים

למדנו בשיעור פקודת IF ב-Java כיצד להגריל מספר אקראי. נבצע זאת פעמיים: בפעם הראשונה נגריל מספר ונשמור אותו במשתנה x ובפעם השניה נגריל מספר נוסף ונשמור אותו במשתנה y.

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

3. הצגת השאלה וקליטת תשובת המשתמש

נציג את השאלה למשתמש כפי שלמדנו בשיעור קלט ופלט ב-Java. נשמור את תשובתו למשתנה userAnswer.

import java.util.Scanner;

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

                System.out.println("What is the sum of " + x + " + " + y + " ? ");
                Scanner console = new Scanner(System.in);
                int userAnswer = console.nextInt();
                console.close();
        }
}

שימו לב כיצד ניסחנו את השאלה: שירשרנו (חיברנו) את המילים What is the sum of ל-ערך של x ולאחר מכן שירשרנו את הסימון + (סימן החיבור), לאחריו שירשרנו את ה-ערך של y ובסוף את סימן השאלה (?).

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

4. חישוב התשובה הנכונה

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

import java.util.Scanner;

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

                System.out.println("What is the sum of " + x + " + " + y + " ? ");
                Scanner console = new Scanner(System.in);
                int userAnswer = console.nextInt();
                console.close();

                int correctAnswer = x + y;
        }
}

5. השוואת התשובות

כעת נשתמש בפקודת IF על מנת לדעת אם תשובת המשתמש השמורה ב-userAnswer זהה לתשובה הנכונה השמורה במשתנה correctAnswer. כמו כן נגיב בהתאם ונציד למשתמש האם צדק או טעה.

import java.util.Scanner;

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

                System.out.println("What is the sum of " + x + " + " + y + " ? ");
                Scanner console = new Scanner(System.in);
                int userAnswer = console.nextInt();
                console.close();

                int correctAnswer = x + y;

                if (userAnswer == correctAnswer)
                {   
                        System.out.println("Right!");
                }   
                else  
                {   
                        System.out.println("Wrong!");
                }  
        }
}

זהו גם הפיתרון המלא של התרגיל.

סיכום

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

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

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

26 תגובות

  1. אלי | 1/6/2009 9:35:42 PM
    לא יותר פשוט !?
    Scanner in = new Scanner();
    int x = in.nextInt();
  2. אנונימי | 1/9/2009 2:16:21 PM

    אכן, אני חושב שבמקרה הזה - השימוש במחלקה Scanner יהיה יותר פשוט, אבל זו גם אפשרות.

  3. טל | 2/24/2009 2:52:57 PM
    @אלי, לקחתי את ההצעה שלך ושיניתי. תודה.
  4. פיני | 7/20/2009 12:13:50 PM
    אם אני כותב את זה בפנקס רשימות זה אמור להעלות לי את התוכנית על המסך?
  5. טל | 7/24/2009 4:42:50 AM
    לא... אתה אמור גם להדר (לקמפל) את זה. מומלץ שתקרא את הפוסט תוכנית ראשונה ב-Java לעוד מידע.
  6. נדב | 7/26/2009 2:30:26 PM

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

    זה רושם לי ב-command line ככה:

    add.java:12: cannot find symbol

    symbol  :  method readlnt()

    location: class java.util.scanner

                         int userAnswer = consle.readlnt();

                                                         ^(זה מסמן את הנקודה)

  7. טל | 7/26/2009 3:11:35 PM

    @נדב, אתה צודק. תוקן.

    מה שקרה הוא שבעקבות ההצעה של אלי (הצעה טובה) הקוד שהוצג טיפה השתבש. כעת זה עובד, בדוק.

  8. never gve up | 11/15/2009 5:12:33 PM

    אחלה מדריך ואחלה אתר

  9. אפי | 12/8/2009 5:26:50 AM

    טל אתה ענקקקקקקקקקקקקק !!

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

    מהיום אני פשוט רק ממתין לשיעורים הבאים אז בבקשה תמשיך לרמות יותר גבוהות, פליז, אני מחכה לאיזה פרויקט רציני שתתן לכתוב משהו אבל באמת שנוכל להשביץ איתו

    ביייייייייי ותודה ענקית

  10. אפי | 12/8/2009 5:28:54 AM

    הנה הפיתרון נראה יותר פשוט ממה שאת כתבת לא ???


                    Scanner console = new Scanner(System.in);
                    int x = (int) (Math.random()*10)+1;
                    int y = (int) (Math.random()*10)+1;
                      System.out.println(" היי חמודי בא נראה אותך מפעיל קצת ת'מח שלך");
                      System.out.println("כמה זה " + x + " פלוס " + y);
                      System.out.println("Please enter the number:");
                       int z = console.nextInt();
                       if (x + y==z)
                       {
                        System.out.println("יפה חמודי צדקת !");
                       }
                       else
                       {
                       System.out.println("לא נכון! פעם הבאה לחשוב יותר טוב");
                       }

  11. אפי | 12/8/2009 5:32:16 AM

    טל שמע שנייה אני מבסוט רצח מהתרגיל האחרון שהצלחתי לפתור אולי תסביר איך אפשר לקמפל את הקוד לקובץ exe רגיל ולשלוח אותו לחברים להראות להם כי ככה אין לי מצב לשלוח להם ושייראו את זה ???

  12. בראל גוזלן | 1/18/2010 1:37:20 PM

    מישהו יכול אולי לעזור לי בחידה?!?1

    נתונים המספרים:2,3,4,5 אפששר לעשות כל פעולה אפשרית ולהשתמש פעם אחתת בכל מספר ושהתוצאה תיצא  28

  13. טל | 1/19/2010 3:28:23 PM

    4 לחלק ל-2 זה 2.

    5 בחזקת 2 זה 25.

    25 ועוד 3 זה 28.

  14. עמינדב | 9/12/2010 12:59:48 PM

    לבראל גוזלן:

    5 כפול 4 = 20

    2 בחזקת 3 = 8

    מה שאומר שהתרגיל הוא כזה(** מסמן חזקה):

    28 = 2 ** 3 + 5 * 4

     

  15. עדן | 10/10/2010 2:13:21 PM

    בסדר אם רשמתי ככה:

       import java.util.Scanner;
    class ff1

    {
        static Scanner reader=new Scanner(System.in);
        public static void main(String[]args)
        {
    System.out.println("what is the answer");
    int x = (int) (Math.random()*10)+1; 
    int y = (int) (Math.random()*10)+1;         
     int z;
                System.out.print("how much it "+x+"+"); 
                System.out.println(y+"?"); 
                z=reader.nextInt();
                if (x+y==z)
        {
                    System.out.println("Right!");
                   
        }
                else
                {
                    System.out.println("Wrong!");
                }
        }
    }

  16. שאול ביטון | 2/9/2011 10:27:20 AM

    לפי דעתי... כן!

    ד"א, אם אתה עובד ב eclipse אתה יכול לכתוב: "מה התוצאת של..." במקום

    "How Much Is..." בכל מקרה- טוב

  17. שחר | 3/2/2011 1:54:41 PM

    שלום, טל, או מישהו אחר-

    איך אני עושה בדיוק את אותו הדבר, רק עם מילים?

    לדוג'- בקשה מהמשתמש להזין מילה מסויימת ובהתאם לשלוח פלט?

    ניסיתי פשוט להחליף את ה int ב String אבל זה לא עובד......

  18. jay-b | 3/29/2012 12:06:28 PM
    28=4*  7=3-  10=2*5 
  19. מ.ת. | 5/28/2013 6:34:04 AM

    ניסיתי את התרגיל הזה וזה היה מאוד קל.

    די הופתעתי כשראיתי ששמרת את התוצאה במשתנה בהדגמה שלך.

    לא יותר קל וגם חוסך זכרון פשוט לעשות את תרגיל החיבור בתוך הif?

    דוגמא:

     

    int x,y,rezult;

            

            Scanner c = new Scanner(System.in);

            

            

            

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

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

                

                System.out.println("what she is the sum of " + x + " + " + y + "?");

                

                rezult = c.nextInt();

                

                if (rezult == x + y)

                    System.out.println("Right");

                else

                    System.out.println("Wrong");

     

  20. מ.ת. | 5/28/2013 6:50:27 AM

    דרך אגב:

    כשאמרתי "לא יותר קל וגם חוסך זכרון פשוט לעשות את תרגיל החיבור בתוך הif?" התכוונתי לשאול אם לא קל יותר לעשות:

    if (rezult = x + y);

    במקום לכתוב משהו בסגנון:

    int rezult_check = x + y;

     if (rezult = x + y);

  21. מ.ת. | 5/28/2013 6:52:35 AM

    סליחהת טעיתי בכתיבת התגובה הקודמת, הנה מה שרציתי לכתוב:

    דרך אגב:

    כשאמרתי "לא יותר קל וגם חוסך זכרון פשוט לעשות את תרגיל החיבור בתוך הif?" התכוונתי לשאול אם לא קל יותר לעשות:

    if (rezult = x + y);

    במקום לכתוב משהו בסגנון:

    int rezult_check = x + y;

     if (rezult = rezult_check); 

  22. יהונתן | 6/1/2013 10:43:39 AM
    אחלה תרגיל ואחלה אתר והסברים. תודה רבה! 
  23. איציק המגניב | 7/7/2013 7:45:32 AM
    אני משתמש בeclipse וזה לא נותן לי לכתוב else. למה?
  24. עידן | 7/25/2013 2:06:55 PM

    טל אתה יכול להסביר לי את השורה הזאת? לא כל כך הבנתי אותה

    console.nextInt();
  25. anutk | 7/31/2013 2:43:53 AM
    למה אתה משתמש בדברים כמו userAnswer?
    לא למדנו את זה ויש כאלה(כמוני לדוגמא)שבכלל לא חשבו לעשות את זה
    אני עשיתי את זה: 
     
    import java.util.Scanner;

    class iiff 
    {  
            public static void main(String args[])  
            { 
                      Scanner console = new Scanner(System.in);  
                      int x = (int) (Math.random()*10)+1;  
                      int y = (int) (Math.random()*10)+1;
                      System.out.println("What is the sum of " + x + " + " + y + " ? "); 
                      int z = console.nextInt();  
                      if (z == x + y)
                      {
                                 System.out.println("you are right!");
                      }
                      else
                      {
                                 System.out.println("try again");
                      }

            }  
    }  
     
    והיו לי מלא סיבוכים(אבל בסוף זה עבד לי.....)
    אז עכשיו כבר לא משנה לי כלכך אבל תביא עוד חידות JAVA(סתם בשביל הכיף:)) 
  26. יובל | 8/6/2013 1:24:03 PM

    טל דבר ראשון מדריך מצויין!!!

    דבר שני יש לי בעיה: ניסיתי לבנות את הקוד לבד אבל לצערי נתקלתי במבוי סתום ולעתקתי את מה שהיה לי חסר מהקוד המלא, ניסיתי והאו רשם לי כמה טעויות. לאחר מכן ניסיתי להעתיק את הקוד לכשהדרתי הוא רשם לי Microsoft Windows [Version 6.0.6002]

    C:\Users\יובל שרצר\JavaProg>javac add2.java

    add2.java:9: error: cannot access Math

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

                                       ^

      bad source file: .\Math.java

        file does not contain class Math

        Please remove or make sure it appears in the correct subdirectory of the sou

    rcepath.

    1 error

    C:\Users\יובל שרצר\JavaProg>

    נ.ב. אחד מהקבצים הקיימים באותה תיקייה שעשיתי מהשיעורים הקודמים נקרא Math.java.

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