PDA

View Full Version : مشکل در یه برنامه در مورد کلاسها



alirah84
یک شنبه 23 مهر 1391, 20:37 عصر
سلام
اقا من چند تا مشکل و سوال دارم در مورد جواب این برنامه .خواهشا اگه بلدید یه کمکی بکنید،دعاتون میکنم.
این سواله:
فرض کنید در یکی از مناطق آزاد ، مغازه ای پارچه فروشی وجود دارد که پارچه ها را به کشورهای دیگر صادر میکند . مغازه دار پارچه ها را بر حسب متر مربع می سنجد،ولی کشورهای خریدار میخواهند پارچه را بر حسب یارد مربع بدانند .برنامه ای بنویسید که این تبدیل را انجام دهد .

#inlclude "stdafx.h"
#inlclude <iostream>
using namespace std,
class PieceofFabric
{
public :
void readSqMeters();
float toSqYards();
void displayFabric();
private :
float sqMeters;
};
void PieceofFabric::readSqMeters()
{
cout<<"Enter size in sqare meters :";
cin>>sqMeters;
}


float PieceofFabric :: toSqYards()
{
return 1.96* sqMeters;
}
void PieceofFabric :: displayFabric()
{
cout << sqMeters<<"square meter is "<< toSqYards()
<< "square yards.";
}
int main ()
{
PieceofFabric fabric;
fabric.readSqMeters();
fabric.displayFabric();
cin.get();
cin.get();
}

1.چرا SqMeters را در private نوشته؟آیا میشه در public هم نوشت؟منظور اینه که این متغیر فقط توی این کلاس قابل دسترسی هست ؟اگه کلاس دیگه ای هم در برنامه بود این متغیر تو اون کلاس قابل دسترسی نیست؟؟
2.چرا دو تابع readSqMeters و displayFabric رو نوشته؟نمیشه توی این برنامه فقط یه تابع نوشت که ورودی نداره ولی خروجیش double باشه و این کد ها:

cout<<"Enter size in sqare meters :";
cin>>sqMeters;
return 1.96* sqMeters
به عنوان دستور داخلش بنویسیم و تابع رو در main صدا بزنیم.میشه همچین کاری کرد؟
3.مگه نباید تابع toSqYards در تابع اصلی صدا زده بشه ،پس چرا در تابع displayFabric صدا زده شده؟
4.در این برنامه شی به پارچه هایی میگن که هرکدوم یه مقدارن که به هرکدومشون میگن عضو شی؟
5.در مورد اون سه خطی که تو main نوشته شده میشه توضیح بدید .چرا بعد از PieceofFabric ،دوباره fabric نوشته شده .
ببخشید یکم سوالام مبتدی و زیادن.

mahak006
یک شنبه 23 مهر 1391, 22:21 عصر
سلام
اقا من چند تا مشکل و سوال دارم در مورد جواب این برنامه .خواهشا اگه بلدید یه کمکی بکنید،دعاتون میکنم.
این سواله:
فرض کنید در یکی از مناطق آزاد ، مغازه ای پارچه فروشی وجود دارد که پارچه ها را به کشورهای دیگر صادر میکند . مغازه دار پارچه ها را بر حسب متر مربع می سنجد،ولی کشورهای خریدار میخواهند پارچه را بر حسب یارد مربع بدانند .برنامه ای بنویسید که این تبدیل را انجام دهد .

#inlclude "stdafx.h"
#inlclude <iostream>
using namespace std,
class PieceofFabric
{
public :
void readSqMeters();
float toSqYards();
void displayFabric();
private :
float sqMeters;
};
void PieceofFabric::readSqMeters()
{
cout<<"Enter size in sqare meters :";
cin>>sqMeters;
}


float PieceofFabric :: toSqYards()
{
return 1.96* sqMeters;
}
void PieceofFabric :: displayFabric()
{
cout << sqMeters<<"square meter is "<< toSqYards()
<< "square yards.";
}
int main ()
{
PieceofFabric fabric;
fabric.readSqMeters();
fabric.displayFabric();
cin.get();
cin.get();
}

1.چرا SqMeters را در private نوشته؟آیا میشه در public هم نوشت؟منظور اینه که این متغیر فقط توی این کلاس قابل دسترسی هست ؟اگه کلاس دیگه ای هم در برنامه بود این متغیر تو اون کلاس قابل دسترسی نیست؟؟
2.چرا دو تابع readSqMeters و displayFabric رو نوشته؟نمیشه توی این برنامه فقط یه تابع نوشت که ورودی نداره ولی خروجیش double باشه و این کد ها:

cout<<"Enter size in sqare meters :";
cin>>sqMeters;
return 1.96* sqMeters
به عنوان دستور داخلش بنویسیم و تابع رو در main صدا بزنیم.میشه همچین کاری کرد؟
3.مگه نباید تابع toSqYards در تابع اصلی صدا زده بشه ،پس چرا در تابع displayFabric صدا زده شده؟
4.در این برنامه شی به پارچه هایی میگن که هرکدوم یه مقدارن که به هرکدومشون میگن عضو شی؟
5.در مورد اون سه خطی که تو main نوشته شده میشه توضیح بدید .چرا بعد از PieceofFabric ،دوباره fabric نوشته شده .
ببخشید یکم سوالام مبتدی و زیادن.

اینا تماما مفاهیم شیء گرایی هستن . یه سری از سؤال هایی که کردی هم جوابشون رو بیشتر می شه سلیقه در برنامه نویسی دونست .
معمولا تو کلاس ها ، آرگومان ها رو برای اینکه دسترسی هاشون از توابع خارج کلاس کم بشه و از هر جایی و هر کسی نتونه ازشون استفاده کنه ، در قسمت private تعریف می کنن . که البته مشکلی از نظر برنامه نویسی پیش نمیاد که تو public تعریف بشن . وقتی متغیر private باشه ، فقط تو توابع داخلی اون کلاس و توابع دوست کلاس می تونن مورد استفاده قرار بگیرن . به همین خاطر اگه کلاس دیگه ای تو برنامه تعریف کنید ، به متغیر های این کلاس ، دسترسی نداره .

2.میشه جفتشو تو یه تابع نوشت . ولی یه مقدار قوانین به هم می ریزه . چون تو جایی از main ممکنه که بخوایم از یک نوع داده کلاس ، مقدار رو به یک نوع داده دیگه انتساب بدیم و دومی رو چاپ کنیم ( مثل گرفتن خروجی از یه تابع . که البته اینجا مورد استفاده نیست ) بره همین نیاز داره دو تابع گرفتن مقدار از کاربر و چاپ مقدار یک متغیر ، جداگانه نوشته بشن تا اگه بره یه نوع داده از کلاس ، فقط لازم به چاپ بود ، پیغام دریافت مقدار نگیره . البته تو این برنامه چنین چیزی وجود نداره . ولی بهتره به همین حالت ، تمام کلاس ها و توابعشون پیاده سازی بشن . یعنی توابع جداگانه کار بکنن . تا بره توسعه نرم افزار به سختی نیافتیم .
3.تابع yard میتونه تو main صدا زده بشه . ولی بره چاپ مقدار ، به دلیلی که تو سؤال اومده ، باید مقدار یارد مربوط به متر هم در کنارش چاپ بشه .
4.شیء به نوع داده pieceoffabric گفته می شه . به پارچه هایی که مقدارشون وارد می شه می گن عضو از نوع شیء ( عضو کلاس )
5.تو خط اول در main یک عضو از کلاس ساخته شده . در خطوط بعدی ، برای اون عضو از کلاس ، توابع صدا زده شده . به همین دلیل باید با اضافه کردن نام عضو به ابتدای تابع ، مشخص بشه که کدوم عضو ، اون تابع رو در خواست کرده . یه جور مثل آرگومان ورودی تابع های ساده به حساب میاد ولی پیشرفته تر .

abarkarbar
یک شنبه 23 مهر 1391, 22:52 عصر
تأیید میشه. ضمن تأیید گفته های قبلی ..

1. بله میشه آن را public هم نوشت ولی برای مواردی که نیاز به دسترسی به آنها در بین کلاس های دیگر وجود نداره و تنها در آن کلاس استفاده میشه، اصول مهندسی شیء گرا ایجاب میکنه کنه آن موارد private یا خصوصی باشه. این به امنیت آن موارد کمک می کنه.

2. بله میشه، ولی برنامه (برای انجام کار مورد نظر) در توابعی نوشته میشه که هر کدام مجزا عمل می کنند و بخشی از کار مورد نظر رو انجام می دهند. در اینجا یک تابع برای دریافت داده ورودی، یک تابع برای انجام محاسبه و تولید خروجی و یکی هم برای نمایش و ارائه آن در نظر گرفته است. این کار مطابق اوصول مهندسی نرم افزار و شیء گرایی هست که تست کردن، ایرادیابی و درک آن را ساده تر می کند.

3. نه لزوماً نیاز نیست که حتماً در داخل تابع main صدا زده شود، در این برنامه تابع display برای نمایش نتیجه اجرا می شود که آن هم در داخلش برای بدست آوردن نتیجه تابع محاسبه toSqYard رو فراخوانی می کنه و خروجی آن تابع در واقع به جای اسمش میاد میشینه.

4. در واقع به صورت خیلی ساده تر طبق گفته شما اینطور هست:
در این برنامه شی به پارچه هایی میگن که هرکدوم یه مقداری دارند و عملیاتی روی آنها می تواند انجام شود (read، display، toSqYard) که به هرکدومشون میگن عضو کلاس پارچه.

5. سطر اول در داخل main می خواهد نمونه ای از کلاس موجود را ایجاد کند - یا همان یک نمونه شیء ایجاد کند. مثلاً وقتی می نویسیم int a نمونه ای از متغیر int به نام a ایجاد کردیم در اینجا می خواهیم نوع int نباشد و نوع کلاسی که داریم باشد - یعنی متغیری از نوع پارچه! پس نمونه ای از کلاس پارچه ایجاد می شود، اسم کلاس اول می آید (مثل int) و بعد اسم اختیاری برای شیء (مثل a) که در اینجا fabric ساخته می شود. الان fabric یک شیء است که نمونه ای از کلاس پارچه است و میتواند مقداری به آن داد و عملیاتی روی آن انجام داد (هر یک از توابع موجود در کلاس آن: read، display، toSqYard).

امیدوارم روشن تر توضیح داده باشم.