PDA

View Full Version : برعکس کردن عدد اعشاری



elaheyenaz_65
چهارشنبه 09 فروردین 1385, 23:46 عصر
با عرض سلام و تسلیت رحلت پیامبر اسلام و شهادت امام حسن و امام رضا
می خواهم یه برنامه بنویسم که عدد اعشاری رو می گیره و بر عکس می کنه
مثلا اگر ورودی ما 123.654 باشد خروجی ما 456.321 می باشد
ممنون میشم اگه راهنماییم کنین

Sepidar
پنج شنبه 10 فروردین 1385, 00:51 صبح
کلک رشتی: تبدیلش کن به رشته و بعد رشته رو ریورس کن!

در مورد روشهای عادی چیزی نمیتونم بگم، چون گاهی بعضی از کامپایلرهای سی، رقمهای بی معنی با مرتبه خیلی کم تو پردازش اعداد اعشاری تولید میکنن.

Amir Oveisi
پنج شنبه 10 فروردین 1385, 03:11 صبح
میتونی عدد اعشاری رو بصورت جمعی از نمادهای علمی بنویسی مثلا :
123.456 = 1*10^2 + 2*10^1 + 3*10^0 + 4*10^ -1 + 5*10^ -2 + 6*10^ -3

بعدش توانهای منفی رو مثبت کن و منهای یک کن و از راست به چپ بصورت نماد علمی بنویس :متفکر:

موفق باشی


BeRMOoDA

mamadgmail
پنج شنبه 10 فروردین 1385, 03:32 صبح
بهترین راه همونیه که گفتن تبدیلش کن به رشته
در مورد بخش اعشاری اگر بخوای مثلا در 10 ضرب کنی و یکی یکی رقم های اعشاری رو بکشی بیرون همیشه رقم های بی معنی تولید می شن
برمودا می شه بگی منظورت چیه من که نفهمیدم . می شه توضیح بدی چطوری توان های منفی رو پیدا می کنی؟؟

elaheyenaz_65
پنج شنبه 10 فروردین 1385, 14:37 عصر
کلک رشتی: تبدیلش کن به رشته و بعد رشته رو ریورس کن!

در مورد روشهای عادی چیزی نمیتونم بگم، چون گاهی بعضی از کامپایلرهای سی، رقمهای بی معنی با مرتبه خیلی کم تو پردازش اعداد اعشاری تولید میکنن.




ممنون که راهنمایی کردین ولی استادمون از این کلک ها از ما قبول نمی کنه یکی برام برنامه اش رو با ++cنوشته ولی من از ++cسر در نمیارم اگه میشه به c تبدیلش کنین ممنون میشم یا توضیخ بدین چی شده
ممنون


#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <algorithm>

double Reverse(double dNum)
{
std::ostringstream ssNum;
ssNum << dNum;
std::string csNum = ssNum.str();
std::string csReverse;
std::reverse_copy(csNum.begin(), csNum.end(),
std::back_inserter(csReverse));
double dRev = atof(csReverse.c_str());
return dRev;
}

int main()
{
double dNum = 0.0;
std::cout << "Enter Number: ";
std::cin >> dNum;
std::cout << Reverse(dNum);
return 0;
}

mamadgmail
پنج شنبه 10 فروردین 1385, 17:04 عصر
این کدی که نویشتین خوانا نیست بزارینش توی تگ های کد تا بشه خوندش

Amir Oveisi
پنج شنبه 10 فروردین 1385, 17:47 عصر
خوب این روشی که گفتم یه کم پیچیده میشه نوشتنش ولی یه روش خیلی ساده به ذهنم رسید
اینجوریه که اول عدد اعشاری رو اونقدر در 10 ضرب میکنیم که عدد معمولی بشه بعد ای عدد رو reverse میکنیم بعد به تعداد اعداد قسمت صحیح ( قبل از ضرب در 10 کردن ) براش اعشار میزنیم
( در 10 به توان منفی اون تعداد ضرب میکنیم ) روش خیلی ساده و عملی هستش خودم همین الان برنامشو نوشتم اگه خواستین براتون میفرستم.:متفکر:

Amir Oveisi
پنج شنبه 10 فروردین 1385, 17:52 عصر
خوب اینم فایل امیدوارو به درد بخوره سعی کردم واضح باشه :متفکر:

mamadgmail
جمعه 11 فروردین 1385, 04:42 صبح
سلام
اقای bermooda من که از برنامه شما جواب نگرفتم. در شمن راجب اینکه گفتید عدد رو اونقدر در 10 ضرب می کنید تا تبدیل به عدد صحیح بشه این دقیقا همون چیزیه که دوستان گفتن مشکل داره. دلیلش هم اینه که زمانی که شما یک عدد مثلا Double رو در 10 ضرب می کنید هیچ موقه واقعا بعد از اعشار به صفر نمی رسه.

خوش باشید

Amir Oveisi
جمعه 11 فروردین 1385, 04:49 صبح
من نوشتم و کار هم میکنه !!! میتونید امتحان کنید !!!

#

include "stdafx.h"
#include "iostream.h"
#include "conio.h"
#include "math.h"

int Length( int );
int Reverse( int );

/************************************************** *************/

void main()
{
double inVal = 0;
cout << " Please enter your digit : ";
cin >> inVal;
int intPart = floor( inVal );
int n = Length( intPart );
cout << " n = " << n << " ";
while( inVal - floor( inVal ) != 0 )
inVal *= 10;
cout << " inVal = " << inVal;
double outVal = Reverse( inVal );
cout << " outVal = " << outVal;
outVal *= pow( 10 , (-n) );
cout << "\n inveresed digit is : " << outVal;
cin.get();
getch();
cin.get();
}//end main

/************************************************** **************/
int Length( int a )
{
for( int i = 1; a >= 10; i++ )
a = ( a / 10 );
return i;

}//end fn
/************************************************** ***************/
int Reverse( int a )
{
int n = Length( a );
int sum = 0;
int b = 0;
for( int i = (n-1); i >= 0; i-- )
{
b = a % 10;
sum += ( b * pow( 10 , i ) );
a = ( a / 10 );
}//end for
return sum;
}//end fn

mamadgmail
جمعه 11 فروردین 1385, 21:52 عصر
دوست عزیز من کد شما رو نخوندم ولی کامپایلش کردم حق با شماست جواب می ده اما فقط برای بعضی از اعداد مثل 12.25 . برای اینگونه اعداد که بعد از ممیز هیچ صفری ندارند درست جواب می ده اما اگه عدد مثلا بشه 12.205 همه چی بهم می ریزه خودتون امتحان کنید یک بار


خوش باشید

Amir Oveisi
جمعه 11 فروردین 1385, 23:22 عصر
سلام من امتحان کردم !!!! کار میکنه هر جوری هم عدد اعشاری بدی درست میده جواب رو حتی همین 12.205 که میگین کار نمیکنه !!!!!

mamadgmail
یک شنبه 13 فروردین 1385, 21:21 عصر
خوب ببین عزیز این بستگی به کامپایلر داره بعضی از کامپایلر ها برای اعداد اعشاری رقم های بی معنی به ارزش مکانی خیلی پایین ایجاد می کنن مثلا من از Borland 3.0 استفاده کردم و برنامه شما به من اشتباه جواب داد. در هر صورت موفق باشی.

میترا12
دوشنبه 14 فروردین 1385, 12:44 عصر
با سلام
برنامه ی آقای برمودا در borland 5.02 درست کار می کنه. روششون هم درست و منطقیه. :تشویق:
ولی با توجه به اینکه گنجایش عدد صحیح (int) در ++C محدوده (16 یا 32 بیت) اگر عدد اعشاری موقع ضرب متوالی در 10 از این مقدار بزرگتر بشه ارقام بی معنی تولید خواهند شد.بهترین و کارامدترین راه همون رشته ست.

Amir Oveisi
شنبه 19 فروردین 1385, 11:56 صبح
الان آخه کی با borland 3 کار میکنه؟ :تعجب:

mamadgmail
شنبه 19 فروردین 1385, 19:09 عصر
نمی دونم والا ولی من از محصولات borland فقط این روژن رو داشتم. در هر حال بحث خوبی بود. ممنون.

Amir Oveisi
یک شنبه 20 فروردین 1385, 11:50 صبح
مرسی... من با VS نوشته بودم... به هر حال جالب بود