This repository has been archived on 2024-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
NG_2024_Stanislav_Mykhailenko/Lesson_5/Task_3/calculator.cpp
Stanislav Mykhailenko 586e5e3258
Add Lesson 5 Task 3
2024-07-26 19:19:09 +03:00

226 lines
5 KiB
C++

#include "calculator.h"
#include "ui_calculator.h"
Calculator::Calculator(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Calculator)
{
ui->setupUi(this);
connect(ui->b_0, &QPushButton::clicked, this, &Calculator::press0);
connect(ui->b_1, &QPushButton::clicked, this, &Calculator::press1);
connect(ui->b_2, &QPushButton::clicked, this, &Calculator::press2);
connect(ui->b_3, &QPushButton::clicked, this, &Calculator::press3);
connect(ui->b_4, &QPushButton::clicked, this, &Calculator::press4);
connect(ui->b_5, &QPushButton::clicked, this, &Calculator::press5);
connect(ui->b_6, &QPushButton::clicked, this, &Calculator::press6);
connect(ui->b_7, &QPushButton::clicked, this, &Calculator::press7);
connect(ui->b_8, &QPushButton::clicked, this, &Calculator::press8);
connect(ui->b_9, &QPushButton::clicked, this, &Calculator::press9);
connect(ui->b_add, &QPushButton::clicked, this, &Calculator::pressAdd);
connect(ui->b_subtract, &QPushButton::clicked, this, &Calculator::pressSubtract);
connect(ui->b_multiply, &QPushButton::clicked, this, &Calculator::pressMultiply);
connect(ui->b_divide, &QPushButton::clicked, this, &Calculator::pressDivide);
connect(ui->b_equals, &QPushButton::clicked, this, &Calculator::pressEquals);
connect(ui->b_dot, &QPushButton::clicked, this, &Calculator::pressDot);
connect(ui->b_ce, &QPushButton::clicked, this, &Calculator::pressCe);
connect(ui->b_ac, &QPushButton::clicked, this, &Calculator::pressAc);
}
Calculator::~Calculator()
{
delete ui;
}
void Calculator::press0()
{
keyPressed("0");
}
void Calculator::press1()
{
keyPressed("1");
}
void Calculator::press2()
{
keyPressed("2");
}
void Calculator::press3()
{
keyPressed("3");
}
void Calculator::press4()
{
keyPressed("4");
}
void Calculator::press5()
{
keyPressed("5");
}
void Calculator::press6()
{
keyPressed("6");
}
void Calculator::press7()
{
keyPressed("7");
}
void Calculator::press8()
{
keyPressed("8");
}
void Calculator::press9()
{
keyPressed("9");
}
void Calculator::pressAdd()
{
keyPressed("+");
}
void Calculator::pressSubtract()
{
keyPressed("-");
}
void Calculator::pressMultiply()
{
keyPressed("*");
}
void Calculator::pressDivide()
{
keyPressed("/");
}
void Calculator::pressEquals()
{
keyPressed("=");
}
void Calculator::pressDot()
{
keyPressed(".");
}
void Calculator::pressCe()
{
keyPressed("CE");
}
void Calculator::pressAc()
{
keyPressed("AC");
}
bool Calculator::isDigit(QString value)
{
if (value == "0"
|| value == "1"
|| value == "2"
|| value == "3"
|| value == "4"
|| value == "5"
|| value == "6"
|| value == "7"
|| value == "8"
|| value == "9"
)
return true;
return false;
}
bool Calculator::isOperator(QString value)
{
if (value == "+"
|| value == "-"
|| value == "*"
|| value == "/"
|| value == "="
)
return true;
return false;
}
void Calculator::calculate(bool clearOperand)
{
m_operand2 = ui->e_display->text().toFloat();
if (m_operator == '+')
m_operand1 = m_operand1 + m_operand2;
else if (m_operator == '-')
m_operand1 = m_operand1 - m_operand2;
else if (m_operator == '*')
m_operand1 = m_operand1 * m_operand2;
else if (m_operator == '/')
m_operand1 = m_operand1 / m_operand2;
ui->e_display->setText(QString::number(m_operand1));
m_done = true;
if (clearOperand)
m_operand1Set = false;
}
void Calculator::clearIfDone()
{
if (m_done) {
ui->e_display->setText("0");
m_done = false;
}
}
void Calculator::keyPressed(QString keyName)
{
if (isDigit(keyName)) {
clearIfDone();
if (ui->e_display->text() == "0")
ui->e_display->setText(keyName);
else
ui->e_display->setText(ui->e_display->text() + keyName);
}
else if (keyName == ".") {
clearIfDone();
if (ui->e_display->text().contains("."))
return;
ui->e_display->setText(ui->e_display->text() + keyName);
}
else if (isOperator(keyName)) {
if (!m_operand1Set && keyName != "=") {
m_operand1Set = true;
m_operand1 = ui->e_display->text().toFloat();
m_operator = QChar(keyName[0]);
ui->e_display->setText("0");
} else if (m_operand1Set && !m_done) {
if (keyName == "=")
calculate(true);
else {
calculate(false);
m_operator = QChar(keyName[0]);
}
}
}
else if (keyName == "CE") {
QString text = ui->e_display->text();
if (text.size() > 1)
text.chop(1);
else
text = "0";
ui->e_display->setText(text);
}
else if (keyName == "AC") {
ui->e_display->setText("0");
m_operand1Set = false;
m_done = false;
}
}