السلام عليكم
لطالما حلمت ببرمجة برنامج أدخل له تعبيرا مشابهاً للتالي 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=='s' && s[i+1]=='i')no=1; else if(s=='c' && s[i+1]=='o')no=2; else if(s=='t' && s[i+1]=='a')no=3; else if(s=='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=='e') { s.Delete(i,1); s.Insert("2.71828182845905",i); } if(s=='p' &&s[i+1]=='i') { s.Delete(i,2); s.Insert("3.14159265358979",i); } if(s=='ط') { 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=='(')p1=i; for(i=p1+1; i<=s.Length(); i++) if(s==')') { 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=='!') { a=i; break; }; for(i=a-1; i>=1; i--) { if(s=='+' || s=='*' || s=='/' || s=='^' || s=='!' || s=='%' ) break; else if (s=='-' && s[i-1]!='E') { ShowMessage("صيغة غير صحيحة"); return S; } } ss=s; for(i=a-1; i>=1; i--) if(ss=='+' || (ss=='-'&& s[i-1]!='E') || ss=='*' || ss=='/' || ss=='^' || s=='!'|| s=='%') { before=i; break; } else before=0; for(i=a+1; i<=ss.Length(); i++) if (ss=='+' || (ss=='-'&& s[i-1]!='E') || ss=='*' || ss=='/' ||ss=='^' || s=='!'|| s=='%') { 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=='^') { a=i; break; }; ss=s; for(i=a-1; i>=1; i--) if(ss=='+' || (ss=='-'&& s[i-1]!='E') || ss=='*' || ss=='/' || ss=='^'|| s=='%') { if(i==1) { before=0; break; } else { before=i; break; } } for(i=a+1; i<=ss.Length(); i++) if (ss=='+' || (ss=='-'&& s[i-1]!='E') || ss=='*' || ss=='/' ||ss=='^'|| s=='%') { 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=='*' || s=='/' || s=='%') { a=i; break; }; ss=s; for(i=a-1; i>=1; i--) { if (i>1) { if((ss=='-')&&ss[i-1]!='E') { before=i; break; } } if(ss=='+' || ss=='*' || ss=='/' || ss=='%') { //--- 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=='+' || (ss=='-'&& s[i-1]!='E') || ss=='*' || ss=='/' || ss=='%') { 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=='+' && s[i+1]=='-')s.Delete(i,1); if(s=='+' && s[i-1]=='-')s.Delete(i,1); } int u=0,p=0; for(i=1; i<=s.Length(); i++) if(s=='-' ||s=='+') { 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=='+' || (s=='-'&& s[i-1]!='E')) { a=i; break; }; ss=s; after=0; for(i=a+1; i<=ss.Length(); i++) if (ss=='+' || (ss=='-'&& 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;}//---------------------------------------------------------------------------