PDA

View Full Version : استفاده از درصد برای اعداد اعشاری



gole.shabbu8
شنبه 15 فروردین 1394, 22:57 عصر
با سلام
دنبال یه برنامه میگشتم که معکوس یک عدد اعشاری رو توی خرووجی چاپ کنه(به قول بروبچ مقلوب یه عدد). برنامه زیر رو پیدا کردم که واسه سی نوشته شده بود که تغییرش دادم به سی پلاس پلاس چون درکش واسم راحتتره. (البته میتونم مقلوب یک عدد صحیح رو کد بزنم!)
سوالیم اینکه که دقیقا کار این long که توی پرانتز اومده چیه؟ میگه میشه % رو برای double هم به کار برد ؟ اگه قرار با long تبدیل بشه چه نوع تبدیلیه ؟ اگه به integer آیا ارقام اعشاریی عددمون حذف نمیشن ؟اصلا میشه یکی بهم توضیح بده دقیقا این برنامه چه جوری کار میکنه؟ num رو تبدیل به long کرده؟ کار این pointer چیه اینجا؟ منظورش چیه از اینکه داخل پرانتز if نوشته اگر not pointer ؟ ممنون از راهنمایی اساتید گلم.
من تا حالا فقط حلقه for رو به این صورت دیده بودم که بین ; هر کدوم چیزهایی نوشته شده بود! اینم یه توضیح بدید ممنون میشم.


#include"stdafx.h"
#include <iostream>
using namespace std;
int main()
{

double num = 0 ;
int pointer = 0 ;
cout << "enter a number :";
cin >> num ;
cout << endl ;

for( ; num -( (long)num ) > 0 ; num *= 10, pointer++ )
{ }

for( ; num>0 ; num = ( (long)num/10 ) )
{

cout << ( (long)num % 10 );

pointer--;

if(!pointer) {cout << "." ;}

}



cin.get();
cin.get();
}

حامد مصافی
یک شنبه 16 فروردین 1394, 16:52 عصر
در تبدیل از اعشاری به صحیح بخش بعد از ممیز از بین می‌رود
اگر یک عدد در شرط if قرار بگیرد، در صورتی که برابر با صفر باشد false و در غیر اینصورت برابر با true نظر گرفته می‌شود. این شامل اشاره‌گر ها هم میشه.

gole.shabbu8
یک شنبه 16 فروردین 1394, 23:30 عصر
فرق num با (long)num چیه ؟

amirtork
دوشنبه 17 فروردین 1394, 20:51 عصر
سلام
در واقع با نوشتن
double num;
cout<<(int)num;

یا هر عبارت دیگه ای شبیه به همین، یک cast رو انجام میدیم، یعنی num رو که double هست، به long یا int یا چیز های دیگه ای تبدیل میکنیم.

gole.shabbu8
دوشنبه 17 فروردین 1394, 22:48 عصر
میشه برنامه بالا رو یه توضیح کوچولو بدید؟:اشتباه::ناراحت:

amirtork
سه شنبه 18 فروردین 1394, 15:48 عصر
#include <iostream>
using namespace std;

int main()
{
double num = 0 ;
int pointer = 0 ;
cout << "enter a number :";
cin >> num ;
cout << endl;
for( ; num - ( (long)num ) > 0 ; num *= 10, pointer++ )
{
}

for( ; num>0 ; num = ( (long)num/10 ) )
{
cout << ( (long)num % 10 );
pointer--;

if(!pointer)
cout << "." ;
}

cin.ignore();
cin.get();
return 0;
}

سلام
در کد بالا، که یک مقدار tab بندی شده ی کد اصلی هست، حلقه ی for اولی، تا زمانی که عدد وارد شده که در متغیر num ذخیره شده، دارای عدد اعشاری باشه، اون رو در 10 ضرب میکنه و مساوی num قرار میده، و بعد یک عدد به متغیر pointer اضافه میکنه. که در واقع با انجام این کار، مقدار متغیر pointer برابر با تعداد ممیز (تعداد اعداد سمت راست ممیز)عدد وارد شده توسط کاربر هست. و نحوه ی فهمیدن اینکه عدد وارد شده تا کی اعشار داره هم، به وسیله ی منها کردن عدد اصلی(دارای اعشار) با صحیح شده ی عدد اصلی(حذف کردن اعداد بعد از ممیز به وسیله ی cast کردن به long) هست، تا موقعی که این مقدار بیشتر از 0 باشه، یعنی هنوز اعدادی بعد از ممیز وجود داره.
در حلقه ی for دوم، برای نمایش معکوس عدد num، شرط حلقه رو num>0 قرار داده شده، در واقع این شرط، نشان دهنده ی این هست که در هر مرحله از انجام این حلقه، از مقدار نام کاسته خواهد شد، که مقدار این کاسته شدن هم، یک رقم در هر مرحله است(به تقسیم بر 10 و عمل انساب دوباره به num در for دقت کنید.
بعد هم در هر مرحله، باقیمانده num بر 10 (آخرین رقم num) رو نمایش میده، تا زمانی که به تعداد اعداد سمت راست ممیز در عدد اصلی برسه، بعد ممیز رو چاپ میکنه و ادامه ی ارقام رو نمایش میده.