• 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#

Moderators: tungcan5diop, QUANITGROBEST

Forum rules
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]
User avatar
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 1641
Joined: Wed 16/04/2008 11:25 am
Location: Chợ Lách - Bến Tre
Been thanked: 31 times
Contact:

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

Postby clarkkent » Wed 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]

Code: Select all

  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

Code: Select all

  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
Attachments
Calcs.rar
Caculator Script Class
(3.01 KiB) Downloaded 826 times


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

User avatar
bangnhatquang68
Guru
Guru
Posts: 791
Joined: Tue 26/01/2010 12:44 pm
Location: Vĩ tuyến 17
Has thanked: 20 times
Been thanked: 38 times
Contact:

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

Postby bangnhatquang68 » Wed 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
Posts: 832
Joined: Wed 20/04/2011 9:56 am
Been thanked: 325 times

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

Postby FlyingFox » Thu 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());

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

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

Postby tungcan5diop » Thu 22/03/2012 10:10 am

kết quả vẫn đúng mà bạn
  1.  MsgBox(Calcs.Eval("0.7*6 "))
Attachments
cals.JPG
cals.JPG (4.93 KiB) Viewed 2443 times
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!


Return to “[.NET] Module, Class, UserControl, DLL”

Who is online

Users browsing this forum: No registered users and 0 guests