banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Hỏi về cách xử lý chuỗi!  XML
  [Programming]   Hỏi về cách xử lý chuỗi! 08/01/2009 10:55:40 (+0700) | #1 | 165622
publicIT
Member

[Minus]    0    [Plus]
Joined: 12/04/2008 14:44:09
Messages: 63
Offline
[Profile] [PM]
Giả sử mình có các biến : a = 20 b = 30 d = 40 ab = 50
Chuỗi biêủ thức như sau :strChuoi = "a - (b * d) + ab"
Mình có hàm sau :
Function sfXLChuoi(Byval strChuoi As String) As String
'Xử lý chuỗi
'Return về chuỗi đã xử lý
End Function
Thì kết quả sẽ ra được : 20 - (30 * 40) + 50

*Vấn đề mình bị vướng là : nếu tìm a trong strChuoi rồi thay giá trị vào thì biến ab sẽ là 20b (do trong biến ab cũng có chưá a . Mà mình thì chỉ xử lý trên chuỗi )
*Mình có nghĩ tới cách cắt chuỗi dưạ trên các phép toán rồi chưá các giá trị vào stack nhưng vẫn không khả thi
Ai có ý tưởng thì nói cho mình biết nha!THANKS!
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 11:07:29 (+0700) | #2 | 165624
zerozeroone
Member

[Minus]    0    [Plus]
Joined: 24/12/2006 13:29:23
Messages: 149
Offline
[Profile] [PM]
Cái phần code nên đưa vào thẻ code cho nó dễ nhìn.

publicIT wrote:

*Vấn đề mình bị vướng là : nếu tìm a trong strChuoi rồi thay giá trị vào thì biến ab sẽ là 20b (do trong biến ab cũng có chưá a . Mà mình thì chỉ xử lý trên chuỗi )  

Như vậy thì xét tiếp ký tự kế tiếp một chữ cái là gì? Nếu sau nó không phải là một chữ cái thì cái đó cần thay thế, còn nếu tiếp tục là chữ cái thì cái biến lúc này sẽ là 2 ký tự, cứ thế tiếp tục...
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 12:23:28 (+0700) | #3 | 165633
publicIT
Member

[Minus]    0    [Plus]
Joined: 12/04/2008 14:44:09
Messages: 63
Offline
[Profile] [PM]
Mình thấy cách của bạn không khả thi vì trong thực tế thì biến của mình không phải là a,b,c... mà là các chuỗi khá dài
VD như : sThucLanh, sChuyenCan, sChuyenCan_Tien, sNgayCong,sNgayCong_Tien ...
Nếu xét biểu thức tiếp theo có phải là chữ cái hay không thì cũng chẳng phân biệt được các biến với nhau
Mình VD : sNgayCong_Tien * 26 + sNgayCong ( sNgayCong = 10 , sNgayCong_Tien = 50)
thì lúc đó bạn cũng sẽ thế lộn biểu thức sẽ là : 10_Tien * 26 + 10 ( sẽ không đúng )
Nếu bạn có ý gì thì chỉ cho mình nưã nha! Cám ơn bạn đã trả lời mình! smilie
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 12:40:53 (+0700) | #4 | 165635
zerozeroone
Member

[Minus]    0    [Plus]
Joined: 24/12/2006 13:29:23
Messages: 149
Offline
[Profile] [PM]
Trong lập trình bạn có quy tắc đặt tên biến của mình.
Xét lần lượt từng ký tự nếu gặp các ký tự nào đó mà ngoài các ký tự đặt tên biến của bạn thì mới kết luận nó là biến.
Cái chuỗi cần xét của bạn là biểu thức toán học thì sau biến phải là: các phép toán, khoảng trắng, các dấu ngoặc. => cũng không nhiều lắm.
Tìm hiểu xem trong ngôn ngữ lập trình của bạn các hàm hỗ trợ tách chuỗi. Ví dụ trong C/C++ có:
Code:
char * strtok ( char * str, const char * delimiters );

Tham khảo ý nghĩa về cái hàm đó tại đây: http://www.cplusplus.com/reference/clibrary/cstring/strtok.html và thử tìm cái tương tự trong ngôn ngữ bạn đang dùng.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 14:36:13 (+0700) | #5 | 165641
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Ý của bạn publicIT hỏi là thay thế các giá trị của các biến vào chuỗi à:
Code:
VD : a = 1,b=2,ab =13, c=14, ca=15;
Chuỗi : (a-b*ca+ab)*b ---> (1-2*15+13)*2 đúng không?

Vậy bạn làm thử thế này :
Code:
- Tạo một table định danh cho các biến : có thể là struct, array để lưu các định danh cho biến
- Tạo một table lưu các toán tử (+,-,*,/,...)
- Duyệt chuỗi :
  + Từ String[0] -> String[Length(String)]
  + Khai báo Array Bien =['a','b','ab',...]  // Tùy theo bài của bạn
  + Khai báo Array GiaTriBien = [,..,..,..] // Cái này bạn lưu tương ứng với từng định danh biến
  + Khai báo i,j  (kiểu int chẳng hạn)
  + Khai báo TempStr (kiểu String )
  + i = 0 ; Được dùng để duyệt chuỗi
  + j = 0; vị trí của định danh biến trong chuỗi 
  + TempStr=''; // Lưu tạm của định danh biến mà ta tìm thấy 
 Bắt đầu duyệt :
  + If String[i] in [+,/,-,...] 
    {
       For x = j to (i-1) TempStr = TempStr + String[x];
       If TempStr in Bien 
       {
           Thay GiaTriBien tương ứng với TempStr vào. 
           (Cái này có nhiều cách, bạn có thể trực tiếp sửa trong chuỗi nguồn cũng được, nhưng xử lý cẩn thận tí)
       }
    }


Đây là một cách cơ bản. Bạn có thể cải tiến thêm để chương trình chạy tốt hơn.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 14:46:38 (+0700) | #6 | 165643
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]
Chào publicIT,

Tôi không biết bạn định nghĩa a = 20, b = 10 ... ở đâu. Nhưng tóm lại là sau khi định nghĩa nhét vào stack với dạng sau:
Code:
|   |    |   
|Tên|gtrị|
|___|____|

Bạn cần phân rõ các tokens cần kiểm tra:
+ Biến: bắt đầu bằng chữ và chỉ được chữa chữ hoặc số
+ phép toán: + - * /...
....
Sau đó đọc tất cả, nhét vào stack (1 stack khác chẳng hạn)
Sau đó kiểm tra lại định nghĩa các biến từ stack đầu tiên
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 14:53:55 (+0700) | #7 | 165644
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Bạn publicIT nói đã làm thử với stack và tách dựa trên các token rồi và bảo không hiệu quả thì anh FaL hướng dẫn bạn ấy như vậy thì sao làm được. Bạn publicIT nên tập với các thuật toán duyệt chuỗi đơn giản hơn đã đi.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 15:30:59 (+0700) | #8 | 165648
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

VaT wrote:
Bạn publicIT nói đã làm thử với stack và tách dựa trên các token rồi và bảo không hiệu quả thì anh FaL hướng dẫn bạn ấy như vậy thì sao làm được. Bạn publicIT nên tập với các thuật toán duyệt chuỗi đơn giản hơn đã đi.  


Thì tại bạn ấy làm ko đúng. Chứ làm gì có chuyện "dịch" ab ra 10b nếu a = 10 smilie. Tách tokens cho đúng (lexical analysis) sau đó check syntax + với các table biến thì làm sao mà rối được smilie
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 08/01/2009 15:36:45 (+0700) | #9 | 165649
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Vì vậy mình mới đề nghị cách duyệt chuỗi đơn giản hơn và phù hợp hơn cho bạn ấy smilie. Chứ mấy bài này thì trên 4rum mình đã có hỏi nhiều rồi.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 03:55:02 (+0700) | #10 | 165730
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]
Mà giờ tui mới đọc rõ code của VaT,

Code:
For x = j to (i-1) TempStr = TempStr + String[x];
        If TempStr in Bien 
        {
            Thay GiaTriBien tương ứng với TempStr vào. 
            (Cái này có nhiều cách, bạn có thể trực tiếp sửa trong chuỗi nguồn cũng được, nhưng xử lý cẩn thận tí)
        }

Kiểu này thì khi đọc TempStr được "a" thì bạn thay luôn à? Mặc dù biến đó thực sự là ab?
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 13:05:57 (+0700) | #11 | 165793
publicIT
Member

[Minus]    0    [Plus]
Joined: 12/04/2008 14:44:09
Messages: 63
Offline
[Profile] [PM]
Cảm ơn các bạn đã trả lời mình nha!
vấn đề của mình đặt ra không chỉ dừng lại là một biểu thức cố định. Mà là một biểu thức nhập vào bất kỳ và có thể thêm vào nhiều biến và các toán tử khác nhau. Nên việc dùng 2 mảng để lưu các biến và các biểu thức thì chắc chắc là không khả thi. Ví lúc đó sẽ không lưu được tương ứng các biến và các phép toán( tại mình không nói rõ, mình chỉ muốn nói đơn giản cho các bạn dễ hiểu thôi!sorry nha! )
Nếu dùng stack thì chắc chắn phải duyệt từng ký tự của chuỗi mới giải quyết được vấn đề!
Sẵn cho mình hỏi trong .net có hàm nào hỗ trợ mình làm việc này hay không?(để mình thực hiện việc này cho nhanh, vì database của mình thì số record khá lớn).Nếu dùng thuật toán thì chương trình sẽ chạy cực kỳ chậm.
THANKS! smilie
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 14:20:09 (+0700) | #12 | 165807
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]

FaL wrote:
Mà giờ tui mới đọc rõ code của VaT,

Code:
For x = j to (i-1) TempStr = TempStr + String[x];
        If TempStr in Bien 
        {
            Thay GiaTriBien tương ứng với TempStr vào. 
            (Cái này có nhiều cách, bạn có thể trực tiếp sửa trong chuỗi nguồn cũng được, nhưng xử lý cẩn thận tí)
        }

Kiểu này thì khi đọc TempStr được "a" thì bạn thay luôn à? Mặc dù biến đó thực sự là ab? 


Làm gì có chuyện đó hả bác.
Ở điều kiện khi duyệt tới vị trí i trong chuỗi String nếu gặp các token là các toán tử thì mới bắt đầu lấy tên của các biến. Sau đó kiểm tra tên biến đó có tồn tại trong các định danh tên biến mà mình đã lưu trữ không, nếu có thì thay thếsmilie
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 14:24:53 (+0700) | #13 | 165809
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Ý của bạn publicIT là chuỗi biểu thức (gồm định danh của biến và các toán tử) là do người dùng nhập vào hay sao? Vậy thì các giá trị của các biến đó được nhập như thế nào??? Mình không hiểu lắm.

P/S : các hàm cũng được viết từ thuật toán ra cả. Nhanh hạy chậm còn tùy thuộc vào nhiều yếu tố của bài toán mà mình áp dụng.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 15:07:38 (+0700) | #14 | 165813
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

publicIT wrote:
Cảm ơn các bạn đã trả lời mình nha!
vấn đề của mình đặt ra không chỉ dừng lại là một biểu thức cố định. Mà là một biểu thức nhập vào bất kỳ và có thể thêm vào nhiều biến và các toán tử khác nhau. Nên việc dùng 2 mảng để lưu các biến và các biểu thức thì chắc chắc là không khả thi. Ví lúc đó sẽ không lưu được tương ứng các biến và các phép toán( tại mình không nói rõ, mình chỉ muốn nói đơn giản cho các bạn dễ hiểu thôi!sorry nha! )
Nếu dùng stack thì chắc chắn phải duyệt từng ký tự của chuỗi mới giải quyết được vấn đề!
Sẵn cho mình hỏi trong .net có hàm nào hỗ trợ mình làm việc này hay không?(để mình thực hiện việc này cho nhanh, vì database của mình thì số record khá lớn).Nếu dùng thuật toán thì chương trình sẽ chạy cực kỳ chậm.
THANKS! smilie  


Màu vàng
: Không ai reply ở đây là không hiểu cả. Có thể bồ không hiểu ý người ta đó smilie
Màu đỏ: Bồ viết được theo hướng dẫn ở trên chưa? Hay là chỉ nghĩ mà đã phán như vậy?
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 15:09:28 (+0700) | #15 | 165814
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

VaT wrote:

FaL wrote:
Mà giờ tui mới đọc rõ code của VaT,

Code:
For x = j to (i-1) TempStr = TempStr + String[x];
        If TempStr in Bien 
        {
            Thay GiaTriBien tương ứng với TempStr vào. 
            (Cái này có nhiều cách, bạn có thể trực tiếp sửa trong chuỗi nguồn cũng được, nhưng xử lý cẩn thận tí)
        }

Kiểu này thì khi đọc TempStr được "a" thì bạn thay luôn à? Mặc dù biến đó thực sự là ab? 


Làm gì có chuyện đó hả bác.
Ở điều kiện khi duyệt tới vị trí i trong chuỗi String nếu gặp các token là các toán tử thì mới bắt đầu lấy tên của các biến. Sau đó kiểm tra tên biến đó có tồn tại trong các định danh tên biến mà mình đã lưu trữ không, nếu có thì thay thếsmilie 

À ừ, đúng là tôi không để ý cái chỗ check token. Xin lỗi nhé smilie
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 09/01/2009 23:23:12 (+0700) | #16 | 165841
publicIT
Member

[Minus]    0    [Plus]
Joined: 12/04/2008 14:44:09
Messages: 63
Offline
[Profile] [PM]
Đúng là mình chưa làm nhưng nếu nghĩ thôi thì đã không khả thi thì làm cũng không có kết quả!
Bạn đó nói :
+ Khai báo Array Bien =['a','b','ab',...] // Tùy theo bài của bạn
+ Khai báo Array GiaTriBien = [,..,..,..] // Cái này bạn lưu tương ứng với từng định danh biến
Mảng Array GiaTriBien = [,..,..,..] lưu tương ứng với từng định danh của biến. Thế này nhé! Nếu người dùng nhập thêm biến thì và giá trị biến thì không có vấn đề, nhưng nếu người dùng muốn sửa biểu thức (sửa biến hoặc giá trị )thì chắc chắc hai mảng trên sẽ lưu không còn đúng nữa.
Nếu dùng stack thì phải duyệt từng ký tự trong chuỗi để phận biệt đâu là biến đâu là toán tử!Nhưng khi lấy từ trong stack ra thay giá trị vào chuỗi thì phải thay như thế nào?Do tất cả mình xử lý đều là chuỗi nên mình nghĩ nếu thay thì cũng sẽ bị lại vấn đề mà mình đã đặt ra ban đầu!
Đây là vấn đề phát sinh trong quá trình mình làm chương trình chứ không phải mình tự đặt ra đâu!
Cám ơn các bạn đã trả lời nha!
THANKS! smilie
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 10/01/2009 13:55:39 (+0700) | #17 | 165970
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]

publicIT wrote:
Đúng là mình chưa làm nhưng nếu nghĩ thôi thì đã không khả thi thì làm cũng không có kết quả!
Bạn đó nói :
+ Khai báo Array Bien =['a','b','ab',...] // Tùy theo bài của bạn
+ Khai báo Array GiaTriBien = [,..,..,..] // Cái này bạn lưu tương ứng với từng định danh biến
Mảng Array GiaTriBien = [,..,..,..] lưu tương ứng với từng định danh của biến. Thế này nhé! Nếu người dùng nhập thêm biến thì và giá trị biến thì không có vấn đề, nhưng nếu người dùng muốn sửa biểu thức (sửa biến hoặc giá trị )thì chắc chắc hai mảng trên sẽ lưu không còn đúng nữa.
Nếu dùng stack thì phải duyệt từng ký tự trong chuỗi để phận biệt đâu là biến đâu là toán tử!Nhưng khi lấy từ trong stack ra thay giá trị vào chuỗi thì phải thay như thế nào?Do tất cả mình xử lý đều là chuỗi nên mình nghĩ nếu thay thì cũng sẽ bị lại vấn đề mà mình đã đặt ra ban đầu!
Đây là vấn đề phát sinh trong quá trình mình làm chương trình chứ không phải mình tự đặt ra đâu!
Cám ơn các bạn đã trả lời nha!
THANKS! smilie  


Về vấn đề như màu đỏ mà bạn nói là thuộc phần xử lý Input chứ đâu phải là phần xử lý chuỗi (Output). Nếu là vấn đề Input như bạn nói thì dùng stack cũng vậy. Khi bạn thay đổi giá trị mới cho Input thì bạn phải cập nhập lại Input của bạn thì bạn mới có thể xử lý được. Còn chuyện Input thì tùy yêu cầu của ứng dụng mà có nhiều cách để làm...Mình thấy với đề bài của bạn không có gì phức tạp cả hoặc có thể là bạn chưa nói đúng mục đích của ứng dụng của bạn nên mình hiểu sai chăng. Bạn xem lại nhé.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 13/01/2009 06:04:01 (+0700) | #18 | 166225
vanthanh225355
Member

[Minus]    0    [Plus]
Joined: 18/09/2008 10:46:47
Messages: 11
Offline
[Profile] [PM]
bạn thao khảo chương trình dịch sẽ hiểu rõ mô hình
bài toán này cũng dễ dàng giải quyết thôi.
[Up] [Print Copy]
  [Question]   Re: Hỏi về cách xử lý chuỗi! 14/01/2009 14:01:07 (+0700) | #19 | 166444
VaT
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 00:17:52
Messages: 87
Offline
[Profile] [PM]
Ngay cả chương trình biên dịch/ thông dịch thì các giá trị Input(biến,hàm,...) cũng phải được khai báo rõ ràng. Còn chuyện tự hiểu các giá trị Input thì có lẽ chỉ có AI làm được thôi...
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|