Dữ liệu đầu vào là một string mô tả một hàm siêu việt, có cách nào để nhận diện các phép toán có trong input?

Chào mọi người, cho mình xin phép hỏi…

Input là một string mô tả một hàm số siêu việt:
Vd: “sin (x) + cos (x)/e^x - 4tan(4x)”

Bây giờ nếu có giá trị của x thì tính giá trị của f(x) như thế nào nhỉ?

Cách duy nhất mình có thể nghĩ ra đó là cắt từng đoạn của input ra thành các phần nhỏ riêng biệt rồi tính từng phần xonq tổng giá trị lại với nhau sẽ được giá trị của hàm số:
["sin (x), “cos (x)/e^x”, “4tan(4x)”]

Tuy nhiên như vậy thì code để thực hiện việc này khá là khoai và rất dễ lỗi vì sự phức tạp của phương trình nếu có thêm các dấu ngoặc () {} [] để thể hiện độ ưu tiên tính toán, rồi các phép / (chia), * (nhân) lồng vào nhau, … .

Mô tả của mình khá giống với thao tác trên máy tính cầm tay Casio. Mọi người có giải pháp nào hoặc kinh nghiệm gì về vấn đề này không ạ? Mình cảm ơn.

*Hàm siêu việt: nôm na là hàm số không có x^n.

Giải pháp chung nhất là một cái expression parser, tham khảo: https://yinyangit.wordpress.com/2011/04/02/c-chuyển-chuỗi-biểu-thức-thanh-expression-tree/
Đây là code C#, bạn thử tìm cách áp dụng vào C++, expression tree tự làm cũng được, hoặc khỏi cần cũng được, tự bạn tìm cách biểu diễn nó thôi.

5 Likes

cảm ơn bạn đã chỉ hướng đi cho mình :heart:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?