ABA



"שאלה קטנה על בדיקת קלט ב C"
גירסת הדפסה   שלח לחבר        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10389 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10389
TYSON 
חבר מתאריך 17.9.08
8048 הודעות
   12:54   19.05.11   
אל הפורום  
  שאלה קטנה על בדיקת קלט ב C  
 
   אם בתוכנה שלי אני צריך שיכניסו רק מספרים (אין הגלבה עד איזה מספר אבל אם נגיד אני אצליח לדאוג עד ל30 זה יהיה בסדר

יש לי מטריצה והמשתמש צריך לבחור 2 שורות מהמטריצה
יש דרך להחזיר הודעת שגיאה אם התווים שהוכנסו הם בכלל לא ספרות?
אם המספר שהוכנס הוא גדול מהמטריצה הוא מחזיר ארור את זה הצלחתי לסדר
אבל אם מכניסים לי אותיות נגיד התוכנה משתגעת
בסעיף הזה קלטתי את הנתונים כ int
יש דרך לעשות את זה כשהקליטה היא ב int ולא ב char?

תודה


                             שתף        


  האשכול     מחבר     תאריך כתיבה     מספר  
  כן D-KinG 19.05.11 15:16 1
     ואו זה בדיוק מה שחיפשתי!! תודה רבה TYSON  19.05.11 18:01 2
         כי לא אמורים לספר לכם הכל. ShocKi  19.05.11 20:32 3
             הדרך לתקן את התוכנית היא באותם משתנים ? -KG-  23.05.11 01:48 4
                 אם אתה רוצה עוד משתנים אתה מוזמן להגדיר.. ShocKi  24.05.11 11:17 7
  אותי לימדו VeNom 23.05.11 10:29 5
     זה ארוך, מיותר ולא ממש יעיל. ShocKi  24.05.11 11:15 6
         זה לא כזה ארוך VeNom 24.05.11 19:08 8
             אם הבנתי נכון אתה יוצא מנקודת הנחה שנקלטת ספרה ShocKi  24.05.11 20:09 9
                 אחי VeNom 24.05.11 20:48 10
                     זה מה שאני מציע לעשות ShocKi  25.05.11 21:09 11

     
D-KinG
חבר מתאריך 8.6.02
3460 הודעות
   15:16   19.05.11   
אל הפורום  
  1. כן  
בתגובה להודעה מספר 0
 
   scanf מחזירה לך את מס' הארגומנטים שהיא הצליחה לקלוט לתוכם.
אם אתה מנסה לקלוט מס' כלשהו והיא מחזירה לך 0 סימן שהיא לא הצליחה.

int x, num;
x=scanf("%d", &num);
if (x!=0)
printf("success\n");
else
printf("invalid number\n");



                                                      (ניהול: מחק תגובה)
TYSON 
חבר מתאריך 17.9.08
8048 הודעות
   18:01   19.05.11   
אל הפורום  
  2. ואו זה בדיוק מה שחיפשתי!! תודה רבה  
בתגובה להודעה מספר 1
 
   השאלה הא למה מסתירים מאיתנו פרטים כאלו בקורס...


                                                      (ניהול: מחק תגובה)
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
15506 הודעות, 4 פידבק
   20:32   19.05.11   
אל הפורום  
  3. כי לא אמורים לספר לכם הכל.  
בתגובה להודעה מספר 2
 
   או יותר נכון לומר, איאפשר לספר לכם הכל.
אפשר לדבר על SCANF וחברותיה למשפחה הרבה מאוד.

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

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


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

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

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


                                                      (ניהול: מחק תגובה)
-KG- 
חבר מתאריך 2.8.02
13617 הודעות, דרג אמינות חבר זה
   01:48   23.05.11   
אל הפורום  
  4. הדרך לתקן את התוכנית היא באותם משתנים ?  
בתגובה להודעה מספר 3
 
   או שצריך להוסיף?


                                                      (ניהול: מחק תגובה)
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
15506 הודעות, 4 פידבק, 7 נקודות
   11:17   24.05.11   
אל הפורום  
  7. אם אתה רוצה עוד משתנים אתה מוזמן להגדיר..  
בתגובה להודעה מספר 4
 
   ערכתי לאחרונה בתאריך 24.05.11 בשעה 11:25 בברכה, ShocKi
 
זה משחק עם הדרך שבה אתה קובע את הקלט... לא משהו שמוסיף עוד שורות קוד רבות.


                                                      (ניהול: מחק תגובה)
VeNom
חבר מתאריך 7.6.02
7419 הודעות, דרג אמינות חבר זה
   10:29   23.05.11   
אל הפורום  
  5. אותי לימדו  
בתגובה להודעה מספר 0
 
   שאין כזה דבר לקבל int מהמשתמש..
המשתמש מכניס מחרוזת..ואתה זה שלוקח את המחרוזת ומבצע את ההתאמות.
וזה אחלה טיפ..למה שלא תקבל מחרוזת ותדאג אתה להעביר אותה לפונקציה שתבדוק את התקינות שלה ותבצע את כל הבדיקות תקינות?


                                                      (ניהול: מחק תגובה)
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
15506 הודעות, 4 פידבק, 7 נקודות
   11:15   24.05.11   
אל הפורום  
  6. זה ארוך, מיותר ולא ממש יעיל.  
בתגובה להודעה מספר 5
 
   קלטת מחרוזת.. בדקת שהיא מורכבת ממספרים.. אתה צריך להמיר אותה עכשיו למספר.. לשתמש בפונקציות atoi וחברותיה...
אתה יודע מה הסיבוכיות של הפונקציות האלה?

תנסה לפתור את הבעיה שהצגתי בתגובה 3 בשיטה שלך.. תראה לנו איזה קוד אתה מקבל


                                                      (ניהול: מחק תגובה)
VeNom
חבר מתאריך 7.6.02
7419 הודעות, דרג אמינות חבר זה
   19:08   24.05.11   
אל הפורום  
  8. זה לא כזה ארוך  
בתגובה להודעה מספר 6
 
   לא כזה מיותר והסיבוכיות של זה אפילו לא נספרת..
עובדה שבשפות העיליות והחדשות אתה מקבל רק STRING מהקונסול ובצדק..
ומצחיק שבכלל כתבת את המילה "סיבוכיות" כאן..
ובקשר לבעיה שלך..קולט מחרוזת בגודל n..עושה לולאה מ 0..n-1 ובודק האם התו שהוכנס הוא מספר בין 0 ל 9.אם לא מחזיר FALSE אחרת ממשיך..בסוף הלולאה מחזיר TRUE..


                                                      (ניהול: מחק תגובה)
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
15506 הודעות, 4 פידבק, 7 נקודות
   20:09   24.05.11   
אל הפורום  
  9. אם הבנתי נכון אתה יוצא מנקודת הנחה שנקלטת ספרה  
בתגובה להודעה מספר 8
 
   ומה אם המספר הוא באורך של 4 ספרות? בוא נזכור שמדובר על integer ואני יכול לקחת את זה רחוק יותר לlong ול double ולכל אורך מטורף אחר של מספר.
השאלה כאן היא לאו דווקא על ספרה בודדת.

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

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

הפתרון הנדרש הוא בסיבוכיות זמן o(1) אתה יכול לעשות את זה בדרך שלך?

כולנו כאן כדי ללמוד... אולי גם אני אלמד משהו חדש


                                                      (ניהול: מחק תגובה)
VeNom
חבר מתאריך 7.6.02
7419 הודעות, דרג אמינות חבר זה
   20:48   24.05.11   
אל הפורום  
  10. אחי  
בתגובה להודעה מספר 9
 
   אם כבר אתה מדבר על מספרים גדולים לצורך העניין מספרים ענקיים שלא נכנסים ב LONG אז כן משתמשים במבנים קצת שונים מהטיפוסים הבסיסים.(כל מיני אלגוריתמים למציאת פירוק ראשוני למספרים ענקיים לדוגמא שלא נכנסים ב LONG).
אני לא יצאתי מנק' הנחה שמדובר בספרה בודדת..הרי מחרוזת היא "מערך של תוים" ואני יכול לעבור על תו תו ולבדוק האם הוא ספרה ואם כן לבצע המרה ולהכניס אותו למבנה שבחרתי(בין אם זה LONG\INT או משהו יותר גדול).
כל הפונקציות שממומשות בספריות הן בד"כ הכי "יעילות"\"מוגנות" וטובות כי אחרת היו מכניסים את המימושים היותר יעילים\טובים לאותה ספריה אם יכלו.
במקרה הזה קל מאוד לבצע המרה בין תו לספרה ע"י פעולת חיסור קטנה..ולהרכיב מספר אפשר עם כפל בבסיס שלה(נגיד בסיס 10 תעשה עם כפולות של 10).
תמיד יש דרכים יותר קצרות..מה שנתתי זה מאין טיפ כזה..הרי בכל הקורסים האלה מריצים בדיקות אוטומטיות..ואם אתה לא רוצה לקרוס אתה חייב להיות מוכן לכך שהבדיקה תלך לפינות הכי רחוקות ולא קשורות.
ומה יותר פשוט לבדוק האם המשתמש הכניס INT או FLOAT או תו או משהו אחר?
סה"כ עוברים פעם אחת על הקלט ובודקים את מה שרלוונטי.


                                                      (ניהול: מחק תגובה)
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
15506 הודעות, 4 פידבק, 7 נקודות
   21:09   25.05.11   
אל הפורום  
  11. זה מה שאני מציע לעשות  
בתגובה להודעה מספר 10
 
   ערכתי לאחרונה בתאריך 25.05.11 בשעה 21:15 בברכה, ShocKi
 

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


                                                      (ניהול: מחק תגובה)

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
     


© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net