מבוא למדעי המחשב (C++)

mamaniv

New member
מבוא למדעי המחשב (C++)

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

vinney

Well-known member
לא ברורה השאלה

מהז זה "תקוע"? יש הרבה שיטות לוודא תקינות קלט ב++C, כך שכדאי שפשוט תשים פה את הקוד שלך, ובהתאם לשיטת הקלט שבחרת, נוכל לעזור לך לבחור את שיטת בדיקת התקינות שלו...
 

mamaniv

New member
הנה

do { printf("Please enter two numbers \n"); if ((scanf("%d%d",&x,&y) != 2) || (x<=0) || (y<=0)) { printf("Input Error\n"); while (scanf("%c",c)!=0) { getchar(c); } } } while ((x <= 0) || (y <= 0)); אני רוצה שהתוכנית תקלוט את המספרים רק אם שניהם שלמים וגדולים מ 0 כמו כן אני לא רוצה שהיא תיזרוק אותי החוצה במקרה שהקלט לא תקין, אלא פשוט תבקש להכניס שוב
 

vinney

Well-known member
אאוץ', זה כואב!

כדי לא להכאיב לעיניים של הקוראים, תשתמש בבקשה בכפתורי "תחילת קוד" ו"סיום קוד" בתחתית חלון כתיבת ההודעות, אחרת אי אפשר לכתוב את הקוד שלך!
 

vinney

Well-known member
הא, וscanf לא יעזור לך

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

mamaniv

New member
אוקיי

סליחה אבל אין לי מושג איך עושים את מה שאמרת בכל מקרה אתה יכול להעתיק ל notepad וליישר לשמאל ה scanf נועד בשביל לבדוק אם יש קלט תקוע ולפעול בהתאם ולנקות אותו בעזרת getchar
 

mamaniv

New member
אה הנה מצאתי

do { printf("Please enter two numbers \n"); if ((scanf("%d%d",&x,&y) != 2) || (x<=0) || (y<=0)) { printf("Input Error\n"); while (scanf("%c",c)!=0) { getchar(c); } } } while ((x <= 0) || (y <= 0));​
 

mamaniv

New member
מזה?

עוד לא נתקלתי בזה אז אני אשמח אם תסביר לי למה זה טוב לי ובמה זה שומה מ scanf
 

mamaniv

New member
תודה אבל זה לא עונה לי על השאלה

אני באמת אשמח אם תצליח לענות לי בעברית פשוטה
 

vinney

Well-known member
אני לא רוצה לעשות לך את השיעורי בית

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

mamaniv

New member
איך הגעת למסקנה הזאת?

תאמין לי שהשיעורי הבית שלי לא היו לסכם על ההבדל בין scanf ל sscanf ואגב הקומפיילר אומר שמבחינתו אין דבר כזה sscanf. בכל מקרה, את הבעיה הראשונה פתרתי וזה ממש לא היה קשור ל scanf אלא רק בתנאי עצירה של הלולאה. עכשיו שאלה אחרת: איך בודקים אם הקלט מספר שלם? זה אמור להיות משהו בסיגנון if int(x)!=double(x) zz רק שמשום מה זה לא זה...
 

vinney

Well-known member
בגלל זה אמרתי שscanf לא מתאים לך

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

mamaniv

New member
אוקיי

ניסיתי וניסיתי וזה ממש לא מצליח... כנראה אני לא יודע איך לרשום את השורה עם ה sscanf כמו שצריך יש לי syntax error... אתה יכול לרשום לי שורה לדוגמא שאני אראה את המבנה?
 

vinney

Well-known member
מה הקוד שאתה כותב?

אתה קראת את הלינק שנתתי לך? מוסבר שם בדיוק הסינטקס של הפונקציה.
 

mamaniv

New member
לא מובן

int sscanf(const char *str, const char *format, ...); zz מה אני אמור להבין מפה? זה נראה משהו בסיגנון sscanf(x,y); zz אבל זה עושה שגיאה דרך אגב.. אני רוצה לעשות בדיקה int(x)==double(x) zz זה מודיע על שגיאה, למה?
 

Arrival

New member
אז ככה

1. שיעורים צריך לעשות לבד. 2. קודם אתה צריך להגדיר X וY כDOUBLE ולחלק את הבדיקה ל2 בדיקת קלט(אם אתה מקבל אות - יציאה) בדיקת שלמות וסימן(אז אתה מבקש להקליד שוב) בדיקת שלמות אתה יכול לעשות בהשוות ערך INT של מספר לערך אמיתי שלו. 3. נראה לי שאתה קצת מסתבך... תקרא ספר בC של KERNIGAN&RITCHI כי זה נראה לי C ולא C++...
 

vinney

Well-known member
רק הערה אחת

" בדיקת שלמות אתה יכול לעשות בהשוות ערך INT של מספר לערך אמיתי שלו" - זה לא בהכרח יעבוד בC, צריך קצת יותר תחכום מזה (או למעשה, קצת פחות).
 
למעלה