פורסם 2006 בפברואר 1219 שנים #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();} המטרה של התוכנית היא להדפיס כמה מספרים יש אחרי הנקודהתודה
פורסם 2006 בפברואר 1219 שנים משתנה מסוג float לא מחזיק את המספר בצורה עשרונית.כשאתה מכפיל אותו ב- 10 אתה לא בהכרח מקטין את מספר הספרות אחרי הנקודה.לדעתי היה עדיף שהיית קורא את המספר כמחרוזת ועובד עליה.
פורסם 2006 בפברואר 1219 שנים בסי יש את הפעולה מודולו % שמחזירה את הערך השלם של החלוקה וכך אפשר לחשב את החלק הנותרnum=5%2התשובה תהיה 2ואז מחשבים את השארית כךnum1=5-num*2ואז התשובה היא 1
פורסם 2006 בפברואר 1219 שנים מחבר משתנה מסוג float לא מחזיק את המספר בצורה עשרונית.כשאתה מכפיל אותו ב- 10 אתה לא בהכרח מקטין את מספר הספרות אחרי הנקודה.לדעתי היה עדיף שהיית קורא את המספר כמחרוזת ועובד עליה.מה הכוונה לקרוא אותה כמחרוזת?בסי יש את הפעולה מודולו % שמחזירה את הערך השלם של החלוקה וכך אפשר לחשב את החלק הנותרnum=5%2התשובה תהיה 2ואז מחשבים את השארית כךnum1=5-num*2ואז התשובה היא 1אני לא הבנתי איך מודלו עוזר לי למצוא את מספר הספרות שאחרי הנקודה
פורסם 2006 בפברואר 1219 שנים לעשות scanf("%s", num);ולא scanf("%f", &num);ככה תוכל לעבור בלולאה עד שאתה רואה נקודה, ולאחר מכן לעבור בלולאה עד שאתה פוגש ב- 0.
פורסם 2006 בפברואר 1219 שנים תקצה מערך מספיק גדול של תוים, ותשתמש ב- scanf עם s% כדי לקרוא את מה שמשתמש מקליד בתור תוים.מה שנשאר לך לעשות זה למצוא את המיקום של הנקודה ולהחסיר אותו מאורך המחרוזת שקראת.unsigned integer - אני מניח שאתה מתכוון לתו '0\' ולא לתו '0'.
פורסם 2006 בפברואר 1219 שנים מחבר לא ממש הבנתי את מה שאמרתםאבל אני לא מבין מה הבעיה בדרך שעשיתי את זה?
פורסם 2006 בפברואר 1219 שנים '/0' = 0מאקרו כזהכמו NULL.דידס: בומרנג אמר לך למה זה לא עובד.תנסה לקלוט מתרוזת.אם הכנסת 3.14אז בתא הראשון יהייה 3בתא השניה יהייה .בשלישי יהייה 1ברביעי 4עכשיו אתה עובר איבר איבר.אם אתה רואה '.', אתה מתחיל לספור.כל עוד לא ראית נקודה, אתה לא סופר.for(i=0;num && num!='.';i++);for(i=i+1, count=0;num;count++, i++);
פורסם 2006 בפברואר 1219 שנים מחבר דידס: בומרנג אמר לך למה זה לא עובד. הההודעה הזאת? משתנה מסוג float לא מחזיק את המספר בצורה עשרונית. כשאתה מכפיל אותו ב- 10 אתה לא בהכרח מקטין את מספר הספרות אחרי הנקודה. לדעתי היה עדיף שהיית קורא את המספר כמחרוזת ועובד עליה. אם כן מה הכונה "לא מחזיק את המספר בצורה עשרונית."? ד"א מה זה מחרוזת? תודה לכולם
פורסם 2006 בפברואר 1219 שנים מחבר אני יסביר את התוכנית שעשיתי ואיפה שיש טעות תתקנו אותי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והוא צריך להדפיס את המונה (שבדוג' הזאת גדל בשתיים)לא ככה?
פורסם 2006 בפברואר 1219 שנים מה הכונה "לא מחזיק את המספר בצורה עשרונית."?C מחזיק משתנים מסוג float בצורה בינארית, כלומר סכום חזקות של 2 (כאשר המעריך הוא 0 ומטה) כפול 10 (או 2, אני לא זוכר) בחזקה כלשהי.כשאתה מקליד מספר ומכניס אותו ל- float הוא 'יעוגל' לבסיס בינארי, מה שלמעשה יוסיף לך ספרות בבסיס בינארי.נגיד שלצורך העניין יש 4 ביטים שמחזיקים את המספר אחרי הנקודה, אז הערכים שהוא יכול לקבל הם כפולות של 1/16 ואם תכניס מספר כמו 0.3 הוא למעשה יעוגל ל- 0.3125 (והנה, נוספו לך 3 ספרות)
פורסם 2006 בפברואר 1219 שנים אני כתבתי תוכנית שקולתת מספר עם נקודה עשרונית ומדפיסה אותו וקלתתי 0.3 והוא הדפיס לי 0.3000000 כלומר שהוא לא מעגל את המספר
פורסם 2006 בפברואר 1219 שנים מחבר זה מה שרציתי לכתוב מקודם אבל האתר לא עבדאם כך למה התוכנית לא עובדת?
פורסם 2006 בפברואר 1219 שנים הרגע הסבירו לך למה!מה שקורה הוא שהמחשב לא משתמש בבסיס 10 כמונו, אלא בבסיס 2.זה נכון גם לגבי שברים.מה זאת אומרת?תחשוב על המקרה שאתה רוצה לייצג את המספר 1/3 בצורה עשרונית.אז הוא יוצא 0.333333333... ככה עד אינסוף 3-ים.למה זה? כי ל-3 יש גורמים ראשוניים שאינם גורמים של 10 (ספציפית 3 עצמו הוא הגורם הזה).במקרה שלנו, אתה מנסה לייצג את המספר 0.3 (שהוא 3/10) בצורה בינארית.אז הוא גם כן יוצא מספר מחזורי אינסופי (אין לי כוח באמת לחשב אותו), מאותה סיבה - ל-10 יש גורם (5) שאינו גורם של הבסיס 2.לכן המחשב לא באמת יכול לייצג אותו, והוא "מעגל" אותו. (כמו שאנחנו לא באמת יכולים לייצג את 1/3 כמספר עשרוני, אז אנחנו רושמים רק כמה 3-ים אחרי הנקודה).העיגול הזה גורם להרבה בעיות במחשב - מה שנקרא "שגיאות עיגול".שגיאות העיגול האלה גורמות לכך שכשאתה מבצע פעולה חשבונית על שני מספרים ממשיים, התוצאה לא מדוייקת ב-100%.וכשמבצעים הרבה פעולות כאלה, השגיאה הולכת וגדלה.סביר להניח שמה שקרה הוא שבגלל השגיאות האלה, d אף פעם לא באמת קיבל את הערך 0, אלא רק ערך ממש ממש קטן, ולכן הלולאה נמשכה עד אינסוף. (או לחילופין, היא נפסקה מאוחר מדי).
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.