sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
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);
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.
Powód: Brak LaTeXa - zapoznaj się z instrukcją: http://matematyka.pl/latex.htm.
-
- Użytkownik
- Posty: 1595
- Rejestracja: 16 maja 2013, o 17:56
- Płeć: Mężczyzna
- Lokalizacja: Trójmiasto
- Podziękował: 11 razy
- Pomógł: 247 razy
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
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.
Powód: Poprawa wiadomości.
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
nie rozumiem? możesz mi to zapisać w postaci kodu?
Dodano po 1 godzinie 16 minutach 42 sekundach:
a następnie co mam zrobić aby w char a[]="wpisać przypisane"; :cin>>"sin", cin>>"x" .
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)";
Ostatnio zmieniony 22 mar 2024, o 00:57 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Powód: Poprawa wiadomości.
- Hir
- Użytkownik
- Posty: 63
- Rejestracja: 7 mar 2024, o 21:07
- Płeć: Kobieta
- wiek: 29
- Podziękował: 15 razy
- Pomógł: 25 razy
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
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:
(ale przed zajrzeniem jednak spróbowałabym coś z powyższego zrobić sama). Dodatkowe pytanie, czy język to musi być C/C++?
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
Ostatnio zmieniony 23 mar 2024, o 07:51 przez admin, łącznie zmieniany 1 raz.
Powód: Usunięto aktywny link do strony zewnętrznej!
Powód: Usunięto aktywny link do strony zewnętrznej!
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
dodatek: jak przekonwertować typ: string to double?
-
- Użytkownik
- Posty: 1595
- Rejestracja: 16 maja 2013, o 17:56
- Płeć: Mężczyzna
- Lokalizacja: Trójmiasto
- Podziękował: 11 razy
- Pomógł: 247 razy
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
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 doubleRe: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
otrzymuję: error C2440 'type cast' : cannot convert from 'std::string' to 'double'
-
- Użytkownik
- Posty: 1595
- Rejestracja: 16 maja 2013, o 17:56
- Płeć: Mężczyzna
- Lokalizacja: Trójmiasto
- Podziękował: 11 razy
- Pomógł: 247 razy
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
bo używasz namespace std, spróbuj zaincludować stdio.h albo cstdio i wczytać stringa np. zmiennej x jako
scanf("%s", &x);
-
- Użytkownik
- Posty: 975
- 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
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:)
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:)
-
- Użytkownik
- Posty: 1595
- Rejestracja: 16 maja 2013, o 17:56
- Płeć: Mężczyzna
- Lokalizacja: Trójmiasto
- Podziękował: 11 razy
- Pomógł: 247 razy
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
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
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ę
![:)](./../images/smilies/icon_smile.gif)
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
}
-
- Użytkownik
- Posty: 975
- 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
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:
Dodano po 15 minutach 18 sekundach:
kalkulator do obliczeń na zespolnych:
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!
Powód: Usunięto aktywne linki do stron zewnętrznych!
-
- Użytkownik
- Posty: 1595
- Rejestracja: 16 maja 2013, o 17:56
- Płeć: Mężczyzna
- Lokalizacja: Trójmiasto
- Podziękował: 11 razy
- Pomógł: 247 razy
Re: sin, cos wprowadzany z klawiatury,połaczenie funkcji z argumentem
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
-
- Użytkownik
- Posty: 975
- 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
oczywiście że może tracić wciąż czas na pierdoły.
a ja wolę od razu wszystko robić.
definicje symboli:
można sobie do tej tabelki doładować kolejne, np. rnd(), inne stałe i zmienne, itd.
i to wyliczy wszystko jak należy.![:)](./../images/smilies/icon_smile.gif)
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
}
i to wyliczy wszystko jak należy.
![:)](./../images/smilies/icon_smile.gif)
Ostatnio zmieniony 3 kwie 2024, o 00:18 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Powód: Poprawa wiadomości.