בעיה ב-C

pdib

New member
בעיה ב-C

התוכנית הבאה לא מבצעת את הנדרש:
#include <stdio.h> int main () { int t,sum,num2; double num,hefresh; do{ t=0; sum=0; scanf("%d",&num); while (num != 10) { num2 = num; hefresh = num - num2; if (hefresh != 0) t=1; else if (num2%2==1) sum += num; scanf("%d",&num); } if (t==1) printf("error"); } while (t==1); return 0; }​
הנדרש: התוכנית תקלוט רצף של מספרים שלמים ותסכום את האי-זוגיים מביניהם עד לקליטת המספר 10. (10 לא יכלל בסכום). במידה ואפילו אחד מהערכים הנקלטים אינו מהווה מספר שלם יש להדפיס הודעת שגיאה, להתעלם לגמרי מסדרת המספרים הנתונה ולהמתין לסדרת מספרים חדשה. משום מה זה לא פועל כמו שצריך. זה נותן לי לקלוט מספר אחד, ומסיים את התוכנית, כלו' משום מה לא נכנס ללולאה.
 

vinney

Well-known member
זה שאלה לפורום שפות תכנות

כשאתה קולט double - אל תשתמש בd%, אלא ב f%. כשאתה משווה ל10 - אל תשווה את הdouble, הוא לעולם לא יהיה 10, אלא את הint. הלולאה שלך מסתיימת כי t==1, זה הרי תנאי לסיום הלולאה. זה קורא כי לא משנה מה תקלוט, זה לעולם לא יהיה מדויק (מגבלת הdouble), ולכן תמיד יהיה הפרש בין הint לdouble.
 

pdib

New member
אוקיי... אז ../images/Emo26.gif

איך אני יכול לדעת אם משתמש הכניס לתוך משתנה שלם, תו, או מספר שאינו שלם? (לפי תנאי השאלה...)
 

pdib

New member
ד"א, t==1 זה לא התנאי לסיום, אלא

כל עוד t==1 תבצע את מה שהלולאה דורשת, לא? או שכאן זה לא כמו בפסקל, וצריך לכתוב בתוך ה-while את תנאי העצירה?
 

vinney

Well-known member
לא, אתה צודק

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

pdib

New member
אין בו באגים...../images/Emo26.gif

תראה, מה שקורה זה שנקלט מספר, ואז לולאת וויל שתנאי העצירה שלה הוא שהמספר יהיה 10. עכשיו, המספר שנקלט, נקלט לתוך משתנה ממשי, אז אני מעביר את המספר לתוך משתנה שלם, וכך מקבל את הערך השלם, ואז בודק אם יש הפרש בין הממשי לשלם. אם יש הפרש מכאן שנקלט מספר שהוא לא מספר שלם (לתוך המשתנה הממשי), אם אין הפרש, אז נקלט מספר שלם. עכשיו, אם נקלט מספר לא שלם, t הופך ל-1. עכשיו, כל העסק הזה נמצא בלולאת while do, כך שאם t=1 (נקלט מספר לא שלם), אז אמורה להקלט סדרת מספרים חדשה ש"דורסת" את סדרת המספרים הקודמת. לכן התוכנית שבניתי מתאימה לתנאי השאלה. אבל יכול להיות שיש דרך יותר פשוטה לבדוק אם לתוך משתנה ממשי הוקלד משתנה שלם או לאו. דבר נוסף: איך אפשר לבדוק אם לתוך משתנה ממשי הוקלד אות?
 

גיל14

New member
אתה יכול להשתמש ברעיון של דפנה

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