Compare commits
13 Commits
d4790dfc4e
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 110a292529 | |||
| 000629b937 | |||
| f651fcdb4c | |||
| 93da1771f4 | |||
| 1ef2665418 | |||
| 9c090bc317 | |||
| 8dda608d07 | |||
| 78ada5fbd4 | |||
| 688f490ec1 | |||
| 6f6ea77e69 | |||
| d366d15de3 | |||
| 06cee99f91 | |||
| eb7e3391c2 |
@@ -2,11 +2,11 @@ all:
|
||||
cc command.cpp input_resolver.cpp main.cpp -lstdc++ -std=c++17 -O3 -L./ -lCalc -o calculator
|
||||
|
||||
libs:
|
||||
cc -c -fPIC basecalc.cpp Operation.cpp
|
||||
cc -shared basecalc.o Operation.o -o libCalc.so
|
||||
cc -c -fPIC basecalc.cpp Operation.cpp special_calculator.cpp
|
||||
cc -shared basecalc.o Operation.o special_calculator.o -o libCalc.so
|
||||
|
||||
compile:
|
||||
cc *.cpp -O3 -c
|
||||
|
||||
debug:
|
||||
cc *.cpp -g -std=c++17 -o calculator -lstdc++
|
||||
cc *.cpp -g -std=c++17 -o calculator -lstdc++ -lm
|
||||
@@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
enum class OpType
|
||||
{
|
||||
Addition, Subtraction, Multiplication, Division, Modulo, Special
|
||||
|
||||
+15
-2
@@ -1,4 +1,5 @@
|
||||
#include "basecalc.h"
|
||||
#include <iostream>
|
||||
|
||||
BaseCalculator::~BaseCalculator()
|
||||
{}
|
||||
@@ -20,11 +21,23 @@ int BaseCalculator::calculate(const Operation& op)
|
||||
break;
|
||||
|
||||
case OpType::Division:
|
||||
result = op.a / op.b;
|
||||
if (op.b == 0)
|
||||
{
|
||||
std::cerr << "Invalid operation requested! Resetting the accumulator to 0\n";
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
result = op.a / op.b;
|
||||
break;
|
||||
|
||||
case OpType::Modulo:
|
||||
result += op.a % op.b;
|
||||
if (op.b == 0)
|
||||
{
|
||||
std::cerr << "Invalid operation requested! Resetting the accumulator to 0\n";
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
result = op.a % op.b;
|
||||
break;
|
||||
|
||||
case OpType::Special:
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include "Operation.h"
|
||||
class BaseCalculator
|
||||
{
|
||||
|
||||
+13
-5
@@ -1,6 +1,7 @@
|
||||
#include "input_resolver.h"
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
#define delimiter " "
|
||||
|
||||
@@ -47,10 +48,10 @@ ValidationResult validate_token(const std::string &token)
|
||||
|
||||
|
||||
if (digitpos == -1)
|
||||
return {true, ' ', 0};
|
||||
return {true, token[0], 0};
|
||||
|
||||
int next = stoi(token.substr(digitpos));
|
||||
return {true, ' ', next};
|
||||
return {true, token[0], next};
|
||||
}
|
||||
|
||||
Command resolveCommand()
|
||||
@@ -63,21 +64,28 @@ Command resolveCommand()
|
||||
auto validation_result = validate_token(token);
|
||||
if (!validation_result.ok())
|
||||
{
|
||||
throw std::runtime_error{"invalid token " + validation_result.incorrect_token()};
|
||||
std::ostringstream os;
|
||||
os << "invalid token "<< validation_result.incorrect_token();
|
||||
throw std::runtime_error{os.str()};
|
||||
}
|
||||
|
||||
bool shouldQuit = token.find("q") != token.npos;
|
||||
bool shouldPrint = token.find("p") != token.npos;
|
||||
char operation;
|
||||
char operation = 0;
|
||||
|
||||
for (const char c: token)
|
||||
{
|
||||
static const std::string operators {"+-*/%"};
|
||||
static const std::string operators {"+-*/%$"};
|
||||
if(operators.find(c) != operators.npos)
|
||||
{
|
||||
operation = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (operation == 0)
|
||||
{
|
||||
operation = '+';
|
||||
}
|
||||
|
||||
return {shouldQuit, operation, validation_result.next_arg(), shouldPrint};
|
||||
}
|
||||
@@ -1,2 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#include "command.h"
|
||||
Command resolveCommand();
|
||||
@@ -1,17 +1,18 @@
|
||||
#include <iostream>
|
||||
#include "basecalc.h"
|
||||
#include "special_calculator.h"
|
||||
#include <memory>
|
||||
#include "input_resolver.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
auto calc = std::make_unique<BaseCalculator>();
|
||||
std::unique_ptr<BaseCalculator> calc = std::make_unique<SpecialCalculator>();
|
||||
|
||||
std::cout << "Initializing calculator";
|
||||
std::cout << "Initializing calculator\n";
|
||||
|
||||
while (true)
|
||||
{
|
||||
std::cout << "What's your next input? (+,-,*,/,%,$,q,p)";
|
||||
std::cout << "What's your next input? (+,-,*,/,%,$,q,p): ";
|
||||
auto command = resolveCommand();
|
||||
|
||||
if (command.shouldTerminate())
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#include "special_calculator.h"
|
||||
#include <cmath>
|
||||
|
||||
int SpecialCalculator::special(int a)
|
||||
{
|
||||
return sqrt(a);
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include "basecalc.h"
|
||||
|
||||
class SpecialCalculator: public BaseCalculator
|
||||
|
||||
Reference in New Issue
Block a user