• 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
273 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,010 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ź 873 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
1 odpowiedź 343 wizyt
0 głosów
3 odpowiedzi 1,125 wizyt

92,576 zapytań

141,425 odpowiedzi

319,650 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...