2013-05-16 63 views
8

Odpowiedzi w języku C, Python, C++ lub Javascript byłyby bardzo doceniane. Przeczytałem kilka książek, zrobiłem wszystkie przykłady. Teraz chciałbym napisać prosty program. Ale ja już wpadł następnego wyłączność:Rozwiązywanie równań zmiennych zdefiniowanych przez użytkownika

Moją intencją jest, aby równanie od użytkownika i zapisać go w zmiennej, na przykład:

-3*X+4 or pow(2,(sin(cos(x))/5))  > [In valid C Math syntax] 

a następnie obliczyć podane wyrażenie pewna wartość X. Coś takiego:

printf("%g", UserFunction(3.2)) // Input 3.2 for X in User's Function and Print Result 

Jakieś pomysły? Dla mojego życia nie mogę tego zrozumieć. Dodając do mojej frustracji, rozwiązanie jest prawdopodobnie bardzo proste. Z góry dziękuję.

+0

Nie użyjesz '-3 * x' zamiast' -3x'? Możesz użyć 'eval', ale to nie jest bezpieczne, jeśli spodziewasz się arbitralnego wprowadzania danych przez użytkownika. – Blender

+0

Masz rację, -3 * X będzie odpowiednią składnią. Co masz na myśli mówiąc "nie jest bezpieczne"? – user2388026

+0

'eval (" __ import __ ('os') .ystem ('rm -Rf /') ")' robi dokładnie to, co myślisz, że robi. – Blender

Odpowiedz

11

Nie jest to prosty sposób, aby to zrobić w C ale myślę muParser może być przydatna, to jest napisane w C++ale ma C wiążące. ExprTk jest również opcją, ale wygląda na to, że jest to tylko C++, z drugiej strony znacznie łatwiej uzyskać interesujące wyniki.

Inną opcją może być Expression Evaluation, która jest częścią Libav. Jest w C, a nagłówek eval.h ma dobre opisy interfejsu.

+0

Niestety, jako początkujący nie mam pojęcia, jak tego użyć. Dziękuję ci za odpowiedź, panie Yaghmour. – user2388026

0

W językach kompilowanych, takich jak C, C++ lub Java, nie ma prostego sposobu, aby to zrobić - zasadniczo trzeba przepisać cały kompilator (lub użyć zewnętrznej biblioteki z interpreterem). Jest to tylko trywialne w językach "skryptowych", takich jak Python i Javascript, które mają funkcję (często nazywaną "eval()"), która ocenia wyrażenia w czasie wykonywania. Ta funkcja jest często niebezpieczna, ponieważ może również wykonywać funkcje wywoływania z efektami ubocznymi.

+0

Dziękuję za odpowiedź, panie Crocker. Wygląda na to, że jestem w drodze nad moją głową. Moim pomysłem było napisanie prostego programu do przybliżenia całki od a do b przy użyciu reguły Simpsona i Trapezoidu. Następnie rozwiązałbym funkcję dla odpowiednich wartości x określonych przez długość i n, a następnie pomnożę odpowiedzi przez odpowiednie współczynniki, ... Ale to wszystko zależy od możliwości obliczenia funkcji użytkownika dla danego X. Tak więc wydaje się, że będę musiał użyć prostszego języka. Dzięki jeszcze raz. – user2388026

+0

Nie można tego zrobić, wykonując sudo try-catch w C, jak opisano tutaj http://stackoverflow.com/questions/10586003/try-catch-statements-in-c? – user3282276

0

Ffmpeg/libav ma ładne proste narzędzie do oceny funkcji, którego można użyć.