PDA

View Full Version : سوال: چند تا سوال سینتکسی در c++



mohammaddx
سه شنبه 19 خرداد 1394, 13:12 عصر
با سلام به همه ی دوستان.دارم برای امتحان برنامه نویسی پیشرفته میخونم که چند تا سوال برام پیش امده
سوال 1:


;float fltfeet=5.5
;int feet=4

feet = int(fltfeet);




در دستور سوم int(fltfeet) میاد متغییر fltfeet را از فلوت به اینت تبدیل میکنه؟یعنی کار static_cast<int> را انجام میده؟اصلا چه نیازی به این کار است مگه کامپایلر ضمنی این کار را انجام نمیده؟
سوال 2:
چرا بعضی جاها متغییر فلوت را برابر مثلا 2.35F قرار میدهند؟این f آخر برای چی هست؟
سوال 3:
مثلا در کلاس time داریم:


time time::hours()
{
return time(4,5,6(
}

(سازنده سه پارامتر دارد).کلا متوجه نمیشم return time(4,5,6( برای چی هست؟
مگه با به کاربردن time(4,5,6(
شی ساخته می شود؟

-Geek-
سه شنبه 19 خرداد 1394, 15:23 عصر
کد اول رو ویرایش کن. با HTML قاطی شده

mohammaddx
سه شنبه 19 خرداد 1394, 16:18 عصر
کد اول رو ویرایش کن. با HTML قاطی شده
مشکلی نداره که؟

rahnema1
سه شنبه 19 خرداد 1394, 18:44 عصر
سلام،در عبارت اول 5.5 ثابت از نوع double هست که به صورت ضمنی تبدیل به float میشه
وقتی ما fltfeet را به صورت صریح به int تبدیل می کنیم فرقی نمی کنه که به صورت ضمنی هم تبدیل بشه و اینجور تبدیل نوع صریح که به شکل تابع هست از لحاظ تعریف معادل cast به صورت صریح می باشد
feet = (int) fltfeet;
اما مثلا اگه 5.5f بنویسیم یک ثابت از نوع float خوهیم داشت نه از نوع double و هیچ تبدیلی صورت نمی گیره
توضیح اینکه نحوه ذخیره double و float به صورت دودویی در کامپیوتر باهم متفاوته و اگه دو عدد که به نظر ما یکسان هست ولی یکی از نوع float و دیگری double باشه وبخواهیم به int تبدیل کنیم نتیجه کاملا متفاوت بشه!

int a = 16777217.0;
int b = 16777217.0f;
cout << a <<endl;
cout << b <<endl;


در مثال دوم یک کلاس داریم به نام time که یک تابع عضو اون هست به نام hours که نوع برگشتی اون تابع از نوع time هست.
در داخل تابع hours یک شیء از نوع time ایجاد می کنیم. البته با استفاده از یکی از سازنده های کلاس time که این سازنده سه تا پارامتر می گیره که شما تعریف سازنده را اینجا نذاشتید

mohammaddx
سه شنبه 19 خرداد 1394, 19:28 عصر
سلام،در عبارت اول 5.5 ثابت از نوع double هست که به صورت ضمنی تبدیل به float میشه
وقتی ما fltfeet را به صورت صریح به int تبدیل می کنیم فرقی نمی کنه که به صورت ضمنی هم تبدیل بشه و اینجور تبدیل نوع صریح که به شکل تابع هست از لحاظ تعریف معادل cast به صورت صریح می باشد
feet = (int) fltfeet;
اما مثلا اگه 5.5f بنویسیم یک ثابت از نوع float خوهیم داشت نه از نوع double و هیچ تبدیلی صورت نمی گیره
توضیح اینکه نحوه ذخیره double و float به صورت دودویی در کامپیوتر باهم متفاوته و اگه دو عدد که به نظر ما یکسان هست ولی یکی از نوع float و دیگری double باشه وبخواهیم به int تبدیل کنیم نتیجه کاملا متفاوت بشه!

int a = 16777217.0;
int b = 16777217.0f;
cout << a <<endl;
cout << b <<endl;


در مثال دوم یک کلاس داریم به نام time که یک تابع عضو اون هست به نام hours که نوع برگشتی اون تابع از نوع time هست.
در داخل تابع hours یک شیء از نوع time ایجاد می کنیم. البته با استفاده از یکی از سازنده های کلاس time که این سازنده سه تا پارامتر می گیره که شما تعریف سازنده را اینجا نذاشتید


class time12
{ private:
bool pm; //true = pm, false = am
int hrs; //1 to 12
int mins; //0 to 59
public:
time12() : pm(true), hrs(0), mins(0) { }
time12(bool ap, int h, int m) : pm(ap), hrs(h), mins(m) { }
}
class time24
{ private:
int hours; //0 to 23
int minutes; //0 to 59
int seconds; //0 to 59
public:
time24() : hours(0), minutes(0), seconds(0) { }
time24(int h, int m, int s) :hours(h), minutes(m), seconds(s) { }
operator time12() const; //conversion operator
};
time24::operator time12() const
{i
nt hrs24 = hours;
bool pm = hours < 12 ? false : true;
int roundMins = seconds < 30 ? minutes : minutes+1;
if(roundMins == 60)
{ roundMins=0;
++hrs24;
if(hrs24 ( == 12 || hrs24 == 24)
pm = (pm==true) ? false : true;
}i
nt hrs12 = (hrs24 < 13) ? hrs24 : hrs24-12;
if (hrs12=0)
{hrs12=12; pm=false;}
return time12(pm, hrs12,roundMins);
}

ممنون از پاسختون.من باسه سوال 3 هنوز مشکل دارم.
مشکل من دقیقا خط یکی مونده به اخره.مگه با return time12(pm, hrs12,roundMins); شی بازگشت داده میشه؟نباید به شکل return time12 myname (pm, hrs12,roundMins); باشه؟

rahnema1
سه شنبه 19 خرداد 1394, 22:44 عصر
دو تا نکته نباید با هم اشتباه بشه
یه وقت می خواهیم یک شیء از نوع time12 اعلان کنیم و در همون اعلان هم مقدار دهی اولیه انجام بدیم
اعلان در واقع یک دستور یا statement هست. و مقداری را بر نمی گردونه و صرفا با اعلان، یک دستور صادر می کنیم

time12 myname (pm, hrs12,roundMins);

اینجا ما یک متغیر به نام myname از نوع کلاس time12 اعلان می کنیم و این متغیر را مقدار دهی اولیه می کنیم و این مقدار دهی به این صورت انجام می شه که پارامترهایی که داخل پرانتز جلوی اسم متغیر گذاشتیم به عنوان پارامترهای سازنده اون شیء در نظر گرفته می شه و سازنده صدا زده شده و اون شیء مقدار دهی اولیه می شه.
بنابراین یک دستور صادر شد که اون شیء اعلان بشه و مقدار دهی اولیه بشه. این دستور هیچ مقداری را بر نمی گردونه

اما گاهی ما صراحتا سازنده یک شیء را صدا می زنیم:

time12(pm, hrs12,roundMins);

اینجا دیگه دستوری صادر نمیشه بلکه یک عبارت یا expression داریم که مقداری را برمی گردونه که از نوع time12 هست
حالا return یک دستور هست که جلوی اون باید یک عبارت بذاریم که اون عبارت باید نوعش معادل نوع برگشتی تابع باشه یا قابل تبدیل به نوع برگشتی تابع باشه
در این مثالی که داریم ما یک تابع تبدیل کننده داریم که قراره یک نوع time24 را به نوع time12 تبدیل کنه بنابراین نوع برگشتی اون تابع، time12 هست
بنابراین جلوی دستور return باید عبارتی از نوع time12 بذاریم که این عبارت را با صدا زدن صریح سازنده time12 تشکیل می دهیم