• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed char jako operator matematyczny

Object Storage Arubacloud
0 głosów
469 wizyt
pytanie zadane 18 marca 2018 w C i C++ przez Erichu Nowicjusz (230 p.)
zamknięte 19 czerwca 2018 przez Erichu

Witam,

 Jestem początkującym programistą i ostatnio chciałem napisać bardziej rozbudowany kalkulator. Jednak pojawił się pewien problem, którego nie potrafię sam rozwiązać i na żadnych forach nie znalazłem podobnego zagadnienia. Mam w Tablicy char zapisany znak "*". Czy da się sprawić, żeby program nie czytał go jako znaku tylko jako operator matematyczny?

Z grubsza chodzi o to: int a= int b (i tu wstawić operator matematyczny zapisany w tablicy) int c;

Z góry dziękuję za pomoc.

 

komentarz zamknięcia: rozwiązane

1 odpowiedź

+2 głosów
odpowiedź 18 marca 2018 przez adrian17 Ekspert (344,860 p.)

Nie, nie ma do tego wbudowanych narzędzi w języku (a przynajmniej w C++ie i większości języków).

Pamiętaj, że kod C++a jest kompilowany do kodu wykonywanego przez procesor. Gdzieś musi znaleźć się kod, który "przekonwertuje" znak '*' na ciąg instrukcji procesora odpowiedzialnych za wykonanie mnożenia. Albo ten kod do mnożenia  jest tworzony dynamicznie (wtedy to tak zwane kompilowanie na żywo, JIT) albo po prostu już jest w programie. To drugie rozwiązanie jest znacznie mniej skomplikowane i wystarczy do praktycznie wszystkich zastosowań, poza interpreterami.

if (character == '+')
    x = a + b;
else if (character == '*')
    x = a * b;

Albo na przykład przez mapowanie znaku na funkcję:

std::unordered_map<char, int(int, int)> character_functions = {
	{'*', [](int a, int b){return a*b;}},
	{'+', [](int a, int b){return a+b;}},
	{'-', [](int a, int b){return a-b;}},
};

char c = '*';

int wynik = character_functions[c](a, b);

 

komentarz 18 marca 2018 przez Erichu Nowicjusz (230 p.)
Dzięki
komentarz 18 marca 2018 przez mokrowski Mędrzec (155,460 p.)

@adrian17, ...wystarczy do praktycznie wszystkich zastosowań, poza interpreterami.

Do interpreterów także wystarcza.

komentarz 18 marca 2018 przez adrian17 Ekspert (344,860 p.)
Miałem na myśli interpretery z JITem ;) Ale jednocześnie czułem że "poza JITowanymi interpreterami" by tylko skomplikowało odpowiedź, a autor pytania raczej i tak nie wie co to.

Choć może sam przekombinowałem.
komentarz 18 marca 2018 przez mokrowski Mędrzec (155,460 p.)
Raczej chyba dynamizm... ale i tam "wstrzykiwanie kodu jako string" do aplikacji to ... śliska technika... JIT raczej nie ma tu wiele wspólnego z tematem. JIT robiony jest w gorących miejscach kodu.
komentarz 30 maja 2018 przez Hiskiel Pasjonat (22,830 p.)

Wiem, iż jest to stary temat, ale:

std::unordered_map<char, int(int, int)> character_functions = {
    {'*', [](int a, int b){return a*b;}},
    {'+', [](int a, int b){return a+b;}},
    {'-', [](int a, int b){return a-b;}},
};
 
char c = '*';
 
int wynik = character_functions[c](a, b);

czy lambda czasem nie musi definiować zwracanego typu

[](int a, int b)->int{return a+b}

? I czy nie musi mieć czasem jeszcze listy argumentów, nawet jeśli jest pusta

[](int a, int b)->int{return a+b}(x, y)

?... Choć w sumie tutaj nie ma jak przekazać tych argumentów.... Wyjaśnisz to, proszę? laugh

komentarz 30 maja 2018 przez adrian17 Ekspert (344,860 p.)

czy lambda czasem nie musi definiować zwracanego typu

W C++11 trzeba w niektórych przypadkach deklarować zwracany typ - ale nie w tak prostych, jak ten. W C++14 jest to jeszcze rzadziej potrzebne.

I czy nie musi mieć czasem jeszcze listy argumentów, nawet jeśli jest pusta

Nie rozumiem. Ta lambda ma listę paramerów `(int a, int b)`. Twoje `(x, y)` próbuje ją wywołać z argumentami `x`, `y` (nie wiem skąd je wziąłeś) - ale nie chcemy wywołać funkcji, chcemy ją przechować w mapie do późniejszego wywołania.

Podobne pytania

0 głosów
1 odpowiedź 436 wizyt
pytanie zadane 27 listopada 2017 w C i C++ przez renticor Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 240 wizyt
pytanie zadane 18 listopada 2017 w C i C++ przez Programeł Gaduła (3,500 p.)
0 głosów
1 odpowiedź 305 wizyt
pytanie zadane 19 stycznia 2021 w C i C++ przez Mytwi Nowicjusz (160 p.)

92,540 zapytań

141,383 odpowiedzi

319,482 komentarzy

61,928 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!

...