• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Własny wzór funkcji matematycznej użytkownika

Aruba Cloud - Virtual Private Server VPS
0 głosów
392 wizyt
pytanie zadane 27 kwietnia 2019 w C# przez Moras Obywatel (1,620 p.)
Cześć chce stworzyć program w którym użytkownik podaje wzór funkcji, wpisuje np. 2x^2 + 4x - 2 lub 4^3  - 2

i następnie użytkownik podaje argument funkcji czyli x i na tej podstawie jest wyliczana wartość funkcji. Tylko, że za bardzo nie wiem jak to zrealizować by się za dużo nie namęczyć. Ma ktoś jakieś pomysły? Będę bardzo wdzięczny.

5 odpowiedzi

+2 głosów
odpowiedź 27 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)
wybrane 29 kwietnia 2019 przez Moras
 
Najlepsza

Mógłbyś użyć algorytmu Shunting-yard (https://en.wikipedia.org/wiki/Shunting-yard_algorithm) do przekonwertowania notacji infiksowej (działania) do RPN sprawdzając przy każdym składniku czy następny znak to x, jeżeli tak to na stos wrzucasz to co miałeś wrzucić pomnożone przez x.

Później obliczasz wartość wyrażenia RPNhttps://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_evaluation_algorithm

Jeżesz chciałbyś zaimplementować bardziej zaawansowane funkcje o których napisał @mrspock1 w swojej odpowiedzi to może ci pomóc ten post na SO: https://stackoverflow.com/questions/24279027/usage-of-functions-with-rpn-form oraz kod kalkulatora napisanego w C++, który takowe funkcje posiada: http://www.learntosolveit.com/cprogramming/Ex_4.5_calculator_math_functions.html

komentarz 29 kwietnia 2019 przez Moras Obywatel (1,620 p.)
Bardzo dziękuje za pomoc.
+1 głos
odpowiedź 27 kwietnia 2019 przez VirtualMember Pasjonat (15,790 p.)

Wykorzystaj zapis texowy (.tex), a następnie skorzystaj z algorytmów ewaluowania wyrażeń texowych

komentarz 29 kwietnia 2019 przez Moras Obywatel (1,620 p.)
Bardzo dziękuje za pomoc.
+1 głos
odpowiedź 27 kwietnia 2019 przez Benek Szeryf (93,070 p.)

Da się coś takiego zrobić w Pythonie za pomocą Sympy. A moduł ten możesz połączyć z C#.

komentarz 29 kwietnia 2019 przez Moras Obywatel (1,620 p.)
Bardzo dziękuje za pomoc.
+1 głos
odpowiedź 29 kwietnia 2019 przez Moras Obywatel (1,620 p.)
edycja 29 kwietnia 2019 przez Moras

Udało mi się napisać w C#. Może nie jest to najbardziej wydajny kod, ale działa(chyba) :D

Program oblicza wartość funkcji gdzie używane są operacje dodawania, odejmowania i potęgowania. Może komuś się przyda:

        static int F(int x)
        {
            string wzor = "-4x^2-2+3x^2"; //Console.ReadLine();

            int i = 0;
            string liczba_przed_x="";
            string liczba_po_znaku_potegi = "";
            int wartosc_wyrazenia=0;
            int wartosc_wzoru = 0;


            char znak_operacji;
            if (wzor[0].Equals('-'))
                znak_operacji = '-';
            else
                znak_operacji = '+';

            while (i < wzor.Length)
            {
                if(!wzor[i].Equals('x') && !wzor[i].Equals('+') && !wzor[i].Equals('-'))
                {
                    liczba_przed_x = liczba_przed_x + wzor[i];
                    i++;

                    if(i>=wzor.Length || wzor[i].Equals('+') || wzor[i].Equals('-'))
                    {
                        wartosc_wyrazenia = Int32.Parse(liczba_przed_x);
                        if (znak_operacji == '+')
                            wartosc_wzoru = wartosc_wzoru + wartosc_wyrazenia;
                        else
                            wartosc_wzoru = wartosc_wzoru - wartosc_wyrazenia;

                        liczba_przed_x = "";
                       
                    }
                }
                else if(i+1<wzor.Length && wzor[i].Equals('x') && wzor[i + 1].Equals('^'))
                {
                    i = i + 2;
                    for(int j = i; j < wzor.Length; j++)
                    {

                        if (!wzor[j].Equals('+') && !wzor[j].Equals('-'))
                        {
                            liczba_po_znaku_potegi = liczba_po_znaku_potegi + wzor[j];
                            i++;
                        }
                        else
                            break;

                    }
                    wartosc_wyrazenia = Int32.Parse(liczba_przed_x) * (int)(Math.Pow(x, Int32.Parse(liczba_po_znaku_potegi)));
                    if (znak_operacji == '+')
                        wartosc_wzoru = wartosc_wzoru + wartosc_wyrazenia;
                    else
                        wartosc_wzoru = wartosc_wzoru - wartosc_wyrazenia;

                    liczba_przed_x = "";
                    liczba_po_znaku_potegi = "";
                    
                }
                else if (wzor[i].Equals('x'))
                {
                    wartosc_wyrazenia = Int32.Parse(liczba_przed_x) * x;
                    if (znak_operacji == '+')
                        wartosc_wzoru = wartosc_wzoru + wartosc_wyrazenia;
                    else
                        wartosc_wzoru = wartosc_wzoru - wartosc_wyrazenia;
                    i++;

                    liczba_przed_x = "";
                    liczba_po_znaku_potegi = "";
                }
                else if (wzor[i].Equals('+'))
                {
                    znak_operacji = '+';
                    i++;
                }
                else if (wzor[i].Equals('-'))
                {
                    znak_operacji = '-';
                    i++;
                }
            }
            return wartosc_wzoru;
        }

 

0 głosów
odpowiedź 27 kwietnia 2019 przez mrspock1 Mądrala (6,420 p.)
Jeżeli w tej funkcji mają być zaawansowane rzeczy jak log(x) to będziesz miał kłopot. Chyba ktoś napisał taką gotową bibliotekę do tego.

Podobne pytania

+1 głos
1 odpowiedź 1,256 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
1 odpowiedź 508 wizyt
0 głosów
3 odpowiedzi 1,371 wizyt

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...