ABA


"בעיה קלה בפסקל :) ממש פשוטה ! (מספרים עשרוניים)"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11491 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11491
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   13:55   09.12.04   
אל הפורום  
  בעיה קלה בפסקל :) ממש פשוטה ! (מספרים עשרוניים)  
 
   יש לי קטע כזה...

A,B:Integer;
Y:Real;

Y:=A/B


אני רוצה שב-Y יהיה מספר עשרוני, במקום התוצאה המדעית שיש עכשיו.

אם אני עושה
Writeln(Y):0:2;
אז הוא מדפיס לי את Y כמו שאני אוהב עם 2 מספרים אחרי הנקודה העשרונית.

אני לא רוצה להדפיס את Y, אלא לשמור את Y.
איך אני עושה פקודה שמכניסה ל-Y את עצמו בצורה עשרונית ?
אני מנסה הוראות שכאלה:
Y:=Y:0:2;
Y:=(A/B):0:2;

ובכל פעם זה נותן לי Error,

איך בדיוק כותבים את ההוראה הנכונה שעושה את מה שאני רוצה ?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  על מה אתה מדבר ??? Dudenland 09.12.04 17:29 1
     אהה, אז איך לשמור בY של A\B (שזה יהיה מספר עשרוני) ? GaBrIeL 10.12.04 10:12 2
         כמו שעשית: '';Y = A / B'' Dudenland 10.12.04 12:30 3
             אחי כנס שניה :) GaBrIeL 10.12.04 17:39 4
                 מכתב Yoni 10.12.04 19:08 5
                 שמע, אני לא ממש זוכר את הפקודות שיש בפסקל... Dudenland 10.12.04 19:15 6

       
Dudenland

   17:29   09.12.04   
אל הפורום  
  1. על מה אתה מדבר ???  
בתגובה להודעה מספר 0
 
   אין שום בעייה בלשמור ב-Y את הביטוי A/B, ומה שעשית, הוא הדרך היחידה לכך.
Y זה ערך. WriteLn היא פונקציה. כשאתה מדפיס את Y, אתה יכול להדפיס אותו באלפי צורות. אם תדפיס ;(WriteLn('The result is: ', Y זה לא אומר שהערך של Y יהיה עתה "# :The result is" (# זה מספר כלשהו... אני פשוט לא יודע מה הערך של A, ו-B).
הקטע הזה עם ה-":", זה "קטע" שרק הפונקציה WriteLn מבינה (כי כך תיכנתו אותה)...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   10:12   10.12.04   
אל הפורום  
  2. אהה, אז איך לשמור בY של A\B (שזה יהיה מספר עשרוני) ?  
בתגובה להודעה מספר 1
 
   לדוגמא A=9 B=7
ואני רוצה שבY יהיה 1.28

מה ההוראה ?


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

   12:30   10.12.04   
אל הפורום  
  3. כמו שעשית: '';Y = A / B''  
בתגובה להודעה מספר 2
 
   וכמובן ש-Y יכיל (כביכול, לאחר ביצוע הוראה זו) את המספר המבוקש 1.28

דבר אחד שאתה צריך להבין, זה שהמחשב עובד לפי בסיס מסויים - בסיס בינארי (0 או 1).
למעשה, כשאתה שומר ב-Y, אשר מוגדר כ-Real, את המנה 9 / 7, או אפילו את המספר 1.28, אתה בעצם שומר את הקירוב שלו, אשר מוערך בבסיס בינארי.

למה התכוון המשורר?

Real, זהו טיפוס נתונים אשר נלקח מהגדרות קבועות שיש במערכת-ההפעלה (אשר נקבעו לכל מערכות-ההפעלה ע"י תקן IEEE). מכיוון שהמחשב עובד בבינארי, מה שנשמר ב-Real הוא המספר עצמו, ומספר המקומות להזזה של הנקודה הבינארית (כמו לכפול את המספר ב-2 בחזקת מספר המקומות להזזה). לכן, עבור "מספרים מסובכים" נשמר איזשהו קירוב שניתן אפשר לייצג בבסיס הבינארי. הכלל אומר שאם המספר שאחרי הנקודה הצפה הוא לא מנה של חזקה מסויימת של 2, אז לא יהיה ניתן לייצג את המספר במדוייק במחשב, לפחות לא בצורת הייצוג שנחברה (כמו Real).
לכן, כשהדפסת את ערכו של Y, קיבלת מספר מן השמיים... משהו ארוך ולא מובן (מה גם שב-Pascal, הדפסה פשוטה מדפיסה את הערך המנורמל, כלומר עם תוספת של כפולה ב-10 בחזקת X)...
בעצם, זהו הקירוב שאליו מצליח להגיע המחשב...

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

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

מקווה שהבנת...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
GaBrIeL
חבר מתאריך 13.4.03
3131 הודעות
   17:39   10.12.04   
אל הפורום  
  4. אחי כנס שניה :)  
בתגובה להודעה מספר 3
 
   הבנתי ותודה על ההסבר הנרחב,

אולי תוכל לעזור לי
אני כותב בפסקל משחק שנותן תרגילי חשבון והמשתמש צריך להזין תשובות,
זה הקטע;
Randomize;
A:=Random(10);
B:=Random(10);
while B = 0 do
B:=Random(10);
Y:=a/b;
Writeln(A,'/',B,'=');
Readln(AnsY);
If AnsY = Y then
Writeln('Correct Answer')

הבעיה היא שבY יש לי ערך בינארי כמו שאמרת
שמופיע בערך כך: 1.29864234EE -26
או משו כזה,
וכך אני לא יכול לענות תשובה נכונה על השאלה ואז המשחק דפוק...
אתה מבין ?

איך אתה מציע שאני יעשה את זה ?

תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Yoni
חבר מתאריך 26.5.02
2305 הודעות
   19:08   10.12.04   
אל הפורום  
  5. מכתב  
בתגובה להודעה מספר 4
 
https://rotter.name/nor/study/15587.shtml#5


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

   19:15   10.12.04   
אל הפורום  
  6. שמע, אני לא ממש זוכר את הפקודות שיש בפסקל...  
בתגובה להודעה מספר 4
 
   אבל מה שאתה צריך לעשות, זה משהו כזה:

אם "החלק שמשמאל לנקודה" של המספר (AnsY * 100) שווה ל"חלק שמשמאל לנקודה" של המספר (Y * 100) אז:
- הדפס "תשובה נכונה".

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


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

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

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



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