עבור לתוכן

בעיה עם אופרטור חזקה

Featured Replies

פורסם

שלום לכלום שיעור שעבר למדנו על אופרטורים ובתור שיעורים אני אמור לעשות אופרטורים של +-/* וגם של חזקה הכל עובד חוץ מהחזקה מישהו יודע למה?

FloatPoint operator^(const FloatPoint &r,int x)
{
if(x=0)
return 1;

FloatPoint ret;
int no,i;

no=r.numer;

for(i=0;i<x;i++)
no*=no;
ret.numer=no;

no=r.denom;

for(i=0;i<x;i++)
no*=no;

ret.denom=no;

return ret;
}

אני לא ממש בטוח שככה רושמים את זה אבל דוקא בתוכנית זה לא רשם לי שום טעות..

מקווה שתעזרו לי

תודה.

פורסם

ניסית לקרוא לזה:


FloatPoint FloatPoint::operator^(int x)const;

או שהגדרת כFRIEND?

ומה הכוונה לא עובד? לא עובר קומפילציה, או שהפונ לא מבצעת מה שאתה רוצה?

פורסם

הנה הבעיה שלך:

no*=no;

מה שקורה הוא שבמקום לכפול כל פעם במספר המקורי, אתה כל פעם כופל את המספר בעצמו.

ככה שבמקום לחשב, לדוגמה, את 2 בחזקת 3, אתה עושה:

no = no*no = 2*2 = 4

no = no*no = 4*4 = 16

no = no*no = 16*16 = 256

במקום פשוט לקבל 8.

מה שאתה צריך לעשות הוא

no*=r.numer

(במקרה הראשון. בשני תשתמש ב-r.denom)

חוץ מזה, שים לב שהלולאה שלך רצה פעם אחת יותר מדי. וגם לא בדקת מה קורה אם x שלילי.

ועוד שתי הערות אגב:

קודם כל, מבחינת מינוח, הקלאס שאתה מגדיר פה הוא לא Floating Point, אלא Rational (יענו מספר רציונלי). מספר floating point לא מוגדר ע"י מונה ומכנה, אלא ע"י ערך וחזקה.

חוץ מזה, לאופרטור ^ לא קוראים חזקה, אלא xor, והוא עושה פעולת קסור לוגית. (לא נהוג לשנות את המשמעות של אופרטורים...)

פורסם
  • מחבר

ניסית לקרוא לזה:


FloatPoint FloatPoint::operator^(int x)const;

או שהגדרת כFRIEND?

ומה הכוונה לא עובד? לא עובר קומפילציה, או שהפונ לא מבצעת מה שאתה רוצה?

אכן הגדרתי את את זה כ friend ..השאלה אם עדיף באמת להשאיר את זה ככה או לשנות?

והכוונה בלא עובד שהמספר נשאר אותו מספר.

הנה הבעיה שלך:

no*=no;

מה שקורה הוא שבמקום לכפול כל פעם במספר המקורי' date=' אתה כל פעם כופל את המספר בעצמו.

ככה שבמקום לחשב, לדוגמה, את 2 בחזקת 3, אתה עושה:

no = no*no = 2*2 = 4

no = no*no = 4*4 = 16

no = no*no = 16*16 = 256

במקום פשוט לקבל 8.

כן אני יודע שמתי לב שזה טעות אבל עדיין הבעיה נשארה זאת אומרת שהמספר נשאר אותו מספר ולא משתנה

מה שאתה צריך לעשות הוא

no*=r.numer

(במקרה הראשון. בשני תשתמש ב-r.denom)

חוץ מזה, שים לב שהלולאה שלך רצה פעם אחת יותר מדי. וגם לא בדקת מה קורה אם x שלילי.

ועוד שתי הערות אגב:

קודם כל, מבחינת מינוח, הקלאס שאתה מגדיר פה הוא לא Floating Point, אלא Rational (יענו מספר רציונלי). מספר floating point לא מוגדר ע"י מונה ומכנה, אלא ע"י ערך וחזקה.

חוץ מזה, לאופרטור ^ לא קוראים חזקה, אלא xor, והוא עושה פעולת קסור לוגית. (לא נהוג לשנות את המשמעות של אופרטורים...)

לא ממש הבנתי מה שאמרת פה :nixweiss:

פורסם

דרך אגב, תתחיל את שניהם מ- 1(a^0=1 ולא a).

עריכה: עכשיו שמתי לב שגם שניצל אמר את זה..

תעשה גם את האופרטור ~ להופכי.

פורסם

אכן הגדרתי את את זה כ friend ..השאלה אם עדיף באמת להשאיר את זה ככה או לשנות?

והכוונה בלא עובד שהמספר נשאר אותו מספר.

מה זאת אומרת לא משתנה?

האופרטור לא אמור לשנות את המספר, אלא להחזיר מספר חדש.

האופרטור שמשנה את המספר הוא =^operator.

ולגבי ה-friend - אם אתה יכול שלא להגדיר כ-friend (כמו במקרה הזה), אז עדיף.

מגדירים כ-friend רק מתי שיש לך כבר קלאס קיים שאתה רוצה להוסיף לו אופרטור (נניח במקרה שאתה רוצה להוסיף אפשרות הדפסה לקלאס שלך, אתה למעשה מוסיף אופרטור >> לקלאס ostream).

ולגבי החלק השני - בסדר, תתעלם. :)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים