פורסם 2007 בינואר 618 שנים אני מנסה לעזור לחבר בשפת C אבל אני קצת חלוד בזה אז אולי תוכלו לעזור לי לפתור בעיה לא מסובכת מידי.לא כל כך משנה מה התוכנית עושה אבל היא קולטת מספר מהמשתמש (כל מספר בעולם)אז הגדרנו בתוכנית משתנה int ולתוכו נקלט המספרהתוכנית עובדת יופי אבל יש בעיה קטנה.אם המשתמש מקליד תו כל שהוא שהוא לא מספרהתוכנית משתגעת ועושה לולאה אין סופית (לא יודע למה אולי זה קשור לקוד עצמו שבודק בלולאה את תקינותטווח המספר שנקלט).בכל מקרה התוכנית צריכה לצאת החוצה ברגע שמנסים להכניס אות או תו שהוא לא מספרלא עולה לי רעיון איך לעשות את זה. אני מניח שנצרך להגדיר משתנה זמני שהוא לא int לבדוק שהוא לא אות ורק אזלהמשיך בתכונית אבל מה בדיוק לעשות אני לא יודע
פורסם 2007 בינואר 618 שנים מחבר int main(){int target;for( ; ; ){ scanf("%d",&target); while ((target>20 || target<1) && target!=50){ printf("\nyou have insert an illigal number (%d). try again (1-20,50)",target); scanf("%d",&target); }.... קיצרתי את הקוד כדי לא לסבך בעיקרון מה שקורה כאן שנקלט מספר הוא בודק שהמספר בתחום ואם הוא לא בתחום אז הוא מתבקש להכניס מספר אחרכל הקוד של התוכנית נמצאת בלולאה אין סופית שנגמרת רק כשמשתנה אחר שלא כתבתי אותו למעלה(שוב כדי לא לסבך) מגיע ל0 ואז יש return 0 והתוכנית מסתימתהלולאה האין סופית שהוא מבצע ,כשמכניסים תו במקום מספר למשתנה של ה int ,היא הלולאה של בדיקת תקינות הקלט ולא הלולאה החיצוניתכלומר מכניסים תו הוא בודק את התקינות ואז הוא לא מבקש להכניס שוב משהוא אחר אלא בודק שוב ושוב ושוב את הקלט אפילו שאף אחד לא הזין כלום(מדפיס בלי סוף you have insert an illigal number אבל לא עוצר לקלוט מספר אחר)
פורסם 2007 בינואר 618 שנים מחבר ה FOR יוצר בכוונה לולאה אין סופית ככה שאני יכול לחזור על הקוד של התוכנית שוב ושוב כמה פעמים שצריךעד שמתבצע איזה תנאי מסווים ובתוכו אני רושם return 0 והתוכנית מסתימתאבל זה לא הנקודה עכשיומה שנראה לי שצריך לעשות זה להגדיר CHAR ולקלוט עם getchar את המספר ברגע שהוא יראה ערך אסקי של תו שהוא לא מספרלהגדיר לו לעוף מהתוכניתאבל במקרה כזה אני לא יודע איך לקלוט מספר עם אני יכניס לדומא 1234 הוא יקלוט 1 אחר כך 2 וכוהוא לא ידע שזה מספר אחת ארוך .אולי אפשר להוסיף איזה אינקס שיספור כמה מספרים נקלטו ולשחזר את המספר המקוריזה לא יכול להיות מסובך ,פשוט עבר כבר זמן מאז שהתעסקתי עם זה
פורסם 2007 בינואר 618 שנים כשלא מכניסים תו שמקיים את ה- while שלך אז כלום לא קורה לתכנית מלבד לולאת ה- for.תעשה מעל while שפועל הפוך, כל עוד לא הוכנס משהו בטווח הרצוי תעשה כך וכך.
פורסם 2007 בינואר 618 שנים מחבר אתה לא הבנת, אם ה while לא מתקיים אז הקלט חוקי והתוכנית ממשיכה לרוץ לשאר הקוד שלא הבאתי כאן כי זה לא משנה מהואהוא יכנס ל while רק אם הקלט לא חוקי ויבקש להזין אותו שובבכל מקרה הלולאות הם לא הבעיה התוכנית עובדת מצויין כל עוד המשתמש לא מכניס תו או אות אלא רק מספרואני צריך שבמקרה והודפס משהוא שהוא לא מספר שתוכנית תעוף.מה שקורה אצלי זה שמנסים להכניס תו (CHAR) למשתנה שהוא מספר(INT)התוכנית משתגעת.צריך לשכלל את מנגנון הבדיקה ככה שקודם הוא יבדוק עם הודפס מספר או משהוא אחר ובמידה והודפס רק מספר בלי תוספות רק אז להכניס אתהמספר הזה ל target והתוכנית תמשיך לרוץ כרגיל וזה בדיוק מה שאני לא יודע איך לעשות
פורסם 2007 בינואר 618 שנים המבנה הנכון לבדיקות קלט הוא:קלטWHILE (תנאי) הודעת שגיאה קלטסוף לולאההמשך קודתשנה את הקוד שלך לפי זה, וזה יעבוד.ד"א, שים לב מה אתה קולט, כי הוא עשוי לעשות לך בעיות עם קודי הASCII של תווים אם אתה לא מכניס לו מספרים.
פורסם 2007 בינואר 618 שנים scanf מחזיר את מספר השדות שהוא קרא בהצלחה.על כן אם scanf שלך מחזיר 1 אתה יודע שהוא קרא את המספר בהצלחה.אם הוא מחזיר משהו אחר סימן שהכניסו תווים לא חוקיים (שאינם מספר).הערה: אני לא בטוח מה יקרה אם יכניסו מספר ואחריו אותיות לדוגמא "24g". נא לבדוק בתיעוד או ע"י ניסוי.
פורסם 2007 בינואר 618 שנים מחבר scanf מחזיר את מספר השדות שהוא קרא בהצלחה.על כן אם scanf שלך מחזיר 1 אתה יודע שהוא קרא את המספר בהצלחה.אם הוא מחזיר משהו אחר סימן שהכניסו תווים לא חוקיים (שאינם מספר).הערה: אני לא בטוח מה יקרה אם יכניסו מספר ואחריו אותיות לדוגמא "24g". נא לבדוק בתיעוד או ע"י ניסוי.זה קידם אותי מאד וזה עובד חלקית אם מכניסים תו או תו ומספרים זה עובדאבל אם מספר ואז תו כמו בדוגמא שלך זה עדין משתגעיש לך אולי עוד רעיון---עריכה----סליחה טעות שלי זה לא משתגע פשוט לא סידרתי את כל הקוד כמו שצריךמה שהוא עושה זה לקלוט את המספר עד התו הריאשוןוזה עדין לא טוב לי כי זה אמור לעוף
פורסם 2007 בינואר 618 שנים הנה טריק נחמד.תשתמש ב-scanf("%d%s") (כלומר קלוט תו ואז מחרוזת) ואז תוודא ש:א) ערך החזרה הוא 1 ולכן הוכנס רק מספראוב) ערך החזרה הוא 2 אבל המחרוזת היא ריקה (או מכילה רק רווחים, whitespace, ואולי new line).עוד אופציה:לקלוט מראש מחרוזת ואז להשתמש ב-strtol בשביל לתרגם אותה למספר. strtol מחזיר מצביע לתו הראשון שהוא אינו חלק מהמספר, ולכן אם הוכנס מספר אזי strtol יחזיר NULL (או אולי מצביע לתו סיום מחרוזת כלומר "0\").
פורסם 2007 בינואר 618 שנים מחבר גדול זה עבד תודה רבה לכולם ובמיוחד לשני החברה האחרונים שהגיבו ופתרו לי את הבעיה
פורסם 2007 בינואר 618 שנים אתה יכול גם להוסיף fflush אחרי scanf זה יפתור לך את הבאג עם הלולאה האין הסופית, לדוגמה:while ( (target < 1 || target > 20) && target != 50 ){ printf ("Enter a value between 1 - 20: "); scanf("%d",&target); fflush (stdin);}
פורסם 2007 בינואר 618 שנים מחבר אחרי הפיתרון הקודם זה כבר לא נחוץ וגם אני צריך שזה יעוף מהתוכנית (מה שהפיתרון שלך לא נותן לי)אבל ניסתי אותו בכל מקרה והוא אכן עובד מצויין ,שמחתי ללמוד משהו חדש נוסף היוםושוב תודה לכולם על התגובות
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.