• 0
خليل الأمين عبد الجواد

دالة تحليل التعابير الرياضية

سؤال

السلام عليكم

لطالما حلمت ببرمجة برنامج أدخل له تعبيرا مشابهاً للتالي 5*6/7+12-2 ويقوم بإيجاد الناتج , واليوم قد أتممت بناءدالة تقوم بذلك وهي أعظم ما برمجت على الإطلاق , وبرمجتها كانت معقدة للغاية لدرجة حقا لا توصف , إذ أن كل لمشكلة تظهر ينتج مشكلة أخرى ومع سلسلة الحل والمشكلة تم القضاء على كل المشاكل في الأخير .
والتعرف على كل مؤثر وإعطاء الأسبقية للمؤثرات شيئ معقد جداً.
فيما يمكن أن تستخدم الدالة :
تستخدم في الآلات الحاسبة لأنها مفيدة جدا في هذا المجال إذ يها يمكن برمجة آلات حاسبة علمية ذات قدرة مميزة وصغيرة الحجم وسريعة العمل , وكذلك يمكن أن تستخدم في البرامج التجارية لحساب المبيعات وغيرها , ويمكن كذلك استعمالها في مفسرات لغات البرمجة , وفي تطبيقات كثيرة.
أنا متأكد بنسبة 95% أنها تعمل تماماَ وقد تم تجريبها وإن وجدت نتيجة خاطئة يرجى الإخبار عنها .
والدالة تم برمجتها على Borland C++ Builder
والمؤثرات المستعملة كالآتي حسب الأسبقية:
الأقواس :.
! : المضروب مثلا !6
^ : الأس : 2^4
* / % : الضرب والقسمة وباقي القسمة .
الجمع والطرح .
كما أن الدالة تتعرف على النسبة Pi والعدد الطبيعي e: فيمكن كتابة e^3*pi
وبرمجة معها دالة أخرى لكي ينفذا الدوال الرياضية التالية :
جيب الزاوية : sin
جيب التمام :cos
الظل :tan
الجذر :sqrt

والملف الحاوي للدالتين هو :
 

#include<math.h>#define msg ShowMessage//   برمجة : خليل الأمين عبد الجواد   {الساحر }     ء// Programmed by : Khalil Alamin Abduljawwad    { magician }// Khal_i_l @ Yahoo.comString Equal(String);String math_funs(String &s){    int no=0,rc,i,j=0,len=0;    double natej;    String fun;    if(s.Pos("sin")<1 && s.Pos("cos")<1 && s.Pos("tan")<1 && s.Pos("sqrt")<1)return s;    for(i=1; i<=s.Length(); i++)    {        if(s[i]=='s' && s[i+1]=='i')no=1;        else if(s[i]=='c' && s[i+1]=='o')no=2;        else if(s[i]=='t' && s[i+1]=='a')no=3;        else if(s[i]=='s' && s[i+1]=='q')no=4;        if(no>0)        {            fun=s;            switch(no)            {            case 4:                fun.Delete(1,i+3);                break;            default:                fun.Delete(1,i+2);            }            for(j=1; j<=fun.Length(); j++)                if(fun[j]==')')                    break;            fun.Delete(j+1,fun.Length());            len=fun.Length();            fun=Equal(fun);            switch(no)            {            case 1:                natej=(sin(fun.ToDouble()));                break;            case 2:                natej=(cos(fun.ToDouble()));                break;            case 3:                natej=(tan(fun.ToDouble()));                break;            case 4:                natej=(sqrt(fun.ToDouble()));                len++;                break;            }            fun=String(natej);            s.Delete(i,len+3);            s.Insert(fun,i);        }        no=0;    }    return s;}String Equal(String s){    math_funs(s);    if(s=="Khalil")return ("He has programmed me from zero and by 230 line only. Don't think me an easy program, imagine a program analyze the string \"5+68*(5!/6^2)\" and calculate its result.");    String st,ss,S=s,k=s;    bool bo,if1;    double re=0;    int a,before,after,i,p1=0,p2=0;    s=s.LowerCase();    for(i=1; i<=s.Length(); i++)    {        if(s[i]=='e')        {            s.Delete(i,1);            s.Insert("2.71828182845905",i);        }        if(s[i]=='p' &&s[i+1]=='i')        {            s.Delete(i,2);            s.Insert("3.14159265358979",i);        }        if(s[i]=='ط')        {            s.Delete(i,1);            s.Insert("3.14159265358979",i);        }    }    if(s.Pos('(')<=0 && s.Pos('+')<=0 && s.Pos('-')<=0 && s.Pos('*')<=0 && s.Pos('/')<=0 && s.Pos('%')<=0 && s.Pos('!')<=0 && s.Pos('^')<=0 && s.Pos(')')<=0)        return s;u:    if(s.Pos('(')>0)    {        bo=true;        for(i=1; i<=s.Length(); i++)            if(s[i]=='(')p1=i;        for(i=p1+1; i<=s.Length(); i++)            if(s[i]==')')            {                p2=i;                break;            }        if(p2==0)        {            msg("هناك قوس '(' ناقص");            return s;        }        s.Delete(p2,s.Length());        s.Delete(1,p1);    }    try    {/////////////////////        while(s.Pos('!')>0 )        {            for(i=1; i<=s.Length(); i++)                if (s[i]=='!')                {                    a=i;                    break;                };            for(i=a-1; i>=1; i--)            {                if(s[i]=='+' || s[i]=='*' || s[i]=='/' || s[i]=='^' || s[i]=='!' || s[i]=='%' )                    break;                else if (s[i]=='-' && s[i-1]!='E')                {                    ShowMessage("صيغة غير صحيحة");                    return S;                }            }            ss=s;            for(i=a-1; i>=1; i--)                if(ss[i]=='+' || (ss[i]=='-'&& s[i-1]!='E') || ss[i]=='*' || ss[i]=='/' || ss[i]=='^' || s[i]=='!'|| s[i]=='%')                {                    before=i;                    break;                }                else before=0;            for(i=a+1; i<=ss.Length(); i++)                if (ss[i]=='+' || (ss[i]=='-'&& s[i-1]!='E') || ss[i]=='*' || ss[i]=='/' ||ss[i]=='^' || s[i]=='!'|| s[i]=='%')                {                    after=i;                    break;                }                else after=0;            ss.Delete(after,ss.Length());            ss.Delete(1,before);            st=ss;            String x=ss;            x.Delete(x.Pos('!'),x.Length());            long double fact=1;            for(int j=1; j<=x; j++)fact*=j;            re=fact;            s.Delete(before+1,ss.Length());            s.Insert(String(re),before+1) ;        }/////////////////////        while(s.Pos('^')>0 )        {            before=after=0;            for(i=1; i<=s.Length(); i++)                if (s[i]=='^')                {                    a=i;                    break;                };            ss=s;            for(i=a-1; i>=1; i--)                if(ss[i]=='+' || (ss[i]=='-'&& s[i-1]!='E') || ss[i]=='*' || ss[i]=='/' || ss[i]=='^'|| s[i]=='%')                {                    if(i==1)                    {                        before=0;                        break;                    }                    else                    {                        before=i;                        break;                    }                }            for(i=a+1; i<=ss.Length(); i++)                if (ss[i]=='+' || (ss[i]=='-'&& s[i-1]!='E') || ss[i]=='*' || ss[i]=='/' ||ss[i]=='^'|| s[i]=='%')                {                    after=i;                    break;                }            ss.Delete(after,ss.Length());            ss.Delete(1,before);            st=ss;            String x=ss;            x.Delete(x.Pos('^'),x.Length());            st.Delete(1,st.Pos('^'));            re=pow(x.ToDouble(),st.ToDouble());            s.Delete(before+1,ss.Length());            s.Insert(String(re),before+1);        }///////////////////////-------------------        while(s.Pos('*')>1 || s.Pos('/')>1 || s.Pos('%')>1)        {            for(i=1; i<=s.Length(); i++)                if (s[i]=='*' || s[i]=='/' || s[i]=='%')                {                    a=i;                    break;                };            ss=s;            for(i=a-1; i>=1; i--)            {                if (i>1)                {                    if((ss[i]=='-')&&ss[i-1]!='E')                    {                        before=i;                        break;                    }                }                if(ss[i]=='+' ||  ss[i]=='*' || ss[i]=='/' || ss[i]=='%')                {                    //---                    if(i==1)                    {                        before=0;                        break;                    }                    else                    {                        before=i;                        break;                    }                }                else before=0;            }            if(before >1 && (ss[before]=='-' || ss[before]=='+'))                before--;            if(ss[a+1]=='-')i=a+2;            else i=a+1;            for(; i<=ss.Length(); i++)                if (ss[i]=='+' || (ss[i]=='-'&& s[i-1]!='E') || ss[i]=='*' || ss[i]=='/' || ss[i]=='%')                {                    after=i;                    break;                }                else after=0;            ss.Delete(after,ss.Length());            ss.Delete(1,before);            st=ss;            String x=ss;            if(ss.Pos('-')==1)            {                x;                x.Delete(1,1);                if (x.Pos('-')>2)                    if1=false;            }            x=ss;            if(ss.Pos('/')>0)            {                x.Delete(x.Pos('/'),x.Length());                st.Delete(1,st.Pos('/'));                re=(x.ToDouble())/(st.ToDouble());            }            if(ss.Pos('*')>0)            {                x.Delete(x.Pos('*'),x.Length());                st.Delete(1,st.Pos('*'));                re=(x.ToDouble())*(st.ToDouble());            }            if(ss.Pos('%')>0)            {                x.Delete(x.Pos('%'),x.Length());                st.Delete(1,st.Pos('%'));                re=(x.ToInt())%(st.ToInt());            }            if(!if1)            {                s.Delete(before+1,ss.Length());                s.Insert("+"+String(re),before+1);            }            else            {                s.Delete(before+1,ss.Length());                if(String(re)[1]!='-')                    s.Insert("+"+String(re),before+1);                else  s.Insert(String(re),before+1);            }            s=s;        }        if(s[1]=='+')s.Delete(1,1);/////////////////////        for(i=1; i<=s.Length(); i++)        {            if(s[i]=='+' && s[i+1]=='-')s.Delete(i,1);            if(s[i]=='+' && s[i-1]=='-')s.Delete(i,1);        }        int u=0,p=0;        for(i=1; i<=s.Length(); i++)            if(s[i]=='-' ||s[i]=='+')            {                u++;                p=i;            }//if(p>1)        if(u==1 && (p>1 && s[p-1]=='E'));        else        {            while(s.Pos('+')>0 || s.Pos('-')>1)            {                for(i=2; i<=s.Length(); i++)                    if (s[i]=='+' || (s[i]=='-'&& s[i-1]!='E'))                    {                        a=i;                        break;                    };                ss=s;                after=0;                for(i=a+1; i<=ss.Length(); i++)                    if (ss[i]=='+' || (ss[i]=='-'&& s[i-1]!='E') )                    {                        after=i;                        break;                    }                ss.Delete(after,ss.Length());                st=ss;                String x=ss;                if(ss.Pos('-')>1)                {                    x.Delete(x.Pos('-'),x.Length());                    st.Delete(1,st.Pos('-'));                    re=(x.ToDouble())-(st.ToDouble());                }                if(ss.Pos('+')>0)                {                    x.Delete(x.Pos('+'),x.Length());                    st.Delete(1,st.Pos('+'));                    re=(x.ToDouble())+(st.ToDouble());                }                s.Delete(1,ss.Length());                s.Insert(String(re),1);            }        }        if(bo==true)        {            k.Delete(p1,p2-p1+1);            k.Insert(s,p1);            s=k;            bo=false;            goto u;        }    }    catch(...)    {        ShowMessage("صيغة غير مقبولة");        return S;    }    return s;}//---------------------------------------------------------------------------

Lexer.rar

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

1 إجابات على هذا السؤال .

  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .