PDA

View Full Version : Hỏi, thuật toán tính biểu thức?



hueduongit
15-07-2004, 22:42
Chào tất cả!
Cho hỏi, ai còn nhớ thuật toán tính biểu thức (bất kỳ) {vd: bt = x*(y+z) - x/2 + 4xyz}, theo kiểu "Ba Lan ngược" không?

hueduongit
16-07-2004, 23:00
Không có ai giúp đỡ à
Ai có thể mô tả trên một ngôn ngữ nào đó thì càng tốt
Cám ơn nhiều!

bichduyen_nt
17-07-2004, 09:34
Đây là một bài tập ứng dụng Stack, bạn có thể tìm đọc trong các phần đó, Duyên nghĩ sách nào cũng có hết.Nếu bạn đã biết STACk là gì thì mọi chuyện đơn giản thôi
Duyên chỉ nói ở đây thuật toán đơn giản thôi, còn viết code thì dài lắm.
đầu tiên bạn phải biến đổi biểu thức trên thành dạng hậu tố, có nghĩa là như sau:
VD: 2+3 -> 23+
hay (2+3)*5-6 --->23+5*6-
có nghĩa là bạn sẽ duyệt từ đầu biểu thức đến cuối.
***Nếu gặp dấu "(" thì Push nó vô STACK
***Nếu gặp chữ số (từ 1-->9) thì Push vô luôn
*** Nếu gặp toán tử (+,-,*,/) thì Pop ra 2 số trong STACK
***Nếu gặp ")" thì bạn Pop ra các số cho đến khi nào Pop ra được dấu "("
bước 1 là như vậy, còn chuyện sau đó làm gì thì khi nào bạn làm được biểu thức như trên sẽ có người chỉ bạn tiếp, hi hi

songok
17-07-2004, 10:14
Thuật toán đó chỉ đúng khi người nhập vào biểu thức đúng có nghĩa là phải đầy đủ các dấu mở ( và đóng ngọăc . Mà điều này thì đâu phải ai cũng nhập đúng.
Mình cũng có làm bài này, cho phép người nhập vào các biểu thức tuỳ ý ( nghĩa là có ngoặc hoặc không có ngoặc, nều như không có ngọăc thì áp dụng thứ tự ưu tiên của các phép toán ...) Mình cải bài này dùng 2 STACK, cũng biến đổi biểu thức trugn tố sang hậu tố, trong lúc biến đổi mình cũng tự thêm ngoặc vào cho đúng. Sau đó tính toán giá trị từ biểu thức hậu tố đó. Bài này cũng có thể áp dụng cây để làm.

hueduongit
23-07-2004, 04:57
Thank you very much!

black hole
01-08-2004, 13:41
bạn có thể vào đây để đọc về kí pháp nghịch đảo balan
Trong đó họ viết rất kĩ và có thể lập trình ngay được
http://thnt.com.vn/magazine.php?op=viewcontent&topicid=5&storyid=268&choosed_year=2003&count=112

minhthinh937
30-05-2009, 17:36
có anh chị nào có thể viết dùm em thuật toán giải biểu thức tính nhiều phép tính cùng một lúc bằng chương trình C được không?em nghĩ mãi mà không ra.
vd : 2(2*2)-1+2
Chỉ cần nhập vào là ra đáp số.ông thầy chơi ác quá.huhu.Cứu em với

ptaminh
01-06-2009, 13:16
có anh chị nào có thể viết dùm em thuật toán giải biểu thức tính nhiều phép tính cùng một lúc bằng chương trình C được không?em nghĩ mãi mà không ra.
vd : 2(2*2)-1+2
Chỉ cần nhập vào là ra đáp số.ông thầy chơi ác quá.huhu.Cứu em với

Tui cũng đã làm chơi (làm cho vui) biểu thức dạng f(x,y,z,...).
Vì vậy cũng muốn nó có ích với ai đó. Nó có thể được ứng dụng để tính tích phân gần đúng, tìm nghiệm gần đúng, vẽ đồ thị hàm số (2D,3D,...) đối với một biểu thức hàm số bất kỳ.

Ví dụ :


BieuThuc a = "x*y + cos(sin(ln(x -y)))";
a.SetParamsKey("xy");
double params[]={1,2};
double res = a.Caculate(params);


Nó được thiết kế dựa trên nhu cầu tính toán cùng một biểu thức nhưng có tham số đầu vào khác nhau ví dụ vẽ đồ thị hàm số, hoặc tính tích phân gần đúng của một biểu thức hàm số bất kỳ.

Các bước thực hiện


1. Khởi tạo đối tượng
2. Tính toán dựa vào các tham số

bước 1 chia làm 3 bước nhỏ
tiền xử lý chuỗi
đưa về biểu thức balance dạng chuỗi
đưa về biểu thức balance dạng đối tượng hàm
biên dịch (tạm gọi).

bước 2. tính toán dựa trên biểu thức đã biên dịch.

do đó
Không Nên
f = "1 + 2";
res_f = f.calculate(NULL);
g = "2 + 3"
res_g = g.calculate(NULL);

Nên thay doạn code trên bằng :
f = "x + y";
f.SetParamsKey("xy");
params = {1,2};
res_1 = f.calculate(params);
params = {2,3};
res_2 = f.calculate(params);



Nếu ai cần tui sẽ đưa file dạng thư viện (.dll và header + mô hình lớp), cũng có thể cho cả source code.

minhthinh937
08-06-2009, 15:51
anh Minh ơi! anh có thể send cho em cái code về bài toán kia đc ko?
nếu được anh gửi vào mail nguyenminhthinh08th@yahoo.com.vn
em xin cảm ơn!

ptaminh
09-06-2009, 18:27
Ý của bạn là source code à ? Nếu vậy bạn cần source làm gì ?
Nếu cần file dạng thư viện thì không có vấn đề gì.