שאלה

manutd2

New member
שאלה

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

vinney

Well-known member
תחשוב על זה ככה

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

manutd2

New member
זה בעייתי

אני לא למדתי STRING והמטרה זה שאני אפתור את התרגיל בעזרת לולאת WHILE בעיקר רק אני לא יודע בדיוק איך.ואני קולט מספר(FLOAT) לא STRING. תודה לעוזר
 

טיורינג

New member
יש כל מיני דרכים

הנה אחת קצת מסורבלת אבל אמורה לעבוד (אני מניח שאתה מכיר את האופרטור % ואת תכונות החלוקה בשלמים): קלוט מספר x. הכפל אותו ב-10 (נניח למשתנה y). תעשה למשתנה הזה casting ל-int ואז שוב casting ל-float (שמור את התוצאה במשתנה נפרד, נניח z). עכשיו תשווה בין z (המספר לאחר שתי המרות) לבין y המספר ללא המרות. אם הם שווים, מצאת את כל הספרות שאחרי הספרה העשרונית. אם לא, תקדם מונה באחד, וחוזר חלילה (שוב להכפיל בעשר וכו' וכו').
 

manutd2

New member
אמ...

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

operandx

New member
תנסה אולי כיוון אחר >>

קצת יותר "נאיבי" אם תוריד את מהמספר את כל הערכים השלמים - החסרה של אחדות, לבסוף תשאר עם ערך מספרי בין אפס לאחד (בהנחה שהמספר חיובי כמובן). אז אתה יודע שהגעת לשבר. אתה מקדם את המונה שלך, מכפיל ב 10, וחוזר לתחילת הפרוצדורה. אפשר עם שתי לולאות מקוננות, או עם אחת + תנאי פנימי. בהצלחה :) נ.ב. - השאלה הזו בלבלה אותי קצת. כאשר אתה מבצע את הבדיקה, תשתמש בקלט/קבוע של שבר רציונלי - למשל, 11.0/1024, אחרת זה נהיה קצת סלט.
 

טיורינג

New member
חשבתי על זה

הבעיה היא איך הוא ידע (אחרי שיש לו מספר בין 0 ל-1) מתי לעצור? לדוגמא, אם הוא קיבל את המספר 0.1000000000001 איך הוא ידע שלמרות שיש לו שם אפסים הוא צריך להמשיך לספור?
 

operandx

New member
מאחר ותנאי העצירה שלך הוא f != 0

ו 0.00000001 הוא לא אפס. תתחיל לעבוד על לולאה שמפחיתה אחדות, ומכפילה מדי פעם ב 10....
 

טיורינג

New member
לא הבנתי באיזה שלב אתה בקורס

אם אתה לא יודע מה זה casting... casting זאת פעולת המרה מסוג אחד של משתנה לסוג אחר. אם תיקח למשל את הקוד double d = 3.14; int i = (int) d; זה casting, כלומר אתה לוקח מספר שהוא עשרוני ו"מכריח" אותו להיכנס למספר שהוא שלם (ובדרך אתה כמובן מאבד את כל הספרות מימין לנקודה).
 

manutd2

New member
ניסיתי ולא הצליח...

מישהו יכול לנסות ולהביא פה פתרון מוצלח בשפת C? תודה
 

operandx

New member
בבקשה (זה טיפה עקום :/)

This should return 10 or something. float f = 11.0/1024; int i = 0; while (f != 0) { if (f >= 1) f--; else { i++; f *= 10; } }​
 

yossiea

New member
שמע זה לא פשוט...

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

yossiea

New member
יש פונקציות ספרייה לזה:

סתם לידיעה. _ecvt _fcvt _qcvt ממירות מספר נקודה צפה למחרוזת. משם הדרך קלה. אבל נראה לי שזה לא יעזור לך כי התרגיל שלך כנראה אוסר שימוש בפונקציות ספרייה. אני צודק? תנסה אולי בדרך אחרת: אם A=123.456789 בהתחלה תיפטר מהשלמים ככה: B = (A - (int)A); תכפיל את B בעשר בחזקת עשרים או 19 אני לא בטוח לגבי זה (משתנה 64 ביט זה בערך 20 ספרות עשרוניות). למעשה תקבל מספר שלם אבל כמו שציינתי קודם יהיה קשה לדעת איפה הוא מסתיים. למשל תחשוב על מספר כזה: 100000000000000000001. ויש גם שגיאות עיגול (המהדר מפעיל אוטומטית עיגול). יקרו שם דברים מוזרים... זה אולי אפשרי, זה דרך עקומה וכמו שאמרתי גם לא מדוייקת.
 

פרבול

New member
אממ לא חייב מחרוזת..

אממ.. |אני קצת חלוד| אבל צורה אחת לפתור את האלגוריתם היא להשתמש בפונקציית הfloat שאם אני לא טועה מביאה לך את הערך העשרוני של שבר מסויים נגיד float(22.5) = 0.5 חחח יש מצב שאני ממציא:) בהנחה שאני צודק, אז נגיד המספר שלך הוא num והמונה שלך הוא counter אז אתה יכול לעשות את הפעולה הבאה: counter=0 while (float(num)!=0) { num=num*10 counter++ }
 
למעלה