Strona 1 z 1

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

: 20 mar 2024, o 21:29
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);

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

: 21 mar 2024, o 19:02
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]

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

: 21 mar 2024, o 23:34
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" .

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

: 22 mar 2024, o 08:53
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++?

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

: 22 mar 2024, o 14:09
autor: RBator1
dodatek: jak przekonwertować typ: string to double?

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

: 22 mar 2024, o 19:57
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

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

: 23 mar 2024, o 19:47
autor: RBator1
otrzymuję: error C2440 'type cast' : cannot convert from 'std::string' to 'double'

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

: 23 mar 2024, o 21:27
autor: Gouranga
bo używasz namespace std, spróbuj zaincludować stdio.h albo cstdio i wczytać stringa np. zmiennej x jako scanf("%s", &x);

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

: 31 mar 2024, o 16:07
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:)

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

: 31 mar 2024, o 19:28
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ę

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

: 1 kwie 2024, o 18:03
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

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

: 1 kwie 2024, o 19:47
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

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

: 2 kwie 2024, o 18:05
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. :)