هذا الموضوع منقول من شبكة تكنولوجيا المعلومات والهندسه التقنيه
وقد اعجبني جدا صاحب الموضوع بطرحه وطريقة شرحه
ارجو من الجميع الفائده~

لدينا رقم مكون من 9 خانات فأقل ، كيف نكتب برنامجاً لتهجئة ذلك الرقم وكتابته بالكلمات ؟ حتى تكون لديك فكرة عن طبيعة عمل البرنامج ، انظر الصورة :

سيكون لدينا مخزون من الكلمات الأساسية التي سنحتاجها عند التهجئة ، تلك الكلمات نخزنها في مصفوفات رمزية string arrays ويكمن دورنا في انتقاء الكلمة المناسبة من المصفوفة المناسبة ووضعها في المكان المناسب . المصفوفات اللازمة هي :
string digits[20]={"Zero ","One ","Two ","Three ","Four ","Five ",
"Six ","Seven ","Eight ","Nine ","Ten ","Eleven ","Twelve ",
"Thirteen ","Fourteen ","Fifteen ","Sixteen ","Seventeen ",
"Eighteen ","Nineteen "};
string tens[8]={"Twenty ","Thirty ","Forty ","Fifty ","Sixty ","Seventy ","Eighty ","Ninety "};ولتسهيل التعامل مع الأعداد والوصول إلى خاناتها من اليسار إلى اليمين ، سنفرغ محتويات العدد في مصفوفة عددية num من 9 عناصر . خذ العدد n=120351807 مثلاً ، مصفوفته هي :

الأمر يتم ببساطة من اليمين إلى اليسار من خلال الكود التالي :
int n;
cout << "Insert a Number : ";
cin >> n;
int num[9];
for(int i=8 ; i>=0 ; i--)
{
num=n%10;
n=n/10;
}الآن أصبح الوضع تحت السيطرة خصوصاً عندما نمر على الفئات الثلاثة بدوران for يأخذ خلاله المتغير k القيم 0 و 3 و 6 بحيث تكتب مواقع الخانات ويتم التعامل معها بدلالة k كما يلي :

for(int k=0 ; k<=6 ; k+=3)
{
.
.
.
}قبل الدخول في صلب الكود سنحتاج إلى ثلاثة متغيرات منطقية ، وستعرف دورها لاحقاً ؛ الأول a تكون قيمته false فقط عندما لا يكون لفئة الملايين وجود ، والثاني b تكون قيمته false فقط عندما لا يكون لفئة الألوف وجود ، وأخيراً c تكون قيمته false فقط عندما لا يكون لفئة الواحدات وجود .
bool a=(num[0]+num[1]+num[2] > 0); bool b=(num[3]+num[4]+num[5] > 0); bool c=(num[6]+num[7]+num[8] > 0);
الصورة التالية هي ترجمة لما سبق ، عوض مكان العلامة ؟ ما شئت :

التعامل مع الفئات الثلاثة سيكون بشكل مماثل ؛ الآحاد وآحاد الألوف وآحاد الملايين في الموقع k+2 ، والعشرات وعشرات الألوف وعشرات الملايين فتكون في الموقع k+1 ، أما المئات ومئات الألوف ومئات الملايين ففي الموقع k من المصفوفة num .
لما k=0 فنحن نعالج فئة الملايين ، ولما k=3 فنحن نعالج فئة الألوف ، أما عندما k=6 فنحن نعالج فئة الواحدات . نفس الأوامر تنفذ في الحالات الثلاثة ، عدا كلمة Million التي تطبع في الحالة الأولى وكلمة Thousand والتي تطبع في الحالة الثانية .
داخل الدوران المذكور ، نبدأ بخانات المئات k ؛ نطبع الخانة يليها كلمة Hundred فقط إن كانت قيمتها أكبر من الصفر .
if(num[k] != 0)
cout << digits[num[k]] << "Hundred ";بالنسبة للعشرات فهناك وقفة ، ان كانت خانة العشرات ( الموقع k+1 ) اكبر من واحد ، 2 أو 3 أو ... ، حينها سنطبع Twenty أو Thirty أو ... ، على الترتيب ، وبما أن أول قيمة لدينا Twenty موجودة في الموقع 0 من المصفوفة tens ، نكتب الكود االتالي :
if(num[k+1] > 1)
cout << tens[num[k+1] - 2];أما إن كانت خانة العشرات تساوي 1 ، حينها سنطبع Ten وحتى Nineteen بالاعتماد على خانة الآحاد ( الموقع k+2 ) كما يلي :
if(num[k+1] == 1)
cout << digits[10 * num[k+1] + num[k+2]];وماذا ان كان لدينا آحاد وخانة العشرات لا تساوي 1 ؟ حينها سنطبع خانة الآحاد كما هي :
if(num[k+1]!=1 && num[k+2]!=0)
cout << digits[num[k+2]];كما أشرنا ، سيطبع برنامجنا كلمة Million فقط عندما k=0 ، و a=true بمعنى أنه لدينا مليون فأكثر .
وسيطبع كلمة Thousand فقط عندما k=3 ، و b=true بمعنى أنه لدينا ألف واحد فأكثر في فئة الألوف .
بالنسبة للفاصلة :
سيطبع فاصلة بعد كلمة Million إذا كان لدينا ما نطبعه بعد هذه الكلمة ، أي إذا كان محتوى فئة الواحدات وفئة الألوف ليس كلاهما صفراً . وكذلك الأمر ، سيطبع فاصلة بعد كلمة Thousand إن كانت فئة الواحدات لا تساوي صفراً ، أي أنه لا يزال هناك ما سيطبعه .
if(k==0 && a)
{
cout << "Million ";
if(b || c) cout << ",\n";
}
if(k==3 && b)
{
cout << "Thousand ";
if(c) cout << ",\n";
}نقوم بتجميع أجزاء البرنامج لنحصل على الآتي :
#include<iostream>
#include<string>
using namespace std;
void main()
{
string digits[20]={"Zero ","One ","Two ","Three ","Four ","Five ",
"Six ","Seven ","Eight ","Nine ","Ten ","Eleven ","Twelve ",
"Thirteen ","Fourteen ","Fifteen ","Sixteen ","Seventeen ",
"Eighteen ","Nineteen "};
string tens[8]={"Twenty ","Thirty ","Forty ","Fifty ","Sixty ","Seventy ","Eighty ","Ninety "};
int n;
cout << "Insert a Number : ";
cin >> n;
int num[9];
for(int i=8 ; i>=0 ; i--)
{
num=n%10;
n=n/10;
}
bool a=(num[0]+num[1]+num[2] > 0);
bool b=(num[3]+num[4]+num[5] > 0);
bool c=(num[6]+num[7]+num[8] > 0);
cout<<"\n";
for(int k=0 ; k<=6 ; k+=3)
{
if(num[k] != 0)
cout << digits[num[k]] << "Hundred ";
if(num[k+1] > 1)
cout << tens[num[k+1] - 2];
if(num[k+1] == 1)
cout << digits[10 * num[k+1] + num[k+2]];
if(num[k+1]!=1 && num[k+2]!= 0)
cout << digits[num[k+2]];
if(k==0 && a)
{
cout << "Million ";
if(b || c) cout << ",\n";
}
if(k==3 && b)
{
cout << "Thousand ";
if(c) cout << ",\n";
}
}
cout << "\n\n";
}وفي الختام ، هناك موقع على النت ، يقوم بنفس وظيفة البرنامج الذي كتبناه ، يمكنك الرجوع إلى ذلك الموقع ومقارنة النتائج التى ستحصل عليها بالنتائج التي يعطيك اياها برنامجنا . اتبع هذا الرابط .
◄ للأمانة العلمية ، يرجى ذكر المصدر عند النقل
شبكة تكنولوجيا المعلومات والهندسة التقنية
www.psd-development.com
الموضوع الاصلي~
http://psd-development.com/vb/t519.html


