בעיה עם אופרטור חזקה - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


eli33

Recommended Posts

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

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;
}

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

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

תודה.

קישור לתוכן
שתף באתרים אחרים

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

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:

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...