Witam,
Mam taki problem z algorytmem zamieniającym pierwiastki na potęgowanie.
Np: cbrt(23) = 23^1/3
W kodzie poniżej program sobie radzi z takim czymś cbrt(23) i zwraca:
Podaj wyrazenie matematyczne: cbrt(23)
Zamienione wyrazenie: ((23)^(1/3))
Schody się zaczynają jak chce wykonać taki zabieg
cbrt(cbrt(23)) = (23^1/3)^1/3
Program to zamienia na takie coś:
Podaj wyrazenie matematyczne: cbrt(cbrt(23))
Zamienione wyrazenie: ((cbrt(23)^(1/3)))
Nawiasy dobrze wykonał natomiast zabrakło potęgi 1/3. Chce żeby ten algorytm mógł zamieniać jeszcze bardziej zagnieżdżone pierwiastki. Fajnie by było jakby można było mieszać np cbrt(sqrt(23)) i program powinien zwrócić:
(23^1/2)^1/3.
Jeszcze chciałem zrobić to z dowolnym stopnie np root(n)[a] n - stopień | a - liczba pierwiastkowana
Chce żeby to wszystko mogło się mieszać ze sobą i móc wpisywać zagnieżdżone pierwiastki.
Próbowałem i nic nie idzie, tylko takie proste zamienia.
Będę bardzo wdzięczny za pomoc :)
#include <iostream>
#include <string>
// Funkcja do zamiany zapisu pierwiastków na potęgi
std::string convertToPowerNotation(const std::string& expression) {
std::string result;
int level = 0; // Poziom zagnieżdżenia
for (size_t i = 0; i < expression.length(); i++) {
char c = expression[i];
if (c == '(') {
level++;
result += '(';
} else if (c == ')') {
level--;
result += ')';
} else if (level == 0 && c == 'c' && expression.find("cbrt(", i) == i) {
size_t start = i + 5; // Przesunięcie na początek argumentu
size_t end = expression.find(")", start);
if (end != std::string::npos) {
std::string argument = expression.substr(start, end - start);
result += "((" + argument + ")^(1/3))";
i = end; // Przesuwamy iterator za zamieniony fragment
}
} else if (level == 0 && c == 's' && expression.find("sqrt(", i) == i) {
size_t start = i + 5; // Przesunięcie na początek argumentu
size_t end = expression.find(")", start);
if (end != std::string::npos) {
std::string argument = expression.substr(start, end - start);
result += "((" + argument + ")^(1/2))";
i = end; // Przesuwamy iterator za zamieniony fragment
}
} else if (level == 0 && c == 'r' && expression.find("root(", i) == i) {
size_t start = i + 5; // Przesunięcie na początek argumentu
size_t end = expression.find(")", start);
if (end != std::string::npos) {
std::string argument = expression.substr(start, end - start);
result += "(" + argument + ")^";
i = end; // Przesuwamy iterator za zamieniony fragment
}
} else {
result += c;
}
}
return result;
}
int main() {
std::string input;
std::cout << "Podaj wyrażenie matematyczne: ";
std::getline(std::cin, input);
std::string convertedExpression = convertToPowerNotation(input);
std::cout << "Zamienione wyrażenie: " << convertedExpression << std::endl;
return 0;
}
Pozdrawiam,
Piotr Domański