نمایش نتایج 1 تا 5 از 5

نام تاپیک: تبدیل infix به postfix توسط پاسکال

  1. #1
    کاربر دائمی آواتار Nabi
    تاریخ عضویت
    اسفند 1383
    محل زندگی
    اهواز
    سن
    43
    پست
    121

    تبدیل infix به postfix توسط پاسکال

    سلام
    نمیدونستم در مورد پاسکال کجا بایستی مینوشتم . این بود که اینجا رو مناسب تر دیدم .

    یه سوال پاسکال هست ، اگه کسی سورسی در این باره داره یا توضیح و کمکی از دستش بر میاد ممنون میشم کمک کنه .
    گفته که برنامه ای نویسید که عبارات infix رو به postfix تبدیل کنه . یه شرح مفصل هم داره که چیکار باید کرد از آرایه ها و پشته استفاده میشه.. و میخواد که اعمال ریاضی رو انجام بده ، مهمه که توان رو هم انجام بده! فکر کردم توضیح در این حد کافی باشه ...
    راستش من که هیچی سر در نیاوردم شما چی؟
    البته یه سرچ کردم یه سری لینک هم پیدا کردم ولی نمیدونم کدوم میتونه جواب باشه:

    http://www.qiksearch.com/articles/cs/infix-postfix/
    http://www.qiksearch.com/javascripts...to-postfix.htm
    http://www.experts-exchange.com/Prog..._20394130.html
    http://www.latrobe.edu.au/philosophy...s15opprec.html
    http://www.latrobe.edu.au/philosophy...as/s11pre.html
    http://www.bsdg.org/SWAG/PARSING/0012.PAS.html
    http://www.programmersheaven.com/zone3/cat414/16136.htm

    تشکر
    نبی

  2. #2
    سلام. فهمیدم چی میخوای و اتفاقا برنامش رو قبلا نوشتم. ولی برای اینکه تاپیکت بسته نشه راهنمایی میکنم. البته چندین جواب به زبان سی داده شده تو همین سایت. میتونی کلمه میانوندی به پیشوندی رو سرچ کنی. ولی سادس. یه عکسی داشتم که خیلی برای این کار کمکت میکنه. پیدا کردم میذارم. اما اگر عجله مند بودی خود فایل رو با اجازه بزرگترا میذارم.

  3. #3
    کاربر دائمی آواتار Nabi
    تاریخ عضویت
    اسفند 1383
    محل زندگی
    اهواز
    سن
    43
    پست
    121
    سلام
    از شما ممنون که پاسخ دادید .
    اون تاپیکی هم که گفتید پیدا کردم . اینجاست:
    http://www.barnamenevis.org/sh...ad.php?t=34570

    اما سورس به زبان سی است و من پاسکال میخواستم ضمنا اون برنامه توان رو اعمال نمیکنه ! . ضمنا خیلی هم عجله دارم و فرصت نوشتن برنامه رو ندارم . ضمن اینکه اونقدر به پاسکال تسلط ندارم .
    اگر سورس آماده دارید ممنون میشم بدید .
    اینها مهمه :
    1. پاسکال باشه
    2. توان رو حتما اعمال کنه
    3. بعد از تبدیل ، عمل محاسبه رو نیز انجام بده

    باتشکر
    نبی

  4. #4

    Const
    Number : Set Of Char = ['0' .. '9','.'];
    Amalgar1 : Set Of Char = ['+','-'];
    Amalgar2 : Set Of Char = ['*','/'];
    Amalgar3 : Set Of Char = ['^'];
    type
    model = (opp, clp, num, amal1, amal2, amal3);
    model2 = (oopp, cclp, nnum, aamal,aaamal,aaaamal, none,ende);
    Trec = Record
    Amalvand : Real;
    Amalgar : Char;
    Modl : Model;
    End;
    Prec = ^TTrec;
    TTrec = Record
    Info : Trec;
    Pred : Prec;
    End;

    var Top, Tempel,Tip : Prec;
    Temp, S, Ebarat : String;
    I, J : Integer;
    Tt1, Tt2 : Model2;
    Rec : TRec;
    endnum : Real;
    {-----------------------------------------------------------}

    Function P_Pop(Var stru : Trec;var Rip : Prec) : Boolean;
    Var Pech : Prec;
    Begin
    P_Pop := False;
    If Rip <> Nil Then
    Begin
    Pech := Rip;
    Rip := Rip^.Pred;
    Stru := Pech^.Info;
    P_Pop := True;
    Dispose(Pech);
    End;
    End;

    Procedure P_Push(stru : Trec;var Rip : Prec);
    Var Pech : Prec;
    Begin
    Pech := Rip;
    New(Rip);
    Rip^.Pred := Pech;
    Rip^.Info := Stru;
    End;

    Procedure Convert(var Rip : Prec);
    Var Pech : PRec;
    reco : Trec;
    Begin
    Tempel := Nil;
    While P_Pop(Reco,Rip) Do
    Begin
    Pech := Tempel;
    New(Tempel);
    Tempel^.Pred := Pech;
    Tempel^.Info := Reco;
    End;
    Rip := Tempel;
    End;

    Function Vil (S : String) : Real;
    Var TST : Integer;
    OSt : Real;
    Begin
    Val(S, OSt, TST);
    Vil := OSt;
    End;

    {-------------------------------------------------------}
    Procedure SetData;
    Begin
    Temp := Ebarat+'e';
    Repeat {Length Ebarat}
    I := 1;
    S := '';
    Tt1 := None;
    Tt2 := None;
    Repeat {Length Model}
    If Temp[I] In Number Then Begin S := S + Temp[I]; Tt1 := nnum; End;
    If Temp[I] In Amalgar1 Then Begin S := S + Temp[I]; Tt1 := aamal; End;
    If Temp[I] In Amalgar2 Then Begin S := S + Temp[I]; Tt1 := aaamal; End;
    If Temp[I] In Amalgar3 Then Begin S := S + Temp[I]; Tt1 := aaaamal; End;
    If Temp[I] = '(' Then Begin S := S + '('; Tt1 := oopp; End;
    If Temp[I] = ')' Then Begin S := S + ')'; Tt1 := cclp; End;
    If Temp[I] = 'e' Then Begin S := S + 'e'; Tt1 := ende; End;

    If (Tt1 <> Tt2) And (Tt2 = none) Then Tt2 := Tt1;
    Inc(I);
    Until (Tt1 <> Tt2) Or (I > Length(Temp));
    Delete(S, Length(S), 1);
    Delete(Temp, 1, Length(S));
    Case Tt2 Of
    aamal : Begin Rec.Amalgar := S[1]; Rec.Modl := amal1;Rec.Amalvand := 0; End;
    aaamal : Begin Rec.Amalgar := S[1]; Rec.Modl := amal2;Rec.Amalvand := 0; End;
    aaaamal : Begin Rec.Amalgar := S[1]; Rec.Modl := amal3;Rec.Amalvand := 0; End;
    nnum : Begin Rec.Amalvand := Vil(S); Rec.Modl := num; Rec.Amalgar :=' '; End;
    oopp : Begin Rec.Amalgar := '('; Rec.Modl := opp; Rec.Amalvand := 0; End;
    cclp : Begin Rec.Amalgar := ')'; Rec.Modl := clp; Rec.Amalvand := 0; End;
    End;
    P_Push(Rec,Top);

    Until Temp = 'e';
    Rec.Amalgar := ')';Rec.Amalvand := 0; Rec.Modl :=clp; P_Push(Rec,Top);
    Convert(Top); {poshte ro bar aks mikone.}

    End;
    {----------------------------------------------------------}
    Procedure Amalgart(ebarat : trec);
    Var
    Tr : Trec;
    begin
    P_Pop(Tr, Tempel);
    P_Push(Tr,Tempel);
    while (tr.Modl >= Ebarat.Modl) Do
    Begin
    P_Pop(Tr,Tempel);
    P_Push(Tr,Tip);
    {-----------------------------------------}
    P_Pop(Tr, Tempel);
    P_Push(Tr,Tempel);
    End;
    P_Push(Ebarat, Tempel);
    end;
    {----------------------------------------------------------}
    procedure closep;
    Var
    Tr : Trec;
    a : boolean;
    begin
    a := P_Pop(Tr, Tempel);
    if a then P_Push(Tr,Tempel);
    while (tr.modl <> opp) Do
    Begin
    a := P_Pop(Tr, Tempel);
    if a then P_Push(Tr,Tip);
    {-----------------------------------------}
    P_Pop(Tr, Tempel);
    P_Push(Tr,Tempel);
    End;
    P_Pop(tr, Tempel);
    end;
    {----------------------------------------------------------}
    Procedure Maqos;
    Begin
    Tempel := Nil;
    Rec.Amalgar := '(';Rec.Amalvand := 0; Rec.Modl :=opp; P_Push(Rec,Tempel);

    While P_Pop(Rec,Top) Do
    Begin
    Case Rec.Modl Of
    amal1 : amalgart(rec);
    amal2 : amalgart(rec);
    amal3 : amalgart(rec);
    num : P_Push(Rec, Tip);
    opp : P_Push(Rec, Tempel);
    clp : closep;
    end;
    End;

    End;
    {----------------------------------------------------------}
    function tavan(n1,n2 : longint) : longint;
    Var I, J : LongInt;
    Jig, Natije : Longint;
    begin
    Natije := N1;
    For J := 2 To n2 Do Begin Jig := 0;
    fOR i := 1 tO n1 dO
    Jig := jig + Natije;
    Natije := Jig;
    End;
    Tavan := Trunc(Natije);
    end;
    {----------------------------------------------------------}
    Procedure Mohaseb (N1, N2 : Real;Amal : Char);
    Var Tr : Trec;
    Begin
    Case amal Of
    '+' : Tr.amalvand := N1 + N2;
    '-' : Tr.amalvand := N1 - N2;
    '/' : Tr.amalvand := N1 / N2;
    '*' : Tr.amalvand := N1 * N2;
    '^' : Tr.amalvand := Tavan(Trunc(N1), Trunc(N2));
    End;
    Tr.modl := num;
    tr.amalgar := ' ';
    P_Push(Tr, Tempel);
    End;
    {----------------------------------------------------------}

    Procedure Hesab ;
    var
    num1, num2 : real;
    Tr : TRec;
    Begin
    Tempel := Nil;
    While P_Pop(Rec, Tip) Do
    Begin
    Case Rec.Modl Of
    amal1 : Begin P_Pop(Tr,Tempel);Num2:=Tr.Amalvand;P_Pop(Tr,Tempel );Num1:=Tr.Amalvand;Mohaseb(Num1,Num2,Rec.Amalgar) ;End;
    amal2 : Begin P_Pop(Tr,Tempel);Num2:=Tr.Amalvand;P_Pop(Tr,Tempel );Num1:=Tr.Amalvand;Mohaseb(Num1,Num2,Rec.Amalgar) ;End;
    amal3 : Begin P_Pop(Tr,Tempel);Num2:=Tr.Amalvand;P_Pop(Tr,Tempel );Num1:=Tr.Amalvand;Mohaseb(Num1,Num2,Rec.Amalgar) ;End;
    num : P_Push(Rec, Tempel);
    End;
    End;
    P_Pop(Rec,Tempel);
    EndNum := Rec.Amalvand;
    End;

    {----------------------------------------------------------}


    begin
    Top := Nil;
    Tempel := Nil;
    Tip := Nil;
    {--------------}
    Writeln;
    Write('Enter Ebarat : ');
    readln(Ebarat);
    {ebarat := '312/(25-6)*7^3'; = 5632.4210526}
    {--------------}
    SetData;
    maqos;
    convert(tip);
    hesab;
    writeln('Natije ',ebarat,' = ',endnum :0:20);
    Readln;
    end.




    این فقط جواب رو نشون میده و توان هم داره.
    عبارت تبدیل شده رو نشون نمیده چون اعداد چند رقمی هم قبول میکنه و در کنار هم قرار دادن اعداد چند رقمی نامناسبه.
    البته صحت عبارت رو چک نمیکنه.
    ولی خودم ازش خوشم اومد.
    اگر خواستی بگو یه کاریش کنم عبارت تبدیل شده را هم نشون بده.فوقش با فاصله میشه دیگه.

  5. #5
    کاربر دائمی آواتار Nabi
    تاریخ عضویت
    اسفند 1383
    محل زندگی
    اهواز
    سن
    43
    پست
    121
    سلام
    دست شما درد نکنه
    واقعا زحمت کشیدید.
    ولی همون طور که گفتید عبارت هایی که از حروف استفاده شده رو تبدیل نمیکنه و تنها عبارتهای عددی رو محاسبه میکنه .
    در صورتی که وقت داشتید و زحمتی نیست طوری تغییرش بدید که ابتدا تبدیل برای کارکترهای حروفی رو انجام بده و سپس عدد گذاری و محاسبه کنه ممنونتون میشم .
    بازم متشکرم
    نبی

تاپیک های مشابه

  1. تبدیل infix به postfix
    نوشته شده توسط shahram197070 در بخش VB.NET
    پاسخ: 2
    آخرین پست: دوشنبه 06 فروردین 1386, 11:37 صبح
  2. **برنامه ماشین حساب با استفاده از postfix یا prefix **
    نوشته شده توسط mohammad87 در بخش C#‎‎
    پاسخ: 6
    آخرین پست: سه شنبه 28 آذر 1385, 11:58 صبح
  3. خواهش می کنم... کدی ساده برای تبدیلاتinfix postfix prefix
    نوشته شده توسط amator در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 4
    آخرین پست: سه شنبه 31 خرداد 1384, 11:49 صبح
  4. محاسبه عبارت infix
    نوشته شده توسط ali hashemi در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 0
    آخرین پست: سه شنبه 23 فروردین 1384, 18:57 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •