dids22 פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 #include<stdio.h>#include<conio.h>int main(){float a,d;int b,mone=0;printf("insert a number\n");scanf("%f",&a);b=a;d=a-b;while(d>0){ a=(d*10); b=a; d=a-b; mone++;}printf("there is %d numbers after the point",mone); getch();} המטרה של התוכנית היא להדפיס כמה מספרים יש אחרי הנקודהתודה קישור לתוכן שתף באתרים אחרים More sharing options...
Boomerang פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 משתנה מסוג float לא מחזיק את המספר בצורה עשרונית.כשאתה מכפיל אותו ב- 10 אתה לא בהכרח מקטין את מספר הספרות אחרי הנקודה.לדעתי היה עדיף שהיית קורא את המספר כמחרוזת ועובד עליה. קישור לתוכן שתף באתרים אחרים More sharing options...
big foot פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 בסי יש את הפעולה מודולו % שמחזירה את הערך השלם של החלוקה וכך אפשר לחשב את החלק הנותרnum=5%2התשובה תהיה 2ואז מחשבים את השארית כךnum1=5-num*2ואז התשובה היא 1 קישור לתוכן שתף באתרים אחרים More sharing options...
dids22 פורסם 2006 בפברואר 12 מחבר Share פורסם 2006 בפברואר 12 משתנה מסוג float לא מחזיק את המספר בצורה עשרונית.כשאתה מכפיל אותו ב- 10 אתה לא בהכרח מקטין את מספר הספרות אחרי הנקודה.לדעתי היה עדיף שהיית קורא את המספר כמחרוזת ועובד עליה.מה הכוונה לקרוא אותה כמחרוזת?בסי יש את הפעולה מודולו % שמחזירה את הערך השלם של החלוקה וכך אפשר לחשב את החלק הנותרnum=5%2התשובה תהיה 2ואז מחשבים את השארית כךnum1=5-num*2ואז התשובה היא 1אני לא הבנתי איך מודלו עוזר לי למצוא את מספר הספרות שאחרי הנקודה קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 לעשות scanf("%s", num);ולא scanf("%f", &num);ככה תוכל לעבור בלולאה עד שאתה רואה נקודה, ולאחר מכן לעבור בלולאה עד שאתה פוגש ב- 0. קישור לתוכן שתף באתרים אחרים More sharing options...
Boomerang פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 תקצה מערך מספיק גדול של תוים, ותשתמש ב- scanf עם s% כדי לקרוא את מה שמשתמש מקליד בתור תוים.מה שנשאר לך לעשות זה למצוא את המיקום של הנקודה ולהחסיר אותו מאורך המחרוזת שקראת.unsigned integer - אני מניח שאתה מתכוון לתו '0\' ולא לתו '0'. קישור לתוכן שתף באתרים אחרים More sharing options...
dids22 פורסם 2006 בפברואר 12 מחבר Share פורסם 2006 בפברואר 12 לא ממש הבנתי את מה שאמרתםאבל אני לא מבין מה הבעיה בדרך שעשיתי את זה? קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 '/0' = 0מאקרו כזהכמו NULL.דידס: בומרנג אמר לך למה זה לא עובד.תנסה לקלוט מתרוזת.אם הכנסת 3.14אז בתא הראשון יהייה 3בתא השניה יהייה .בשלישי יהייה 1ברביעי 4עכשיו אתה עובר איבר איבר.אם אתה רואה '.', אתה מתחיל לספור.כל עוד לא ראית נקודה, אתה לא סופר.for(i=0;num && num!='.';i++);for(i=i+1, count=0;num;count++, i++); קישור לתוכן שתף באתרים אחרים More sharing options...
dids22 פורסם 2006 בפברואר 12 מחבר Share פורסם 2006 בפברואר 12 דידס: בומרנג אמר לך למה זה לא עובד. הההודעה הזאת? משתנה מסוג float לא מחזיק את המספר בצורה עשרונית. כשאתה מכפיל אותו ב- 10 אתה לא בהכרח מקטין את מספר הספרות אחרי הנקודה. לדעתי היה עדיף שהיית קורא את המספר כמחרוזת ועובד עליה. אם כן מה הכונה "לא מחזיק את המספר בצורה עשרונית."? ד"א מה זה מחרוזת? תודה לכולם קישור לתוכן שתף באתרים אחרים More sharing options...
amilo פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 מחרוזת זה מערך של תווים אחי... קישור לתוכן שתף באתרים אחרים More sharing options...
dids22 פורסם 2006 בפברואר 12 מחבר Share פורסם 2006 בפברואר 12 אני יסביר את התוכנית שעשיתי ואיפה שיש טעות תתקנו אותי1)המשתמש מקליד מספר למשתנה a מסוג float -נגיד המספר הוא 15.23b=a המשתנה הוא מסוג int ולכן a=15d=15.23-15=0.23while(d>0)(כל עוד d גדול מאפס הוא יעשה את הלולאה שוב וd שווה 0.23 ולכן הוא נכנס ללולאה)a=(d*10) כלמר a =2.3b=a כלמר b=2d=a-b כלמר d=0.3mone++ -המונה גדל באחדהוא עושה שוב את הלולאה כי d=0.3a=(d*10 כלמר a=3b=a כלמר b=3d=a-b כלמר d=0mone ++ המונה גדל שוב באחדהוא לא עושה שוב את הלולאה כי d=0והוא צריך להדפיס את המונה (שבדוג' הזאת גדל בשתיים)לא ככה? קישור לתוכן שתף באתרים אחרים More sharing options...
Boomerang פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 מה הכונה "לא מחזיק את המספר בצורה עשרונית."?C מחזיק משתנים מסוג float בצורה בינארית, כלומר סכום חזקות של 2 (כאשר המעריך הוא 0 ומטה) כפול 10 (או 2, אני לא זוכר) בחזקה כלשהי.כשאתה מקליד מספר ומכניס אותו ל- float הוא 'יעוגל' לבסיס בינארי, מה שלמעשה יוסיף לך ספרות בבסיס בינארי.נגיד שלצורך העניין יש 4 ביטים שמחזיקים את המספר אחרי הנקודה, אז הערכים שהוא יכול לקבל הם כפולות של 1/16 ואם תכניס מספר כמו 0.3 הוא למעשה יעוגל ל- 0.3125 (והנה, נוספו לך 3 ספרות) קישור לתוכן שתף באתרים אחרים More sharing options...
big foot פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 אני כתבתי תוכנית שקולתת מספר עם נקודה עשרונית ומדפיסה אותו וקלתתי 0.3 והוא הדפיס לי 0.3000000 כלומר שהוא לא מעגל את המספר קישור לתוכן שתף באתרים אחרים More sharing options...
dids22 פורסם 2006 בפברואר 12 מחבר Share פורסם 2006 בפברואר 12 זה מה שרציתי לכתוב מקודם אבל האתר לא עבדאם כך למה התוכנית לא עובדת? קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2006 בפברואר 12 Share פורסם 2006 בפברואר 12 הרגע הסבירו לך למה!מה שקורה הוא שהמחשב לא משתמש בבסיס 10 כמונו, אלא בבסיס 2.זה נכון גם לגבי שברים.מה זאת אומרת?תחשוב על המקרה שאתה רוצה לייצג את המספר 1/3 בצורה עשרונית.אז הוא יוצא 0.333333333... ככה עד אינסוף 3-ים.למה זה? כי ל-3 יש גורמים ראשוניים שאינם גורמים של 10 (ספציפית 3 עצמו הוא הגורם הזה).במקרה שלנו, אתה מנסה לייצג את המספר 0.3 (שהוא 3/10) בצורה בינארית.אז הוא גם כן יוצא מספר מחזורי אינסופי (אין לי כוח באמת לחשב אותו), מאותה סיבה - ל-10 יש גורם (5) שאינו גורם של הבסיס 2.לכן המחשב לא באמת יכול לייצג אותו, והוא "מעגל" אותו. (כמו שאנחנו לא באמת יכולים לייצג את 1/3 כמספר עשרוני, אז אנחנו רושמים רק כמה 3-ים אחרי הנקודה).העיגול הזה גורם להרבה בעיות במחשב - מה שנקרא "שגיאות עיגול".שגיאות העיגול האלה גורמות לכך שכשאתה מבצע פעולה חשבונית על שני מספרים ממשיים, התוצאה לא מדוייקת ב-100%.וכשמבצעים הרבה פעולות כאלה, השגיאה הולכת וגדלה.סביר להניח שמה שקרה הוא שבגלל השגיאות האלה, d אף פעם לא באמת קיבל את הערך 0, אלא רק ערך ממש ממש קטן, ולכן הלולאה נמשכה עד אינסוף. (או לחילופין, היא נפסקה מאוחר מדי). קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.