PDA

View Full Version : سوال: مشکل در جمع نشدن دو شی



motherboard
چهارشنبه 05 شهریور 1393, 10:25 صبح
سلام.در کد زیر هر دو شی Box1 و Box 2 دارای خصوصیت می شوند.اما نمیدونم چرا هنگام جمع دو تا شی نتیجه درستی نمایش داده نمیشه.؟؟؟

#include <iostream>
using namespace std;

class Box
{
public:

double getVolume(void)
{
return length * breadth * height;
}
void setLength( double len )
{
length = len;
}

void setBreadth( double bre )
{
breadth = bre;
}

void setHeight( double hei )
{
height = hei;
}
Box operator+(const Box& b)
{
Box box;
box.length = b.length ;
box.breadth = b.breadth ;
box.height = b.height;
return box;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
// Main function for the program
int main( )
{
Box Box1; // Declare Box1 of type Box
Box Box2; // Declare Box2 of type Box
Box Box3; // Declare Box3 of type Box
double volume = 0.0; // Store the volume of a box here

// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);

// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);

// volume of box 1
volume = Box1.getVolume();
cout << "Volume of Box1 : " << volume <<endl;

// volume of box 2
volume = Box2.getVolume();
cout << "Volume of Box2 : " << volume <<endl;

// Add two object as follows:
Box3 = Box1 + Box2;

// volume of box 3
volume = Box3.getVolume();
cout << "Volume of Box3 : " << volume <<endl;

return 0;
}

rahnema1
چهارشنبه 05 شهریور 1393, 12:14 عصر
سلام
دو تا مکعب را در نظر بگیرید. حالا می خواهید این دو تا را با هم جمع کنید. بنابراین شیء جدید میشه آرایه ای از دو تا مکعب. حجم شیء جدید هم میشه مجموع حجم دو مکعب موجود
بنابراین باید کلاس box را طوری تعریف کنید که بتونه آرایه ای از مکعب را در خودش ذخیره کنه

hamed72900
چهارشنبه 05 شهریور 1393, 12:38 عصر
سلام . دوست عزیز شما تو تعریف کردن operator اصلا دو تا object رو با هم جمع نکردین که . اگر میخواین با نعریف عملگر ( + ) برای دو شی ، مقادیر height , length , ... آنها با هم جمع بشن باید تعریف عملگرتون به این صورت باشه :


Box box; box.length = b.length + length;
box.breadth = b.breadth +breadth ;
box.height = b.height + height ;
return box;
چیزی که شما نوشتید نهایتا یک شی رو ( آخرین شی ) که اینجا Box2 هست رو در شی مورد نظر شما میریزه و نه مجموع اونارو

motherboard
چهارشنبه 05 شهریور 1393, 12:46 عصر
سلام . دوست عزیز شما تو تعریف کردن operator اصلا دو تا object رو با هم جمع نکردین که . اگر میخواین با نعریف عملگر ( + ) برای دو شی ، مقادیر height , length , ... آنها با هم جمع بشن باید تعریف عملگرتون به این صورت باشه :


Box box; box.length = b.length + length;
box.breadth = b.breadth +breadth ;
box.height = b.height + height ;
return box;
چیزی که شما نوشتید نهایتا یک شی رو ( آخرین شی ) که اینجا Box2 هست رو در شی مورد نظر شما میریزه و نه مجموع اونارو
با تشکر از پاسخی که دادید.من الان کدی رو که دادید رو جایگزین کردم ولی همچنان فکر می کنم که پاسخ رو اشتباه نشون می ده.ببینید الان مثلا Box1 دارای مقدار 210 هست و Box2 دارای مقدار 1560.اما نتیجه ای که بعد از کامپایل شدن برنامه نشون میده مقدار 5400 است!!! در حالی که من انتظار دارم جمع دو شی مورد نظرمون بشه 1770=1560+210

مسعود اقدسی فام
چهارشنبه 05 شهریور 1393, 12:53 عصر
با تشکر از پاسخی که دادید.من الان کدی رو که دادید رو جایگزین کردم ولی همچنان فکر می کنم که پاسخ رو اشتباه نشون می ده.ببینید الان مثلا Box1 دارای مقدار 210 هست و Box2 دارای مقدار 1560.اما نتیجه ای که بعد از کامپایل شدن برنامه نشون میده مقدار 5400 است!!! در حالی که من انتظار دارم جمع دو شی مورد نظرمون بشه 1770=1560+210

این کدی که نوشته شده طول‌های دو مکعب رو با هم، عرض‌ها رو با هم، و ارتفاع‌ها رو با هم جمع می‌زنه و یه مکعب جدید تشکیل می‌شه. وقتی حجم حساب می‌کنید حجم این مکعب محاسبه می‌شه. نه اینکه مجموع حجم دو تای قبلی رو برگردونه. چون حجم از روی طول و عرض و ارتفاع محاسبه می‌شه و خودش مستقل حاصل جمع دو حجم قبلی نیست. این مثالی که شما زدید حاصل جمع دو مکعب می‌شه مکعبی با اعداد ۱۸ و ۲۰ و ۱۵ که خب حجمش می‌شه ۵۴۰۰.

motherboard
چهارشنبه 05 شهریور 1393, 13:02 عصر
اره.حق با شما و جناب hamed72900 (http://barnamenevis.org/member.php?243304-hamed72900) بود.الان کاملا متوجه شدم.اما سوالی که برام مطرحه اینه که اگر به جای کد صحیحی که دوستمون ارائه دادند کد زیر رو قرار بدیم چرا نتیجه اشتباه میشه؟؟

Box operator+(const Box& b)
{
Box box;
box.length = b.length + b.length;
box.breadth = b.breadth +b.breadth ;
box.height = b.height + b.height ;
return box;
}

hamed72900
چهارشنبه 05 شهریور 1393, 13:17 عصر
من دقیقا منظورتون رو از این کد متوجه نشدم . چیزی که شما نوشتید نهایتا بعد از کامپایل برنامه 2 برابر box2 رو در box3 شما میریزه . و اصلا کاری به box1 نخواهد داشت . و یه نکته ی دیگه . اگه هدف کلی شما بدست آوردن حجم نهایی دو جعبه پس از جمع کردن اوناس ، در واقعیت هیچ وقت برای این کار تمام ویژگی های دو جعبه اعم از طول ، عرض و ارتفاع اونا رو با هم جمع نمی کنن .

و در کل برای درک بهتر نسبت به operator توصیه می کنم این لینک رو مطالعه فرمایید :

operator overloading in cpp (http://www.cprogramming.com/tutorial/operator_overloading.html)

motherboard
چهارشنبه 05 شهریور 1393, 13:22 عصر
و باز سوالی که دارم اینه که اگر دوباره بخواهیم این کد زیر رو جایگزاری کنیم.چرا this فقط و فقط به Box1 اشاره داره؟؟؟ و اصلا کاری با شی ای به نام Box2 نداره؟؟؟


Box operator+(const Box& b)
{
Box box;
box.length = this->length + this->length;
box.breadth =this-> breadth + this->breadth ;
box.height = this->height + this->height ;
return box;
}

rahnema1
چهارشنبه 05 شهریور 1393, 14:06 عصر
و باز سوالی که دارم اینه که اگر دوباره بخواهیم این کد زیر رو جایگزاری کنیم.چرا this فقط و فقط به Box1 اشاره داره؟؟؟ و اصلا کاری با شی ای به نام Box2 نداره؟؟؟


Box operator+(const Box& b)
{
Box box;
box.length = this->length + this->length;
box.breadth =this-> breadth + this->breadth ;
box.height = this->height + this->height ;
return box;
}


گفتیم که این روش غلطه که بخواهیم طول و عرض و ارتفاع را با هم جمع کنیم. شما باید هر کلاس را آرایه ( یا وکتور ...) از مکعب ها در نظر بگیرید و دیگه نیازی به this نیست

مسعود اقدسی فام
چهارشنبه 05 شهریور 1393, 14:19 عصر
گفتیم که این روش غلطه که بخواهیم طول و عرض و ارتفاع را با هم جمع کنیم. شما باید هر کلاس را آرایه ( یا وکتور ...) از مکعب ها در نظر بگیرید و دیگه نیازی به this نیست

تعریفی که شما ارائه می‌دید در واقع عملگر اجتماع هست. یعنی ایشون یه کلاسی تعریف کنن که مجموعه‌ای از اشیاء رو بشه داخلش نگه داشت. عملگر جمع هم این باشه که بشه عضو جدیدی به این مجموعه اضافه کرد.

باید دید منظور ایشون از جمع کردن دو مکعب چی هست. یکی اون کدی می‌شه که شما توضیح می‌دید (اجتماع) و یکی اینکه طول و عرض و ارتفاع با هم جمع بشن. در کل برای اشکال هندسی قانون خاصی نداریم که بگه حتما باید به روش شما با هم جمع بشن یا روشی که ما قبلا بحثش رو کردیم. بماند که در این دو حالت کلا مفهوم کلاسش عوض می‌شه. دومی کلاس مکعب هست و اولی کالکشنی از کلاس مکعب.


و باز سوالی که دارم اینه که اگر دوباره بخواهیم این کد زیر رو جایگزاری کنیم.چرا this فقط و فقط به Box1 اشاره داره؟؟؟ و اصلا کاری با شی ای به نام Box2 نداره؟؟؟


Box operator+(const Box& b)
{
Box box;
box.length = this->length + this->length;
box.breadth =this-> breadth + this->breadth ;
box.height = this->height + this->height ;
return box;
}


استفاده کردن از this مختص اینجا نیست. البته این کدی هم که نوشتید باز هم اشتباهه! یکی باید this باشه و اونیکی b.

نگاهی به این لینک هم بندازید:

http://www.algorithmha.ir/post-%D8%B3%D8%B1%D8%A8%D8%A7%D8%B1%DA%AF%D8%B2%D8%A7%D 8%B1%DB%8C-%D8%B9%D9%85%D9%84%DA%AF%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx

rahnema1
چهارشنبه 05 شهریور 1393, 14:37 عصر
تعریفی که شما ارائه می‌دید در واقع عملگر اجتماع هست. یعنی ایشون یه کلاسی تعریف کنن که مجموعه‌ای از اشیاء رو بشه داخلش نگه داشت. عملگر جمع هم این باشه که بشه عضو جدیدی به این مجموعه اضافه کرد.

باید دید منظور ایشون از جمع کردن دو مکعب چی هست. یکی اون کدی می‌شه که شما توضیح می‌دید (اجتماع) و یکی اینکه طول و عرض و ارتفاع با هم جمع بشن. در کل برای اشکال هندسی قانون خاصی نداریم که بگه حتما باید به روش شما با هم جمع بشن یا روشی که ما قبلا بحثش رو کردیم. بماند که در این دو حالت کلا مفهوم کلاسش عوض می‌شه. دومی کلاس مکعب هست و اولی کالکشنی از کلاس مکعب.

درسته باید ببینیم آقا رضا سوال را از کجا گیر آورده و منظورش از جمع دو مکعب چی بوده ولی به نظرم اجتماع، طبیعی تر به نظر می رسه به خصوص وقتی که حجم هم داریم یعنی دو تا مکعب داریم و برای هر کدام حجم را محاسبه می کنیم و طبیعتا حجم سومی برابر با مجموع دو حجم قبلی میشه ( مخصوصا وقتی پرسیده بود « چرا هنگام جمع دو تا شی نتیجه درستی نمایش داده نمیشه»
مگه اینکه به قول شما از روش دوم استفاده بشه که ...

zero_ox
پنج شنبه 06 شهریور 1393, 01:20 صبح
سلام :اینو امتحان کن


#include <iostream>

using namespace std;

class Box

{
public:

double getVolume(void)

{

return length * breadth * height;


}

void setLength( double len )

{

length = len;

}

void setBreadth( double bre )

{

breadth = bre;

}

void setHeight( double hei )

{
height = hei;
}
Box& operator+(Box& b)

{
cout<<"volum of Box1+Box2 : "<<this->getVolume()+b.getVolume();

}

private:

double length; // Length of a box

double breadth; // Breadth of a box

double height; // Height of a box

};

// Main function for the program

int main( )

{

Box Box1; // Declare Box1 of type Box

Box Box2; // Declare Box2 of type Box

// Declare Box3 of type Box

// Store the volume of a box here

// box 1 specification

Box1.setLength(6.0);

Box1.setBreadth(7.0);

Box1.setHeight(5.0);

// box 2 specification

Box2.setLength(12.0);

Box2.setBreadth(13.0);

Box2.setHeight(10.0);

double volume=0.00;
// volume of box 1

volume = Box1.getVolume();

cout << "Volume of Box1 : " << volume <<endl;

// volume of box 2

volume = Box2.getVolume();

cout << "Volume of Box2 : " << volume <<endl;

// Add two object as follows:

Box1 + Box2;

return 0;

}

مسعود اقدسی فام
پنج شنبه 06 شهریور 1393, 06:07 صبح
سلام :اینو امتحان کن




این کد درست کار می‌کنه. اما عبارتی مثل
Box1 + Box2;

چه مفهومی داره؟ نمی‌شد مثلا اینطوری بنویسم:
sum(Box1,Box2);


void sum(Box box1,Box box2)
{
cout<<"volum of Box1+Box2 : "<<box1.getVolume()+box2.getVolume();
}


مفاهیم شی گرایی فرای این هستن که صرفا چند تا تابع رو داخل یه بسته جمع کنیم و اسمش رو بذاریم کلاس. مثلا جواب این سوالا چی می‌شه:

از کجا مطمئن هستید که کدنویس نهایی از این کد در محیط کنسول استفاده می‌کنه که از cout استفاده کردید؟ از کجا مطمئنید که اسم متعیرها Box1 و Box2 هست که پیامتون به اون ترتیبه؟ حالا اگه بخوایم مجموع مساحت کل سطوح مکعب رو هم به نحوی برگردونیم باید یه عملگر دیگه (مثلا *) رو تعریف کنیم که Box1 * Box2 مجموع مساحت سطوح دو تا مکعب رو چاپ کنه؟ و بعد اگه عدد مجموع حجم‌ها رو نیاز داشته باشیم که داخل متغیر بریزیم باز یه محاسبه‌ی دستی
double sum = box1.getVolume() + box2.getVolume();
باید انجام بدیم؟ یعنی عملگر + فقط برای چاپ در محیطی که معلوم نیست کنسولی هم باشه نوشته شده و هیچ کاربرد دیگه‌ای نداره؟
و کلی سوال دیگه ...

شاید بگید که صرفا یه مثال بود. بله درسته. ولی به نظر من همچین مثالی کسی رو که تازه با این مفاهیم آشنا می‌شه ممکنه منحرف بکنه.