Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Tính biểu thức hậu tố, sử dụng ký pháp Balan

  1. #1
    Ngày gia nhập
    08 2006
    Nơi ở
    Chương Mỹ-Hà Tây
    Bài viết
    27

    Mặc định Tính biểu thức hậu tố, sử dụng ký pháp Balan

    cac bạn khi nhập vào số phải có khoang trăng ngăn cach nhé:
    ( 3+ 5.6 -6 * - etc)

    Pascal Code:
    1. uses crt;
    2. type mang=array[0..256] of real;
    3. var s:mang;x,y,z :real;tam:char;n,t:integer;
    4.     st:string;ch:char;
    5. procedure push(var s:mang;var t:integer;var x:real);
    6. {khong duoc quen var o day}
    7. begin
    8.     if t>n then writeln(' Stack da day roi')
    9.     else begin
    10.                t:=t+1;
    11.                s[t]:=x;
    12.          end;
    13. end;
    14. procedure pop(var s:mang;var t:integer;var x:real);
    15. {nho la phai co var}
    16. begin
    17.    if t=0 then writeln(' Stack da voi')
    18.    else
    19.        begin
    20.               x:=s[t];
    21.               t:=t-1;
    22.        end;
    23. end;
    24. function ds(ch:string):real;
    25. var tam:real;result:integer;
    26. begin
    27.     val(ch,tam,result);
    28.     ds:=tam;
    29. end;
    30. function kt(ch:char):integer;
    31. var t:integer;
    32. begin
    33.     case ch of
    34.      '+': t:=1;
    35.      '-': t:=2;
    36.      '*': t:=3;
    37.      '/': t:=4;
    38.      else
    39.       t:=0
    40.      end;
    41.    kt:=t;
    42. end;
    43. procedure hauto(s:mang;st:string);
    44. var l,i,j:integer;tam,tam1:string;danhdau:boolean;
    45.     so:real;
    46. begin
    47.    l:=length(st);i:=1; tam:='';danhdau:=false;
    48.   while i<=l do
    49.     begin
    50.       j:=i;
    51.        if ( j<l)and(kt(st[j])=2)then
    52.               danhdau:=true
    53.         else
    54.          begin
    55.           if(kt(st[j])=0)and(st[j]<>#32) then
    56.             begin
    57.              while st[j]<>#32 do
    58.               begin
    59.                  tam:=tam+st[j];j:=j+1;
    60.               end;
    61.  
    62.                 if danhdau=true then
    63.                    begin so:=-ds(tam);danhdau:=false; end
    64.                 else so:=ds(tam);
    65.                 tam:='';
    66.                 push(s,t,so);
    67.             end
    68.           else
    69.           if kt(st[j])<> 0then
    70.                 begin
    71.                   pop(s,t,x);pop(s,t,y);
    72.                   case kt(st[j])of
    73.                   1:z:=x+y;
    74.                   2:z:=-x+y;
    75.                   3:z:=x*y;
    76.                   4:z:=y/x;
    77.                   end;
    78.                   push(s,t,z);
    79.                 end;
    80.           end;
    81.           i:=j+1;
    82.     end;
    83.   pop(s,t,x);writeln('xxxxxxxx:',x:2:2);
    84. end;
    85. begin
    86.  clrscr;
    87.  t:=0;n:=100;
    88.   repeat
    89.    write('ban nhap vao mot chuoi hau to:');readln(st);
    90.    hauto(s,st);
    91.    readln(ch);
    92.   until ch='k';
    93. readln;
    94. end.

  2. #2
    Ngày gia nhập
    04 2007
    Nơi ở
    Ho Chi Minh City
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi tuyetton Xem bài viết
    cac bạn khi nhập vào số phải có khoang trăng ngăn cach nhé:
    ( 3+ 5.6 -6 * - etc)

    Pascal Code:
    1. uses crt;
    2. type mang=array[0..256] of real;
    3. var s:mang;x,y,z :real;tam:char;n,t:integer;
    4.     st:string;ch:char;
    5. procedure push(var s:mang;var t:integer;var x:real);
    6. {khong duoc quen var o day}
    7. begin
    8.     if t>n then writeln(' Stack da day roi')
    9.     else begin
    10.                t:=t+1;
    11.                s[t]:=x;
    12.          end;
    13. end;
    14. procedure pop(var s:mang;var t:integer;var x:real);
    15. {nho la phai co var}
    16. begin
    17.    if t=0 then writeln(' Stack da voi')
    18.    else
    19.        begin
    20.               x:=s[t];
    21.               t:=t-1;
    22.        end;
    23. end;
    24. function ds(ch:string):real;
    25. var tam:real;result:integer;
    26. begin
    27.     val(ch,tam,result);
    28.     ds:=tam;
    29. end;
    30. function kt(ch:char):integer;
    31. var t:integer;
    32. begin
    33.     case ch of
    34.      '+': t:=1;
    35.      '-': t:=2;
    36.      '*': t:=3;
    37.      '/': t:=4;
    38.      else
    39.       t:=0
    40.      end;
    41.    kt:=t;
    42. end;
    43. procedure hauto(s:mang;st:string);
    44. var l,i,j:integer;tam,tam1:string;danhdau:boolean;
    45.     so:real;
    46. begin
    47.    l:=length(st);i:=1; tam:='';danhdau:=false;
    48.   while i<=l do
    49.     begin
    50.       j:=i;
    51.        if ( j<l)and(kt(st[j])=2)then
    52.               danhdau:=true
    53.         else
    54.          begin
    55.           if(kt(st[j])=0)and(st[j]<>#32) then
    56.             begin
    57.              while st[j]<>#32 do
    58.               begin
    59.                  tam:=tam+st[j];j:=j+1;
    60.               end;
    61.  
    62.                 if danhdau=true then
    63.                    begin so:=-ds(tam);danhdau:=false; end
    64.                 else so:=ds(tam);
    65.                 tam:='';
    66.                 push(s,t,so);
    67.             end
    68.           else
    69.           if kt(st[j])<> 0then
    70.                 begin
    71.                   pop(s,t,x);pop(s,t,y);
    72.                   case kt(st[j])of
    73.                   1:z:=x+y;
    74.                   2:z:=-x+y;
    75.                   3:z:=x*y;
    76.                   4:z:=y/x;
    77.                   end;
    78.                   push(s,t,z);
    79.                 end;
    80.           end;
    81.           i:=j+1;
    82.     end;
    83.   pop(s,t,x);writeln('xxxxxxxx:',x:2:2);
    84. end;
    85. begin
    86.  clrscr;
    87.  t:=0;n:=100;
    88.   repeat
    89.    write('ban nhap vao mot chuoi hau to:');readln(st);
    90.    hauto(s,st);
    91.    readln(ch);
    92.   until ch='k';
    93. readln;
    94. end.
    Bạn quên 1 điều cơ bản là : ở đây là cộng đồng Xi Việt àh.

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    16

    có cần phải quote nguyên bài vậy không. C hay pascal cũng đều là lập trình cả thôi mà bạn. Đừng quá khắt khe như vậy. Mình quên hết về pascal rùi nên chắc cũng ko check dc code của bạn. Thanks vì đã share
    nothing is impossible

  4. #4
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Này thì C++ cũng có một bài post tạm. Mà nhìn Pascal chả hiểu cái chi mô gì cả
    C++ Code:
    1. const int max=200;
    2. int ktuutien(char a)
    3. {
    4.     if(a=='-')
    5.     return 0;
    6.     if(a=='+')
    7.     return 0;
    8.    if(a=='*')
    9.     return 1;
    10.    if(a=='/')
    11.     return 1;
    12. }
    13. bool kiemtraso(char a)
    14. {
    15.     if((int(a)>=48&&int(a)<=57)||a=='.')
    16.     return true;
    17.    return false;
    18. }
    19. bool kttoantu(char ch)
    20. {
    21.     if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
    22.     return true;
    23.    return false;
    24. }
    25.  
    26. class stack
    27. {
    28.     char data[max];
    29.     int top;
    30.    public:
    31.     bool isempty()
    32.       {
    33.         return top==-1;
    34.       }
    35.         stack()
    36.       {
    37.             top=-1;
    38.       }
    39.       bool push(const char&a)
    40.       {
    41.         if(top==max)
    42.             return false;
    43.         top++;
    44.         data[top]=a;
    45.          return true;
    46.       }
    47.       bool pop(char&a)
    48.       {
    49.         if(top==-1)
    50.             return false;
    51.          a=data[top];
    52.          top--;
    53.       }
    54.       char get_top()const
    55.       {
    56.         return data[top];
    57.       }
    58.       void print()const
    59.       {
    60.         for(int i=0;i<=top;i++)
    61.             cout<<data[i]<<" ";
    62.       }
    63. };
    64.  
    65. bool toanhang(char a)
    66. {
    67.     if(a>=48&&a<=57)
    68.     return true;
    69.    return false;
    70. }
    71.  
    72. /*********************ham` chuyen tu 1 bieu thuc trung to--->hau to *************/
    73. bool conver(char a[],char b[])
    74. {
    75.     stack k;
    76.    int dem=0;
    77.    for(int i=0;i<strlen(a);i++)
    78.    {
    79.     if(kttoantu(a[i])&&kttoantu(a[i+1]))           ///kiem tra du lieu dau vao`
    80.         return false;
    81.       if((a[i]>=97&&a[i]<=122)||(a[i]>=65&&a[i]<=90))
    82.         return false;
    83.    }
    84.    for(int i=0;i<strlen(a);i++)
    85.    {
    86.     char ch=a[i];
    87.       if(kiemtraso(ch))
    88.       {
    89.         b[dem++]=ch;
    90.          if(kttoantu(a[i+1]))
    91.             b[dem++]=' ';            //dau cach dung de fan biet giua cac so co nhieu` chu so voi nhau
    92.  
    93.       }
    94.       if(ch=='(')
    95.         k.push(ch);
    96.       if(kttoantu(ch))
    97.       {
    98.         if(!k.isempty())
    99.          {
    100.             if((kttoantu(k.get_top()))&&(ktuutien(ch)==ktuutien(k.get_top())||ktuutien(ch)<ktuutien(k.get_top())))                  // cau lenh nay` kiem tra do uu tien giua cac toan tu
    101.             {
    102.                 char m;
    103.                 k.pop(m);
    104.                 b[dem++]=m;
    105.                   k.push(ch);
    106.             }
    107.             else
    108.             {
    109.                 k.push(ch);
    110.             }
    111.          }
    112.          else
    113.             k.push(ch);
    114.       }
    115.         if(ch==')')   // neu fat hien dau ) thi ta pop cho toi khi gap dau '(" thi` dung`
    116.        {
    117.             char d;
    118.             while(1)
    119.             {
    120.                 k.pop(d);
    121.                if(d=='(')
    122.                 break;
    123.                 b[dem++]=d;
    124.             }
    125.          }
    126.    }
    127.  
    128.    // cau lenh nay dung de lay not so toan tu con lai trong stack..................
    129.    while(!k.isempty())
    130.    {
    131.         char m;
    132.       char n;
    133.     k.pop(m);
    134.       b[dem++]=m;
    135.    }
    136.    b[dem]='\0';
    137. }
    138. float doi(char a)
    139. {
    140.     switch(a)
    141.    {
    142.     case '1': return 1;
    143.         case '2': return 2;
    144.     case '3': return 3;
    145.     case '4': return 4;
    146.     case '5': return 5;
    147.       case '6': return 6;
    148.     case '7': return 7;
    149.     case '8': return 8;
    150.     case '9': return 9;
    151.     case '0': return 0;
    152.  }
    153. }
    154.  
    155.  
    156.  
    157. //// ham` bien doi chuoi sang dang so
    158. float biendoi(char a[])
    159. {
    160.     float d=0;
    161.    int n=strlen(a);
    162.    if(strlen(a))
    163.    {
    164.     for(int i=0;i<n;i++)
    165.       {
    166.         if(a[i]=='.')
    167.          {
    168.             int dem=1;
    169.             float bd1=1,bd=0;
    170.  
    171.             for(int j=i+1;j<n;j++)
    172.             {
    173.                 for(int i=0;i<dem;i++)
    174.                 bd1=bd1*10;
    175.                bd=bd+doi(a[j])/bd1;
    176.  
    177.             }
    178.             d=d+bd;
    179.             break;
    180.          }
    181.          else
    182.                 d=d*10+doi(a[i]);
    183.        }
    184.  
    185.        return d;
    186.    }
    187.    return 0;
    188.  
    189. }
    190. float tinhtoan(char pos[])
    191. {
    192.     char ch='\0';
    193.    stack a;
    194.    int dem1=0;
    195.    float data[1000];
    196.    int n=strlen(pos);
    197.     for(int i=0;i<n;)
    198.    {
    199.     char b[100];
    200.       int dem=0;
    201.     while(pos[i]!=' '&&i<n&&!kttoantu(pos[i]))
    202.       {
    203.         b[dem++]=pos[i++];
    204.       }
    205.       if(dem)
    206.       {
    207.         b[dem]='\0';
    208.         data[dem1++]=biendoi(b);
    209.       }
    210.       if(kttoantu(pos[i]))
    211.       {            
    212.             a.push(ch);
    213.                        
    214.          switch(pos[i])
    215.          {
    216.             case '+':
    217.             {
    218.                 float temp=data[dem1-1]+data[dem1-2];
    219.                     data[dem1-2]=temp;
    220.                      dem1--;
    221.             }break;
    222.             case '-':
    223.             {
    224.                 float temp=data[dem1-2]-data[dem1-1];
    225.                     data[dem1-2]=temp;
    226.                      dem1--;
    227.             }break;
    228.             case '*':
    229.             {
    230.                 float temp=data[dem1-1]*data[dem1-2];
    231.                     data[dem1-2]=temp;
    232.                      dem1--;
    233.             }
    234.             break;
    235.             case '/':
    236.             {
    237.                 float temp=data[dem1-2]/data[dem1-1];
    238.                     data[dem1-2]=temp;
    239.                      dem1--;
    240.             }break;
    241.          }
    242.  
    243.       }
    244.    i++;
    245.    }
    246.   return data[0];
    247. }

  5. #5
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Đây là bài tính biểu thức bằng thuật toán kí pháp ba lan mình viết bằng C.Trong đó mình mở rộng để tính được các biểu thức có cả các hàm số sin cos tan, ln lg... và các phép toán giai thừa ,phép tăng giảm với biển kiểu a--,a++,phép gán a=<bieu thuc>.Cho phép tính các biểu thức với các biến với điều kiện các biến đó được gán giá trị trước khi nhập biểu thức.Do mới học lên viết code chưa được pro lắm vì vậy tên một số ham được đặt chưa đúng chuẩn lắm mong mọi người thông cảm.

    C Code:
    1. #include "stdafx.h"
    2. #include <conio.h>
    3. #include <string.h>
    4. #include <malloc.h>
    5. #include <math.h>
    6. #include <ctype.h>
    7. #include <stdlib.h>
    8.  
    9. typedef struct stack_trungto
    10. {  char kt;
    11.    struct stack_trungto *tiep;
    12. }  tt;
    13.  
    14. typedef struct list_hauto
    15. {  char kt[10];
    16.    double bien;
    17.    struct list_hauto *lui;
    18.    struct list_hauto *tiep;
    19. } ht;
    20.  
    21. typedef struct stack_giatribien
    22. { char   tenbien[100];
    23.   double gtr;
    24.   struct stack_giatribien *tiep;
    25. }gtb;
    26. //////////////////////////////////////////////////////////////////////////
    27. const double PI=acos(-1);
    28. typedef char xau[100];
    29. typedef char xau1[256];
    30. tt  *dau1=NULL;
    31. ht  *dau2=NULL;
    32. gtb *dau3=NULL;
    33. int i,j,n,m;
    34. bool stop=true;
    35. //////////////////////////////////////////////////////////////////////////
    36. //Cac ham phuc vu viec tinh bieu thuc.
    37. void pushtt(char x);
    38.  
    39. void pushht(xau x,double var);
    40.  
    41. char pop();
    42.  
    43. char lay();
    44.  
    45. int  dut(char x);
    46.  
    47. void dsbien(xau tenbien,double giatri);
    48.  
    49. int  ktkt(char x);
    50.  
    51. int  ktbien(xau x,gtb **vt);
    52.  
    53. int  ktra(xau x);
    54.  
    55. int  ktbieuthuc(xau1 x);
    56.  
    57. double match(ht *dau);
    58.  
    59. void tinhbieuthuc();
    60.  
    61. double giaithua(double x);
    62.  
    63. //////////////////////////////////////////////////////////////////////////
    64. //////////////////////////////////////////////////////////////////////////
    65. // CAC  HAM DUNG DE PHAN TICH VA TINH BIEU THUC TOAN HOC
    66.  
    67.  
    68. //////////////////////////////////////////////////////////////////////////
    69. // ham dua gia tri vao stack trung to.
    70. void pushtt(char x)
    71. { tt * moi;
    72.     moi=(tt*)malloc(sizeof(tt));
    73.     moi->kt=x;
    74.     moi->tiep=dau1;
    75.     dau1=moi;  
    76. };
    77. //////////////////////////////////////////////////////////////////////////
    78. // ham dua gia tri vao list hau to.
    79.  
    80. void pushht(xau x,double var)
    81. { ht *moi;
    82.  
    83.   if(dau2==NULL)
    84.   { moi=(ht*)malloc(sizeof(ht));
    85.     strcpy(moi->kt,x);
    86.     moi->bien=var;
    87.     moi->tiep=NULL;
    88.     moi->lui =NULL;
    89.     dau2=moi;
    90.   }
    91.   else
    92.   { moi=dau2;
    93.     while(moi->tiep!=NULL)  moi=moi->tiep;
    94.     moi->tiep=(ht*)malloc(sizeof(ht));
    95.     moi->tiep->lui=moi;
    96.     moi=moi->tiep;
    97.     moi->tiep=NULL;
    98.     strcpy(moi->kt,x);
    99.     moi->bien=var;
    100.   };
    101. };
    102.  
    103. //////////////////////////////////////////////////////////////////////////
    104. // ham lay gia tri khoi stack trung to.
    105.  
    106. char pop()
    107. { tt *moi;
    108.   char k;
    109.   moi=dau1;
    110.   dau1=dau1->tiep;
    111.   k=moi->kt;
    112.   free(moi);
    113.   return k;
    114. };
    115. //////////////////////////////////////////////////////////////////////////
    116. // lay gia tri dau tien cua stack trung to ra sanh.
    117. char lay()
    118. { char k;
    119.   k=dau1->kt;
    120.   return k;
    121. };
    122.  
    123. //////////////////////////////////////////////////////////////////////////
    124. // ham xet do uu tien cua toan hang.
    125.  
    126. int dut(char x)
    127. { char k;
    128.   k=x;
    129.   if((k=='+')||(k=='-')||(k==')')) return 1;
    130.   else if((k=='*')||(k=='/')||(k=='^')) return 2;
    131.   else if(k=='(') return 3;
    132.   else return 0;
    133. };
    134.  
    135. //////////////////////////////////////////////////////////////////////////
    136. // dua bien vao danh sach bien.
    137. void dsbien(xau tenbien,double giatri)
    138. { gtb *moi;
    139.  
    140.   moi=(gtb*)malloc(sizeof(gtb));
    141.   strcpy(moi->tenbien,tenbien);
    142.   moi->gtr=giatri;
    143.   if(dau3==NULL)
    144.   { moi->tiep=NULL;
    145.     dau3=moi;
    146.   }
    147.   else
    148.   { moi->tiep=dau3;
    149.     dau3=moi;
    150.   };
    151.  
    152. };
    153. //////////////////////////////////////////////////////////////////////////
    154. // ham kiem tra xem bien nhap vao co hop le hay khong?
    155.  int ktbien(xau x,gtb **vt)
    156.  {  gtb *pp;
    157.     int k;
    158.      k=0;
    159.      if(dau3==NULL) k=0;
    160.      else
    161.      {  pp=dau3;
    162.         while(pp!=NULL)
    163.         { if(strcmp(pp->tenbien,x)==0)
    164.           { k=1;
    165.             *vt=pp;
    166.           }
    167.             pp=pp->tiep;
    168.         };
    169.      };
    170.      return k;
    171.  };
    172.  
    173.  //////////////////////////////////////////////////////////////////////////
    174. //ham kiem tra ki tu.
    175. int ktkt(char x)
    176. { int d;
    177.   d=x;
    178.   if(((d>=65)&&(d<=90))||((d>=97)&&(d<=122))||((d>=48)&&(d<=57))||(d==46)) return 1;
    179.   else if((d==33)||(d==37)||((d>=40)&&(d<=43))||((d==45)||(d==47))||(d==94)||(d==32)||(d==61)) return 2;
    180.   else return 0;
    181. };
    182. //////////////////////////////////////////////////////////////////////////
    183.  
    184. // ham kiem tra bieu thuc nhap vao co hop le hay khong?
    185.  
    186. int ktbieuthuc(xau1 x)
    187. { int k,m,i,l,j,d,t,y,b,h,v,z,p;
    188.   xau tg;
    189.   m=strlen(x);
    190.   k=0;l=0;i=0;b=0;z=0;
    191.   while((i<=m-1)&&(l>=0))
    192.   {
    193.      if(ktkt(x[i])==0)  return 0;
    194.      while((x[i]==' ')&&(i<=m-1)) i=i+1;
    195.      if((ktkt(x[i])==2)&&(x[i]!='(')&&(x[i]!=')'))
    196.      {
    197.          for(k=0;k<=m-1;k++) if(ktkt(x[k])==1) z=1;
    198.           if(z==0) return 0;
    199.           k=0;
    200.        while((ktkt(x[i])==2)&&(i<=m-1)&&(x[i]!='(')||(x[i]=='.'))
    201.        {  if(ktkt(x[i])==0) return 0;
    202.           tg[k]=x[i];
    203.           k=k+1;
    204.           i=i+1;
    205.        }; tg[k]='\0';
    206.        if(k>1) return 0;
    207.      
    208.        if((k==1)&&(tg[0]!='+')&&(tg[0]!='-')&&(tg[0]=='.')) return 0;
    209.      };
    210.      if(x[i]=='(')
    211.      {  l=l+1;
    212.         j=i+1;
    213.         while((x[j]==' ')&&(j<=m-1)) j=j+1;
    214.         if(x[j]==')') return 0;
    215.         if(x[j]=='.') return 0;
    216.         if(j==m) return 0;
    217.         if(ktkt(x[j])==2)
    218.         {
    219.           if(j==m-1) return 0;
    220.             k=0;
    221.           while((j<=m-1)&&(ktkt(x[j])==2)&&(x[j]!='(')&&(x[j]!=')')||(x[j]=='.'))
    222.           {
    223.             if(ktkt(x[j])==0)return 0;
    224.             if(x[j]=='.') return 0;  
    225.               tg[k]=x[j];
    226.               k=k+1;
    227.               j=j+1;
    228.           }; tg[k]='\0';
    229.           while((x[j]==' ')&&(j<=m-1)) j=j+1;
    230.           if(j==m) return 0;
    231.           if(k>1) return 0;
    232.           if((tg[0]!='+')&&(tg[0]!='-')&&(k!=0)) return 0;
    233.         };
    234.          i=j;
    235.      };
    236.      
    237.      if(x[i]==')')
    238.      {   l=l-1;
    239.          j=i+1;
    240.       while((x[j]==' ')&&(j<=m-1)) j=j+1;
    241.       if((ktkt(x[j])==1)||(x[j]=='(')) return 0;
    242.       else if(x[j]!=')')
    243.       { k=0;
    244.         if((j==m-1)&&(x[j]!='!')) return 0;
    245.         while((ktkt(x[j])==2)&&(j<=m-1)&&(x[j]!='(')&&(x[j]!=')')||(x[j]=='.'))
    246.         {  
    247.             if(ktkt(x[j])==0) return 0;
    248.             tg[k]=x[j];
    249.             k=k+1;
    250.             j=j+1;
    251.         }; tg[k]='\0';
    252.         while((x[j]==' ')&&(j<=m-1)) j=j+1;
    253.         if((j==m)&&(k!=0)&&(tg[0]!='!')) return 0;
    254.         if(k>3) return 0;
    255.         else
    256.         {
    257.           if(k==2)
    258.           { if(tg[1]=='!') return 0;
    259.             if((tg[1]!='+')&&(tg[1]!='-')) return 0;
    260.           };
    261.           if(k==3)
    262.           { if(tg[0]!='!') return 0;
    263.             else if((tg[1]=='!')||((tg[2]!='+')&&(tg[2]!='-'))) return 0;
    264.             else return 0;
    265.          
    266.           };
    267.         };
    268.        
    269.       };
    270.       i=j;
    271.  
    272.      };
    273.      
    274.      if(ktkt(x[i])==1)
    275.      {  
    276.         j=i-1;
    277.         k=0;
    278.        
    279.         while((ktkt(x[i])==1)&&(i<=m-1)||(x[i]=='.'))
    280.         {  tg[k]=x[i];
    281.            k=k+1;
    282.            i=i+1;
    283.         };
    284.            tg[k]='\0';  
    285.          
    286.         if((strcmp(tg,"sin")==0)||(strcmp(tg,"cos")==0)||(strcmp(tg,"tan")==0)||(strcmp(tg,"acsin")==0)||(strcmp(tg,"accos")==0)||(strcmp(tg,"actan")==0)||(strcmp(tg,"sqrt")==0)||(strcmp(tg,"ln")==0)||(strcmp(tg,"lg")==0)||(strcmp(tg,"exp")==0)||(strcmp(tg,"abs")==0))       
    287.         {  b=b+1;
    288.           while((x[i]==' ')&&(i<=m-1)) i=i+1;
    289.           if(ktkt(x[i])==0) return 0;
    290.           if(i==m) return 0;
    291.           if(x[i]=='.') return 0;
    292.           if((ktkt(x[i])==2)&&(x[i]!='+')&&(x[i]!='-')&&(x[i]!='(')) return 0;
    293.         }
    294.        
    295.         else
    296.         {  
    297.            k=0;h=0;v=strlen(tg);
    298.            while(k<=v-1)
    299.            { if((isdigit(tg[k])!=0)||(tg[k]=='.'))
    300.              { if(tg[k]=='.') h=h+1;
    301.                k=k+1;
    302.              }
    303.              else break;
    304.            };
    305.            if((h==1)&&(x[i-1]=='.')&&( (x[i]=='(')||(x[i]==')')||(ktkt(x[i])==2)||(i==m))) return 0;
    306.            if(h>1) return 0;
    307.            k=0; h=0;
    308.            if(isdigit(tg[k])==0)
    309.               for(k=0;k<=m-1;k++) if(tg[k]=='.') h=h+1;
    310.               if(h!=0) return 0;
    311.            b=b+1;
    312.            p=0;
    313.            while((x[i]==' ')&&(i<=m-1)) { i=i+1; p=p+1;};
    314.          
    315.            y=0;
    316.            while((x[i]=='.')||((ktkt(x[i])!=1)&&(i<=m-1)&&(x[i]!='(')&&(x[i]!=')')))
    317.            {  
    318.               if(x[i]!=' ')
    319.               { if(ktkt(x[i])==0) return 0;
    320.                 if(x[i]=='.') return 0;
    321.                 if((x[i]=='=')&&((b>1)||(y!=0))) return 0;
    322.                 tg[y]=x[i];
    323.                 y=y+1;
    324.               };
    325.               i=i+1;
    326.            };
    327.            if(x[i]=='.') return 0;  
    328.            tg[y]='\0';
    329.            if((p!=0)&&(y==0)&&(x[i]!=')')&&(i!=m) )return 0;             
    330.            if(y>4) return 0;
    331.            
    332.            if((y<=4)&&(y!=0))
    333.            {
    334.               if((tg[0]=='=')&&(strlen(tg)>1))
    335.               { if(strlen(tg)>2) return 0;
    336.                 else if((tg[1]!='+')&&(tg[1]!='-'))  return 0;
    337.               };
    338.               if(tg[0]=='!')
    339.               {   if(y>3)  return 0;
    340.                   if((y==2)&&(tg[1]=='!')) return 0;
    341.                   if((y==3)&&(tg[2]!='+')&&(tg[2]!='-')||(tg[1]=='!')) return 0;
    342.               };
    343.              
    344.               if((tg[0]!='!')&&(y==1)&&((x[i]==')')||(i==m))) return 0;
    345.               if(((i==m)||(x[i]==')'))&&(ktkt(x[i])!=1)&&(y>=2))
    346.               { if(y>2) return 0;
    347.                 if((tg[0]!='+')&&(tg[0]!='-')) return 0;
    348.                 if(((tg[0]=='+')||(tg[0]=='-'))&&(tg[1]!=tg[0])) return 0;
    349.               };    
    350.               if(((ktkt(x[i])==1)||(x[i]=='('))&&(y>1))
    351.               { if((tg[0]=='*')||(tg[0]=='/')||(tg[0]=='^'))
    352.                 { if(y>2) return 0;
    353.                   else if((ktkt(tg[1])==2)&&(tg[1]!='+')&&(tg[1]!='-')) return 0;
    354.                 };
    355.                 if(tg[0]=='+')
    356.                 { if((tg[1]=='-')&&(y>2)) return 0;
    357.                   d=strlen(tg);
    358.                   if((tg[1]=='+')&&(d>2))
    359.                   {
    360.                     if((d==4)&&(tg[3]!='+')&&(tg[3]!='-')) return 0;
    361.                   }
    362.                   else
    363.                   {
    364.                     for(t=1;t<=d-1;t++)
    365.                     if((tg[t]!='+')&&(tg[t]!='-')) return 0;
    366.                   };
    367.                 };
    368.                 if(tg[0]=='-')
    369.                 {
    370.                   if((tg[1]=='+')&&(y>2)) return 0;
    371.                   if((tg[1]=='-')&&(d>2))
    372.                   {
    373.                      if((d==4)&&(tg[3]!='+')&&(tg[3]!='-')) return 0;
    374.                   }
    375.                   else
    376.                   {
    377.                      for(t=1;t<=d-1;t++)
    378.                      if((tg[t]!='+')&&(tg[t]!='-')) return 0;
    379.                   };
    380.                 };   
    381.            
    382.               };
    383.        
    384.            };
    385.  
    386.         };
    387.  
    388.      };  
    389.      
    390.   };
    391.    if((l!=0)||(l<0)) return 0;
    392.    
    393.    return 1;
    394. };
    395. //////////////////////////////////////////////////////////////////////////
    396. // kiem tra xem xau X la ham hay toan hang ?
    397.  
    398. int ktra(xau x)
    399. {
    400.   if((strcmp(x,"+")==0)||(strcmp(x,"-")==0)||(strcmp(x,"*")==0)||(strcmp(x,"/")==0)||(strcmp(x,"^")==0)) return 1;
    401.   else if((strcmp(x,"sin")==0)||(strcmp(x,"cos")==0)||(strcmp(x,"tan")==0)||(strcmp(x,"acsin")==0)||(strcmp(x,"accos")==0)||(strcmp(x,"actan")==0)||(strcmp(x,"ln")==0)||(strcmp(x,"lg")==0)||(strcmp(x,"sqrt")==0)||(strcmp(x,"exp")==0)||(strcmp(x,"!")==0)) return 2;
    402.   else return 0;
    403. };
    404. //////////////////////////////////////////////////////////////////////////
    405. // ham tinh giai thua .
    406. double giaithua(double x)
    407. {double y,t;
    408.  
    409.   if(x==0) return 1;
    410.   t=0;y=1;
    411.   while(t<x)
    412.   { t=t+1;
    413.     y=y*t;
    414.   };
    415.   return y;
    416. };
    417.  
    418. //////////////////////////////////////////////////////////////////////////
    419. // ham phan tich bieu thuc
    420.  
    421. void tinhbieuthuc()
    422. {   tt *p;
    423.     ht *p1,*truocp;
    424.     gtb *vt;
    425.     bool g,pi;
    426.     char gan[100],tg[100],bt[256];
    427.     int l,j,k,t,s;
    428.     double var,c;
    429.    
    430. while((strcmp(bt,"exit")!=0)&&(strcmp(bt,"EXIT")!=0))
    431.   {
    432.      printf("\n > ");
    433.      gets(bt);
    434.      fflush(stdin);
    435.    
    436.  
    437.     n=strlen(bt);
    438.     i=0;s=1;
    439.     if(ktbieuthuc(bt)==0) printf("\n bieu thuc toan hoc nhap sai !");
    440.     else if((strcmp(bt,"exit")!=0)&&(strcmp(bt,"EXIT")!=0))
    441.     {   m=0; g=false;
    442.  
    443.     while(i<=n-1)
    444.     {  
    445.        while((bt[i]==' ')&&(i<=n-1)) i=i+1;
    446.        if(ktkt(bt[i])==1)
    447.        {  l=0;
    448.           while(ktkt(bt[i])==1)
    449.           {  tg[l]=bt[i];
    450.              l=l+1;
    451.              i=i+1;
    452.           }; tg[l]='\0';
    453.           while((bt[i]==' ')&&(i<=n-1)) i=i+1;
    454.          // kiem tra xem co phai la ham khong.
    455.        
    456.           if(strcmp(tg,"sin")==0)  
    457.           {   pushtt(' ');
    458.               while(l>0)
    459.               { l=l-1;
    460.                 pushtt(tg[l]);
    461.               };
    462.              m=m+1;
    463.           }
    464.           else if(strcmp(tg,"cos")==0)  
    465.           {   pushtt(' ');
    466.               while(l>0)
    467.               { l=l-1;
    468.                 pushtt(tg[l]);
    469.               };
    470.              m=m+1;
    471.           }
    472.           else if(strcmp(tg,"tan")==0)  
    473.           {   pushtt(' ');
    474.               while(l>0)
    475.               {  l=l-1;
    476.                 pushtt(tg[l]);
    477.               };
    478.              m=m+1;
    479.           }
    480.          
    481.           else if(strcmp(tg,"ln")==0)  
    482.           {   pushtt(' ');
    483.               while(l>0)
    484.               { l=l-1;
    485.                 pushtt(tg[l]);
    486.               };
    487.             m=m+1;
    488.           }
    489.           else if(strcmp(tg,"lg")==0)  
    490.           {   pushtt(' ');
    491.               while(l>0)
    492.               { l=l-1;
    493.                 pushtt(tg[l]);
    494.               };
    495.             m=m+1;
    496.           }
    497.           else if(strcmp(tg,"sqrt")==0)  
    498.           {   pushtt(' ');
    499.               while(l>0)
    500.               { l=l-1;
    501.                 pushtt(tg[l]);
    502.               };
    503.               m=m+1;
    504.           }
    505.           else if(strcmp(tg,"accos")==0)  
    506.           {   pushtt(' ');
    507.               while(l>0)
    508.               { l=l-1;
    509.                 pushtt(tg[l]);
    510.               };
    511.               m=m+1;
    512.           }
    513.           else if(strcmp(tg,"acsin")==0)  
    514.           {   pushtt(' ');
    515.               while(l>0)
    516.               { l=l-1;
    517.                 pushtt(tg[l]);
    518.               };
    519.               m=m+1;
    520.           }
    521.           else if(strcmp(tg,"actan")==0)  
    522.           {   pushtt(' ');
    523.               while(l>0)
    524.               { l=l-1;
    525.                 pushtt(tg[l]);
    526.               };
    527.               m=m+1;
    528.           }
    529.           else if(strcmp(tg,"exp")==0)  
    530.           {   pushtt(' ');
    531.               while(l>0)
    532.               { l=l-1;
    533.                 pushtt(tg[l]);
    534.               };
    535.               m=m+1;
    536.           }
    537.           else if(strcmp(tg,"abs")==0)  
    538.           {   pushtt(' ');
    539.               while(l>0)
    540.               { l=l-1;
    541.                 pushtt(tg[l]);
    542.               };
    543.               m=m+1;
    544.           }
    545.          
    546.           else
    547.           {   // dua bien vao day hau to.
    548.                  
    549.                  k=0;l=0;t=strlen(tg);
    550.            
    551.               // kiem tra xem neu la so thi dua luon vao hau to.     
    552.                if(strcmp(tg,"PI")==0)
    553.                { pushht("0",PI);
    554.                    m++;
    555.                }
    556.                  while(l<=t-1)
    557.                    { if((isdigit(tg[l])!=0)||(tg[l]=='.')) l=l+1;
    558.                      else
    559.                      { k=1;
    560.                        break;
    561.                      };
    562.                    };
    563.                  if(k==0)
    564.                  { while((bt[i]==' ')&&(i<=n-1)) i=i+1;
    565.                    if(bt[i]=='=')
    566.                    {  printf("\n hang so khong duoc gan");
    567.                       s=0;
    568.                       break;
    569.                    }  
    570.                    var =atof(tg);
    571.                    k=0;j=i;
    572.                    while((ktkt(bt[j])==2)&&(j<=n-1)&&(bt[j]!='(')&&(bt[j]!=')'))
    573.                    { if(k==3) i=j-1;
    574.                        if(bt[j]!=' ')
    575.                        { tg[k]=bt[j];
    576.                             k=k+1;
    577.                        };
    578.                         j=j+1;
    579.                    };tg[k]='\0';
    580.                    // Kiem tra toan tu tang giam ++ ,--
    581.  
    582.                        if(k>2)
    583.                        { printf("\n khong duoc thay doi gia tri hang so");
    584.                          s=0;
    585.                          break;
    586.                        };  
    587.                        while((j<=n-1)&&(bt[j]==' ')) j=j+1;
    588.                        if((k==2)&&((bt[j]==')')||(j==n)))
    589.                        { i=j;
    590.                          printf("\n khong duoc thay doi gia tri hang so");
    591.                          s=0;
    592.                          break;
    593.                        };
    594.                  
    595.                    pushht("0",var);
    596.                    m=m+1;
    597.                  }
    598.                  else
    599.                  {
    600.                    while((bt[i]==' ')&&(i<=n-1)) i=i+1;
    601.                    if(bt[i]=='=')  // xu ly voi toan tu gan .
    602.                    {
    603.                      if(strcmp(tg,"PI")==0)
    604.                      {printf("\n PI la hang so");
    605.                       s=0;
    606.                       break;
    607.                      }
    608.                      else
    609.                      { i=i+1;
    610.                        g=true;
    611.                        strcpy(gan,tg);
    612.                      }
    613.                    }
    614.                    else
    615.                    { // Kiem tra bien nhap vao co trong danh sach bien hay khong,neu co thi dua gia tri vao day hau to.
    616.                      if((ktbien(tg,&vt)!=0)||(strcmp(tg,"PI")==0))
    617.                      {   k=0;j=i;
    618.                         if(strcmp(tg,"PI")==0) pi=false;
    619.                         else pi=true;
    620.                         while((ktkt(bt[j])==2)&&(j<=n-1)&&(bt[j]!='(')&&(bt[j]!=')'))
    621.                         { if(k==3) i=j-1;
    622.                           if(bt[j]!=' ')
    623.                           { tg[k]=bt[j];
    624.                             k=k+1;
    625.                           };
    626.                            j=j+1;
    627.                         };tg[k]='\0';
    628.                         if(pi==true)var=vt->gtr;
    629.                      // Kiem tra toan tu tang giam ++ ,--
    630.                         if(k>2)
    631.                         { if(pi==false)
    632.                           {printf("\n PI la hang so");
    633.                             s=0;
    634.                             break;
    635.                           }
    636.                           if((tg[0]=='+')&&(tg[1]=='+')) var=var+1;
    637.                           if((tg[0]=='-')&&(tg[1]=='-')) var=var-1;
    638.                         };
    639.                         while((i<=n-1)&&(bt[i]==' ')) i=i+1;
    640.                         if((k==2)&&((bt[j]==')')||(j==n)))
    641.                         { if(pi==false)
    642.                           {printf("\n PI la hang so");
    643.                            s=0;
    644.                            break;
    645.                           }
    646.                           i=j;
    647.                           if(tg[0]=='+') var=var+1;
    648.                           if(tg[0]=='-') var=var-1;
    649.                           if(pi==true) vt->gtr=var;
    650.                         };
    651.                         if(pi==true)pushht("0",var);
    652.                         if(pi==true) m=m+1;
    653.                     }
    654.                     else
    655.                     { printf("\n bien chua khai bao");
    656.                       s=0;
    657.                       break;
    658.                     };
    659.                    }
    660.                   };
    661.             // xu  ly toan hang mot ngoi (vd sin -a).
    662.              if((dau1!=NULL)&&((lay()=='/')||(lay()=='*')))
    663.              {  p=dau1->tiep;
    664.                 if((p!=NULL)&&(ktkt(p->kt)==1))
    665.                 { tg[0]=pop();
    666.                   tg[1]='\0';
    667.                   pushht(tg,1);
    668.                  };
    669.              };
    670.              // kiem tra neu co ham trong day trung to thi dua vao.
    671.              
    672.              while((dau1!=NULL)&&(ktkt(lay())==1))
    673.              { l=0;
    674.                while(lay()!=' ')
    675.                { tg[l]=pop();
    676.                  l=l+1;
    677.                };
    678.                  tg[l]='\0';
    679.                  pushht(tg,1);
    680.                  if(lay()==' ') dau1=dau1->tiep;
    681.              };
    682.           };
    683.     }
    684.  
    685.     else
    686.     {  
    687.        // xu ly voi phep tinh giai thua.
    688.         if(bt[i]=='!')
    689.         { p1=dau2;
    690.           while(p1!=NULL)
    691.           {truocp=p1;
    692.            p1=p1->tiep;
    693.           }
    694.           if(truocp->lui!=NULL)
    695.           if(((strcmp(truocp->lui->kt,"*")==0)&&(truocp->lui->lui->bien==-1))||(truocp->lui->bien==-1))
    696.           {printf("\n loi sai gia tri");
    697.            s=0;
    698.            break;
    699.           }
    700.           pushht("!",1);
    701.           i=i+1;
    702.           m=m+1;
    703.         };
    704.         // kiem tra xem toan hang co phai la toan hang mot ngoi khong
    705.        
    706.         if((bt[i]=='-')||(bt[i]=='+'))
    707.         {
    708.             if(i==0) j=i;
    709.             if((i>0)&&(bt[i]!=')')&&(bt[i])!='(')    j=i-1;
    710.             if((i<n-1)&&(bt[i]!='(')&&(bt[i]!=')'))  k=i+1;
    711.                    
    712.             while((bt[j]==' ')&&(j>=0))        j=j-1;  
    713.             while((bt[k]==' ')&&(k<=n-1))      k=k+1;
    714.            
    715.             // xu ly toan hang mot ngoi dang a*-b...
    716.             if((bt[j]=='*')||(bt[j]=='/'))
    717.             {    if(bt[i]=='-')
    718.                  {pushht("0",-1);
    719.                   m=m+1;
    720.                  }
    721.                  else
    722.                  {pushht("0",1);
    723.                   m=m+1;
    724.                  };
    725.                  
    726.                  // dua toan hang * hoac / vao hau to.
    727.                  tg[0]=bt[j];
    728.                  tg[1]='\0';
    729.                  pushht(tg,1);
    730.                  i=i+1;
    731.             };
    732.            
    733.             // xu ly toan hang mot ngoi dang a+-b,-(a+b...),sin -a...
    734.  
    735.             if((j==-1)||(bt[j]=='=')||(bt[j]=='+')||(bt[j]=='-')||(bt[j]=='(')||(bt[j]=='^')||((dau1!=NULL)&&(ktkt(lay())==1)))
    736.             {    if(bt[i]=='-')
    737.                  {pushht("0",-1);
    738.                   m=m+1;
    739.                  }
    740.                  else  
    741.                  {pushht("0",1);
    742.                   m=m+1;
    743.                  };
    744.                  pushtt('*');
    745.                  i=i+1;
    746.             };
    747.         };
    748.         // truong gap toan hang dong ngoac tien hanh dua cac toan hang con lai trong day trung to den khi gap toan hanh '('.
    749.         if((bt[i]!=')')&&(ktkt(bt[i])!=1))
    750.         { if((dau1!=NULL)&&(ktkt(lay())==2)&&(dut(bt[i])<=dut(lay()))&&(lay()!='('))
    751.             { tg[0]=pop();
    752.               tg[1]='\0';
    753.               pushht(tg,1);
    754.             };         
    755.             pushtt(bt[i]);
    756.             i=i+1;
    757.         };
    758.         if(bt[i]==')')
    759.         {   i=i+1;
    760.             while(lay()!='(')
    761.             {    tg[0]=pop();
    762.                  tg[1]='\0';
    763.                  pushht(tg,1);
    764.             };
    765.             if(dau1->tiep!=NULL)   dau1=dau1->tiep;
    766.            
    767.             // xu ly dang bieu thuc co dang -(a+b...)
    768.  
    769.             if((lay()=='/')||(lay()=='*'))
    770.             {   p=dau1->tiep;
    771.                 if((p!=NULL)&&(ktkt(p->kt)==1))
    772.                 { tg[0]=pop();
    773.                   tg[1]='\0';
    774.                   pushht(tg,1);
    775.                 };
    776.             };
    777.             // kiem tra bieu thuc co thuoc ham hay khong ,neu co ham trong day trung to thi dua ham vao day hau to.
    778.            
    779.             while((dau1!=NULL)&&(ktkt(lay())==1))
    780.              { l=0;
    781.                while(lay()!=' ')
    782.                { tg[l]=pop();
    783.                  l=l+1;
    784.                };
    785.                  tg[l]='\0';
    786.                  pushht(tg,1);
    787.                  
    788.                if(lay()==' ') dau1=dau1->tiep;
    789.             }; if((dau1!=NULL)&&(lay()==' ')) dau1=dau1->tiep;
    790.         };  
    791.       };
    792.          
    793.          while((dau1!=NULL)&&(i>n-1))
    794.          {   tg[0]=pop();
    795.              tg[1]='\0';
    796.              pushht(tg,1);    
    797.          };
    798.    
    799.     }; 
    800.        
    801.    };
    802.        // truong hop trong qua trinh xu ly phat hien bieu thuc bi sai ,sau do phai tien hanh giai phong day hau to va trung to
    803.        if(s==0)
    804.         { p1=dau2;
    805.           while(p1!=NULL)
    806.           { dau2=p1;
    807.             p1=p1->tiep;
    808.             free(dau2);
    809.           };
    810.           p=dau1;
    811.           while(p!=NULL)
    812.           { dau1=p;
    813.             p=p->tiep;
    814.             free(dau1);
    815.           };
    816.           dau1=NULL;
    817.           dau2=NULL;
    818.         };
    819.         // tien hanh tinh toan voi day hau to duoc tao ra.Dung ket qua tinh duoc hoac de hien thi hoac de dung de giai pt va hpt
    820.         if((m!=0)&&(dau2!=NULL)&&(s!=0))
    821.         { c=match(dau2);
    822.          if(stop==true)
    823.          { printf("\n %-100.8f",c);
    824.            // gan gia tri tim duoc cho bien muon gan
    825.            if(g==true)
    826.            { if(ktbien(gan,&vt)==0)
    827.              {  var=c;
    828.                 dsbien(gan,var); // truong bien chua co!
    829.              }
    830.              else vt->gtr=c;  // truong hop bien da co trong danh sach.
    831.            };
    832.          }
    833.          else  printf("\n loi sai gia tri!");
    834.    
    835.         };
    836.    
    837.  
    838. };
    839.  
    840. };
    841. //////////////////////////////////////////////////////////////////////////
    842. // ham tinh toan day hau to.
    843. double match(ht * dau)
    844. {  ht *p,*p1,*p2,*d=dau,*q1,*truocq;
    845.    tt *q2;
    846.    xau s;
    847.    int v1,v2,k;
    848.    double var,a,b,x;
    849.  
    850.    stop= true;
    851.    k=1;
    852.    if(m==1) var=dau->bien;
    853.    p=dau;
    854.    while(m>1)
    855.    {  v1=0;
    856.       v2=0;
    857.       while((p!=NULL)&&(ktra(p->kt)==0)) p=p->tiep;
    858.       if((p!=NULL)&&(ktra(p->kt)==1))
    859.       { strcpy(s,p->kt);
    860.         p1=p->lui;
    861.         b=p1->bien;
    862.         p2=p1->lui;
    863.         a=p2->bien;
    864.         if(strcmp(s,"+")==0) var=a+b;
    865.         if(strcmp(s,"-")==0) var=a-b;
    866.         if(strcmp(s,"*")==0) var=a*b;
    867.         if(strcmp(s,"/")==0)
    868.         { if(b!=0) var=a/b;
    869.           else
    870.           { stop=false;
    871.             break;
    872.           };
    873.         };
    874.         if(strcmp(s,"^")==0) var=pow(a,b);
    875.         p2->bien=var;
    876.         p2->tiep=p->tiep;
    877.         if(p->tiep!=NULL) p->tiep->lui=p2;
    878.         free(p1);
    879.         free(p);
    880.         p=p2;
    881.         m=m-1;
    882.      
    883.       };
    884.       if((p!=NULL)&&(ktra(p->kt)==2))
    885.       { strcpy(s,p->kt);
    886.         p1=p->lui;
    887.         a=p1->bien;
    888.        
    889.         if(strcmp(s,"sin")==0) var=sin(a);
    890.         if(strcmp(s,"cos")==0) var=cos(a);
    891.         if(strcmp(s,"tan")==0) var=tan(a);
    892.         if(strcmp(s,"acsin")==0)
    893.         {   if(a<=1) var=asin(a);
    894.             else
    895.             { stop=false;
    896.               break;
    897.             };
    898.         };
    899.         if(strcmp(s,"accos")==0)
    900.         {if(a<=1) var=acos(a);
    901.             else
    902.             { stop=false;
    903.               break;
    904.             };
    905.         };
    906.         if(strcmp(s,"actan")==0) var=atan(a);
    907.         if(strcmp(s,"ln")==0)
    908.         { if(a>0) var=log(a);
    909.           else
    910.           { stop=false;
    911.             break;
    912.           };
    913.         };
    914.         if(strcmp(s,"lg")==0)
    915.         { if(a>0) var=log10(a);
    916.           else
    917.           { stop=false;
    918.             break;
    919.           };
    920.         }; 
    921.         if(strcmp(s,"sqrt")==0)
    922.         { if(a>=0)  var=sqrt(a);
    923.           else
    924.           { stop=false;
    925.             break;
    926.           };
    927.         };
    928.         if(strcmp(s,"exp")==0) var=exp(a);
    929.         if(strcmp(s,"abs")==0)
    930.         { if(a<0) var=-a;
    931.           else var=a;
    932.         };
    933.         if(strcmp(s,"!")==0)
    934.         { x=1; q1=p;
    935.           while(q1!=NULL)
    936.           { truocq=q1;
    937.             q1=q1->lui;
    938.           }
    939.           while((a>1)&&(x<a)) x++; 
    940.           if((a<1)||(x>a)||(a>120))
    941.           {stop=false;
    942.             break;
    943.           }
    944.           else var=giaithua(a);
    945.         }
    946.         p1->bien=var;
    947.         p1->tiep=p->tiep;
    948.         if(p->tiep!=NULL) p->tiep->lui=p1;
    949.         free(p);
    950.         p=p1;
    951.         m=m-1;
    952.       };
    953.     };
    954.           q1=dau2;
    955.           while(q1!=NULL)
    956.           { dau2=q1;
    957.             q1=q1->tiep;
    958.             free(dau2);
    959.           };
    960.           q2=dau1;
    961.           while(q2!=NULL)
    962.           { dau1=q2;
    963.             q2=q2->tiep;
    964.             free(dau1);
    965.           };
    966.           dau1=NULL;
    967.           dau2=NULL;
    968.    
    969.       if(stop==true) return var;
    970.       else return 1;
    971.      
    972.  
    973. };
    974. main()
    975. {
    976.   tinhbieuthuc();
    977.   getch();
    978.   return 0;
    979. }

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    1

    Mặc định Tính biểu thức hậu tố, sử dụng ký pháp Balan

    Ôi các đại ca tốt quá em đang cần tìm hiểu mấy bài này!

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    2

    Tớ cũng đang làm đề tài về bài toán kí pháp Ba Lan.Yêu cầu của bài là đưa biểu thức đã cho vào trong cây nhị phân.Tớ đã làm rồi nhưng còn vướng một chỗ là: đối với phép ' - ' một ngôi tớ không biết giải quyết để phân biệt được với phép ' - ' hai ngôi khi vẽ thành cây nhị phân.Tớ đã cho nó thành phép toán 2 ngôi bằng cách lấy 0 trừ đi,nhưng thầy tớ không chấp nhận.Vậy ai có cách giúp tớ giải quyết được không?Tớ cảm ơn trước nha.Sắp đến hạn tớ phải nộp bài rùi............

  8. #8
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Có nhiều cách giải quết khó khăn này.Tớ thì coi đó như một trường hợp riêng của -1*a hoặc +1*a với những toán hạng một ngôi như +a hay -a,-(bieuthuc).Làm như thế thì phải đảm bảo khi đưa vào hậu tố không làm thay đổi trật tự.Muốn vậy tớ chia làm hai trường hợp:
    +Đối với những trương hợp như a+-b;a++b;a+-(bieuthuc)...;sau khi đưa a vào hậu tố ,rồi dấu "+" thứ nhất vào trung tố tớ đưa -1 vào hậu tố đồng thời đưa dấu " * " vào trung tố (nghĩa là sau đó chuyển về dạng a+-1*b)
    +Đối với những trường hơp như a*-b,a*-(bieuthuc)... thì sau khi đưa dấu "*" vào trung tố tớ đưa -1 vào hậu tố ngay sau đó đưa"*" vào hậu tố(nghĩa là sau đó đưa về dạng a*-1*b)
    Bạn thử cách này xem sao.Tất nhiên là còn nhiều cách khác .Hy vong với cách này thầy giáo bạn chấp nhận.

  9. #9
    Ngày gia nhập
    11 2007
    Bài viết
    2

    Tớ cảm ơn ban Nghĩa nha.Để tớ làm thử xem.À,tớ còn một vấn đề nữa,là tớ vẽ cây nhưng khi nhập biểu thức dài quá thì các node lại vẽ chồng lên nhau.Tớ có đọc đoạn code của lớp đàn anh nhưng phức tạp quá hổng hỉu gì hết.Ai có cách nào dễ hiểu giúp tớ giải quyết vẽ các node không trùng nhau khi nhập vào dãy biểu thức dài được không?Tớ cảm ơn nhìu nhìu nha.

  10. #10
    Ngày gia nhập
    03 2008
    Bài viết
    1

    mình có 1 bài thầy giáo cho:""viết giải thuật tạo cây nhị phân lưu trữ bt số học +,-,*,/ được cho ở dạng trung tố đầy đủ dấu ngoặc.các toán hạng có thể la hằng hoặc biến.tính giá trị của biểu thức theo cây nhị phân xây dựng đc.dữ liệu vào là bt dang trung tố.dữ liệu ra là cây nhị phân biểu diễn biểu thức và giá trị của biểu thức cần tính

Các đề tài tương tự

  1. Lập trình C++ Kiểm tra tính hợp lý của biểu thức Balan trong lập trình C
    Gửi bởi lvl211189 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 17-02-2012, 07:04 PM
  2. Xử lý biểu thức toán học( thuật toán Balan )
    Gửi bởi hongban trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 06-12-2010, 03:49 PM
  3. BTL:Tính giá trị của biểu thức dưới dạng ký pháp BaLan
    Gửi bởi Qµø©_†µan_¶«µ†€ trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 27-05-2010, 11:44 PM
  4. Bài Kí Pháp Nghịch Đảo Balan RPN
    Gửi bởi SymphonyEnigmatic trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 09-08-2009, 11:54 PM
  5. Ký pháp nghịch đảo balan trên C++?
    Gửi bởi vuvo_it trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 29-04-2009, 08:49 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn