الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ابغى اعرف وش الخطأ بهذا البرنامج..... ممكن تساعدون

مغلق
بدأه مبرمجة خايبة في 6 ديسمبر 2005 · 11 رد · 796 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

عندي برنامج محيرني وودي تتكرممون وتساعدوني

هو برنامج في ++c

وظيفة البرنامج هي تحويل الارقام الى حروف

يعني اذا ادخلت 1 يحوله الى one

بس المشكلة بهذا البرنامج انه اذا ادخلت مثلا 83 يخرج ارقام كثيرة كانه يعد ياليت تساعدوني وتكتشفوا معي الخطأ

بلييييييييييز

وهذا هو البرنامج

#include<iostream.h>
#include<conio.h>

struct std{ int dig;
  char wrd[20];
	};
struct std fig[]={{1,"one"},{2,"two"},{3,"three"},{4,"four"},{5,"five"},{6,"six"},


    {7,"seven"},{8,"eight"},{9,"nine"},{10,"ten"},{11,"eleven"},{12,"twelve"},{13,"thirteen"},


        {14,"fourteen"},{15,"fifteen"},{16,"sixteen"},{17,"seventeen"},{18,"eighteen"},{19,"nineteen"},


            {20,"twenty"},{30,"thirty"},{40,"fourty"},{50,"fifty"},{60,"sixty"},{70,"seventy"},{80,"eighty"},


                {90,"ninety"}};
                int num1[5],i;
              void  op0(long num)


                    {
                    for(i=0;i<20;i++)
                    if(fig.dig==num)
                     cout<<fig.wrd;
                }
               void op1(long num)


                    { //num1=num;
                    num1[0]=num/10;
                    num1[0]=num1[0]*10;
                    num1[1]=num%10;
                    for(i=0;i<27;i++)


                        {if(fig.dig==num1[0])
                         cout<<"%s "; cout<<fig.wrd;
                    }
                    for(i=0;i<20;i++)


                        {if(fig.dig==num1[1])
                         cout<<"%s",fig.wrd;
                    }
                }
               void op2(long num)


                    {
                    int k,j=num%100;
                    k=num/100;
                    for(i=0;i<10;i++)


                        {if(fig.dig==k)


                            { cout<<"%s hundred ",fig.wrd;
                            if(j>0&&j<20)
                            op0(num%100);
                            else
                            op1(num%100);
                        }
                    }
                }
              void  op3(long num)


                    {
                    int k,j=num%1000;
                    k=num/1000;
                    for(i=0;i<10;i++)


                        { if(fig.dig==k)


                            {  cout<<"%s thousand "; cout<<fig.wrd;
                            if(j>=1&&j<10)
                            op0(num%1000);
                            else if(j>10&&j<100)
                            op1(num%1000);
                            else
                            op2(num%1000);
                        }
                    }
                }
               void op4(long num)


                    {
                    int k=num/1000,j;
                    j=num%1000;
                    if(k<=20)


                        {
                        op0(num/1000);
                         cout<<" thousand ";
                        if(j>0&&j<10)
                        op0(num%1000);
                        if(j>10&&j<100)
                        op1(num%1000);
                        else op2(num%1000);
                    }
                    if((k>20)&&(k<100))


                        {
                        op1(num/1000);
                         cout<<" thousand ";
                        if(j>0&&j<10)
                        op0(num%1000);
                        if(j>10&&j<100)
                        op1(num%1000);
                        else op2(num%1000);
                    }
                    //op2(num%1000);
                }
               void op5(long num)


                    {
                    int k=num/100000;
                    int j=num%100000;
                    for(i=0;i<10;i++)


                        { if(fig.dig==k)


                            {  cout<<"%s lakh "; cout<<fig.wrd;
                            if(j>0&&j<20)
                            op0(num%100000);
                            if(j>20&&j<100)
                            op1(num%100000);
                            if(j>100&&j<1000)
                            op2(num%100000);
                            if(j>1000&&j<10000)
                            op3(num%100000);
                            if(j>10000&&j<100000)
                            op4(num%100000);
                           	 }
                        }
                    }
void  main()
{
                        long num;
                       // clrscr();
                        cout<<"Enter the number\n";
                        cin>>num;
                        if(num<=20)
                        op0(num);
                        if((num>20)&&(num/100==0))
                        op1(num);
                        if(num==100)
                         cout<<"hundred";
                        if(num>100&&num<1000)
                        op2(num);
                        if(num==1000)  cout<<"one thousand";
                        if(num>1000&&num<10000)
                        op3(num);
                        if(num==10000)  cout<<"ten thousand";
                        if(num>10000&&num<100000)
                        op4(num);
                        if(num==100000)  cout<<"one lakh";
                        if(num>100000&&num<1000000)
                        op5(num);
                        if(num==1000000)
                         cout<<"One crore";
                        getch();
}

تم تعديل هذه المشاركة بواسطة Asm4all في 6 ديسمبر 2005 في 21:06

#2

بعد لفة رأسي مع المسافات الراحه جايه - نسقي الكود شويه عشان يتقري شوي أسهل - وجدت ان اخطائك تقريبا ثلاث اخطاء متكرره في البرنامج كله

1 - الجمله الشرطيه صيغتها خطأ في بعض الجمل خاصة عند وجود معامل &&

2 - جملة الاخراج cout تستخدميها خطأ احيانا

3 - تكرري الكود أكثر من مره

ده اللي فاكره

عموما عدلت الكود ويعمل تماما , ولكن تركت لكي آخر دالة فقط لتصححيها بنفسك بنفس الطريقة لتعرفي خطأك بنفسك

راجعي الكود مره اخرى لتلاحظي التغيير

#include<iostream>
#include<conio.h>
using namespace std;

struct Mystd {
  int dig;
  char wrd[20];
};
struct Mystd fig[]=
{{1,"one"},{2,"two"},{3,"three"},{4,"four"},{5,"five"},{6,"six"},
 {7,"seven"},{8,"eight"},{9,"nine"},{10,"ten"},{11,"eleven"},
 {12,"twelve"},{13,"thirteen"},{14,"fourteen"},{15,"fifteen"},
 {16,"sixteen"},{17,"seventeen"},{18,"eighteen"},{19,"nineteen"},
 {20,"twenty"},{30,"thirty"},{40,"fourty"},{50,"fifty"},{60,"sixty"},
 {70,"seventy"},{80,"eighty"},{90,"ninety"}};
int num1[5],i;
void op0(long num) {
  for(i = 0; i < 20; i++)
    if(fig.dig == num)
      cout << fig.wrd;
}
void op1(long num) {
  num1[0]= num / 10;
  num1[0]*= 10;
  num1[1]= num % 10;
  for(i = 19; i < 27; i++) {
    if(fig.dig==num1[0])
      cout<< fig.wrd; // cout<<"%s ";cout<<fig.wrd;
  }
  for(i = 0; i < 9; i++) {
    if(fig.dig == num1[1])
      cout << " " << fig.wrd; // cout << "%s",fig.wrd;
  }
}
void op2(long num) {
  int k = num /100, j = num % 100;
  for(i = 0; i < 10; i++) {
    if(fig.dig == k) {
      cout<< fig.wrd << " hundred ";
      if((j > 0) && (j < 20))
        op0(j);
      else
        op1(j);
    }
  }
}
void  op3(long num) {
  int k = num / 1000, j = num % 1000;
  for( i = 0; i < 10; i++) {
    if(fig.dig == k) {
      cout<< fig.wrd << " thousand ";
      if((j >= 1) && (j < 10))
        op0(j);
      else if((j > 10) && (j < 100))
        op1(j);
      else
        op2(j);
    }
  }
}
void op4(long num) {
  int k = num / 1000, j = num % 1000;
  if(k <= 20)
    op0(k);
  else if((k > 20) && ( k < 100))
    op1(k);
  cout << " thousand ";
  if((j > 0) && (j < 10))
    op0(j);
  if((j > 10) && (j < 100))
    op1(j);
  else
    op2(j);
}
void op5(long num)
{
int k=num/100000;
int j=num%100000;
for(i=0;i<10;i++)
{ if(fig.dig==k)
{  cout<<"%s lakh "; cout<<fig.wrd;
if(j>0&&j<20)
op0(num%100000);
if(j>20&&j<100)
op1(num%100000);
if(j>100&&j<1000)
op2(num%100000);
if(j>1000&&j<10000)
op3(num%100000);
if(j>10000&&j<100000)
op4(num%100000);
}
}
}
void  main()
{
  long num;
  cout<< "Enter the number" << endl;
  cin >> num;
  if(num <= 20)
    op0(num);
  else if((num > 20)&&(num < 100))
    op1(num);
  else if(num == 100)
    cout << "hundred";
  else if((num > 100) && (num < 1000))
    op2(num);
  else if(num == 1000)
    cout << "one thousand";
  else if((num > 1000) && (num < 10000))
    op3(num);
  else if(num==10000)
    cout << "ten thousand";
  else if((num > 10000) && (num < 100000))
    op4(num);
  else if(num == 100000)
    cout << "one lakh";
  else if((num > 100000)&& (num < 1000000))
    op5(num);
  else if(num == 1000000)
    cout << "One crore";
  else
    cout << "Out of range";
  cout << endl;
  getch();
}
#3

مشكور اخوي Asm4all والله يجعلها بموازين حسناتك

واسفة على زغللة عيونك وامسافات يمين وشمال بس وش اسوي مبرمجة خايبة

على العموم انا حاولت اصلح الدالة الاخيرة وطلعت بهذي النتيجة واتمنى تكون صحيحة

void op5(long num)
{
int k = num / 100000, j = num % 100000;
for(i = 0; i < 10; i++)
{ if(fig.dig==k)
{  cout<< fig.wrd << " lakh ";
if((j > 0) && (j < 20))
op0(j);
if((j > 20) && (j < 100))
op1(j);
if((j > 100) && (j < 1000))
op2(j);
if((j > 1000) && (j < 10000))
op3(j);
if((j > 10000) && (j < 100000))
op4(j);
}
}
}
#4

برافو يا ....... , طلعتي مش خايبه :D

طيب هدية الموسم , فضلت اروق فيه شويه لغاية ما بقى بالشكل ده

#include<iostream>
#include<conio.h>
using namespace std;

struct Mystd {
  int dig;
  char wrd[20];
};
struct Mystd fig[] =
{{1,"One"},{2,"Two"},{3,"Three"},{4,"Four"},{5,"Five"},{6,"Six"},
 {7,"Seven"},{8,"Eight"},{9,"Nine"},{10,"Ten"},{11,"Eleven"},
 {12,"Twelve"},{13,"Thirteen"},{14,"Fourteen"},{15,"Fifteen"},
 {16,"Sixteen"},{17,"Seventeen"},{18,"Eighteen"},{19,"Nineteen"},
 {20,"Twenty"},{30,"Thirty"},{40,"Fourty"},{50,"Fifty"},{60,"Sixty"},
 {70,"Seventy"},{80,"Eighty"},{90,"Ninety"}};
void op0(long num) {
  if(num) { //num > 0 ?
    for(int i = 0; i < 19; i++)
      if(fig.dig == num) {
        cout << fig.wrd;
        break;
      }
  }
}
void op1(long num) {
  int j = (num / 10) * 10, k = num % 10;
  for(int i = 19; i < 27; i++) {
    if(fig.dig == j) {
      cout << fig.wrd;
      break;
    }
  }
  for(int i = 0; i < 9; i++) {
    if(fig.dig == k) {
      cout << " " << fig.wrd;
      break;
    }
  }
}
void op2(long num) {
  int k = num / 100, j = num % 100;
  for(int i = 0; i < 10; i++) {
    if(fig.dig == k) {
      cout << fig.wrd << " Hundred ";
      if(j < 20)
        op0(j);
      else
        op1(j);
      break;
    }
  }
}
void op3(long num) {
  int k = num / 1000, j = num % 1000;
  if(k < 20)
    op0(k);
  else if(k < 100)
    op1(k);
  else if(k < 1000)
    op2(k);
  cout << " Thousand ";
  if(j < 20)
    op0(j);
  else if(j < 100)
    op1(j);
  else
    op2(j);
}
void op4(long num) {
  int k = num / 1000000;
  long j = num % 1000000;
  if(k < 20)
    op0(k);
  else if(k < 100)
    op1(k);
  else if(k < 1000)
    op2(k);
  cout << " Million ";
  if(j < 20)
    op0(j);
  else if(j < 100)
    op1(j);
  else if(j < 1000)
    op2(j);
  else
    op3(j);
}
void  main() {
  long num;
  cout << "Enter the number" << endl;
  cin >> num;
  if(num < 0) {
    cout << "[negative] ";
    num = -num;
  }
  if(num == 0)
    cout << "Zero";
  else if(num < 20)
    op0(num);
  else if(num < 100)
    op1(num);
  else if(num < 1000)
    op2(num);
  else if(num < 1000000)
    op3(num);
  else if(num < 1000000000)
    op4(num);
  else
    cout << "Out of range";
  cout << endl;
  getch();
}

يقبل من - 999,999,999 الى 999,999,999

قيم سالبه وموجبه

#5

الله يجزاك 999.999.999 خير اخوي Asm4all ومشكور على هديتك

بس عندي مشكلة لما انفذ البرنامج

يقولي فيه خطأ بالعملية الاولى

void op1(long num) {
 int j = (num / 10) * 10, k = num % 10;
 for(int i = 19; i < 27; i++) {
	if(fig.dig == j) {
	  cout << fig.wrd;
	  break;
	}
 }
 for(int i = 0; i < 9; i++) {
	if(fig.dig == k) {
	  cout << " " << fig.wrd;
	  break;
	}
 }
}

والخطأموجود بالسطر ال9

 for(int i = 0; i < 9; i++) {

ممكن تتصححلي الخطأ الله يعطيك العافية

واسفة على ثقالة دمي بس ابيك تتحملني الله يرضى عليك

واشكرك على وقتك الثمين اللي ضيعته معايا

#6

احذفي كلمة int من السطر التاسع فقط (السطر الذي تقولين أن الخطأ موجود فيه)

#7

الموضوع مش مستاهل structs يمكن توفير الوقت و الذاكرة باستخدام array of strings هكذا

	char* numbers[] = {"Zero", "One", "Two", "Three", "Four", "Five", "Six"};

	cout<<numbers[5]<<endl;

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#8

اشكركم اخواني على اهتمامكم بالموضوع وعلى وقتكم الثمين

والله يجزاك الف خير اخوي Asm4all على برنامجك الحلو ويغفر ذنبك ويسر امرك

وانت بعد اخوي سلطان الثبيتي لك مني جزيل الشكر على لفتتك المتواضعة

ومشكور اخويbashmohandes على ردك بس مافهمت قصدك

ممكن توضح الله يجزاك خير

ولكم مني جزيل الشكر

وحقيقة لي الشرف اني احد اعضاء هذا المنتدى الجميل

تحياتي

#9

أنا أقصد بدلاً من استخدام الstructs هكذا

اقتباس
struct Mystd {
 int dig;
 char wrd[20];
};
struct Mystd fig[] =
{{1,"One"},{2,"Two"},{3,"Three"},{4,"Four"},{5,"Five"},{6,"Six"},
{7,"Seven"},{8,"Eight"},{9,"Nine"},{10,"Ten"},{11,"Eleven"},
{12,"Twelve"},{13,"Thirteen"},{14,"Fourteen"},{15,"Fifteen"},
{16,"Sixteen"},{17,"Seventeen"},{18,"Eighteen"},{19,"Nineteen"},
{20,"Twenty"},{30,"Thirty"},{40,"Fourty"},{50,"Fifty"},{60,"Sixty"},
{70,"Seventy"},{80,"Eighty"},{90,"Ninety"}};

يمكنك استخدام Array من الstrings و سيؤدي نفس الوظيفة هكذا

 char* numbers[] = {"Zero", "One", "Two", "Three", "Four", "Five", "Six"};

و هكذا تستغني عن المتغير dig و تستبدليه بالindex الخاص بالArray فعندما تريدين استدعاء الرقم 5 مثلاً تكون هكذا

 cout<<numbers[5]<<endl;

فهذا أسرع و أبسط و يستخدم ذاكرة أقل

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#10

الحل كما يقترحه محمد(bashmohandes) و افضل واسرع وأوفر ايضا

اليكي الطريقه

#include<iostream>
#include<conio.h>
using namespace std;

char* fig[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven",
               "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen",
               "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen",
               "Nineteen", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty",
               "Seventy", "Eighty", "Ninety"};
void op0(long num) {
 if(num) //num > 0 ?
   cout << fig[num-1];
}
void op1(long num) {
 int j = (num / 10) * 10, k = num % 10;
   cout << fig[j/10 + 17];
   cout << " " << fig[k-1];
}
void op2(long num) {
 int k = num / 100, j = num % 100;
 cout << fig[k-1] << " Hundred ";
 if(j < 20)
   op0(j);
 else
   op1(j);
}
void op3(long num) {
 int k = num / 1000, j = num % 1000;
 if(k < 20)
   op0(k);
 else if(k < 100)
   op1(k);
 else if(k < 1000)
   op2(k);
 cout << " Thousand ";
 if(j < 20)
   op0(j);
 else if(j < 100)
   op1(j);
 else
   op2(j);
}
void op4(long num) {
 int k = num / 1000000;
 long j = num % 1000000;
 if(k < 20)
   op0(k);
 else if(k < 100)
   op1(k);
 else if(k < 1000)
   op2(k);
 cout << " Million ";
 if(j < 20)
   op0(j);
 else if(j < 100)
   op1(j);
 else if(j < 1000)
   op2(j);
 else
   op3(j);
}
int main() {
 long num;
 cout << "Enter the number" << endl;
 cin >> num;
 if(num < 0) {
   cout << "[negative] ";
   num = -num;
 }
 if(num == 0)
   cout << "Zero";
 else if(num < 20)
   op0(num);
 else if(num < 100)
   op1(num);
 else if(num < 1000)
   op2(num);
 else if(num < 1000000)
   op3(num);
 else if(num < 1000000000)
   op4(num);
 else
   cout << "Out of range";
 cout << endl;
 getch();
 return 0;
}

طبعا لديكي سؤالين :

1 - أين ال for loops ؟

الاجابه ان نحتاجها لأننا لن نقارن الرقم مع الجدول لنحصل على الكلمه المناسبه وانما سنشير مباشرة على ترتيب الكلمه المناسبه

2 - من اين اخترت في القيمه num-1, k-1 كـ index في op0 , op1 , ولماذا اخترت j/10 + 17 في op1 ؟

الأول لأن الأرقام من 1 الى 19 تمثل في المصفوفه من 0 الى 18 على التوالي , اذاً لتمثيل الرقم n حرفيا نقرأ من المصفوفه العنصر n-1

اما الثاني:

فالرقم 20 موجود في العنصر رقم 19

الرقم 30 موجود في العنصر 20

الرقم 40 موجود في العنصر 21

...

الرقم 90 موجود في العنصر 26

طيب نجتاج علاقه تربط بين الرقم وترتيب الكلمه المناسبه له في المصفوفه

نستنتج العلاقه من اسلوب التغيير في القيم في الطرفين

n = 20 + 10x , string(n) = string(19 + x)
x = (n - 20) / 10 = (n/10) - 2
string(n) = string(19 + (n/10) - 2)
string(n) = string(17 + n/10)

لو الطريقه دي مش واضحه , حد تاني يوضح :D

#11

الله لايحرمني منك اخواني bashmohandes وAsm4all

والله يجزاكم خير على المعلومات المفيدة اللي استفدتها منكم

ولي شرف معرفتكم

والطريقتين جداا واضحة وسهلة

وشكراا لكم

#12

بسم الله الرحمن الرحيم

أشكر المشرفين ( Asm4all / bashmohandes / Sultan_Althibity ) على ردودهم الطيبه وتفانيهم في حل مشكلة العضوة .

===

صورة
صورة

حسابي في الفيس بوك
http://goo.gl/XIzwL

حسابي في تويتر
http://goo.gl/6p4e3

 

 
 

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…