Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Tính biểu thức trung tố trong lập trình C

  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 trung tố trong lập trình C

    đề bài là:
    nhập xâu kí tụ có nội dung là biểu thức trung tố. Tinh kết quả biêu thức này

    gợi ý: chuyển trung tố về hậu tố
    dùng hàm trả về thứ tự ưu tiên so sánh (* hay / cho--> 2;+ hay - -->1; '('và ')'-->0)
    tôi chỉ có mộ tuần thôi bác nào biết giả giúp tôi với

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    C++ Code:
    1. #ifndef __EXPRESS_H__
    2. #define __EXPRESS_H__
    3.  
    4. struct PREFIX_ELEMENT;
    5. struct VARIABLE_INFO;
    6.  
    7. class CExpression
    8. {
    9. public:
    10.     CExpression(void);
    11.     ~CExpression(void);
    12.  
    13.     BOOL ParseExpression(char * szExpression, char * arrVar, long nVar);
    14.     BOOL GetValueAt(float * fReturnValue, float * arrVal);
    15.     char * GetExpression();
    16.  
    17. private:
    18.     void Release();
    19.     BOOL MakeExpressionIntoElements(PREFIX_ELEMENT *arrE, long &nArrE);
    20.     BOOL GetPrefixExpression(PREFIX_ELEMENT *arrE, long &nArrE);
    21.     float GetNumber(char **p);
    22.     BOOL GetOperator(char * str, PREFIX_ELEMENT * arrE, long &nArrE);
    23.     VARIABLE_INFO * GetVariable(char **p);
    24.  
    25.     char * m_szExpression;
    26.  
    27.     PREFIX_ELEMENT * m_arrE;
    28.     long m_wArrE;
    29.  
    30.     VARIABLE_INFO * m_arrV;
    31.     long m_wArrV;
    32. };
    33.  
    34. #endif

    Lần trước trong lần thực tập C của nhà trường tôi đã viết 1 lớp CExpress để phân tích và tính giá trị 1 biểu thức rồi. Không hiểu sao tôi không up lên được. POST tạm cái header nó lên, bạn xem qua nếu thấy có ích thì có thể mail cho tôi để tôi send trực tiếp cho. Hoặc nếu có bác nào chỉ tôi cách up thì hay quá.

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Tính một biểut thức dạng hậu tố
    Xét một biểu thức tính toán dạng hậu tố chỉ chứa các phép toán +. -\ và lũy thừa($), ví dụ: 23+5*2$ = ( (2 + 3) *5 ) 2 = 625
    Nhà toán học Lewinski đã chứng được rằng mọi biểu thức toán học đều có thể biểu diễn dưới dạng hậu tố mà không cần thêm bất kì kí hiệu nào khác.
    Bài toán này có thể giải quyết bằng cài đặt stack.
    Ý tưởng như sau:
    Lấy toán hạng 1(2)-> lấy toán hạng 2 (3) -> lấy phép toán cộng (+) -> lấy toán hạng 1+ toán hạng 2 và đẩy vào stack (5)- > lấy toán hạng tiếp theo(5)-> lấy phép toán tiếp theo(*)-> nhân với toán hạng 1 rồi đẩy vào stack(25)-> rồi lại lấy toán hạng tiếp theo -> lấy phép toán tiếp theo($) thực hiện phép toán và lưu vào stack , và cuối cùng ta được 25$2 = 625
    Cài đặt thuật toán :
    C Code:
    1. #include    <stdio.h>
    2. #include    <stdlib.h>
    3. #include    <conio.h>
    4. #include    <dos.h>
    5. #include    <string.h>
    6. #include    <math.h>
    7. #define MAX 100
    8. #define TRUE    1
    9. #define FALSE   0
    10. typedef struct{
    11.     int top;
    12.     double node[MAX];
    13. } stack;
    14. int Empty(stack *);
    15. void Push( stack *, double);
    16. double Pop(stack *);
    17. double Dinhtri(char *);
    18. int lakyso(char);
    19. double tinh(int, double, double);
    20. int Empty(stack *ps) {
    21.     if (ps->top==-1){
    22.         printf("\n Stack empty");
    23.         delay(2000);return(TRUE);
    24.     }
    25.     return(FALSE);
    26. }
    27. void Push(stack *ps, double p){
    28.     if (ps ->top==MAX-1){
    29.         printf("\n Stack full");
    30.         delay(2000);return;
    31.     }
    32.     ps->top=(ps->top) + 1;
    33.     ps->node[ps->top]=p;
    34. }
    35. double Pop(stack *ps ){
    36.     if (Empty(ps)){
    37.         printf("\n Stack Empty");
    38.         delay(2000); return(0);
    39.     }
    40.     return(ps->node[ps->top--]);
    41. }
    42. double Dinhtri(char *Bieuthuc){
    43.     int i,c, vitri;
    44.     double toanhang1, toanhang2, giatri;
    45.     stack s;
    46.     s.top=-1;vitri=strlen(Bieuthuc);
    47.     for(i=0;i<vitri;i++){
    48.         if (lakyso(Bieuthuc[i]))
    49.             Push(&s,(double)(Bieuthuc[i]-'0'));
    50.         else {
    51.             toanhang2=Pop(&s);
    52.             toanhang1=Pop(&s);
    53.             giatri=tinh(Bieuthuc[i],toanhang1, toanhang2);
    54.             Push(&s, giatri);
    55.         }
    56.     }
    57.     return(Pop(&s));
    58. }
    59. int lakyso(char kitu) {
    60.     return(kitu>='0' && kitu<='9');
    61. }
    62. double tinh(int toantu, double toanhang1, double toanhang2){
    63.     double ketqua=0;
    64.     switch(toantu){
    65.         case '+': ketqua=toanhang1+toanhang2;break;
    66.         case '-': ketqua=toanhang1-toanhang2;break;
    67.         case '*': ketqua=toanhang1*toanhang2;break;
    68.         case '/': ketqua=toanhang1/toanhang2;break;
    69.         case '$': ketqua=pow(toanhang1,toanhang2);break;
    70.     }
    71.     return(ketqua);
    72. }
    73. void main(void){
    74.     char c, bieuthuc[MAX];
    75.     int vitri;clrscr();
    76.     printf("\n Nhap mot bieu thuc:");gets(bieuthuc);
    77.     printf("\n Gia tri = %f",Dinhtri(bieuthuc));
    78. }

    Các bạn có thể tham khảo bài stack, cài đặt và ứng dụng: http://forums.congdongcviet.com/showthread.php?t=575
    Đã được chỉnh sửa lần cuối bởi PoPoPoPo : 25-10-2006 lúc 07:48 AM.

  4. #4
    Ngày gia nhập
    08 2006
    Bài viết
    59

    Lượng giá biểu thức đã ở sẵn dạng hậu tố thì dễ hơn rất nhiều so với lượng giá biểu thức ở dạng trung tố

    Nếu muốn đổi từ dạng trung tố sang dạng hậu tố thì xài stack là 1 cách.
    Còn nếu đã có sẵn dạng hậu tố rồi thì không cần xài stack làm gì cho rườm rà

    (có gì sai sót mong được góp ý, xin cám ơn)

    (làm học sinh thời buổi này sướng thiệt, làm thầy thời buổi này khổ thiệt
    có bài gì bí cứ post lên diễn đàn là có người nhanh nhảu làm giùm ngay :(
    )

  5. #5
    Ngày gia nhập
    08 2006
    Bài viết
    2

    xem chương trình viết bằng Pascal trong quyển DASP textbook của thầy LÊ MINH HOÀNG
    http://forums.congdongcviet.com/showthread.php?t=128đó

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

  1. Bài tập C Hàm tính trung bình mảng trong lập trình C!!!
    Gửi bởi camping29 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 01-04-2016, 04:57 PM
  2. Bão đổ bộ vào miền Trung trong tối nay
    Gửi bởi tungyeuc trong diễn đàn Giải trí - Thư giãn
    Trả lời: 0
    Bài viết cuối: 18-09-2013, 12:20 PM
  3. Bài tập C Tính trung bình cộng trong DSLK bằng C. Lỗi chỉ đếm các số chẵn chứ không tính hàm trung bình cộng?
    Gửi bởi trungdv007 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: 31-08-2011, 11:05 PM
  4. Tính toán biểu thức trung tố hậu tố trong ASP.NET?
    Gửi bởi changnamvi trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 1
    Bài viết cuối: 11-04-2011, 09:29 AM
  5. Tìm Trung Binh Cộng Và Trung Bình Nhân trong C?
    Gửi bởi gvkatashi01 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: 29-07-2010, 08:46 PM

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