• 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

Object Storage Arubacloud
0 głosów
281 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 (91,110 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ź 918 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
1 odpowiedź 361 wizyt
0 głosów
3 odpowiedzi 1,141 wizyt

92,684 zapytań

141,589 odpowiedzi

320,073 komentarzy

62,044 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...