مشکل:برنامه تبدیل عدد به حرف

mhabat

Member
با سلام یک برنامه هست که وقتی بهش عدد میدی اونو به حروف تبدیل میکنه.سورس:
کد:
#include <iostream.h>
#include <conio.h>
int main()
{
    RE:clrscr();
    int s=0,i2=0,x[99];
    char y[99]={0};
    cout<<"Enter your number:\n";
    do
    {
        i2++;
        y[i2]=getche();
    }while(y[i2]!=13);
    i2--;
    for(register int i=1;i2>=1;i2--)
    {
        x[i]=y[i2]-48;
        i++;
    }
    i--;
    clrscr();
    cout<<"Your number: ";
    for(register int i3=i;i3>=1;i3--)
        cout<<x[i3];
    cout<<endl<<"Result:\n";
        for(;i>=1;i--)
    {
        if(s==1)
        {
            switch(x[i])
            {
                case 0:cout<<"";break;
                case 1:cout<<"eleven ";break;
                case 2:cout<<"twelve ";break;
                case 3:cout<<"thirteen ";break;
                case 4:cout<<"fourteen ";break;
                case 5:cout<<"fifteen ";break;
                case 6:cout<<"sixteen ";break;
                case 7:cout<<"seventeen ";break;
                case 8:cout<<"eighteen ";break;
                case 9:cout<<"nineteen ";break;
            }
            s=0;
        }
        else
        {
            if(i%3==2)
            {
                switch(x[i])
                {
                    case 0:cout<<"";break;
                    case 1:s=1;break;
                    case 2:cout<<"twenty ";break;
                    case 3:cout<<"thirty ";break;
                    case 4:cout<<"fourty ";break;
                    case 5:cout<<"fifty ";break;
                    case 6:cout<<"sixty ";break;
                    case 7:cout<<"seventy ";break;
                    case 8:cout<<"eighty ";break;
                    case 9:cout<<"ninety ";break;
                }
            }
            else
            {
                switch(x[i])
                {
                    case 0:cout<<"";break;
                    case 1:cout<<"one ";break;
                    case 2:cout<<"two ";break;
                    case 3:cout<<"three ";break;
                    case 4:cout<<"four ";break;
                    case 5:cout<<"five ";break;
                    case 6:cout<<"six ";break;
                    case 7:cout<<"seven ";break;
                    case 8:cout<<"eight ";break;
                    case 9:cout<<"nine ";break;
                        default:goto ESC;
                }
            }
        }
        if((x[i+2]==0&&x[i]==0)||(x[i]==0&&x[i-2]==0))
        {
            cout<<"";
        }
        else
        {
            if(i%3==0)
                cout<<"hundred ";
            else if(i==4)
                cout<<"thousand ";
            else if(i==7)
                cout<<"million ";
            else if(i==10)
                cout<<"billion ";
            else if(i==13)
                cout<<"trillion ";
            else if(i==16)
                cout<<"quadrillion ";
            else if(i==19)
                cout<<"quintillion ";
            else if(i==22)
                cout<<"***tillion ";
            else if(i==25)
                cout<<"septillion ";
            else if(i==28)
                cout<<"octillion ";
            else if(i==31)
                cout<<"nonillion ";
            else if(i==34)
                cout<<"decillion ";
            else if(i==37)
                cout<<"undecillion ";
            else if(i==40)
                cout<<"duodecillion ";
            else if(i==43)
                cout<<"tredecillion ";
            else if(i==46)
                cout<<"quattuordecillion ";
            else if(i==49)
                cout<<"quindecillion ";
            else if(i==52)
                cout<<"***decillion ";
            else if(i==55)
                cout<<"septendecillion ";
            else if(i==58)
                cout<<"octodecillion ";
            else if(i==61)
                cout<<"novemdecillion ";
            else if(i==64)
                cout<<"vigintillion ";
            else if(i==67)
                cout<<"unvigintillion ";
            else if(i==70)
                cout<<"duovigintillion ";
            else if(i==73)
                cout<<"trevigintillion ";
            else if(i==76)
                cout<<"quattuorvigintillion ";
            else if(i==79)
                cout<<"quinvigintillion ";
            else if(i==82)
                cout<<"***vigintillion ";
            else if(i==85)
                cout<<"septenvigintillion ";
            else if(i==88)
                cout<<"octovigintillion ";
            else if(i==91)
                cout<<"novemvigintillion ";
            else if(i==94)
                cout<<"trigintillion ";
            else if(i==97)
                cout<<"untrigintillion ";
            else if(i==100)
                cout<<"duotrigintillion ";
            ESC:
        }
    }
    gotoxy(0,22);
    cout<<endl<<endl<<"Press any key to translate another number"<<endl;
    getch();
    goto RE;
}
خوب در خط اول اگر clrscrبراشREنزاریم چه مشکلی پیش میاد؟کارREچیه؟
این قسمت :
کد:
do
    {
        i2++;
        y[i2]=getche();
    }while(y[i2]!=13);
مگه برای پیدا کردن تعداد اعداد حروف نست !خوب چه ربطی بهاین برنامهی ما داره و همچنین چرا نبایدy[i2]==13نباشه؟
در چه موقه یی از دستورregisterاستفاده میشه و چرا بعضی وقت ها به صورت:register intوبعضی وقت ها دیگهintشو نمی نویسن؟
کار این قسمت رو هم متوجه نمیشم:
کد:
 for(register int i=1;i2>=1;i2--)
    {
        x[i]=y[i2]-48;
        i++;
    }
که بعدش میاد i---رومیزنه.
دوباره ازین دستور مشابه استفاده کرده:
کد:
for(register int i3=i;i3>=1;i3--)
        cout<<x[i3];
    cout<<endl<<"Result:\n";
این قسمت هارو هم متوجه نمیشم:
کد:
    if((x[i+2]==0&&x[i]==0)||(x[i]==0&&x[i-2]==0))
کد:
 if(i%3==2)
وسوال آخر اینکه چرا وقتی برنامه رو کامپایل میکنی بعد ار یکبار اجرا دیگه بر نمیگرده یعنی بازم میتونی عدد بدی.
خیلی ممنون
بــــدرود
 

the_king

مدیرکل انجمن
با سلام یک برنامه هست که وقتی بهش عدد میدی اونو به حروف تبدیل میکنه.
خوب در خط اول اگر clrscrبراشREنزاریم چه مشکلی پیش میاد؟کارREچیه؟
اون RE دستور نیست، اسم خاصی هم نیست، فقط یک اسم برای یک Label ئه، می توانست هر اسم
دلخواهی که شما می خواهید باشه. Label ها با : بعد از اسم مشخص می شوند.
به این درد می خوره که بخواهید از یک جای دیگر در کد با goto به اون موقعیت پرش کنید، مثلا وقتی
می نویسید ;goto RE اجرای کد به سطری پرش می کنه که RE در اون سطر تعریف شده.

این قسمت :
کد:
    {
        i2++;
        y[i2]=getche();
    }while(y[i2]!=13);
مگه برای پیدا کردن تعداد اعداد حروف نست !خوب چه ربطی بهاین برنامهی ما داره و همچنین چرا نبایدy[i2]==13نباشه؟
رشته رو به جای اینکه یکجا دریافت کنه، کاراکتر به کاراکتر با getche دریافت کرده و کد کاراکتر ها رو در آرایه y
ثبت کرده. حلقه باید وقتی تموم بشه که کلید Enter فشار داده بشه. فشار دادن Enter کاراکتر Carriage return
تولید می کنه که کد کاراکتر اش برابر 13 است، شرط حلقه اینه : مدام کاراکتر دریافت کن تا زمانی که کاراکتر 13
دریافت نکردی.

در چه موقه یی از دستورregisterاستفاده میشه و چرا بعضی وقت ها به صورت:register intوبعضی وقت ها دیگهintشو نمی نویسن؟
کاربرد خیلی محدودی داره، اغلب مواقع هم نوشتنش و ننوشتن اش چندان موثر نیست. پردازنده یکسری متغیر
داخلی داره به اسم Register که پردازش شون سریعتر از حافظه RAM ئه. تعداد شون انگشت شماره و همیشه
هم نمیشه ازشون استفاده کرد. نوع شون هم عددی بدون اعشار است، یعنی مشابه int.
اگه کامپایلر فرضا متغیر i رو بجای حافظه RAM در یک Register نگه داره شاید سرعت اجرای کد کمی بیشتر بشه،
منظور از کمی شاید میلیاردم ثانیه باشه. لزومی نداره به int اشاره بشه چون یک گزینه بیشتر نداریم، همیشه int ئه.

کار این قسمت رو هم متوجه نمیشم:
کد:
 for(register int i=1;i2>=1;i2--)
    {
        x[i]=y[i2]-48;
        i++;
    }
که بعدش میاد i---رومیزنه.
رشته شامل ارقام ئه، اما بشکل کاراکتر های '1' و '2' و ... ذخیره شده اند، نه اعداد 1 و 2 و ...
کاراکتر های عددی '0' الی '9' هر کدوم یک کد ASCII دارند، از 48 الی 57
وقتی از هر کدوم 48 تا کم کنید از کاراکتر به عدد معادل شون تبدیل می شوند، مثلا کاراکتر '5' می شود عدد 5
کد بی سلیقه نوشته شده و یکسری ایرادات هم داره اما به هر حال، مقدار i2 قبل از حلقه هر چی که باشه بعد از
تموم شدن حلقه i2 به صفر می رسه و i هم یک واحد از مقدار اولیه i2 بیشتر میشه. وقتی حلقه تموم میشه
یک واحد از i کم می کنه تا i برابر مقداری باشه که i2 قبل از اجرا شدن حلقه داشت.

دوباره ازین دستور مشابه استفاده کرده:
کد:
for(register int i3=i;i3>=1;i3--)
        cout<<x[i3];
    cout<<endl<<"Result:\n";
رقم های آرایه x رو بصورت معکوس (از آخر به اول) چاپ کرده، register باشه و نباشه فرقی نمی کنه.

این قسمت هارو هم متوجه نمیشم:
کد:
    if((x[i+2]==0&&x[i]==0)||(x[i]==0&&x[i-2]==0))
منظورش این بوده که فقط زمانی هزار و میلیون و میلیارد و ... نمایش داده بشه که لازم باشه.

منظورش این بوده که در گروه های سه تایی داریم رقم وسطی را نمایش می دهیم، مثلا موقعیت های 3 در 436739

وسوال آخر اینکه چرا وقتی برنامه رو کامپایل میکنی بعد ار یکبار اجرا دیگه بر نمیگرده یعنی بازم میتونی عدد بدی.
خیلی ممنون
بــــدرود
به خاطر همون goto است، انتهای کد برنامه دستور داده اید به که سطر RE که ابتدای کد است پرش کنه، یک حلقه
بی پایانه.
 
آخرین ویرایش:

mhabat

Member
با سلام و تشکر از مدیر انجمن.با راهنمایی هایی که کردین من این برنامه را یک بار تجزیه وتحلیل کردم که بعضی جاهاش با مشکل برخوردم:
چرا وقتی این حلقه رو میسازیم چیزی نمایش داده نمیشه:
کد:
for(register int i3=i;i3>=1;i3--)
        cout<<x[i3];
ما در ابتدا به متغیر sمقدار 0رو دادیم ودر طی برنامه دستوری نیست که مقدارشو به یک برسانه پس چطور دستور switchاجرا میشه؟
درپست قبل گفتین که این دستور:
کد:
if((x[i+2]==0&&x[i]==0)||(x[i]==0&&x[i-2]==0))
برای اینه که فقط زمانی هزار و میلیون و میلیارد و ... نمایش داده بشه که لازم باشه اما بعد از این دستور چیزی چاپ نمیشه و اگر این دستور برقرار نباشه(elseباشه):حروف میلیون و.... چاپ میشن.
بعداینکه حالا برفرض مثال باقی مانده ی i بر3مساوی2شد حالا این چطوره که عددی مثل 123بقیه ی حروف پشت hundredقرار میگیرند یعنی چرا حروف به همان ترتیبی که ما عدد رو وارد کردیم نمایش داده میشن.
(چرا جای حروف عدد 123مثلا نمیشه:twenty threehundred)

لازم به ذکر که راهنمایی های بالا در سورس های زیادی کمکم کردند.
خیلی ممنون
بـــــدرود
 

the_king

مدیرکل انجمن
با سلام و تشکر از مدیر انجمن.با راهنمایی هایی که کردین من این برنامه را یک بار تجزیه وتحلیل کردم که بعضی جاهاش با مشکل برخوردم:
چرا وقتی این حلقه رو میسازیم چیزی نمایش داده نمیشه:
کد:
for(register int i3=i;i3>=1;i3--)
        cout<<x[i3];
عدد i رقمی وارد شده رو بصورت ارقام جداگانه در آرایه x قرار داده اید و اون حلقه ارقام رو نمایش میده.

ما در ابتدا به متغیر sمقدار 0رو دادیم ودر طی برنامه دستوری نیست که مقدارشو به یک برسانه پس چطور دستور switchاجرا میشه؟
کد:
switch(x[i])
                {
                    case 0:cout<<"";break;
                    case 1:[B][COLOR="Blue"]s=1[/COLOR][/B];break;
                    case 2:cout<<"twenty ";break;

درپست قبل گفتین که این دستور:
کد:
if((x[i+2]==0&&x[i]==0)||(x[i]==0&&x[i-2]==0))
برای اینه که فقط زمانی هزار و میلیون و میلیارد و ... نمایش داده بشه که لازم باشه اما بعد از این دستور چیزی چاپ نمیشه و اگر این دستور برقرار نباشه(elseباشه):حروف میلیون و.... چاپ میشن.
این شرط مواردی که نباید چاپ بشوند رو فیلتر می کنه.

بعداینکه حالا برفرض مثال باقی مانده ی i بر3مساوی2شد حالا این چطوره که عددی مثل 123بقیه ی حروف پشت hundredقرار میگیرند یعنی چرا حروف به همان ترتیبی که ما عدد رو وارد کردیم نمایش داده میشن.
(چرا جای حروف عدد 123مثلا نمیشه:twenty threehundred)
حلقه نمایش رو ببینید :
کد:
        for(;i>=1;i--)
    {
از انتهای آرایه به سمت ابتدای آرایه پردازش می کنه، یعنی رقم صدگان، بعد hundred، بعد رقم دهگان و بعد رقم یکان.
 

جدیدترین ارسال ها

بالا