PDA

View Full Version : سوال: طریقه ی تبدیل اعداد به رشته ها



moh.mon
یک شنبه 12 خرداد 1387, 21:53 عصر
آیا راهی وجود داره که بشه یه عدد رو به رشته تبدیل کرد؟
(لطفا تابع معرفی نکنید.)

emad_67
یک شنبه 12 خرداد 1387, 22:28 عصر
اگه نمیخوای از تابع استفاده کنی باید تک تک رقم های عدد رو جدا کنی و بعد اونو تبدیل کنی به کاراکتر. یعنی ابتدا عدد رو بر 10 تقسیم میکنی و باقیمانده های اونو تک تک به کاراکتر تبدیل میکنی. برای تبدیل عدد به کاراکتر هم کافیه اون عدد رو با 48 جمع کنی تا کد اسکی مربوط به کاراکتر بدست بیاد.

MRHagh
دوشنبه 13 خرداد 1387, 06:31 صبح
باقیمانده تقسیم های متوالی یک عدد بر 10 , در اصل ارقام عدد هستند . در تبدیل اعداد به کاراکترها ضمن جمع کردن با 48 نیاز به TypeCasting هم دارید تا واقعا به شکل کاراکتری عدد دست پیدا کنید , وگرنه صرفا عددی صحیح را با 48 جمع کردید که حاصل با آنچه انتظار دارید متفاوت است .
برای مثال برنامه ساده زیر عددی را به رشته تبدیل میکند (برای نمونه از ابتدا عدد 20080 وارد شده که میتوانید تغییر دهید )


#include <conio.h>
#include <math.h>
#include <iostream>
using namespace std;
char* chr(int, int=0, char* =0);
void main()
{
int YourNumber=20080;
cout<<chr(YourNumber);
_getch();
}
char* chr(int YourNumber, int index, char *YourString)
{
if(!YourString)
{
index=(int)log10((double)YourNumber);
YourString=new char[index+1];
}
if(YourNumber)
{
int r=YourNumber%10;
YourNumber/=10;
chr(YourNumber, index-1, YourString);
YourString[index]=(char)(r+48);
}
YourString[index+1]='\0';
return YourString;
}

عدد صحیحی را میتوانید در هر برنامه ای به تابع chr برای تبدیل به رشته تحویل دهید و مستقیما مقدار برگشتی تابع را یا چاپ کنید و یا بر حسب نیاز استفاده کنید .
موفق باشید ...

moh.mon
دوشنبه 13 خرداد 1387, 13:12 عصر
از راهنماییتون ممنون ولی میشه همین تابع رو یکم ساده تر بنویسید.
چون تابع واقعا پیچیده است.

MRHagh
دوشنبه 13 خرداد 1387, 16:55 عصر
فکر میکنم تنها قسمت پیچده تابع این باشد که در آن ما از عدد لگاریتم میگیریم تا رشته ای به طول مورد نیاز تولید کنیم و نه بیشتر یا کمتر .
به هر حال قصد من هم فقط راهنمایی بود نه نوشتن برنامه ,سعی در تحلیل پیچیدگی های همین تابع ساده , شاید ایده های بهتری برای حل مسائل ساده ای از این دست به شما بدهد .
طراحی الگوریتم مناسب و چیره دستی در استفاده از ابزارهایی مناسب برای نوشتن یک برنامه , هدفیست که جز با کنکاش پیچیدگی ها و تحلیل صحیح موضوعات , دست یافتنی نیست .
موفق باشید ...

moh.mon
سه شنبه 14 خرداد 1387, 09:38 صبح
از راهنماییتون ممنون من هم یه برنامه نوشتم که یه عدد از مبنای 10 رو به یه عدد در مبنای 2 تبدیل میکنه و سپس عدد از نوع int رو به char تبدیل میکنه ولی نمیدونم مشکلش کجاست اگه میشه را هنمایی کنید.

char* dectobin(int dec)
{
int i , x , s[10] , j=0;
char binary[100];
do
{
x= dec % 2;
s[j] = x;
dec = dec/2;
j++;
}while (dec!=0);
for (i=j-1 ; i>=0 ; i--)
{
binary[i]= s[i] +'0';
}
binary[j]="\0";
return binary ;
}

MRHagh
سه شنبه 14 خرداد 1387, 12:13 عصر
شما در اصل میخواهید برنامه ای بنویسید که عددی را از مبنای 10 به 2 ببرد .. درسته ؟!
با تغییر کوچکی در همان تابع chr میشه این کار و هم خیلی ساده انجام داد , باید بیاد داشته باشید که در تبدیل اعداد به رشته ها شما حتما به تعداد ارقام آن احتیاج خواهید داشت , در تابع زیر هم ابتدا تعداد ارقام عدد در مبنای 2 را محاسبه میکنیم , بعد به ادامه کار میپردازیم . اینکار برای تنظیم اندیسهای رشته و در حالت حرفه ای تر , برای تولید رشته ای درست بطول مورد نیاز , انجام میشود :

char* DecimalToBinary(int Decimal, int index, char *Binary)
{
if(!Binary)
{
index=(int)(log((double)Decimal)/log((double)2))+2;
Binary=new char[index];
Binary[index-1]='\0';
}
for(int i=index-2; i>=0; i--)
{
Binary[i]=(char)((Decimal%2)+48);
Decimal/=2;
}
return Binary;
}
اشکال برنامه شما هم همین بود که با اندیسها درست کار نمیکردید و انها را با مقادیر نا معتبر وارد جریان محاسبه میکردید . همچنین در پست قبلی اشاره کرده بودم که باید پس از جمع عدد با 48 حتما TypeCastig را انجام دهید تا شکل کاراکتری تبدیلات شما در نظر گرفته شود , نه پاسخ محاسبه جمع عدد مورد نظر شما با 48 !!! شما بدون در نظر گرفتن این قضیه , یک مقدار int را برابر یک مقدار char قرار میدهید که کاملا نادرست است .

moh.mon
سه شنبه 14 خرداد 1387, 17:23 عصر
ولی مشکل اینجاست که ما index , *binary رو نمیتونیم به عنوان آرگمان ورودی داشته باشیم.

MRHagh
پنج شنبه 16 خرداد 1387, 13:04 عصر
بدون شرح .... !!!!!!!


char* DecimalToBinary(int Decimal)
{
int index=(int)(log((double)Decimal)/log((double)2))+2;
char *Binary=new char[index];
Binary[index-1]='\0';
for(int i=index-2; i>=0; i--)
{
Binary[i]=((Decimal%2)+48);
Decimal/=2;
}
return Binary;
}

moh.mon
پنج شنبه 16 خرداد 1387, 22:01 عصر
خیلی ممنون.