Czy da się przechowywać działania matematyczne w jakiś kolekcjach, w taki sposób, aby później była możliwość przypisania ich do int?
Przechowywanie działań matematycznych
- Rejestracja: dni
- Ostatnio: dni
- Postów: 15
- Rejestracja: dni
- Ostatnio: dni
Najpierw musisz ponumerować wszystkie działania i pogrupować według liczby argumentów. Większość działań będzie dwuargumentowych. Liczby to już można przechować. Potem, potrzebna jest funkcja zawierająca switch, która wykonuje takie lub inne działanie na argumentach w zależności od liczby przechowywanej w kolekcji. Tak właśnie mniej więcej działa procesor i asembler. Nie przechowuje rozkazów jako takich, tylko przechowuje numer rozkazu i argumenty. W najprostszych implementacjach numer rozkazu (opcode) to jest jedna liczba. Kolejne liczby to są ewentualne argumenty.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 5046
@StaryIniekumaty: Mógłbyś trochę rozwinąć, podać przykłady?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 15
Chciałbym znaleźć wyniki działania np. czterech cyfr z wszystkimi ich permutacjami oraz wariacjami z powtórzeniami operatorów matematycznych: +,-,*,/. Czyli np. mam cztery cyfry: 3, 5, 7, 9 i chciałbym mieć listę wszystkich działań z wykorzystaniem tych cyfr i tych czterech operatorów matematycznych.
- Rejestracja: dni
- Ostatnio: dni
Drzewko sobie zrób po prostu. Niech każde działanie przyjmuje dwa argumenty, które mogą być literałem (liczbą) albo innym działaniem. Na rekordach albo sealed klasach to można ładnie zrobić.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 668
Coś takiego jak poniżej można.
interface Expression {
int evaluate ();
}
class ValueExpr implements Expression {
private int value;
/* To opcjonalnie, zależy od podejścia. */
public void updateValue (int val) {
value = val;
}
public ValueExpr (int val) {
upateValue (val);
}
public int evaluate () {
return value;
}
}
class AdditionExpr implements Expression {
private Expression operand1, operand2;
public AdditionExpr (Expression o1, Expression o2) {
operand1 = o1;
operand2 = o2;
}
public int evaluate () {
rerurn operand1.evaluate () + operand2.evaluate ();
}
}
/* I podobnie dla wszystkich działań. */
Rozwiązanie @andrzejlisek też jest dobre, ale jakby nie w stylu Javy (w porównaniu z moim).
- Rejestracja: dni
- Ostatnio: dni
- Postów: 28
Map<String, BiFunction<Integer, Integer, Integer>> operations;
BiFunction<Integer, Integer, Integer> add = Integer::sum;
BiFunction<Integer, Integer, Integer> subtract = (x, y) -> x - y;
BiFunction<Integer, Integer, Integer> multiply = (x, y) -> x * y;
BiFunction<Integer, Integer, Integer> divide = (x, y) -> x / y;
operations = Map.of(
"add", add,
"subtract", subtract,
"multiply", multiply,
"divide", divide
);
W sumie to nie wiem o co chodzi, ale takie coś przyszło mi do głowy jako pierwsze. :D