• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[Class] Tính toán các phép tính trên chuỗi

Bộ sưu tập các thư viện hỗ trợ sẳn cho Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Nội qui chuyên mục
1. Gửi bài viết tại đây, Tester sẽ chuyển vào trong nếu bài viết đạt yêu cầu.
2. Gửi bài theo mẫu qui định: viewtopic.php?f=2&t=5
[ten][/ten]
[loai][/loai]
[ngonngu][/ngonngu]
[tacgia][/tacgia]
[chucnang][/chucnang]
[end][/end]
Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

[Class] Tính toán các phép tính trên chuỗi

Gửi bàigửi bởi clarkkent » T.Tư 03/06/2009 3:14 pm

Tên: [Class] Tính toán các phép tính trên chuỗi
Loại: Class
Ngôn ngữ lập trình:
Tác giả: Sưu tầm - HaiPT 4rum cũ
Chức năng: [Class] Tính toán các phép tính trên chuỗi. Ví dụ tính ra kết quả của chuỗi 100*(23-3)+34*(32-4)



Class [Code dài quá, post lên không thấy j hết, không đầy đủ, coi trong file đính kèm]

Mã: Chọn hết

  1. Option Strict On
  2. ''' Caculator Script Class
  3. ''' Updated on : 03/3/2007
  4. ''' By : haipt
  5. Public Class Calcs
  6.     Private Class mcSymbol
  7.         Implements IComparer
  8.         Public Token As String
  9.         Public Cls As Calcs.TOKENCLASS
  10.         Public PrecedenceLevel As PRECEDENCE
  11.         Public tag As String
  12.         Public Delegate Function compare_function(ByVal x As Object, ByVal y As Object) As Integer
  13.         Public Overridable Overloads Function compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
  14.             Dim asym, bsym As mcSymbol
  15.             asym = CType(x, mcSymbol)
  16.             bsym = CType(y, mcSymbol)
  17.             If asym.Token > bsym.Token Then Return 1
  18.             If asym.Token < bsym.Token Then Return -1
  19.             If asym.PrecedenceLevel = -1 Or bsym.PrecedenceLevel = -1 Then Return 0
  20.             If asym.PrecedenceLevel > bsym.PrecedenceLevel Then Return 1
  21.             If asym.PrecedenceLevel < bsym.PrecedenceLevel Then Return -1
  22.             Return 0
  23.         End Function
  24.  
  25.         Public Sub New()
  26.         End Sub
  27.  
  28.         Public Sub New(ByVal Token As String, ByVal ClsToken As TOKENCLASS, ByVal level As PRECEDENCE)
  29.             Me.Token = Token
  30.             Me.Cls = ClsToken
  31.             Me.PrecedenceLevel = level
  32.         End Sub
  33.     End Class
  34.  
  35.     Private Enum PRECEDENCE
  36.         NONE = 0
  37.         LEVEL0 = 1
  38.         LEVEL1 = 2
  39.         LEVEL2 = 3
  40.         LEVEL3 = 4
  41.         LEVEL4 = 5
  42.         LEVEL5 = 6
  43.     End Enum
  44.  
  45.     Private Enum TOKENCLASS
  46.         KEYWORD = 1
  47.         IDENTIFIER = 2
  48.         NUMBER = 3
  49.         [OPERATOR] = 4
  50.         PUNCTUATION = 5
  51.     End Enum
  52.  
  53.     Private m_tokens As Collection
  54.     Private m_State(,) As Integer
  55.     Private m_KeyWords() As String
  56.     Private m_colstring As String
  57.     Private Const ALPHA As String = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  58.     Private Const DIGITS As String = "#0123456789"
  59.     Private m_funcs() As String = {"sin", "cos", "tan", "arcsin", "arccos", _
  60.                                  "arctan", "sqrt", "max", "min", "floor", _
  61.                                  "ceiling", "log", "log10", _
  62.                                  "ln", "round", "abs", "neg", "pos"}
  63.     Private m_operators As ArrayList
  64.     Private m_stack As New Stack()
  65.  
  66.     Private Sub init_operators()
  67.         Dim op As mcSymbol
  68.         m_operators = New ArrayList()
  69.         m_operators.Add(New mcSymbol("-", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL1))
  70.         m_operators.Add(New mcSymbol("+", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL1))
  71.         m_operators.Add(New mcSymbol("*", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL2))
  72.         m_operators.Add(New mcSymbol("/", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL2))
  73.         m_operators.Add(New mcSymbol("\", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL2))
  74.         m_operators.Add(New mcSymbol("%", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL2))
  75.         m_operators.Add(New mcSymbol("^", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL3))
  76.         m_operators.Add(New mcSymbol("!", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL5))
  77.         m_operators.Add(New mcSymbol("&", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL5))
  78.         m_operators.Add(New mcSymbol("-", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL4))
  79.         m_operators.Add(New mcSymbol("+", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL4))
  80.         m_operators.Add(New mcSymbol("(", TOKENCLASS.OPERATOR, PRECEDENCE.LEVEL5))
  81.         op = New mcSymbol()
  82.         op.Token = ")"
  83.         op.Cls = TOKENCLASS.[OPERATOR]
  84.         op.PrecedenceLevel = PRECEDENCE.LEVEL0
  85.         m_operators.Add(op)
  86.         m_operators.Sort(op)
  87.     End Sub
  88.  
  89. ...
  90. ...
  91. ...


Cách sử dụng

Mã: Chọn hết

  1.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         MsgBox(Calcs.Eval("100*(23-3)+34*(32-4)"))
  3.     End Sub
Tập tin đính kèm
Calcs.rar
Caculator Script Class
(3.01 KiB) Đã tải 772 lần


• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...

Hình đại diện của người dùng
bangnhatquang68
Guru
Guru
Bài viết: 791
Ngày tham gia: T.Ba 26/01/2010 12:44 pm
Đến từ: Vĩ tuyến 17
Has thanked: 20 time
Been thanked: 37 time
Liên hệ:

Re: [Class] Tính toán các phép tính trên chuỗi

Gửi bàigửi bởi bangnhatquang68 » T.Tư 21/03/2012 10:33 pm

Kiểu double hình như không tính được.
Ví dụ: 0.7*6 kết quả là 42
Mời anh em lên facebook giao lưu nào!
http://www.facebook.com/groups/145823032176611/

FlyingFox
Guru
Guru
Bài viết: 770
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 311 time

Re: [Class] Tính toán các phép tính trên chuỗi

Gửi bàigửi bởi FlyingFox » T.Năm 22/03/2012 8:25 am

Có thễ dùng Function Compute cũa DataTable đễ làm phép tính trên chuỗi cũng được.
  1. DataTable dt = new DataTable();
  2. object value = dt.Compute("0.7*6", "");
  3. MessageBox.Show(value.ToString());

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

Re: [Class] Tính toán các phép tính trên chuỗi

Gửi bàigửi bởi tungcan5diop » T.Năm 22/03/2012 10:10 am

kết quả vẫn đúng mà bạn
  1.  MsgBox(Calcs.Eval("0.7*6 "))
Tập tin đính kèm
cals.JPG
cals.JPG (4.93 KiB) Đã xem 1713 lần
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!


Quay về “[.NET] Module, Class, UserControl, DLL”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách