PDA

View Full Version : Ky phap Ba Lan: chuyen bieu thuc dang trung to thanh hau to



nccnm
09-10-2004, 19:32
Mọi người ơi đã ai làm cái này chưa giúp hộ cái: chuyển biểu thức từ dạng trung tố sang hậu tố.
Cái này gọi là ký pháp Ba Lan chắc nhiều người biết.

Ví dụ như sau:

Biểu thức trung tố: (3+5)*(3-6)
Chuyển sang biểu thức hậu tố: 35+36-*
Hai biểu thức trên chỉ là kết quả của việc duyệt cây sau:
__________*_________
| |
____ +____ ____ -____
| | | |
3 5 3 6


Biểu thức trung tố là kết quả của việc duyệt theo thứ tự giữa.
Duyệt cây theo thứ tự giữa (inorder traversal):
-duyệt cây con trái theo thứ tự giữa
-thăm gốc
-duyệt cây con phải theo thứ tự giữa

Biểu thức hậu tố là kết quả của việc duyệt theo thứ tự sau (postorder traversal):
-duyệt cây con trái theo thứ tự sau
-duyệt cây con phải theo thứ tự sau
-thăm gốc

(ghi chú: phép xử lý các nút (node) trên cây được gọi là phép thăm (visit) nút, một cách hệ thống, sao cho mỗi nút chỉ được thăm một lần , gọi là phép duyệt nút.)

Vấn đề bây giờ là làm thế nào từ biểu thức trung tố mà xây dựng được cái cây kia, hic...hoặc làm cách khác, miễn là đúng.
Ai giúp được cám ơn lắm lắm....
Hình như hồi trước trong phần dowload của của diendantinhoc.net có bài viết về ký pháp nghịch đảo Ba Lan nhưng giờ không vào được. Nếu ai có làm ơn gửi vào nccnm@yahoo.com. Xin cảm ơn

ức thật sao cái cây của mình không hiển thị đúng nhỉ :glare:

mapleleaf
14-10-2004, 16:09
Cái này hình như liên quan đến stack hay queue gi đấy. Bạn search thử đi.

Hồi đó học cái này lớt phớt lắm nên chẳng nhớ đọc được ở đâu.

jiSh@n
16-10-2004, 03:50
Bạn vào http://spkt.net/pn/html/index.php?name=PNphpBB2&file=viewtopic&t=49 xem mã nguồn bằng C, cái này chỉ đơn giản dùng stack.

songok
18-10-2004, 14:41
Bai nay con tuy thuoc vao nguoi su dung nhap vao nhu the nao nua: Neu nguoi su dung nhap day du cac dau ngoac vi du ( 8*(7+3)) thi coi nhu xong , ban chi can dung cau truc cay nhu sau :

typedef struct node {
char key;
node* left;
node* right;
};
key de chi so hay cac phep toan nhu : *,/,+,- con node* left , node* right de chi den nhanh con cua cay

Bai nay tui da lam lau roi, nhung khong dung cay, ma dung mang va su dung stack de lam, bai nay tui lam cho nguoi su dung nhap vao thoai mai, nghia la khong can bo ngoac gi het, chuong trinh se tu bo ngoac. Tui se gui ct nay cho ban

nccnm
18-10-2004, 20:45
Cám ơn các ban, đặc biệt là bạn songok, mình chờ mail của bạn he`.
Mình đã tìm ra thuật toán của bài này rồi, đúng là không cần phải dùng cây , duyệt diếc gì hết, chỉ cần dùng stack.

dongthao
19-10-2004, 16:11
to nccnm: Bài này nếu bạn dùng stack hay queue thì khá đơn giản. Nhưng mình nghĩ bạn nên dùng cấu trúc cây thì sẽ hiểu rõ hoạt động của cây hơn, cụ thể là các cách duyệt cây: preorder, inoder, postorder. Nếu bạn có quan tâm đến cây thì mình sẽ nói sau. Còn nếu bạn dùng stack thì mình nghĩ không có gì để bàn, đúng không?

songok
21-10-2004, 17:09
Dung cau truc cay hay stack hay queue gi cung vay thoi, may ham duyet sau, rong gi do viet de quy co vai dong thoi ( neu thich thi ban cho the khu de quy cung duoc) . Rac roi o cho : neu co du dau ( thi moi dung chu neu nguoi su dung go thieu hay go sai, hay lam bieng go dau ngoac ghi cac giai thuat tren cung khong xong.

Xin loi ban nccmn nhe : minh quen mat di gui cho ban chuong trinh tinh gia tri bieu thuc cua minh, ma ban cho minh mail duoc hong, minh khong biet attach file cho nao het. Minh se gui lien cho ban

chuc may man

bichduyen_nt
21-10-2004, 20:06
Duyên cũng có làm bài này hồi học kỳ trước, xài STACK , làm cũng khá hoàn chỉnh, có luôn phần kiểm tra nhập biểu thức vô, bạn muốn tham khảo không? PM địa chỉ mail của bạn cho D đi, D sẽ gởi bài tập của D qua cho bạn

nccnm
22-10-2004, 21:34
hi địa chỉ mail mình là : nccnm@yahoo.com , nếu các bạn gửi mình sẽ cảm ơn lắm lắm...
Dĩ nhiên là nếu biểu thức nhập sai thì thuật toán đó làm sao cho kết quả đúng.
Thực ra nếu ai học môn chương trình dịch rồi thì bài toán này có thể giải theo cách:
+đầu tiên là phân tích từ vựng xem cái nào là toán hạng, cái nào là toán tử
+sau đó phân tích cú pháp ta sẽ được cái cây trên

Lý thuyết thì là thế nhưng do mấy đứa bạn "xấu xa" toàn rủ mình bỏ học đi ténh bi a nên mình chỉ biết đến thế mà thời gian nộp bài cũng sắp hết.

to dongthao: cám ơn bạn, thật ra các cách duyệt cây thì mình học từ lâu rồi, vấn đề ở chỗ này là làm sau dựng được cái cây đó.
to bichduyen: bạn gửi cho mình nhé , mình cũng chưa rõ cách bạn kiểm tra biểu thức thế nào.

jiSh@n
22-10-2004, 21:59
Bạn cứ xem chương trình của mình ở địa chỉ trên, chương trình có khả năng kiểm tra biểu thức, có thể tự động sửa một số lỗi nhỏ và có hỗ trợ nhập giá trị của biến bên trong biểu thức.

nccnm
22-10-2004, 23:21
cám ơn jiSh@n, mình quên mất cái link của bạn, mình sẽ ngâm kíu nó.

cntt19001570
23-10-2004, 10:12
Duyên cũng có làm bài này hồi học kỳ trước, xài STACK , làm cũng khá hoàn chỉnh, có luôn phần kiểm tra nhập biểu thức vô, bạn muốn tham khảo không? PM địa chỉ mail của bạn cho D đi, D sẽ gởi bài tập của D qua cho bạn


ok,send cho mình với microsoftbk@s.vnn.vn

nccnm
25-10-2004, 02:22
Nếu bạn nào muốn tim hiểu về ký pháp nghịch đảo Ba lan thì link đây:
http://ttvnol.com/f_204/192667.ttvn
Trong đó có mình họa code bằng Pascal nhưng mà hơi phức tạp, nếu bạn thích C hơn thì mình có chương trình sau cho bạn (lấy từ sách Bài tập ngôn ngữ lập trình C, tác giả Huỳnh Tấn Dũng và Hoàng Đức Hải).

to jiSh@n: trong code bạn có đoạn này gây lỗi mình ko dịch được (mình dùng TC3.0), và thú thật mình chưa bao h nhìn thấy kiểu khai báo biến như thế này:

const stacklimit=256;

double stack[stacklimit];

char *s=(char*)malloc(256);

mình nghĩ là nên sửa như sau:
#define stacklimit 256
double stack[stacklimit];
char s[stacklimit];
sau khi sửa xong chương trình vẫn chạy tốt.

jiSh@n
26-10-2004, 00:30
Bạn dịch ko được ư? Tôi thì dịch và chạy bình thường trong BC3.1 cơ đấy. Đây là một project của tôi, đã được thầy kiểm tra kỹ nên tôi nghĩ những lỗi cú pháp hòan tòan ko có. Còn việc khai báo biến như thế thì có gì là lạ đâu cơ chứ?

bete
26-10-2004, 00:38
Thân gửi nccnm & jish@n:

Tui nghĩ

const stacklimit=256;

là cú pháp của C++

TC3.0 là trình biên dịch C => cần sửa như nccnm:

#define stacklimit 256

Còn

char *s=(char*)malloc(256); /* cấp phát động */

thì tui nghĩ TC3.0 chấp nhận rồi => không cần sửa thành:

char s[stacklimit]; /* cấp phát tĩnh */

(có gì sai sót xin các bạn chỉ giúp, cám ơn)

-thân

nccnm
26-10-2004, 00:50
sorry jish@n , cũng có thể là do nccnm chưa bít nhiều.
dòng sau nếu đặt trong 1 hàm nào đó thì dĩ nhiên ok nhưng mờ nếu khai báo biến toàn cục thì TC++3.0 (xin lỗi mình dùng TC++3.0 chứ ko phải TC3.0) báo lỗi khai báo ko hợp lệ.
char *s=(char*)malloc(256); /* cấp phát động */
con dòng sau:const stacklimit=256; để mình xem lại C++ lâu chưa rờ tới nên có thể sai sót, mình cứ nghĩ là khai báo hằng thì cũng phải có kiểu của nó với lại trình biên dịch của mình báo lỗi dòng này.
mình có quan niệm là ko nên nhập nhằng giữa C và C++, nếu viết bằng C thì ko nên sử dụng các đặc điểm của C++. à mà đuôi của tệp mã nguồn của jish@n mình đặt là *.C chứ ko phải *.CPP nên nó TBD báo lỗi chăng, để mình xem lại.

jiSh@n
26-10-2004, 01:33
Đặt là .C hay .CPP đâu có ảnh hưởng gì đâu. tuy nhiên, cái nì do tui dịch trên BC3.1 chứ ko phải TC nên cũng ko rõ là nó có gây lỗi trên TC hay ko nữa. Nhưng trên BC3.1 thì ko có lỗi.

nccnm
26-10-2004, 20:47
hì nếu đặt là .C thì làm sao sử dụng các đặc tính của C++ được. nhưng mà nó vẫn tùy thuộc vào trình biên dịch.

jiSh@n
28-10-2004, 02:30
Chương trình của tôi được đặt tên .C đấy, cái quan trọng là trình biên dịch chứ ko phải cái tên tập tin. BC3.1 chẳng những dịch C mà còn dịch cả C++. .C hay .CPP ko thành vấn đề.

freegianghu
28-10-2004, 02:34
Chương trình của tôi được đặt tên .C đấy, cái quan trọng là trình biên dịch chứ ko phải cái tên tập tin. BC3.1 chẳng những dịch C mà còn dịch cả C++. .C hay .CPP ko thành vấn đề.

Có điều với file .C -> dịch theo cú pháp C, với file .cpp dịch theo cú pháp C++ (cả TC3 lẫn BC3x đều không nằm ngoài nguyên tắc này).

jiSh@n
28-10-2004, 02:56
Cái đó thì tôi ko biết, chỉ biết rằng cú pháp C++ là mở rộng của C, đã là trình dịch C++ thì chỉ dùng cú pháp C thôi cũng dịch được. Chỉ khi nào là trình dịch C thì mới có việc phân biệt C hay C++ chứ nhỉ?

neverstop
03-11-2004, 19:30
có bạn nào nghĩ ra cách gì khác với ký pháp Ba Lan không?
giả sử bài toán đơn giản hơn: không có các dấu ngoặc.

jiSh@n
04-11-2004, 00:25
Ký pháp ba Lan được xem là thuật tóan chuẩn, tôi được biết các máy tính vá trình biên dịch cũng sử dụng nó. Còn nếu ko dùng ký pháp này thì cũng có cách đó, nhưng chậm hơn rất nhiều, hơn nữa cũng ko thực tế.

function Calculate(SMyExpression: string; digits: Byte): string;
// Calculate a simple expression
// Supported are: Real Numbers, parenthesis
var
z: Char;
ipos: Integer;

function StrToReal(chaine: string): Real;
var
r: Real;
Pos: Integer;
begin
Val(chaine, r, Pos);
if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
Result := r;
end;

function RealToStr(inreal: Extended; digits: Byte): string;
var
S: string;
begin
Str(inreal: 0: digits, S);
realToStr := S;
end;

procedure NextChar;
var
s: string;
begin
if ipos > Length(SMyExpression) then
begin
z := #9;
Exit;
end
else
begin
s := Copy(SMyExpression, ipos, 1);
z := s[1];
Inc(ipos);
end;
if z = ' ' then nextchar;
end;

function Expression: Real;
var
w: Real;

function Factor: Real;
var
ws: string;
begin
Nextchar;
if z in ['0'..'9'] then
begin
ws := '';
repeat
ws := ws + z;
nextchar
until not (z in ['0'..'9', '.']);
Factor := StrToReal(ws);
end
else if z = '(' then
begin
Factor := Expression;
nextchar
end
else if z = '+' then Factor := +Factor
else if Z = '-' then Factor := -Factor;
end;

function Term: Real;
var
W: Real;
begin
W := Factor;
while Z in ['*', '/'] do
if z = '*' then w := w * Factor
else
w := w / Factor;
Term := w;
end;
begin
w := term;
while z in ['+', '-'] do
if z = '+' then w := w + term
else
w := w - term;
Expression := w;
end;
begin
ipos := 1;
Result := RealToStr(Expression, digits);
end;

SilverStar
03-12-2004, 20:33
To vocongduong:
Muốn chuyển thành trung tố thì 1 là bạn chuyển 1 biểu thức bình thường sang hậu tố, rồi sau đó đảo ngược biểu thức dạng hậu tố là được tiền tố thôi. Hôm nay , tui mới nộp bài chuyển trung tố, hậu tố và tính những phép toán thông thường cho ông thầy nè. Nhưng do trình độ kém cỏi nên không viết được hoàn chỉnh lắm.


Uses crt;
Const
HAM: array[1..8] of string = ('sin', 'cos', 'tg', 'cotg','ln','exp',
'sqr','sqrt');
Type
Chuoi=String[10];
{ Kieu du lieu cho Cay }
tree=^tNode;
tNode= record
tdata:chuoi;
left,right:tree;
end;

{ Kieu du lieu cho danh sach lien ket }
Stack = ^Node;
Node = record
data : Chuoi;
link : Stack;
End;
Var
L: Stack;
S: String;
Root : Tree;

Function BlankRemoved(S: String): String;
Var
str_tam: String;
i: integer;
Begin
str_tam:='';
i:= 1;
Repeat
If s[i] <> ' ' then
Begin
str_tam:= str_tam + s[i];
i:=i+1;
End
Else
i:=i+1;
Until i > Length(S);
BlankRemoved:= str_tam;
End;

{ Function Tinh Ham }
Function Tinhham(St,Num: String):String;
Var
S: String;
A,Kq : Real;
C : Integer;
Begin
Val(Num, A, C);
If C = 0 Then
Begin
If St = 'sin' then Kq:= sin(A*Pi/180) Else
If St = 'cos' then Kq:= cos(A*Pi/180) Else
If St = 'tg' then Kq:= sin(A*Pi/180)/cos(A*Pi/180) Else
If St = 'cotg' then Kq:= cos(A*Pi/180)/sin(A*Pi/180) Else
If St = 'ln' then Kq:= ln(A) Else
If St = 'exp' then Kq:= exp(A) Else
If St = 'sqr' then Kq:= sqr(A) Else
If St = 'sqrt' then Kq:= sqrt(A);
End;
Str(Kq:0:2,S);
TinhHam:= S;
End;

{ Function Tinh2ngoi }
Function Tinh2ngoi(A,B,Pheptoan: String):String;
Var
S: String;
TT1,TT2,Kq : Real;
C1,C2,i : Integer;
Begin
Val(A,TT1,C1);
Val(B,TT2,C2);

If (C1+C2 = 0) then { Error checking for Val }
Begin
If Pheptoan = '+' then Kq:= TT1+TT2 Else
If Pheptoan = '-' then Kq:= TT1-TT2 Else
If Pheptoan = '*' then Kq:= TT1*TT2 Else
If (Pheptoan = '/') and (TT2 <> 0) then Kq:= TT1/TT2 Else
Write('Phep chia cho 0 - Devided by zero');
End;
Str(Kq:0:2,S);
Tinh2Ngoi:= S;
End;

{ Function xet mot chuoi co la ham khong ? }
Function ThuocSo(S : String):boolean;
Begin
If (S[1] >= '0') and (S[1] <= '9') then
ThuocSo:= True
Else
ThuocSo:= False;
End;

Function ThuocDau(S: String): Boolean;
Begin
If (S = '+') or (S = '-') or (S = '*') or (S = '/') or (S = '^')
Then ThuocDau := True
Else
ThuocDau:=False;
End;

{ Function xet mot chuoi co la ham khong ? }
Function ThuocHam(S : String):boolean;
Var
i: integer;
Begin
ThuocHam:= False;
For i:=1 to 8 do
If S = HAM[i] then
ThuocHam:=True;
End;

{ Ham xet ngoi cua toan tu }
Function Ngoi(s:chuoi):integer;
Begin
If (s[1]='+') or (S[1] = '-') or (S[1]= '*')
or (S[1] = '/') or (S[1]= '^') Then
Ngoi:=2
Else Ngoi:=1;
End;

{ Ham xet uu tien cua toan tu }
Function UuTien(S: String): integer;
Begin
if(S='^') then Uutien:=3
else
If (S = '*') or (S = '/') then UuTien:=2
Else If (S = '+') or (S = '-') then UuTien:=1
else if (S = '(') then UuTien:=0
else UuTien:=4;
End;

{ Procedure cat vao ngan xep }
Procedure Push( Var L: Stack; x :Chuoi);
Var
tam: Stack;
Begin
New(tam);
tam^.data:=x;
tam^.link:= L;
L:=tam;
End;

{Procedure lay ra khoi ngan xep }
Procedure Pop( Var L: Stack; Var x: Chuoi);
Var
tam: Stack;
Begin
tam:= L;
L:=L^.link;
x:=tam^.data;
Dispose(tam);
End;

Procedure Xuat(L:stack);
Var tam:stack;
Begin
tam:=L;
While (tam <> Nil) Do
Begin
Write(tam^.data,' ');
tam:=tam^.link;
End;
End;

{ Procedure dao nguoc thu tu trong dslk L}
Procedure DaoNguoc( Var L: Stack);
Var
t1,t2: Stack;
Begin
t1:=L;
L:=Nil;
while(t1<>Nil) do
begin
t2:=t1;
t1:=t1^.link;
t2^.link:=L;
L:=t2;
end;
End;

Procedure Tach(var L:stack;s:String);
var s_tam:chuoi;
i:integer;
Begin
i:=1;
While (i <= Length(S)) do
Begin
If ((S[i] >= '0') and (S[i] <='9')) Then
Begin
s_tam:='';
While ((S[i] <='9') and (S[i] >= '0')
and (i <= Length(S))) do
Begin
s_tam:=s_tam+S[i];
Inc(i);
End;
Push(L,s_tam);
End
Else If ((S[i] >= 'a') and (S[i] <= 'z')) Then
Begin
s_tam:='';
While ((S[i] <= 'z') and (S[i]>= 'a')
and( i <= Length(S))) do
Begin
s_tam:=s_tam+S[i];
inc(i);
End;
{ Khong nhap ham sai vao dslk }
If (ThuocHam(s_tam)) then Push(L,s_tam)
Else
Begin
Write('Ham nhap sai');
Exit;
End;
End
Else
Begin
Push(L,S[i]);
inc(i);
End;
End;
End;

Procedure Chen_cuoi(Var L,Last:Stack;var x: Stack);
Begin
if(L=Nil) then
Begin
L:=x;
Last:=L;
end
else
begin
Last^.link:=x;
Last:=x;
end;
Last^.link:=Nil;
end;

Procedure Hauto(var L:stack);
var st,tam,tam2,ht,last:Stack;
stop:boolean;
Begin
st:=Nil;
ht:=Nil;
last:=Nil;
While (L<> Nil) do
Begin
tam:=L;
L:=L^.link;

If (tam^.data[1] >= '0')
and (tam^.data[1] <='9') Then {Nut chua so So}
Chen_cuoi(Ht,Last,tam)
Else If (tam^.data[1] = '(') Then {Nut chua dau: '('}
begin {Dua vao ngan xep}
tam^.link:=st;
st:=tam;
end
else
If (tam^.data[1] = ')') Then {Nut chua dau: ')'}
Begin {Lay ra khoi ngan xep cho den khi gap dau ')'}
dispose(tam);
while(st^.data[1]<>'(') do
begin
tam:=st;
st:=st^.Link;
Chen_cuoi(Ht,Last,tam);
end;
tam:=st;
st:=st^.link;
dispose(tam);
End
else {Nut chua toan tu}
repeat
stop:=false;
if(st=Nil) then {Ngan xep rong}
begin
st:=Tam;
Tam^.link:=Nil;
stop:=true;
end
else {Ngan xep khong rong}
if uutien(Tam^.data)>Uutien(St^.data)
then {Do uu tien cao hon dinh ngan xep}
begin {Dua toan tu vao ngan xep}
tam^.link:=st;
st:=tam;
Stop:=True;
end
else {Do uu tien thap hon}
begin
tam2:=st;
st:=st^.Link;
Chen_cuoi(Ht,Last,tam2);
end;
until(stop=true);
End;
while(st<>Nil) do {Lay cho het ngan xep}
begin
tam:=st;
st:=st^.Link;
Chen_cuoi(Ht,Last,tam);
end;
L:=Ht;
End;

Procedure DanhgiaDS(L: Stack);
Var
p,Tam: Stack;
A,B: Chuoi;
Code : integer;
Begin
p:= L;
Tam:=Nil;
Repeat
{ Truong hop xu ly 1 pt trong DSLK HauTo la so }
If ThuocSo(p^.data) then
Begin
Push(Tam,p^.data);
p:= p^.link;
End
Else

{Truong hop pt DSLK HauTo la Ham}
If ThuocHam(p^.data) then
Begin
Pop(tam,A);
A:= TinhHam(p^.data,A);
Push(tam,A);
p:=p^.link;
End
Else
{Truong hop pt DSLK HauTo la Dau }
If ThuocDau(p^.data) then
Begin
Pop(tam,B);
Pop(tam,A);
A:= Tinh2Ngoi(A,B,p^.data);
Push(tam,A);
p:= p^.link;
End
Else p:=p^.link; { Bo qua phan tu khong xac dinh }
Until (p = Nil);
Pop(tam,A);
Clrscr;
Write('Ket qua tinh bang DSLK:',A);
Readln;
End;

Procedure Pushtree(Var root:tree;var L:stack);
Var x:chuoi;
begin
new(root);
pop(L,x);
root^.tdata:=x;
if ThuocSo(x) then {Dat toan hang len Node}
begin {gap toan hang}
root^.right:=nil;
root^.left:=nil;
end
else {Toan tu}
if(Ngoi(x)=2)then
begin
Pushtree(root^.right,L);
Pushtree(root^.left,L);
end
else {Mot ngoi}
begin
Pushtree(root^.right,L);
root^.left:=nil;
end;
end;

{ Xuat }
Procedure duyet_nlr(p:tree);
begin
if (p<>nil) then
begin
write(p^.tdata,' ');
duyet_nlr(p^.left);
duyet_nlr(p^.right);
end;
end;

{ Xuat Trung To}
Procedure duyet_lnr(p:tree);
begin
if (p<>nil) then
begin
duyet_lnr(p^.left);
write(p^.tdata,' ');
duyet_lnr(p^.right);
end;
End;


{Than chuong trinh chinh}
Begin
clrscr;
L:= Nil;
Write('Nhap bieu thuc toan hoc: '); Readln(S);
s:= BlankRemoved(S);
Write('Bieu thuc vua nhap: ',s);
Tach(L,S);
Daonguoc(L);
Hauto(L);
DanhgiaDS(L);

Daonguoc(L);
root:=nil;
pushtree(root,L);
Write('Xuat tien to: ');
duyet_nlr(root);
Write('Xuat trung to: ');
duyet_lnr(root);
End.

Cái này sử dụng chủ yếu là chuỗi, cấu trúc dữ liệu dùng là DSLK, Cây.

hjkromeo
24-11-2008, 01:44
Cái code này là C++ hay là PÁSCAL vậy anh ơi

chiataytuday
11-12-2008, 09:32
đây là bài toán hệ điều hành của mình, thầy bảo làm ký pháp ba lan mà mình chưa hiểu về nó. các bác ai có thể giúp mình không?
mình cảm ơn nhiều nha.

"Viết chương trình gồm có 2 quá trình. Quá trình thứ nhất cho người dùng nhập vào từ bàn phím một chuỗi biễu diễn một phép tính gồm các phần tử +, -, (, ). Độ ưu tiên của các phép tính trong ngoặc (cặp dấu ( & )) là cao nhất, phép + và – cùng độ ưu tiên. Ví dụ:
1+2+(2-3-4) –((3+4)-5)
(1+(-2)–((3+4)-5))
Sau đó truyền chuỗi dữ liệu này cho quá trình thứ hai. Quá trình thứ hai thực hiện tính toán trên và trả kết quả về cho quá trình thứ nhất để hiển thị cho người sử dụng biết.
Thực hiện bài toán dùng message queue để giao tiếp giứa 2 quá trình".
mail:hieunguyen.bkit@gmail.com

quangchjen
23-04-2010, 11:08
các bác ơi! giúp mình với...
bài toán về Shell trong linux:
Viết chương trình gồm có 2 quá trình. Quá trình thứ nhất cho người dùng nhập vào từ bàn phím một chuỗi biễu diễn một phép tính gồm các phần tử +, -, (, ). Độ ưu tiên của các phép tính trong ngoặc (cặp dấu ( & )) là cao nhất, phép + và – cùng độ ưu tiên. Ví dụ:
1+2+(2-3-4) –((3+4)-5)
(1+(-2)–((3+4)-5))
Sau đó truyền chuỗi dữ liệu này cho quá trình thứ hai. Quá trình thứ hai thực hiện tính toán trên và trả kết quả về cho quá trình thứ nhất để hiển thị cho người sử dụng biết.
Thực hiện bài toán dùng cơ chế multicast.để giao tiếp giứa 2 quá trình.
mail: quangchjen1508@gmail.com
thanks các bác trước nhé......