سلام دوستان
من تو قسمتی از یه برنامه می خوام عددی رو که از کاربر گرفته شده به صورت حروفی چاپ کنم. خودم هر چی فکر می کنم نمی دونم چه جوری باید این کارو بکنم. می شه اگه چیزی به ذهنتون می رسه یه ذره راهنماییم کنید.( در ضمن تو ++c ):20:
Printable View
سلام دوستان
من تو قسمتی از یه برنامه می خوام عددی رو که از کاربر گرفته شده به صورت حروفی چاپ کنم. خودم هر چی فکر می کنم نمی دونم چه جوری باید این کارو بکنم. می شه اگه چیزی به ذهنتون می رسه یه ذره راهنماییم کنید.( در ضمن تو ++c ):20:
3561 رو در نظ بگیرید
حالا از راست جلو برید. تو اولین گام دو تا رقم بردارید: 61 و بنویسید shasto yek
حالا به ترتیب جلو برید (توجه کنید باید شمارۀ رقم رو داشته باشید. مثلاً 5 توی مکان سومه پس صدگانه)
بنویسید: Punsad o
بعد برین دو رقم بعدی: 03 در هزارگان. میشه Se Hezaro
توجه کنید که باید سه رقم یه بار دو تایی بخونیم. چون مثلاً اگه 17 بود و ما یکی یکی می خوندیم اشتباه می شد.
13514
chardah
punsad o
sizdah hezar o
باید برای هر index رقم یک تابع جداگانه بنویسید (احتمال زیاد توی صورت مسئله قید شده که طول عدد محدوده)
سلام...
بزار حرفهای حمید رضا رو کامل تر کنم...
ابتدا عددت رو به رشته تبدیل کن (تا بتونی بفهمی هر عدد تو چه مرتبه ای هست)
بعد یه حداکثری واسه عددت تعیین کن... (مثلا بگو تا صدگان..)
بعد باید عدد حروفی رو برای هر مرتبه تعیین کنی ... مثلا
همین جوری با استفاده از enum دهگان و یکان رو تعریف کن...کد:
enum SADGAN { SAD , DEVIST , SISAD , CHAHARSAD , ...etc }; l
بعد از سمت راست با استفاده از عدد مربوطه و مرتبه آن ، از مرتبه مورد نظر که با استفاده از enum تعریف شد عدد حروفی مربوطه رو بنویس...
تو یه حلقه این کار رو بکن و آخر حلقه یه 'O' یعنی حرف 'و' بزار اگر به یکان نرسیدی... اگه یکان بود به اون نیازی نیست...
بازم اگه تو کدش مشکل داشتی بگو..
موفق باشی
خیلی ممنونم از راهنماییاتون،
ببیید من باید بزرگ ترین عددم 8 رقم باشه و عدد رو از کاربر بگیرم و بعد حروفیش کنم. با توجه به توضیحاتتون باید اول یه آرایه داشته باشم که اعداد 1 تا 9 رو حروفی توش ذخیره کنم و بعد یه آرایه که اعداد 11 تا 19 رو و بعد یه آرایه که اعداد 10 تا 90 رو و یه آرایه که اعداد 100 تا 900 رو و به همین ترتیب.
بعد مثلا اگه کاربر وارد کرد 9876 چون عدد 4 رقمیه اول باید تقسیمش کنم به 1000 که خارج قسمت بشه 9 و بنویسم 9 به همرا یه دونه هزار و یه دونه O و بعد باقیمانده رو به 100 تقسیم کنم که بشه 8 و به همراه یه دونه صد و یه دونه O بنویسمش و به همین ترتیب.
ولی اولا عدد که همیشه چهار رقمی نیست که من اول به 1000 و بعد به 100 و ... تقسیمش کنم. ثانیا هم وقتی حاصل تقسیم اول شد 9 من چه حوری باید بفهمم که الان باید عضو نهم از آرایه ای که اعداد تک رقمی توش ذخیره شدن رو باید استفاده کنم؟ و یا ترتیب گذاشتن این هزار و صد و اینا به صورت حروفی رو باید از کجا بفهمم؟
بازم ممنونم که کمکم می کنید.:11:
سلام...نقل قول:
خواهش میکنم...
گفتی بزرگترین عددت 8 رقمیه پس در نتیجه کوچکتر از اون هم می تونه باشه، برای اینکه بفهمی عددت چند رقمیه باید
از این فرمول استفاده کنی >> 1+[ Log l n l ]
بعد که فهمیدی عددت چند رقمیه اون رو تقسیم بر ( 1- تعداد ارقام ) ^ 10 =L میکنی رقم اول از سمت راست رو بدست میاری و با توجه به اینکه الان رو کدوم مرتبه داری کار میکنی ( از طریق L جاری ) و رقم بدست اومده (از طریق تقسیم عددت بر L ) به آرایه ای از رشته ها که اعداد اون مرتبه رو ذخیره کردی (یا با استفاده از enum ) حروف عدد مربوطه رو مینویسی ... بعد یه "O" میزاری به شرط اینکه L=!1 باشه... بعد L=L/10 ... کلا این کارو تو یه حلقه میکنی...
در ضمن همون طور که گفتم شما باید عدد حروفی هر مرتبه رو ذخیره کنی یا با استفاده از enum یا با استفاده از آرایه ای از رشته ها...
به این صورت که... برای یکان (از یک تا نه) برای دهگان ( ده ، بیست ، سی ،... ،نود) تا مرتبه 8
سلام و تشکر دوباره
شرمنده من یه مقدار آی کیوم پایینه.
ببینید من این جوری نوشتم:(البته بعضی رخط ها ربطی به حروفی کردن نداره.)کد:int *str1;
//int size=9;
str1=new int[9];
int str2[9]={'yek','doo','se','chahar','panj','shesh','haft','hasht','noh'};
int str3[9]={'dah','bist','sii','chehel','panjah','shast','haftad','hashtad','navad'};
//int str4[9]={'sad','divist','sisad','chaharsad','pansad','sheshsad','haftsad','hashtsad','nohsad'};
for(int i=0;i<6;i++)
{
cout<<"\nenter youre check number:\n";
cin>> *str1;
int l=(log(fabs(str1))-1);
cout<<"\n";
cout.setf(ios::right,ios::adjustfield);
// cout.fill('*');
cout<<setw(9)<<setfill('*')<<str1[i];
int k=10^(l-1);
cout<<str2[k]<<"hezar"<<"o"<
}
ولی خوب متوجه نشدم. مثلا عدد من هست 56789 و من به دست آوردم که 5 رقمه و حالا اونو تقسیم کردم بر 10 به توان 4 که شده 5 ولی این که الان چه جوری باید بفهمم باید بنویسم پنجاه و بعد O (از طریق l جاری که شما گفتید رو نفهمیدم.میشه این قسمتو یه مقدار بیشتر توضیح بدید.
سلام و خسته نباشید...
ببخشید که حرفام رو توضیحی مینویسم ، واسه همینه شما سخت متوجه شدید... آخه دوست داشتم کدش رو شما بنویسد ، حالا اونجایی که شما متوجه نشدید یا اصلاحیه ی کدی که نوشتید رو کد میکنم...
اولا آرایه ای از اشاره گرها یاید نوشته بشه بدین صورت :
به همین صورت تا هر مرتبه ای که حداکثر شماست...کد:
const char *YEKAN[9] = { "YEK", "DO", "SE",..., "NOH" }; l
حالا پارت اصلی برنامه ...
بازم شما trace ش کن ، اگه سوال یا مشکلی بود بپرس...کد:
int n; // Your number
cout << " please enter a number\n"; // prompt
cin >> n; // read an integer
L = floor( log10( abs(n))) + 1 ; // This is length of number
K = pow(10,L-1); // initialize K
int figure; l
while ( K=! 0 ) // Condition
{
figure = n / K; // first figure of number
n %= K; // for calculate next figure
if (figure =!0) // to omit ziro
{
swich ( K ) // to find cardinality
case 1 :
cout << YEKAN [figure-1]; l
case 10 :
cout << DAHGAN [figure-1] <<" o "; l
case 100 :
cout << SADGAN [figure-1] <<" o "; l
case 1000 :
.
.
.
.
.
}
K = K / 10; l
}
موفق باشی
(خیلی سعی کردم ماژولار باشه... ولی تو پست بهم میریزه... ببخشید)
کد:http://forum.p30world.com/showthread.php?t=120723
البته این برنامه واسه 11 تا 19 مشکل داره که قبل Swich میتونی یه if بزاری ، خیلی راحت حل میشه... اگه نتونستی بگو بنویسم واست
البته توجه کنید که باید ارقام رو سه تا سه تا جدا کنید.
مثلاً عدد 15612 رو باید به دو قسمت 612 و 15 قسمت کنید.
توجه کنید که الگوریتمی که روی هر سه تایی اجرا میشه باید یکی باشه و فقط hezaro و milliono جلوش بیاد.
مثلا توی عدد 612612 میشه "shishsado davazdah hezaro sheshsado davazdah"
یا مثلاً 17017017 میشه "hifdah milliono hifdah hezaro hifdah"
پس کافیه که ارقام رو سه تا سه تا جدا کنی و اونا رو به یه تابع یکسان بدی و جلوشون با توجه به اینکه سه رقم اوله یا دوم یا ... hezaro یا milliono یا milliardo بذاری.
پس کاری که باید بکنی فقط نوشتن یه تابعه که سه رقم بگیره و عدد مورد نظر رو چاپ کنه.
البته توجه کن که سه رقم آخر اگه نیاز بود به تهش صفر اضافه کنی:
12345 باید به 345 و 012 تقسیم کنی و اول 345 رو بفرستی به تابع و بعد 012 رو و جلوش یه hezaro بذاری (چون سه رقم دومه)
تائید میشه... باید اون برنامه ی منو یه کم تغیر بدی... مرسی از توجه ت...نقل قول:
موفق باشی
دوستان خیلی ممنونم. من بدون استفاده از swich تونستم به نتیجه برسم.
این جوری:
از کمک همتون خیلی ممنونم. البته دوست دارم اگه براتون زحمتی نیست با این روشی که گفتین برنامه رو برام بذارید تا اونم ببینم.کد:#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <math.h>
void main()
{
//int *str1;
//int size=9;
//str1=new int[9];
int n;
char str1[]="sad";
char str2[]="hezar";
const char *yekan[]={"","yek","doo","se","chahar","panj","shesh","haft","hasht","noh","dah","yazdah","davazdah","sizdah","chahardah","panzdah","shanzdah","hefdah","hejdah","nuzdah"};
const char *dahgan[]={"","dah","bist","si","chehel","panjah","shast","haftad","hashtad","navad"};
//const char *sadgan[]={"","sad","divist","sisad","chaharsad","pansad","sheshsad","haftsad","hashtsad","nohsad"};
cout<<"\nenter youre check number:\n";
cin>> n;
// int l=floor(log10(abs(n)))+1;
// int k=pow(10,l-1);
// cout<<"\n";
cout.setf(ios::right,ios::adjustfield);
// cout.fill('*');
cout<<setw(9)<<setfill('*')<<n;
/* while ( k=! 0 )
{
int figure = n / k;
n %=k;
swich ( k );
{
: case 1
cout << yekan [figure-1];
: case 10
cout << dahgan [figure-1] <<" o ";
: case
k = k / 10;
}
*/
int i=n*100;
i=i%100;
int j=n*100-i;
j=j/100;
int k=j;
int h=j/1000;
j=j-h*1000;
int s=j/100;
j=j-s*100;
int d=j/10;
int y=k%10;
int dah=k%100;
cout<<"\nnumbar of youre check: ";
if(h>0){
cout<<"\n"<<yekan[h]<<" "<<str2<<" o ";
}
else
;
if(s>0){
cout<<yekan[s]<<" "<<str1<<" o ";
}
else
;
if(dah<20){
cout<<yekan[dah]<<" o ";
}
else if(dah>19){
if(d>2)
cout<<dahgan[d]<<" "<<"o ";
if(y>0)
cout<<yekan[y]<<" ";
}
//cout<<i<<"/100"<<endl;
cout<<"\n"<<endl;
}
خیلی خیلی ممنونم.:11:
سلام.میخواستم اگه میشه سورس کاملشو بزارید لطفا:n16:
- - - Updated - - -
سلام.میخواستم اگه میشه سورس کاملشو بزارید لطفا:n16: