ABA


"שאלה קטנה על בדיקת קלט ב C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10389 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10389
TYSON 
חבר מתאריך 17.9.08
8384 הודעות, דרג אמינות חבר זה
   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
3490 הודעות, דרג אמינות חבר זה
   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
8384 הודעות, דרג אמינות חבר זה
   18:01   19.05.11   
אל הפורום  
  2. ואו זה בדיוק מה שחיפשתי!! תודה רבה  
בתגובה להודעה מספר 1
 
   השאלה הא למה מסתירים מאיתנו פרטים כאלו בקורס...


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

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

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


אני יכול לסבך לך את הבעיה שנתקלת בה כך שהפתרון שמצאת עכשיו לא יעזור לך.
למשל: אתה צריך לקלוט מספר ולבדוק שהקלט שהכניס לך המשתמש הוא אכן מספר שלם ולא משהו אחר.
למשל:
http://gyazo.com/62d7ff159a8e8e303080912cd632da96.png

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

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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


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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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


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

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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


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

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

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

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

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   21:09   25.05.11   
אל הפורום  
  11. זה מה שאני מציע לעשות  
בתגובה להודעה מספר 10
 
   ערכתי לאחרונה בתאריך 25.05.11 בשעה 21:15 בברכה, ShocKi
 
http://gyazo.com/a6e716134ddaa049d2744afdf3e52a94.png

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

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

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



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