PDA

View Full Version : سوال: سربارگذاری



s++ 68-87
جمعه 17 خرداد 1387, 13:04 عصر
سربارگذاری 4 عمل اصلی برای اعداد باینری یعنی چی؟
یعنی باید به مبنای 10 برده بشن بعد سربار گذاری شن بعد باز تبدیل بشن به مبنای 2؟
داخل عملگر باید تبدیلات صورت بگیره؟

Nima_NF
جمعه 17 خرداد 1387, 13:16 عصر
احتمالا به این معنی هست که عددی را به جای دسیمال، از ورودی به صورت باینری 1001110 دریافت کند (حال با دو متغیر 64 بیتی برای حدود 15 رقم، یا مثلا با دو آرایه 32 خانه ای از نوع bool برای 32 بیت) و سپس با تعریف عملگر وقتی می نویسید X+y خودش در داخل تعریف عملگر تک تک خانه های آرایه را جمع کند و به همان نوع یا نوع بزرگتری از همان جنس(مثلا آرایه 33 بیتی + 1 خانه کری) پاسخ را بر گرداند.

s++ 68-87
جمعه 17 خرداد 1387, 13:37 عصر
اخه عدد باید به صورت char گرفته بشه
بعدشم وقتی یکی یکی خونه ها با هم جمع شدن دیگه باینری نمی شه که 1+1 می شه 2 که همونو ذخیره می کنه

A.S.Roma
جمعه 17 خرداد 1387, 15:03 عصر
سلام

شما عدد را به صورت رشته ای از صفر و یک دریافت می کنید.
در داخل کلاستون یک تابع تعریف کنید که این رشته رو به int تبدیل کنه . بعد اعداد int رو با هم جمع کنید.
جواب رو هم بدین به یک تابع دیگر که خروجی اش یک رشته باشه و عدد دهدهی رو به دودویی تبدیل کنه .
همه مراحل بالا در overload مثلا جمع بنویسید .

emad_67
جمعه 17 خرداد 1387, 19:05 عصر
اخه عدد باید به صورت char گرفته بشه
بعدشم وقتی یکی یکی خونه ها با هم جمع شدن دیگه باینری نمی شه که 1+1 می شه 2 که همونو ذخیره می کنه
اگه عدد به صورت باینری باشه دیگه 1+1 نمیشه 2، میشه 10.
شما باید دقیق مشخص کنی که مسئله ازت چی خواشته. آیا باید عدد ورودی مبنای 10 باشه و داخل کلاس تبدیل بشه به باینری و عملیات روش انجام بشه یا اینکه عدد ورودی باینری هست و فقط باید عملگر های مختلف رو براش اورلود کنی که با توجه به سوالت :

سربارگذاری 4 عمل اصلی برای اعداد باینری یعنی چی؟
همونطور که آقا نیما گفت فکر کنم باید ورودی باینری باشه و فقط باید overload رو انجام بدی

s++ 68-87
جمعه 17 خرداد 1387, 20:06 عصر
اگه عدد به صورت باینری باشه دیگه 1+1 نمیشه 2، میشه 10.چطوری باید بگم که 1+1 رو 10 حساب کن؟



شما باید دقیق مشخص کنی که مسئله ازت چی خواشتهبرا خودمم گنگه (یعنی کلا چیز زیادی از بارگذاری نمی دونم)

دو تا شی از یه کلاسو باید با هم جمع کنیم (دوتا عدد باینری هستن)

فکر کنم باید اولش تبدیل به دسیمال شن بعد بعدش جمع شن و باز تبدیل به دسیمال شن همه اینا تو یه عملگر می شه انجام داد؟

emad_67
جمعه 17 خرداد 1387, 22:12 عصر
چطوری باید بگم که 1+1 رو 10 حساب کن؟

فکر کنم باید اولش تبدیل به دسیمال شن بعد بعدش جمع شن و باز تبدیل به دسیمال شن همه اینا تو یه عملگر می شه انجام داد؟
همونطور که خود گفتی به نظر منم بهتره اول تبدیل کنی به مبنای 10 و بعد که جمع کردی دوباره باینری کنیش چون سخت میشه اگه بخوای 2 تا باینری رو جمع کنی. همه اینا رو هم میتونی توی همون اورلود انجام بدی.

Nima_NF
شنبه 18 خرداد 1387, 00:20 صبح
چطوری باید بگم که 1+1 رو 10 حساب کن؟اگر هم خواستید به صورت باینری جمع کنید، از XOR می توانید استفاده کنید که عمل جمع بیتی را انجام می دهد. (در ++C عملگر ^ این کار ار انجام می دهد) و ضمنا محاسبه carry فراموش نشود چرا که در Xor در حالت 1و 1 مقدار صفر می دهد که carry را خودتان باید حساب کنید و به بیت بعدی اضافه کنید.



carry = 0;

bit = x[0] ^ x[0];

if ( x[0] && x[0] )
carry = 1;

moh.mon
شنبه 18 خرداد 1387, 21:58 عصر
من فکر کنم میدونم شما چی میخواین واسه همین عملگر + رو سر بارگذاری کردم شاید بتونه کمک کنه.

bin operator+(bin a,bin b)
{
bin temp;
int d,c,sum;
d=a.bin2dec();
c=b.bin2dec();
sum=d+c;
cout<<"\nMajmoe do Adad Dar Mabnaye 2= "<<sum;
strcpy(temp.s,temp.dectobin(sum));
return temp;
}
البته باید بگم که این عملگر به صورت تابع friend تعریف شده و دو تابع dec2bin و bintodec به صورت private تعریف شدن.

emad_67
شنبه 18 خرداد 1387, 23:41 عصر
من فکر کنم میدونم شما چی میخواین واسه همین عملگر + رو سر بارگذاری کردم شاید بتونه کمک کنه.یه مشکلی که این تابع داره اینه که وقتی temp رو return میکنیم، اون شی در main از بین میره و برنامه با مشکل مواجه میشه. البته این مورد تو vc++6 هست و نمیدونم تو .net رفع شده یا نه.
برای حلش هم باید temp رو از نوع اشاره گر تعریف کنین.

moh.mon
یک شنبه 19 خرداد 1387, 09:44 صبح
یه مشکلی که این تابع داره اینه که وقتی temp رو return میکنیم، اون شی در main از بین میره و برنامه با مشکل مواجه میشه
من برنامه رو امتحان کردم و جواب میده.

emad_67
یک شنبه 19 خرداد 1387, 12:01 عصر
من برنامه رو امتحان کردم و جواب میده.
ببخشید، من حواسم نبود
این مشکل وقتی پیش میاد که برای کلاس destructor هم تعریف کرده باشیم. مثلا اینو اجرا کن متوجه میشی:


#include<iostream.h>
#include<string.h>
class String
{
friend ostream &operator<<(ostream &,String &);
public:
String(char *);
String(int =80);
~String();
String operator+(String );
private:
int length;
char *str;
};
String::String(char *s)
{
length=strlen(s);
str=new char[length+1];
strcpy(str,s);
}
String::String(int n)
{
length=n;
str=new char[length+1];
}
String::~String()
{
length=0;
delete [] str;
}
String String::operator +(String cstr)
{
String temp;
strcpy(temp.str,str);
strcat(temp.str,cstr.str);
return temp;
}
ostream &operator<<(ostream &output,String &cstr)
{
output<<cstr.str;
return output;
}
void main()
{
String s1("abcd");
String s2("efgh");

cout<<s1+s2<<endl;

}


مشکل از زود فراخوانی شدن نابود کننده کلاس هست.

s++ 68-87
یک شنبه 19 خرداد 1387, 15:45 عصر
خیلی خیلی ممنون از راهنمایی هاتون...
البته بعضی پاسخ ها رو کلا متوجه نشدم وکلا نتونستم جوابی هم بدم!
برا این تابع:




bin operator+(bin a,bin b)




{

bin temp;
int d,c,sum;
d=a.bin2dec();
c=b.bin2dec();
sum=d+c;
cout<<"\nMajmoe do Adad Dar Mabnaye 2= "<<sum;
strcpy(temp.s,temp.dectobin(sum));
return temp;
}





چرا عملگر دو تا وردی داره؟

برا عملگرها مگه این جوری نیست که از دو تا شی یکی شو به عنوان وردی بدیم و اون یکی رو باید به طور ضمنی؟؟
و این که لزومی داره این تابع به صورت friend تعریف بشه؟

اگه می شه یه توضیح کاملا ابتدایی !! در مورد سربارگذاری بدین!

emad_67
یک شنبه 19 خرداد 1387, 16:04 عصر
برا عملگرها مگه این جوری نیست که از دو تا شی یکی شو به عنوان وردی بدیم و اون یکی رو باید به طور ضمنی؟؟
کامپایلر بر اساس اورلود عملگر و همچنین friend بودن یا نوبودن نحوه فراخوانی تابع رو تشخیص میده. مثلا اگه obj1 و obj2 ذو شی از این کلاس باشن، شما فقط مینوسی:


obj1+obj2

خوب در اینجا که دوستمون اشاره کدن تابع به صورت friend تعریف شده کامپیایلر میاد همچین فراخوانی رو در مقابل خط بالا انجام میده:


operator+(obj1,obj2)

که در اینجا شد 2 پارامتر برای ورودی تابع.
ولی حالا اگه تابع عملگر رو به صورت friend تعریف نکرده باشیم، همچین فراخوانی خواهیم داشت:


obj1.operator+(obj2);

عملا نحوه نوشتن ما هیچ فرقی نمی کنه ولی این کامایلر هست که دو نوع فراخوانی رو انجام میده.

s++ 68-87
یک شنبه 19 خرداد 1387, 20:51 عصر
بازم خیلی خیلی ممنون.....
_ با این تابع مجموع چاپ می شه ولی توسط تابع عملگر.
برا این که مجموعو توسط تابع main چاپ کنم باید چی کار کنم؟
باید >> یا = رو هم بار گذاری کنم؟
_ و برا این که مجبور نباشیم این تابع رو به صورت friend تعریف کنیم کافیه اولین عملگر رو حذف کنیم و خط زیر رو تغییر بدیم:؟؟

d=a.bin2dec();

d=bin2dec();

s++ 68-87
یک شنبه 19 خرداد 1387, 22:02 عصر
یه سوال دیگه: this مواقعی به کار می ره که با دو تا شی سرو کار داشته باشیم؟ مثل بارگذاری =؟؟
یعنی برای بارگذاری + نمی شه از this استفاده کرد؟ درسته؟

emad_67
یک شنبه 19 خرداد 1387, 22:34 عصر
باید >> یا = رو هم بار گذاری کنم؟
بله باید همین کارو بکنی.

و برا این که مجبور نباشیم این تابع رو به صورت friend تعریف کنیم کافیه اولین عملگر رو حذف کنیم و خط زیر رو تغییر بدیم:؟؟درست منظورتو متوجه نشدم، منظور از اولین عملگر چیه؟

یه سوال دیگه: this مواقعی به کار می ره که با دو تا شی سرو کار داشته باشیم؟ مثل بارگذاری =؟؟بله معمولا این طور هست.

یعنی برای بارگذاری + نمی شه از this استفاده کرد؟ درسته؟چرا میشه استفاده کرد. در واقع this اشاره گری به شی همون کلاس هست مثلا وقتی که در داخل یکی از توابع کلاس هستی و بخوای که به شی همون کلاس دسترسی داشته باشی باید از this استفاده کنی.

s++ 68-87
یک شنبه 19 خرداد 1387, 22:52 عصر
منظورم حذف یکی از ورودی های تابع بود یعنی برا این که همین تابع رو فرند تعریفش نکنیم و عضو کلاس باشه باید یه ورودی داشته باشیم برای تابع operator و اون خط بالا رو تغییر بدیم؟؟ همینا کافین؟

اخه برا این که + رو بارگذاری کنیم باید یکی از ورودی ها ضمنی باشه یکی شو به عنوان وردی oprator وارد کنیم و اونا رو روی یه شی دیگه مثلا temp اعمال کنیم اگه اینجا this رو برگردونیم مگه اون شیی که به صورت ضمنی وارد شده برگشت داده نمی شه؟

emad_67
دوشنبه 20 خرداد 1387, 00:54 صبح
منظورم حذف یکی از ورودی های تابع بود یعنی برا این که همین تابع رو فرند تعریفش نکنیم و عضو کلاس باشه باید یه ورودی داشته باشیم برای تابع operator و اون خط بالا رو تغییر بدیم؟؟ همینا کافین؟

برای اینکه تابعی رو فرند تعذیف نکنی باید عبارت friend رو از prototype اون حذف کنی و بعد هم باید اون تابع به صورت public تعریف بشه. و بعد هم یکی از ورودی های تابع رو باید حذف کنی. به این شکل:


bin operator+(bin a)
{
bin temp;
int d,c,sum;
d=a.bin2dec();
c=bin2dec();
sum=d+c;
cout<<"\nMajmoe do Adad Dar Mabnaye 2= "<<sum;
strcpy(temp.s,temp.dectobin(sum));
return temp;
}

و این خط رو هم که در تابع قبلی بود ادیت کردم:


c=b.bin2dec();


اخه برا این که + رو بارگذاری کنیم باید یکی از ورودی ها ضمنی باشه یکی شو به عنوان وردی oprator وارد کنیم و اونا رو روی یه شی دیگه مثلا temp اعمال کنیم اگه اینجا this رو برگردونیم مگه اون شیی که به صورت ضمنی وارد شده برگشت داده نمی شه؟
در این حالی که میگیف درسته this بر میگرده ولی خوب مثلا فرض کنم میخوای عملگر =+ رو سربار گذاری کنی. در این حالت باید تغیرات بر روی شی اول اعمال بشه ( همون شی ضمنی) و بعد همون شی ضمنی return بشه، پس باید از this استفاده کنی. ولی تو عملگر + کاربردی نداره.

s++ 68-87
دوشنبه 20 خرداد 1387, 14:45 عصر
چه موقعی باید ارجاع به یه شی از نوع کلاس رو تو ورودی تابع operator قرار بدیم؟

emad_67
دوشنبه 20 خرداد 1387, 15:58 عصر
چه موقعی باید ارجاع به یه شی از نوع کلاس رو تو ورودی تابع operator قرار بدیم؟قرار دادن ارجاع الزامی نداره، ولی معمولا به حاطر اینکه سربار زمان اجرا به وجود نیاد این کار رو میکنن. و در بعضی موارد هم شاید موقغیتی پیش بیاد که حتما باید از ارجاع استفاده کنی.

s++ 68-87
سه شنبه 21 خرداد 1387, 00:15 صبح
خیلی ممنون...
وقتی برناممو با turbo c++ اجرا می کنم 10 تا ارور می ده!!! ولی با visual c++ اجرا می کنم ارور نمی ده!! وقتی تیکه پایینو برمی دارم توربو هم اجرا می کنه!! تابع زیر مشکل داره؟


bool operator==(Binary b)
{
if(bin2dec()==b.bin2dec())
return true;
else
return false;
}


if(bin1==bin2)
cout<<"y";
else
cout<<"n";

emad_67
سه شنبه 21 خرداد 1387, 07:34 صبح
وقتی برناممو با turbo c++ اجرا می کنم 10 تا ارور می ده!!! ولی با visual c++ اجرا می کنم ارور نمی ده!! وقتی تیکه پایینو برمی دارم توربو هم اجرا می کنه!! تابع زیر مشکل داره؟
والا این تابعی که نوشتی مشکلی نداره. من خودم هم با visual کار میکنم و دقیقا نمیدونم سینتکس های turbo چه جوریه. ولی کامپایلر مخرفیه، با همین visual کار کن 100 تا مثل اون میرزه.