cpp/CPP09/ex01/main.cpp
2024-12-04 17:29:31 +01:00

101 lines
1.9 KiB
C++

#include <string>
#include <stack>
#include <iostream>
#include <cctype>
#include <cstdlib>
void superPop(std::stack<double>&stck, double *first, double *second) {
*second = stck.top();
stck.pop();
*first = stck.top();
stck.pop();
}
void addition(std::stack<double> &stck) {
double nbr1, nbr2;
superPop(stck, &nbr1, &nbr2);
stck.push(nbr1 + nbr2);
}
void subtraction(std::stack<double> &stck) {
double nbr1, nbr2;
superPop(stck, &nbr1, &nbr2);
stck.push(nbr1 - nbr2);
}
void multiplication(std::stack<double> &stck) {
double nbr1, nbr2;
superPop(stck, &nbr1, &nbr2);
stck.push(nbr1 * nbr2);
}
void division(std::stack<double> &stck) {
double nbr1, nbr2;
superPop(stck, &nbr1, &nbr2);
if (nbr1 == 0 || nbr2 == 0) {
std::cout << "Error: Can't divise by 0" << std::endl;
throw std::exception();
}
stck.push(nbr1 / nbr2);
}
int main(int argc, char **argv) {
if (argc != 2) {
std::cout << "Error: Number of argument is wrong" << std::endl;
return 1;
}
std::stack<double> stck;
std::string cal(argv[1]);
bool spaced = false;
for (size_t i = 0; i < cal.size(); i++) {
char c = cal[i];
if (spaced && c != ' ') {
std::cout << "Error: Only one character by character" << std::endl;
return 1;
}
else if (!spaced) {
if (std::isdigit(c))
stck.push(std::atoi(&c));
else if (stck.size() <= 1) {
std::cout << "Error: Too much operator" << std::endl;
return 1;
}
else if (c == '+')
addition(stck);
else if (c == '-')
subtraction(stck);
else if (c == '*')
multiplication(stck);
else if (c == '/') {
try {
division(stck);
}
catch (std::exception &e) {
return 1;
}
}
else {
std::cout << "Error: Bad Input '" << c << "'" << std::endl;
return 1;
}
}
spaced = !spaced;
}
double result = stck.top();
stck.pop();
if (!stck.empty()) {
std::cout << "Error" << std::endl;
return 1;
}
std::cout << result << std::endl;
return 0;
}