Mình đang cần một thuật toán để xây dựng một công thức tính.
Ví dụ như: khi mình nhập vào một công thức tính là a+b thi khi nhập vào giá trị 3, 5 sẽ in ra 8. Còn khi mình xác lập lại công thức (a-b)*c và nhập vào 5,2,2 thì sẽ in kết quả là 6. Xin các bác vui lòng chỉ giúp mình thuật toán này với nhé, cám ơn các pà con.
Time
- Được đấy, mình nghĩ nếu con người thông minh trên tất cả thì đều có thể biến tất cả các loại máy fục vụ mình ...Ví dụ:nếu như bạn nói ko đc thì bạn đang sài máy tính bỏ túi casio là jì đấy????Cái này chắc không thể làm được đâu bạn ạ
Mình nghĩ vậy, máy chứ không phải người
- Cái này nếu phân tích về mặt cấu trúc dữ liệu thì bạn có thể dùng Stack để cài đặt...(hậu tố, trung tố, tiền tố);Nói chung thì cũng khá phức tạp..
- Nhưng ko ít thì nhiều bạn cũng phải định nghĩa các toán tử cơ bản.
Đã được chỉnh sửa lần cuối bởi hacker_mubaohiem : 10-04-2008 lúc 10:05 AM.
No way, No success..
Cậu học C/C++ được lâu chưa ( 2 năm ?) , bài này khó đó cậu à !Mình đang cần một thuật toán để xây dựng một công thức tính.
Ví dụ như: khi mình nhập vào một công thức tính là a+b thi khi nhập vào giá trị 3, 5 sẽ in ra 8. Còn khi mình xác lập lại công thức (a-b)*c và nhập vào 5,2,2 thì sẽ in kết quả là 6. Xin các bác vui lòng chỉ giúp mình thuật toán này với nhé, cám ơn các pà con.
Có nghĩa là cậu nhập vào công thức tính và giá trị sao cho giá trị sẽ được giải quyết theo công thức cậu nhập vào ?
Với bài này, tớ nghĩ như thế này :
1. Phân rã biểu thức nhập vào thành cấu trúc cụ thể ( cây biểu thức )
2. Lấy dữ liệu đưa vào, kiểm tra và thay thế nó với dữ liệu của cấu trúc ( thay các node leaf của cây biểu thức thành giá trị nhập vào )
3. Tính giá trị trên cây biểu thức và xuất kết quả ra màn hình.
Về cây biểu thức thì cậu phải coi lại trong sách. xây dựng nó cũng không quá khó, nhưng không hề dễ.
Sau đó theo thuật toán trên mà làm.
Vd: ( A+b )*2
Bước 1:
****x
*+****2
A B
Bước 2:
Mặc định giá trị đầu tiên là a, tiếp theo là b ....
A = 5 , b = 10:
****x
*+****2
5 10
Tính toán :
****x
*15***2
****30
Xuất : 30.
Đã được chỉnh sửa lần cuối bởi kidkid : 10-04-2008 lúc 11:22 AM.
thử cái này xem bạn ơiCode:#include<stdio.h> #include<conio.h> #include<string.h> void main() { float a,b; char tt; printf("\n nhap bieu thuc don gian :"); scanf(" %f%c%f",&a,&tt,&b); switch(tt) { case '+' : printf("\n %f%c%f = %f",a,tt,b,a+b); break; case '-' : printf("\n %f%c%f = %f",a,tt,b,a-b); break; case 'x' : case '*' : printf("\n %f%c%f=%f",a,tt,b,a*b); break; case ':' : if(b!=0) printf("\n %f%c%f=%f",a,tt,b,a/b); else printf("loi chia cho 0"); break; default: printf("\n \n khong hieu phep toan %c,tt"); } getch(); }
Nghĩa là * nhỉ? ^^!
Dùng kí pháp nghịch đi ( biểu thức hậu tố ấy )
Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.
Cái dạng này mình có ý tưởng nhưng để sau cùng vì nó khó làm mà đễ nhiều lỗi lắm. Khó nhất phần xử lí ngoặc thôi. các phần khác phải lo ưu tiên và tuần tự.
Đây là bài toán biên dịch công thức. Về cơ bản có 2 cách là dựa vào văn phạm (grammar) và dựa vào văn phạm có thuộc tính (attributed grammar). Cách 1 dễ hiểu hơn nhưng code dài dòng hơn. Cách 2 thì rất ngắn gọn nhưng đòi hỏi kiến thức cao cấp hơn.
Cách 1 (cách mà mình khuyên bạn nên dùng) có các phần như sau:
1- phân tích cú pháp
2- phân tích từ vựng
3- dịch biểu thức thành cây (hoặc thành dạng hậu tố, còn gọi là ký pháp Ba Lan ngược)
4- rút gọn biểu thức
5- thi hành (còn gọi là triển khai hoặc đánh giá) biểu thức.
Để thực hiện cách này bạn chỉ cần
- 1 cú pháp (văn phạm của biểu thức) và
- 1 từ pháp (văn phạm của các ký hiệu như hằng, biến, hàm, dấu phép tính,... trong biểu thức).
Đã được chỉnh sửa lần cuối bởi Ada : 11-04-2008 lúc 06:02 PM. Lý do: thuật ngữ