• 0
الساهر2004

كيف احول من صورة infix الي صورة postfix

سؤال

بسم الله الرحمن الرحيم
اولا ابدء بتحية الاسلام سلام عليكم ورحمة الله وبركات
يا جماعة كيف احول من صورة infix الي صورة postfix انا بصراح حاولة ولكن ما عندي اي معلومة عن كيفية التحويل وارجوا من ذوي الخبر ان لايبخل علي و جزاكم الله خيرا .
وسوف ادعي لمن يساعدني.

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

شارك هذا الرد


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

22 إجابة على هذا السؤال .

  • 0

وضعت كـود قبل أيام لهذا الغرض يقبل العـمليات الأساسية دون أقواس على هذا الرابط:

http://www.arabteam2000-forum.com/index.php?showtopic=83164

=============

ملاحـظـة: عـنوان الموضوع مخالف لذلك سأغيره لك

0

شارك هذا الرد


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

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

السلام عليكم

للتحويل من infix notation to postfix notation

أولا أقراء من المستخدم الline المراد تدخلية كما يلى مثلا

3*)4-6(

مع وجود أقواس ثم بعد ذلك أنشاء array of char لتخزين فيها الNumbers وأيضا stack of char لتخزين فيها الoperators

لاحظ ذلك الكود

template<class T>
void InfixNotation<T> :: InToPost()
{
clrscr();
while(!input)
{
 cin>>c;       //get the char from the user
 if(c == '+' || c == '-' || c == '/' || c == '*' || c == '%' || c == '^' )   //if c is operator push it in stack
  s.push(c);

 else
 if( c == ')' )   //if c ==')' then retrive the top element and entered it in array
 {
  ptr[ArrSize]  =  s.top();
  s.pop();
  ArrSize++;
 }

 else
 if(isdigit(c) )     //if c is digit
 {
  ptr[ArrSize] = c;     //enterd the c in the array then increament the size
  ArrSize++;

 }

 else
 if(c == '=' )
  input = true;    //to stop teh loop


}

ptr[ArrSize] = s.top();   ArrSize++;
cout<<endl<<endl;
getch();
back();
}//end of InToPost method

لو كان operator أدخل العلامة داخل Stack s أما لو كان Int put this value in array of cahr called ptr

طب لو كان اللى داخل "("

أحط أخر operator from stack in array كما ف ذلك السطر

if( c == ')' )   //if c ==')' then retrive the top element and entered it in array
 {
  ptr[ArrSize]  =  s.top();
  s.pop();
  ArrSize++;
 }

طب لو كان اللى داخل دة رقم أخزنة داخل الarray كما موضح ف ذلك السطر

if(isdigit(c) )     //if c is digit
 {
  ptr[ArrSize] = c;     //enterd the c in the array then increament the size
  ArrSize++;

 }

طب ف الاخر لو دخل علامة = يخلى الinput = true وبكدة أطلع من الloop

if(c == '=' )
  input = true;    //to stop teh loop

وعلشان أطبع الpostfix أستخدم تلك الدالة

template<class T>
void InfixNotation<T>:: PostFix()  //to postfix notation
{
 clrscr();
for(unsigned int i = 0; i < ArrSize; i++)
 cout<<ptr[i]<<"   ";
cout<<endl;

getch();
back();

}//end of PostFix method

Data_Structure_Project.rar

0

شارك هذا الرد


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

أخي eng_3llam :

هل يدعـم البرنامج الذي وضعتـه أسبقية العـمليات الحسابيـة....

بحثت كثيراً في الانترنت في السابق عـن مثل هذه الخوارزميـة ... ولم أجد مما جعلني أضع خوارزميـة تدعـم ذلك ولو كانت بدائية بعض الشيء..

0

شارك هذا الرد


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

هل يدعـم البرنامج الذي وضعتـه أسبقية العـمليات الحسابيـة....

بحثت كثيراً في الانترنت في السابق عـن مثل هذه الخوارزميـة ... ولم أجد مما جعلني أضع خوارزميـة تدعـم ذلك ولو كانت بدائية بعض الشيء

بدايتا أعتذر عن التأخر ف الرد :)

هوة بيدعم الاقواس بمعنى ولو دخلت أكتر من قوس متداخل هيحلها :)

الاساس من البرنامج هو تدعيم الاقواس ف المسئلة الحسلبية

0

شارك هذا الرد


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

ما الفائدة من دعـم الأقواس ... إذا لم يكن يدعـم أسبقية العـمليات الحسابيـة....

في الكـود الذي وضعتـه ... الخوارزميـة لا تدعـم الأقواس حاولت بشتى الوسائل إضافتها في الخوارزميـة توصلت إلى طريقـة بدائية نـوعاً ماً ولكن لم أستطع تطبيقها بواسطـة لغـة السي ... لأني لم أكن أعرف المؤشرات وكيفية حجز الذاكرة فيها في ذلك الوقت أقصد من تعليمي...

0

شارك هذا الرد


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

ما الفائدة من دعـم الأقواس ... إذا لم يكن يدعـم أسبقية العـمليات الحسابيـة....

في الكـود الذي وضعتـه ... الخوارزميـة لا تدعـم الأقواس حاولت بشتى الوسائل إضافتها في الخوارزميـة توصلت إلى طريقـة بدائية نـوعاً ماً ولكن لم أستطع تطبيقها بواسطـة لغـة السي ... لأني لم أكن أعرف المؤشرات وكيفية حجز الذاكرة فيها في ذلك الوقت أقصد من تعليمي

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

3*(4-5)

هيكون الناتج 3 وهكذا بس المشكلة أنة يقبل أرقام من 0 الى 9 فقط :(

أتمنى أكون وضحت لك ما تريدة :)

1

شارك هذا الرد


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

آه فهمت ....

ولكن إذا أردنا لهذا البرنامج أن يدعـم أسبقية العـمليات الحسابية ..... فعليه أن يقوم بتعـديل العبارة النصية المدخلة وإضافة الأقواس إليها ... بالنسبة لمشكلة البرنامج حول أنه لا يقبل سوى رقم واحد ... فهي مشكلة بسيطة للغاية ومن الممكن حلها ........ تحتاج فقط تعـديل بسيط للغاية في الخوارزميـة ...

أخ eng_3llam :

هل قد استطعت عـمل برنامج شبيه بالآلة الحاسبة (Parsar) .... أنا أفكر في كتابة كـود يقوم بحل نظام معادلات خطية بطريقة جاوس شبيه بالآلة الحاسبـة ... من معلوماتك السابقة هل سيكون بنفس مستوى برنامج الآلة الحاسبة أم أنـه سيكون أصعب .... بلغـة السي بلس بلس هذه المرة وليست بلغـة السي المعقدة...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
فعليه أن يقوم بتعـديل العبارة النصية المدخلة وإضافة الأقواس إليها

الله ينور عليك مظبوط كدة :D

هل قد استطعت عـمل برنامج شبيه بالآلة الحاسبة (Parsar)

ممممم للاسف ممكن توضح أكتر يا سلطان؟؟؟

أنا أفكر في كتابة كـود يقوم بحل نظام معادلات خطية بطريقة جاوس شبيه بالآلة الحاسبـة

برنامج يحل معادلات جاوس ولا أية ؟؟ أنا عملت برنامج لحل معادلات جاوس باسى شارب وسهل وبسيط بس محتاج وقت :)

0

شارك هذا الرد


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

يعـني برنامج يقوم المستخدم فيه بإدخال عبارة حسابية يريد حسابها ... يقوم البرنامج باستقبالها على أنها مصفوفة حرفية ... يقوم بعـد ذلك بتفسيرها ومعرفة كل حرف منها هل هـو رقم أم عـملية أو أي شيء آخر ..... بعـد ذلك يقوم البرنامج بتحويلها إلى صورة Postfix ويحسبها لك ... هذا ما أقصده .. وأنا آسف لأني لم أوضح جيداً....

نفس هذا البرنامج أريد تطبيقـه ولكن لحل نظام معادلات خطيـة ... يقوم المستخدم بإدخال مصفوفة حرفية طويلـة ... تتضمن المعادلات وتتضمن المجاهيل الموجودة حتى ... يقوم البرنامج بعـد ذلك بتفسيرها واحدا واحدا ومعرفة المجاهيل وما إلى ذلك حتى يفصلها عـن بعض ويقوم بحلها بطريقة جاوس.... هذا البرنامج أعتقد أنـه معقد أكثر من كـود الآلة الحاسبة أليس كذلك....

0

شارك هذا الرد


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

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

ممكن الموضوع دة كان زميل ليا عملة ف مشروعgauss بتاعة وعمل فية كاتبة المعادلات بس كان بالجافا ولكن لا يوجد شيى مستحيل كل ما تحتاجة ف السى بلس بلس دالة تعمل split

أعتقد ان الكود البسيط اللى داخل الmain ممكن يمعل عمل split ولكن تحتاج تعديل بسيط

#include <iostream>
#include <conio>
#include <string>
void main()
{
char input[20];
cout<<"enter the string";
 cin>>input;
char* delimiters = ",";
for( char* token = strtok(input , delimiters);
 token != NULL;
 token = strtok(NULL , delimiters) )

 cout<<token;
getch();

}

:)

تم تعديل بواسطه eng_3llam
0

شارك هذا الرد


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

يا أخ أحمد Asm4all :

لغـة السي ليست بمثل دلال لغـة السي شارب ...... في لغـة السي شارب (حسب خبرتي المتواضعـة فيها) يوجد متغير اسمـه string ... في لغـة السي لا يوجد مثل هذا الدلال وهذه النعـمة الكبيرة...

أخ أحمد ممكن تعرفنا على الخوارزمية المتبعـة في البرنامج وهل هي ناجحـة أم لأ.....

وخاصـة كيف تعاملت مع أسبقية العـمليات الحسابية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
في لغـة السي شارب (حسب خبرتي المتواضعـة فيها) يوجد متغير اسمـه string

يمكنك استخدام الstring class في ال++C فهي تشبه الى حد كبير الC# String

تم تعديل بواسطه bashmohandes
0

شارك هذا الرد


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

أعرف هذا الكلام ..

ولكن أقصد في لغـة السي

0

شارك هذا الرد


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

طريقة جاوس .. طريقة جاوس... لحل المعادلات!...

يا ليت تزور الرابط التالي:

http://www.arabteam2000-forum.com/index.php?showtopic=74047

عندي حزمة تعمل بشكل جيد،، لكن لا تدعم حل المعادلات،، يا ليت أي معلومة بخصوص طريقة جاوس!

شكرا مقدما!

0

شارك هذا الرد


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

طريقة جاوس بسيطـة .. وأعتقد أن هـناك مصادر موجودة في الانترنت لها..

ولكن شرطها هـو أن يكون عـدد المجاهيل يساوي عـدد المعادلات

0

شارك هذا الرد


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

يا أخ أحمد Asm4all :

لغـة السي ليست بمثل دلال لغـة السي شارب ...... في لغـة السي شارب (حسب خبرتي المتواضعـة فيها) يوجد متغير اسمـه string ... في لغـة السي لا يوجد مثل هذا الدلال وهذه النعـمة الكبيرة...

أخ أحمد ممكن تعرفنا على الخوارزمية المتبعـة في البرنامج وهل هي ناجحـة أم لأ.....

وخاصـة كيف تعاملت مع أسبقية العـمليات الحسابية

لا اعتقد انها مشكله لهذه الدرجه , انا كتبت البرنامج في السي شارب ليس لصعوبته في السي ولكن لتوفير وقت وتوفير كود فقط , لكن بدل استخدام الكلاس string يمكن الاستعاضه عنها بمصفوفة حروف , وبدل استخدام الوظائف الداخليه في الـ string يمكن الاستعاضه عنها بالدوال الخاصه بالنصوص في المكتبة string.h , وكذلك عملية التحويل من نص الى أرقام يمكن عملها بدوال السي بدل من الكلاس في السي شارب

و بالنسبة للخوارزمية المتبعة في البرنامج فهي شوية شخابيط على ورق , جربت اشرح نظري مش بينفع :D , لهذا يمكن الانتظار الى ان اشخبطهم مره ثانيه على برنامج رسم أو اسحبهم على الماسح الضوئي

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

عموما لو وجد لدي بعض الوقت لعمله بالسي مع مراعاة ملاحظة الأخ هاني , فسوف اقوم بوضعه , ويا ريت حد يسبقني لأني مكسل ومشغول شويتين :D

0

شارك هذا الرد


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

أعرف أنه ليس صعباً في لغـة السي ..... ولكنه معقد ويجعلك تهتـم بتفاصيل كثيرة ...... ويزيد من حجم الكـود ويزيد من التفكير ويزيد من اللخبطـة وخاصة المحرف الصفري الذي يحتاج لخوارزميـة لكي تنجح في تحديده ........

بالنسبة للمكتبة string.h ... فلقد واجهت مشاكل كثيرة أثناء استخدامها حينما صممت ذلك الكـود سابقاً .. وكانت تظهر لي نتائج غريبـة .. أرقام طويلة وأحرف أو أن البرنامج ينهار عـند نقطـة معينـة .... لذلك لم استخدم كل دوالها وإنما فقط استخدمت بعضاً من قدراتها .... أظن أن المشكلة مني وليس من المكتبة string .....

0

شارك هذا الرد


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

بالنسبة لطريقة جاوس فهي طريقة بسيطة و جيدة و لها تحسينات كثيرة مثل Gauss Elimination With Partial Pivoting

و غيرها و هذا الكود المرفق كتبته منذ سنتين في الجامعة في مادة التحليل العددي Numerical Analysis و هو كود Gauss Elimination with partial pivoting

/*==================================================================
* File name :  Gauss.cpp  (Problem 1 a, b)
* Presented By:  Mohammed Hossam Eldin Elsherif
* Section  :  3  Bench#:  14  
*==================================================================
*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
//#include "Prototypes.h"

#define  N  3       //The max n size of n*n matrix

/*
* As the C++ language arrays is zero based so the formula
* 1/(i+j-1) i,j from 1..n   can be converted to
* 1/(i+j+1) i,j from 0..n-1
*/

double Matrix[N][N + 1];      //Augmented Matrix
double Results[N];        //The X Vextor

/* Prototypes Function */
void InitMatrixFromUser();        //Initialize The Matrix
void GetMatrixFromUser();
bool SolveMatrix();        //Convert to Upper triangular
void BackwordSubstitution();      //Apply backword Subs.
void DisplayResults();
/* End */  


void main(void)
{
InitMatrixFromUser();        //Initialize The Matrix
//GetMatrixFromUser();
cout<<endl;
SolveMatrix();        //Convert to Upper triangular
BackwordSubstitution();      //Apply backword Subs.
cout<<endl;
DisplayResults();       //Display the X array
getch();
}
/*
* This functoin is responsible for initializing the Matrix
*  by using the formula aij=1/(i+j-1)
*  and initializing the b Vector with the formula
*
*     j=n
*      ___  
*    bj = \  aij , i=1 to n;
*      /__
*     j = 1
* this will guarantee that the EXACT solution of the matrix will be
* X = [1 1 1 .... 1]T
*/
void InitMatrix(void)
{
double tmp, bVal;
for(int x = 0; x< N; x++)
{
bVal = 0;
for(int y=0; y< N; y++)
{
 tmp = 1.0/(x+y+1);  
 Matrix[x][y] =  tmp;
 bVal += tmp;
}
Matrix[x][N]= bVal;
}
}

void InitMatrixFromUser()
{
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
 cout<<"Enter Matrix Element["<<i<<"]["<<j<<"] ";
 cin>>Matrix[i][j];
}
cout<<"Enter the free term b"<<i<<" ";
cin>>Matrix[i][N];
}
}
/*
* This function swaps the Src row with Dest row
*/
void ReplaceRows(int Src, int Dest)
{
double swap;
for(int i=0; i < N + 1; i++)
{
swap = Matrix[Dest][i];
Matrix[Dest][i] = Matrix[Src][i];
Matrix[Src][i] =  swap;
}
}
//This function display the Matrix on the screen
void DisplayMatrix(void)
{
for(int x=0; x<N; x++)
{
for(int y=0; y< N; y++)
{
 cout<<Matrix[x][y]<<"\t";
}
cout<<"||\t"<<Matrix[x][N]<<endl;
}
cout.flush();
}
/*
* The function which is resposible for Getting the pivot for the
* specified row and it applies the Pivoting algorithm and checks
* for singular Matrix exception
*/
double GetPivot(int Row)
{
int RowToChange = Row;
double Pivot = Matrix[Row][Row];
for(int x=Row; x < N; x++) //Checking the rest of the column for a largar value
{
 if(Pivot < Matrix[x][Row])
 {
  RowToChange = x;
  Pivot = Matrix[x][Row];
 }
}
if(RowToChange != Row)     //If largar value found then replace the rows
 ReplaceRows(RowToChange, Row);

if(Pivot == 0)
 cout<<"Error Occured: Non Unique Solution"<<endl; // Singular Matrix

return Pivot;  
}
/*
* This function applies the Gauss Elimination algorithm and converts the
* the matrix into Upper Triangular
*/
bool SolveMatrix(void)
{
double Pivot, M;
for(int Step=0; Step<N - 1; Step++)
{
Pivot = GetPivot(Step);
if(Pivot == 0)
 return false;      //Singular Matrix detected
for(int x=Step + 1; x<N; x++)
{
 M = Matrix[x][Step] / Pivot;
 for(int y=0; y<N + 1;y++)
 {
   Matrix[x][y] -= M * Matrix[Step][y];
 }
}
}
return true;
}
/*
* This function applies the Backword Substitution algorithm on the
* Upper Triangular matrix and saves the results is Results array
*/
void BackwordSubstitution(void)
{
Results[N - 1] = Matrix[N-1][N] / Matrix[N-1][N-1];
for(int x = N -2; x>=0; x--)
{
Results[x] = Matrix[x][N] / Matrix[x][x];
for(int y = x + 1; y < N; y++)
{
 Results[x] -= (Matrix[x][y] * Results[y]) / Matrix[x][x];
}
}
}
/*
* This function displays the contents of the Results array on the screen
*/
void DisplayResults(void)
{
for(int i=0; i<N; i++)
{
cout<<"X"<<i<<": "<<Results[i]<<endl;
}
}
/***************************/
void GetMatrixFromUser(void)
{
for(int x = 0; x<N; x++)
{
for(int y=0; y<N; y++)
{
 cout<<"A"<<x<<y<<":";
 cin>>Matrix[x][y];
}
cout<<"b"<<x<<":";
cin>>Matrix[x][N];
}
}
/****************************/

تم تعديل بواسطه Sultan_Althibity
0

شارك هذا الرد


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

أخي العـزيز محمد قمت بتعـديل مشاركتك وتصحيح الكـود الذي وضعتـه لأنك نسيت تضمين الهيدر فايل Prototypes.h .... الكـود يعـمل الآن

0

شارك هذا الرد


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

آآآه،،، طريقة جاوس هي طريقة حلها بطريقة المصفوفات ،، أليس تسمى المحددات؟؟ درسناها في المتوسط! أذكر أني صنعت برنامج بال QBasic في تلك الفترة بنفس الطريقة، لكن طبعا كان يحل فقط 3 معادلات مع ثلاث مجاهيل!

لكن تبقى عندي المشكلة في كيفية تطبيقها في حزمة المعالجة الرياضية!

0

شارك هذا الرد


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

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

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