Calculator

Форк
0
/
calculator.cpp 
108 строк · 3.1 Кб
1
#include "calculator.h"
2

3

4
QString Calculator::calcAll(QString all){
5
    all = deleteUnnecessary(all);
6
    all = seekDevideMulti(all);
7
    all = seekMinusPlus(all);
8
    all = rounding(all);
9
    return all;
10
}
11

12
QString Calculator::deleteUnnecessary(QString all){
13
    if(all == "-") return "0";
14
    while(!isdigit(QString(all).toStdString()[all.size()-1])){
15
        all.remove(all.size()-1,1);
16
    }
17
    return all;
18
}
19

20
QString Calculator::plus(QString firstNum, QString secondNum){
21
    double res = firstNum.toDouble() + secondNum.toDouble();
22

23
    return QString::number(res, 'g', 31);
24
}
25

26
QString Calculator::minus(QString firstNum, QString secondNum){
27
    double res = firstNum.toDouble() - secondNum.toDouble();
28

29
    return QString::number(res, 'g', 31);
30
}
31

32
QString Calculator::multi(QString firstNum, QString secondNum){
33
    double res = firstNum.toDouble() * secondNum.toDouble();
34

35
    return QString::number(res, 'g', 31);
36
}
37

38
QString Calculator::devide(QString firstNum, QString secondNum){
39
    double res = firstNum.toDouble() / secondNum.toDouble();
40
    if(secondNum.toDouble() == 0)
41
        res = 0;
42

43
    return QString::number(res, 'g', 31);
44
}
45

46
QString Calculator::doOperation(QString firstNum,QString op, QString secondNum){
47

48
    if(op == "+") return plus(firstNum, secondNum);
49
    else if(op == "-") return minus(firstNum, secondNum);
50
    else if(op == "/") return devide(firstNum, secondNum);
51
    else if(op == "x") return multi(firstNum, secondNum);
52
    return 0;
53
}
54

55
QString Calculator::seekDevideMulti(QString all){
56
    QRegExp rx_d("([\\-]?\\d+\\.?\\d*)[\\/]([\\-]?\\d+\\.?\\d*)");
57
    QRegExp rx_multi("([\\-]?\\d+\\.?\\d*)[x]([\\-]?\\d+\\.?\\d*)");
58
    return countPath(all ,rx_multi, rx_d, "x", "/");
59

60
}
61

62
QString Calculator::seekMinusPlus(QString all){
63
    QRegExp rx_m("([\\-]?\\d+\\.?\\d*)[\\-]([\\-]?\\d+\\.?\\d*)");
64
    QRegExp rx_p("([\\-]?\\d+\\.?\\d*)[\\+]([\\-]?\\d+\\.?\\d*)");
65
    return countPath(all ,rx_m, rx_p, "-", "+");
66

67
}
68

69
QString Calculator::countPath(QString all, QRegExp rxOne, QRegExp rxTwo, QString opOne, QString opTwo){
70
    int id;
71
    QString res;
72
    QString firstNum,secondNum;
73

74
    while(rxOne.indexIn(all) != -1 || rxTwo.indexIn(all) != -1){
75
        if(rxTwo.indexIn(all) == -1 || (rxOne.indexIn(all)<rxTwo.indexIn(all) && rxOne.indexIn(all) != -1)){
76
            firstNum = rxOne.cap(1);
77
            secondNum = rxOne.cap(2);
78
            id = rxOne.indexIn(all);
79
            res = doOperation(firstNum, opOne, secondNum);
80
        }
81
        else{
82
            firstNum = rxTwo.cap(1);
83
            secondNum = rxTwo.cap(2);
84
            id = rxTwo.indexIn(all);
85
            res = doOperation(firstNum, opTwo, secondNum);
86
        }
87

88
        all.replace(id, firstNum.size() + secondNum.size()+1, res);
89
    }
90

91
    return all;
92
}
93

94
QString Calculator::rounding(QString all){
95
    QRegExp rx_point("([\\-]?\\d+\\.\\d)(\\d)(\\d)");
96
    if(rx_point.indexIn(all) >= 0){
97
        QString delta;
98

99
        if(rx_point.cap(3).toDouble() >= 5){
100
           delta = "1";
101
        }
102
        else {delta = "0";}
103

104
        all = rx_point.cap(1) + plus(rx_point.cap(2), delta);
105
    }
106
    if (all.toDouble() == 0) return "0";
107
    return all;
108
}
109

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.