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

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

مغلق
بدأه الساهر2004 في 14 ديسمبر 2005 · 22 رد · 6,270 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 18 أبريل 2014 في 17:55 — السبب: add some tags

#2

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

/index.php?showtopic=83164

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

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

#3

الله جزاك خير ولله يكثر من امثالك يا عسل

#4

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

السلام عليكم

للتحويل من 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<<"   ";
 cout<<endl;

 getch();
 back();

}//end of PostFix method

Data_Structure_Project.rar

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#5

أخي eng_3llam :

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

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

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

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

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

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

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

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#7

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

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

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

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

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

3*(4-5)

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

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

1

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#9

آه فهمت ....

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

أخ eng_3llam :

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

#10
اقتباس
فعليه أن يقوم بتعـديل العبارة النصية المدخلة وإضافة الأقواس إليها

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

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

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

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

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

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#11

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

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

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

ممكن الموضوع دة كان زميل ليا عملة ف مشروع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 في 18 ديسمبر 2005 في 20:18

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#14

يا أخ أحمد Asm4all :

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

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

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

#15
اقتباس
في لغـة السي شارب (حسب خبرتي المتواضعـة فيها) يوجد متغير اسمـه string

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

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

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#16

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

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

#17

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

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

/index.php?showtopic=74047

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

شكرا مقدما!

#18

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

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

#19
Sultan_Althibity كتب:
يا أخ أحمد Asm4all :

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

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

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

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

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

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

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

#20

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

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

#21

بالنسبة لطريقة جاوس فهي طريقة بسيطة و جيدة و لها تحسينات كثيرة مثل 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[j];
 }
 cout<<"Enter the free term b"<<i<<" ";
 cin>>Matrix[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];
 Matrix[Dest] = Matrix[Src];
 Matrix[Src] =  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<<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 في 22 ديسمبر 2005 في 05:30

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#22

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

#23

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

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

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

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