sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

RBator1
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 5 sie 2022, o 12:18
Płeć: Mężczyzna
wiek: 48

sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: RBator1 »

W jaki sposób mogę zbudować funkcję \(\displaystyle{ y=\sin(x)}\);\(\displaystyle{ y=\cos(x)}\); tak aby można było \(\displaystyle{ \sin}\) lub \(\displaystyle{ \cos}\) wprowadzić z klawiatury jako łańcuch, który zamienić można na funkcję? Argument \(\displaystyle{ x}\) wprowadzany z klawiatury.Inaczej jak funkcję \(\displaystyle{ \sin}\) lub \(\displaystyle{ \cos}\) połaczyć z argumentem.

Dodano po 16 godzinach 11 minutach 34 sekundach:
kompilator C++(Visual c++ 2005). Proszę o wskazówki.

Dodano po 33 minutach 55 sekundach:
Chcę wprowadzić sin,cos w postaci string z klawiatury. Deklarując np: string k, cin>>k;a następnie dołączyć do niego argument z klawiatury x np: cin>>x; Jak połączyć to zdanie w sin(x),cos(x)?Czy użyć operacji strtod i jak, czy aby zbudować zdanie w double, łącząc sin i x do postaci sin(x)? Proszę o pomoc. Język C++.

Dodano po 2 godzinach 18 minutach 47 sekundach:
Inaczej :jak dodać sin typu string do x typu double i zamienić na double sin(x);
Ostatnio zmieniony 21 mar 2024, o 08:54 przez Dasio11, łącznie zmieniany 1 raz.
Powód: Brak LaTeXa - zapoznaj się z instrukcją: http://matematyka.pl/latex.htm.
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Gouranga »

W sensie chcesz do zmiennej typu string wpisać "sin(0.1)" i żeby to działało? to po mojemu najprościej wyrażeniami regularnymi, sprawdź czy string posiada podłańcuch "sin" i jak tak to wytnij to co między nawiasami i możesz nawet to ręcznie zrzutować do double, w sensie

Kod: Zaznacz cały

string s = "0.123";
double d = (double)s;[code]
Ostatnio zmieniony 22 mar 2024, o 00:57 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
RBator1
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 5 sie 2022, o 12:18
Płeć: Mężczyzna
wiek: 48

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: RBator1 »

nie rozumiem? możesz mi to zapisać w postaci kodu?

Dodano po 1 godzinie 16 minutach 42 sekundach:

Kod: Zaznacz cały

char a[]="sin 1";
char* pEnd;
double c,d;
c=strtod(a,&pEnd);
d=strtod(pEnd,NULL);
cout<<"co tutaj wpisać aby obliczyć sin (1)";
a następnie co mam zrobić aby w char a[]="wpisać przypisane"; :cin>>"sin", cin>>"x" .
Ostatnio zmieniony 22 mar 2024, o 00:57 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Hir
Użytkownik
Użytkownik
Posty: 46
Rejestracja: 7 mar 2024, o 21:07
Płeć: Kobieta
wiek: 29
Podziękował: 11 razy
Pomógł: 17 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Hir »

Nie wiemy, co dokładnie chcesz zrobić. Jaki jest cel Twojego projektu?

Na pewno musisz wziąć pod uwagę dodatkowe spacje (i nawiasy raczej też). Ja mogłabym wpisać "sin( 1 )" i też powinno działać. Poczytałabym o RPN - odwrotnej notacji polskiej. Potem spróbowała zaimplementować prosty kalkulator obsługujący + - x /. Dodała wsparcie dla nawiasów. I na koniec funkcje trygonometryczne.

To i dużo więcej jest zrobione tu:

Kod: Zaznacz cały

https://gist.github.com/DreamVB/04220c437ff931a4a7ffef3d5258b960
(ale przed zajrzeniem jednak spróbowałabym coś z powyższego zrobić sama). Dodatkowe pytanie, czy język to musi być C/C++?
Ostatnio zmieniony 23 mar 2024, o 07:51 przez admin, łącznie zmieniany 1 raz.
Powód: Usunięto aktywny link do strony zewnętrznej!
RBator1
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 5 sie 2022, o 12:18
Płeć: Mężczyzna
wiek: 48

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: RBator1 »

dodatek: jak przekonwertować typ: string to double?
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Gouranga »

to jak zmienić string w double napisałem ci wyżej, rzutowanie typów to są podstawy, zapis (double)x zwróci string zapisany w x ale skonwertowany do double
RBator1
Użytkownik
Użytkownik
Posty: 16
Rejestracja: 5 sie 2022, o 12:18
Płeć: Mężczyzna
wiek: 48

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: RBator1 »

otrzymuję: error C2440 'type cast' : cannot convert from 'std::string' to 'double'
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Gouranga »

bo używasz namespace std, spróbuj zaincludować stdio.h albo cstdio i wczytać stringa np. zmiennej x jako scanf("%s", &x);
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Fibik »

czyste bredzenie. autor nie ma pojęcia na czym polega programowanie...

rzutowanie string z sin na double... dobry skecz. hahaha!

nie ma takich rzeczy.

on zapewne chce napisać taki prymitywny kalkulatorek,
ale obsługiwany 'tekstowo', nie za pomocą naciskania klawiszy, jak to jest zwykle robione.

czyli chce zaprogramować parser matematyczny:
np. piszemy :

"2 + 4 * sin(55) - 7"

aby takie coś obliczyć trzeba to... przetwarzać - tak jak człowiek to robi, czyli jak?

a tak:

czytamy symbole kolejno,
i tu mamy na starcie '2', czyli to jest liczba, 2.0
i dalej to czytamy - pomijamy spacje, i mamy '+',
zatem teraz mamy operator - dodawanie...

sin jest też operatorem - jedno-argumentowym,
nawiasy ( i ) - to też operatory, itd.

generalnie są tu argumenty - liczby, no i operatory: jedno i dwuargumentowe
i więcej argumentów też może być, ale kalkulatory ograniczają się do 2 zwykle;

+, -, *, /, ^ = power... to są 2-argumentowe.
a jedno-argumentowe: - (negacja), +, ! - silnia, sin, cos, ln, log...

same argumenty mogą tu być zwyczajnymi liczbami, ale i zespolonymi... wektorami, itd.

operatory post i prefixowe: np.: +5 - pre, i 5! jako post;

sin 5 -> to pre, jak widać, bo nigdy nie używamy zapisu: 5 sin, byłby to błąd.

Dodano po 10 minutach 14 sekundach:
sin -+5 * -+7 tg(5+-pi)^3! = ?

Dodano po 20 minutach 16 sekundach:
i dalej:

operatory mają swoje priorytety, np. wyrażenie: 2+ 3*4 = 14

dlatego wymyślono nawiasy (), np.: (2+3)*4 = 20,
które zmieniają priorytet - mają najwyższy!

i dlatego w praktyce to się upraszcza: notacją posfiksowa, czyli beznawiasowa i bezpriorytetowa.

i teraz mamy takie wyrażenia:
2+3*4 == 2 3 4 *+

natomiast:
(2+3)*4 == 2 3 + 4 *

i takie coś wyliczamy łatwo, bo sekwencyjne, czyli bez komplikacji nawiasowo-priorytetowych.

infix: 3*2^-2! -3 * (5+7) = ? postfix

istnieje również notacja prefiksowa, ale to nic nie daje: to jest równoważne z postfiksową. lpl:)
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Gouranga »

Tłumaczenie autorowi tematu notacji postfixowej wykracza poza coś, co chciałoby mi się robić, mi się wydaje, że on po prostu chce do zmiennej typu string (w sensie do zmiennej typu char* no ale niech mu będzie, nie odbierajmy mu prawa do wiary w istnienie stringów :) ) wpisać "sin 3.1415928", wcisnąć enter i dostać odpowiedź "1", w takiej sytuacji jest skazany albo na regexy albo ręcznie analizowanie substringów na zasadzie

Kod: Zaznacz cały

char* str = "sin 3.14";
if ( strcmp(str.substr(0,3), "sin") == 0 ){
   char* num = str.substr(4);
   double n = (double)num;
   // rób dalej coś z n
}
i tak nie można zagwarantować że to zadziała, najlepiej byłoby osobno wydłubać część przed i po przecinku i ręcznie poskładać tę liczbę
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Fibik »

w ogóle nie ma mowy o takich rzutowaniach.

gdy czytamy tekst z wyrażeniem wtedy szukamy w tym symboli, czyli rozpoznajemy znane nazwy, symbole, identyfikatory;
dopiero potem to wyliczamy (o ile jest to poprawne wyrażenie).

przykładowo mamy tekst: "2.65+ pi*sin(30)"

1. czytamy i jest 2, co rozpoznajemy jako liczbę: symbol1 = (liczba, 2.65);
co należy zwyczajnie obliczyć: 2 + 0.1*0.6 + 0.01*5 = 2.65;
ewentualnie użyć gotowej funkcji z c, która to zrobi: d = atof(tekst);

2. dalej mamy:+
czyli kodujemy operację dodawania: +, co notujemy w jakiś tam sposób... symbol2 = (operator, '+');

3.tu mamy pi, co znamy, jako wartość 3,1415..., zatem symbol3 = (liczba, pi)

4. tu mamy *, czyli symbol4 = ..

itd..

i po utworzeniu tej serii symboli możemy to sobie dopiero próbować obliczyć.

if symbol.nazwa == "sin" then v = sin(arg);

itd.

ale generalnie to się przerabia na te postfiksowe wyrażenia, bo inaczej nie będziemy nawet wiedzieli co i jak:
ile argumentów wymaga operator, najpierw robić + czy * itd.

Dodano po 25 minutach 30 sekundach:
przykład prostego kalkulatora:
https://file.io/GupCagMztKkC

Dodano po 15 minutach 18 sekundach:
kalkulator do obliczeń na zespolnych:
https://drive.google.com/file/d/1bbgfSY69ZpIsHfkpAFHDM_H1YswCZZIz/view?usp=drive_link
Ostatnio zmieniony 2 kwie 2024, o 08:00 przez admin, łącznie zmieniany 1 raz.
Powód: Usunięto aktywne linki do stron zewnętrznych!
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Gouranga »

To wszystko co mówisz ma zastosowanie jeśli mówimy o wpisaniu jednym ciągiem całego wyrażenia, ja się ograniczyłem do tego o co pytał pierwotnie autor - on wpisuje nazwę jednej funkcji trygonometrycznej i wartość a program liczy
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem

Post autor: Fibik »

oczywiście że może tracić wciąż czas na pierdoły.
a ja wolę od razu wszystko robić.

definicje symboli:

Kod: Zaznacz cały

CSym StdCSym[] = {
     {C_NUM, 1, " ",  0,  L_OP,R_OP,  0},
     {C_NUM, 1, "pi", 0,  L_OP,R_OP,  0},
     {C_NUM, 1, "e",  0,  L_OP,R_OP,  0},
     {C_NUM, 1, "i",  0,  L_OP,R_OP,  0},

     {N_OTW, 0, "(",  0, L_OP,L_OP, 0},
     {N_ZAM, 0, ")",  0, R_OP,R_OP, 0},

     {',',  0, ",",  0,     R_OP,L_OP,   20},
     {'=',  0, "=",  0,     R_OP,L_OP,   20},    // przypis

     {'+',  3, "+",  dodaj,   R_OP,L_OP,   21},
     {'-',  4, "-",  odejm,   R_OP,L_OP,   21},
     {'*',  5, "*",  mnoz,    R_OP,L_OP,   22},
     {'/',  6, "/",  dziel,   R_OP,L_OP,   22},
     {'^',  7, "^",  pow,     R_OP,L_OP,   25},
     {'%',  8, "mod", fmod,   R_OP,L_OP,   22},

     {C_NEG, 9, "-", neg,  L_OP,L_OP,  50},

     {1, 11, "sin",   sin,   L_OP,L_OP,   50},
     {1, 12, "asin",  asin,  L_OP,L_OP,   50},
     {1, 13, "sinh",  sinh,  L_OP,L_OP,   50},
     {1, 14, "asinh", asinh, L_OP,L_OP,   50},

     {1, 15, "cos",   cos,   L_OP,L_OP,   50},
     {1, 16, "acos",  acos,  L_OP,L_OP,   50},
     {1, 17, "cosh",  cosh,  L_OP,L_OP,   50},
     {1, 18, "acosh", acosh, L_OP,L_OP,   50},

     {1, 19, "tg",   tan,   L_OP,L_OP,   50},
     {1, 20, "atg",  atan,  L_OP,L_OP,   50},
     {1, 21, "tgh",  tanh,  L_OP,L_OP,   50},
     {1, 22, "atgh", atanh, L_OP,L_OP,   50},

     {1, 23, "sqrt", sqrt, L_OP,L_OP,   50},
     {1, 24, "sqr",  kwad, L_OP,L_OP,   50},

     {1, 25, "ln",   log,  L_OP,L_OP,   50},
     {1, 26, "exp",  exp,  L_OP,L_OP,   50},

     {1, 27, "abs",  fabs,  L_OP,L_OP,  50},
     {1, 28, "arg",   arg,  L_OP,L_OP,  50},

     {1, 29, "sgn",  sgn,   L_OP,L_OP,  50},
     {1, 30, "int",  floor, L_OP,L_OP,  50},

     {'!',  31, "!", sil,  R_OP,R_OP,  90},
     {'\'', 32, "'",   0,  R_OP,R_OP,  90},


     {C_NIC, 0, "",   0, R_OP,0,   -1},  //  == END
     {C_NIC, 0, "=",  0, R_OP,0,   -1},  //  == END

     {C_LVAL, 2, "x",  NULL, L_OP,R_OP,   0},  // zmienna -> nazwę można zmienić
     {C_LVAL, 2, "t",  NULL, L_OP,R_OP,   0},  // zmienna 2
}
można sobie do tej tabelki doładować kolejne, np. rnd(), inne stałe i zmienne, itd.
i to wyliczy wszystko jak należy. :)
Ostatnio zmieniony 3 kwie 2024, o 00:18 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
ODPOWIEDZ