מבחן ב-JAVA

מבחן ב-JAVA

אני בונה אפלט של מבחן אמריקאי (שאלה+4 תשובות), ויש לי שגיאה בבדיקת התשובה הנכונה בקוד הבא:
public void check_answer() { if (cAns3.getState()==true) { String ranswer=q[QuestionNumber].right_answer; if (cAns3.getLabel()==q[QuestionNumber].right_answer) { Total=Total++; lTotal.setText(""+Total); } } }​
זאת הפונקציה שבודקת אם התשובה נכונה או לא. Total - משתנה שמכיל את הניקוד. QuestionNumber - האינדקס של השאלה וארבעת תשובותיה. q - המחלקה שממנה אני יוצר את האובייקטים של השאלות במערך. cAns3 - אובייקט checkbox בקבוצה, ו-3 זה רק דוגמה, שב- cAns3 יש באינדקס הזה (שנקבע עפ"י משתנה QuestionNumber) את התשובה הנכונה. אם יש צורך בפרטים נוספים תוכלו לשאול ואני אענה בשמחה
תודה מראש.
 
אגב..

אל תתייחסו ל-ranswer, הוא לא שייך לשם.. זה רק כשעשיתי כמה בדיקות שחכתי למחוק אותו ואם כבר בדיקות, בדקתי מה מכיל q[QuestionNumber].right_answer , ומה מכיל cAns3.getLabel() והם שווים, כולל בדיקת רווחים. הם ממש אותו דבר בדיוק
אז מוזר לי שהוא לא משווה אותם כמו שצריך
 

voguemaster

New member
הממ מוזר שהשתמשת ב ==

למה השתמשת באופרטור == בבדיקה האם תשובה נכונה ? האופרטור הזה בודק האם שני אובייקטים מסוג כלשהו הם אותו אובייקט!! לכן ידידי, ברור שלעולם לא יהיה שיוויון. תראה, הפונקציה getLabel מחזירה אובייקט חדש מסוג String בכל פעם שאתה קורא לה, כך גם עוד הרבה פונקציות (לדוגמא getText של TextField). לפי זה, ברור שהאובייקט המתקבל מהקריאה למתודה getLabel שונה מהאובייקט שנמצא במערך התשובות הנכונות (אולי התוכן זהה, אבל אלו שני מחרוזות שונות, כלומר שני אובייקטים שונים!), ולכן הבדיקה הזו לא פועלת. בדיקה מהסוג הזה תפעל בטיפול באירועים, כשבודקים לדוגמא איזה לחצן נלחץ. אז אין בעיה כי אתה משווה בין האובייקט שבאירוע לכל האובייקטים שיש לך, וזה אחד מהם בטוח.. בכל מקרה, תנסה להשתמש במתודה equalToIgnoreCase של המחלקה String, בצורה הבאה:
if ( cAns3.getState() == true) { ranswer = q[QuestionNumber].right_answer; if ( cAns3.getLabel().equalsToIgnoreCase( q[QuestionNumber].right_answer) ) { Total++; lTotal.setText( ""+Total); } }​
בוקר טוב
אלי
 
כמה דולרים אתה רוצה../images/Emo35.gif../images/Emo77.gif../images/Emo77.gif

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

יש לי את המחלקה שבודקת האם נלחץ הכפתור של השאלה הבאה או הכפתור של השאלה הקודמת. אני בודק אותו עם אובייקט evt.getSource(). זאת המתודה שבודקת איזה כפתור נלחץ:
public void actionPerformed(ActionEvent evt) { Object src=evt.getSource(); if (src==jchange.bNext) { jchange.check_answer(); jchange.show_next(); } if (src==jchange.bPrevious) { jchange.show_previous(); } }​
עכשיו, במתודה של show_next() אני פשוט משנה את ה-QuestionNumber - מוסיף לו 1 , ומשנה את הערכים של האובייקטים (עם setLabel() ו-setText() ), אותו דבר ב-show_previous() רק ששם אני מחסיר מהאינדקס של השאלה 1 ומשנה את הערכים של האובייקטים. כאן אני מקשר את מחלקת האירועים למחלקה הראשית של התוכנית:
bNext.addActionListener(new change_question(this)); bPrevious.addActionListener(new change_question(this));​
כל זה עשיתי, אבל כשאני עובד עם התוכנית הכל מתבלבל: כשהייתי בשאלה הראשונה לחצתי על next ועברתי לשאלה השנייה כשהייתי בשאלה השנייה לחצתי על previous ועברתי לשאלה השלישית כשהייתי בשאלה השלישית ולחצתי שוב על Previous עברתי לשאלה הראשונה איך מסדרים את זה כך שלא יווצר בלבול
תודה מראש
 
זה בסדר..סידרתי את זה אבל..

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

voguemaster

New member
אני לא נראה כמו צפרדע

הנה רעיון, הזכיר לי באג שהיה לי פעם: בנוסף למונה שאומר לך באיזה שאלה אתה, תחזיק מונה שאומר מה מספר השאלה המקסימלי שהגעת אליו. כלומר, אם מישהו עונה על שאלה, צריך להגדיל את מונה המקסימום רק אם מספר השאלה שווה למונה עצמו. כלומר, אם מישהו עונה נניח על 3 שאלות, ערך שני המונים 3. נניח שהמשתמש חוזר לשאלה הראשונה ואז המונה של השאלה הנוכחית הוא 1, ומונה המקסימום עדיין 3. אם המשתמש יתקדם לשאלה 2, עדיין אסור להגדיל את מונה המקסימום, אלא רק כשיש התקדמות כאשר שניהם 3 (כך המקסימום יהיה 4). עכשיו, למה טוב מונה מקסימום ? אז כך, לא משנים את הניקוד כאשר עונים על שאלה ומונה השאלות קטן ממונה המקסימום. בדוגמא הקודמת אם המשתמש עונה על שאלה 1 או 2 או שתיהן, הניקוד לא צריך להשתנות כי מספר השאלה הנוכחי קטן ממספר השאלה המקסימלי שהגענו אליו, או למעשה, מספר השאלה האחרון שהמשתמש הגיע אליה.. אלי
 
זה בסדר אלי ../images/Emo8.gif

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

voguemaster

New member
רגע

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