فروردین
۲
۱۳۹۳

تبدیل اعداد به متن

درود به همه دوستان

فرارسیدن سال نو بر شما خجسته باد

دقیقا یکسال از درج آخرین مطلبم در سایت میگذره. متاسفانه در این یکسال به دلیل مشغولیت های مختلف از نوشتن مطلب جدید بازماندم.

در سال گذشته تعدادی از دوستان بودند که با پیامها یا ایمیل های خودشون به بنده لطف داشتن که همینجا از همشون سپاسگزارم همینطور عده ای از دوستان بودند که درخواستهایی داشتند که متاسفانه به دلیل کمبود وقت گاها از همفکری با اونها معذور شده بودم که از این دوستان هم صمیمانه عذرخواهی میکنم.

امیدوارم سال جدید فرصت های بهتری برای همیاری با دوستان عزیز به وجود بیاد.

//================================

یادم هست در زمان دانشجویی یکبار به الگوریتم تبدیل ارقام به متن فارسی فکر کرده بودم. از اون موقع پیاده سازی این کد به نظرم جالب میومد تا اینکه چند وقت پیش سعی کردم الگوریتم اون رو با استفاده از زبان C پیاده سازی کنم.

فکر میکنم برنامه نسبتا خوبی از آب درامد هرچند که به علت استفاده از زبان ANSI C به ناچار از حروف فینگلیش برای نمایش نتیجه الگوریتم استفاده نمودم.

 

2014-03-22_050149

البته برای اینکه این الگوریتم برای برنامه نویسان عزیزی که میخواهند از آن استفاده کنند جنبه کاربردی تری داشته باشه در پست بعدی سعی خواهم کرد با اعمال تغییراتی اون رو برای استفاده در زبان های سطح بالاتر مثل سی شارپ آماده کنم اما در این پست فقط به خود الگوریتم میپردازم.

برای طراحی این الگوریتم سعی کردم از همان شیوه ای که ذهن انسان برای تبدیل ارقام به معادل رشته ای اون استفاده میکنه الهام بگیرم. در ادامه سعی میکنم اجزا اصلی کد را شرح بدهم.

فرض کنید یک عدد در مرتبه میلیارد جلوی چشم شما قرار گرفته باشه و شما بخواهید آن را بخوانید.

به نظرم کار اولی که ذهن برای این منظور انجام میدهد این است که اول از همه نگاهی کلی به عدد مورد نظر می اندازد تا ببیند عدد مذکور اصلا عدد درستی است یا خیر.

مثلا اگر چیزی شبیه به این:

۳۴۵۳۳a46

جلوی چشم ما قرار بگیرد بلافاصله با دیدن حرف a در بین ارقام به این نتیجه میرسیم که این رشته از کاراکترها تشکیل یک عدد صحیح را نمیدهند و بلافاصله آن را رد خواهیم کرد. در برنامه این وظیفه بر عهده متد strIsDigit قرار گرفته است.

 

 

این متد چک میکند که آیا رشته کاراکترهای مورد نظر ما تشکیل عدد صحیح میدهد یا خیر. در صورت مثبت بودن پاسخ، مقدار true و در غیر این صورت مقدار false بازگردانده خواهد شد.

2014-03-22_052040

همینطور اعدادی هستند که در فرمت مناسب قرار دارند منتها برای خواندن صحیح آنها باید تغییرات جزئی در آنها داد. به طور مثال عدد زیر را در نظر بگیرید:

۰۰۹۴

همه ما هم نظر هستیم که این یک عدد صحیح میباشد اما همه قبل از خواندن آن به طور اتوماتیک صفرهای قبل از ارقام دیگر را حذف میکنیم. اگر این صفرها حذف نشوند مقدار خروجی به صورت “صفر صفر نود و چهار” خوانده خواهند شد.

وظیفه اعمال این تغییرات در صورت لزوم بر عهده متد زیر قرار دارد:

 

پس از تایید صحت ارقام و در صورت لزوم اصلاح آنها میرسیم به مرحله اصلی یعنی خواندن عدد.

در خواندن اعداد کوچک عموما مسئله خاصی وجود ندارد. اما عدد زیر را در نظر بگیرید:

۲۳۵۴۳۶۲۴۵۲۳۵

سعی کنید این عدد را بخوانید.

برای خواندن این عدد شما چگونه عمل میکنید؟

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

اگر دقت کنید میبینید که تمام این گروه از اعداد به یک شکل خوانده میشوند و تنها تفاوت آنها در مرتبه آنها میباشد. یعنی سه رقمی که مثلا در ابتدای عدد یا انتهای عدد قرار گرفته اند مستقلا و بدون در نظر گرفتن مرتبه آنها یک طور خوانده میشوند. بنابراین اگر ما متدی برای خواندن سه رقم داشته باشیم میتوانیم از آن برای خواندن اعداد با هر تعداد رقم استفاده کنیم.

به طور مثال در مورد عدد بالا خواهیم داشت:

دویست و سی و پنج ۲۳۵

میلیارد و

چهارصد و سی و شش ۴۳۶

میلیون و

 دویست و چهل و پنج ۲۴۵

هزار و

 دویست و سی و پنج ۲۳۵

ملاحظه میکنید ارقام ۲۳۵ در ابتدا و انتهای عدد مذکور دقیقا به یک صورت خوانده میشود فقط مرتبه آنها متفاوت است.

وظیفه خواندن گروه های سه رقمی از اعداد بر عهده متد printTriliteral گذاشته شده است.

 

این متد یک رشته سه حرفی از اعداد را دریافت میکند و آن را به حروف تبدیل کرده به خروجی برای چاپ میفرستد.

این نکته را نیز در مورد این تکه کد باید در نظر گرفت که سمت چپ ترین گروه از اعداد میتوانند کمتر از سه رقم (یک یا دو رقم) نیز داشته باشند.

همینطور معادل متنی مرتبه هر گروه از اعداد به وسیله متد getStairStr انتخاب و بازگردانده میشود:

 

constantNumbersStrings یک آرایه از رشته ها است که معادل متنی هر مرتبه را در خود ثبت شده دارد:

 

در این کد مرتبه ها تا تریلیارد به برنامه معرفی شده است ولی در صورت لزوم میتوان تا هر مرتبه ای را به برنامه اضافه نمود. دقت کنید که برای ارقام بالاتر از ۲۱ رقم مرتبه به شکل “NOTDEFINED” چاپ میشوند.

در پایان میتوانید سورس کامل این برنامه را جهت کامپایل از مسیر زیر دانلود نمایید. به علت استفاده از کد ANSI C شما میتوانید با کمترین تغییر کد این برنامه را که در اینجا با کامپایلر ویژوال سی کامپایل شده در کامپایلرهای دیگر نیز کامپایل کنید.

سورس کامل برنامه جهت دانلود

 

2014-03-22_052715

به امید دیدار مجدد

اشتراک گذاری این مطلب:

نوشته‌های مرتبط

درباره نویسنده

برنامه‌نویس ++‏C/C‏ - برنامه‌نویس سیستم‌های گرافیکی با استفاده از کتابخانه ‏OpenGL - برنامه‌نویس #‏C و ..‏



۴ دیدگاه افزودن دیدگاه +

  • سلام سورس کد این پروژه تبدیل اعداد به حروف فارسی و میخواستم، ظاهرا از سایت فورشیر حذف شده، ممنون میشم دوباره آپلود کنین. تشکر

    • چشم در اولین فرصت اصلاح میکنم. اگر نیاز فوری دارید یه ایمیل بزنید به من

  • سلام . لینک دان خرابه!! لطفا ایمیل کنید نیاز فوری دارم

    • لینک اصلاح شد

فرستادن دیدگاه