• 3884阅读
  • 6回复

[提问]小算盤標準型的思路 [复制链接]

上一主题 下一主题
离线harold00124
 

只看楼主 倒序阅读 楼主  发表于: 2016-10-30
小弟剛入職所以老闆還在考核我的學習能力

因為小弟還是個新手 剛接觸QT也只有1周的時間 C++基礎也很薄弱
上周做了一個簡單的四則運算計算機 被老闆講說我做的是垃圾根本沒有實用價值

要我在下周二前在做一個跟微軟小算盤標準型有同樣功能跟算數邏輯的計算器
並且要求我注意並且增加
1:16進制 10進制 2進制的互相轉換
2:能連續運算 像是能連續輸入1+2/3+4-5 並且遵從 /* >+-的執行規則
3:1/3=0.333333333後*3會回歸1 開根號開平方都比照辦理
4:基本的除錯1/0 要顯示出Error 除數不可為0等等(這個我有做出來

我自己看了QT本身提供的calcuator範例簡直看得一頭霧水 連他的運算式是怎麼完成的都看不太懂 而且他沒有透過ui檔新增button而是直接在主程式新增並且排程(這部分我有看懂是怎麼做的)但是我還是比較習慣在表單用ui直接手動增加元件....

我現在碰到幾個難關
進位的處理要怎麼做才不會卡到二次運算的輸出 我一般都是在按鍵1~9做自動進位*10 等到按下=之後才做
ui->lineEdit->setText(Qstring::number((A+B)/10)並且輸出答案(但是這樣我會卡到多次運算 只能做單次運算)
有辦法直接在lineEdit內輸入值後直接拿那些值來運算嗎?要怎麼把他轉為數值?
比方說我直接連續在理面輸入1+2/3+4-5  然後我直接拿出來做運算?


下面是我參考的範例源碼 目前只看懂不到1/3而已
首先他頭文件有2個 我不懂為什麼會要弄到2個頭文件 我自己做的只有1個頭文件

#ifndef BUTTON_H
#define BUTTON_H

#include <QToolButton>

//! [0]
class Button : public QToolButton
{
    Q_OBJECT

public:
    explicit Button(const QString &text, QWidget *parent = 0);

    QSize sizeHint() const Q_DECL_OVERRIDE;
};
//! [0]

#endif
-------------------------------------------------------------------------------------------------------------------------

#ifndef CALCULATOR_H
#define CALCULATOR_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QLineEdit;
QT_END_NAMESPACE
class Button;

//! [0]
class Calculator : public QWidget
{
    Q_OBJECT

public:
    Calculator(QWidget *parent = 0);

private slots:
    void digitClicked();
    void unaryOperatorClicked();
    void additiveOperatorClicked();
    void multiplicativeOperatorClicked();
    void equalClicked();
    void pointClicked();
    void changeSignClicked();
    void backspaceClicked();
    void clear();
    void clearAll();
    void clearMemory();
    void readMemory();
    void setMemory();
    void addToMemory();
//! [0]

//! [1]
private:
//! [1] //! [2]
    Button *createButton(const QString &text, const char *member);
    void abortOperation();
    bool calculate(double rightOperand, const QString &pendingOperator);
//! [2]

//! [3]
    double sumInMemory;
//! [3] //! [4]
    double sumSoFar;
//! [4] //! [5]
    double factorSoFar;
//! [5] //! [6]
    QString pendingAdditiveOperator;
//! [6] //! [7]
    QString pendingMultiplicativeOperator;
//! [7] //! [8]
    bool waitingForOperand;
//! [8]

//! [9]
    QLineEdit *display;
//! [9] //! [10]

    enum { NumDigitButtons = 10 };
    Button *digitButtons[NumDigitButtons];
};
//! [10]

#endif

然後是主文件也有3個 比我正常在做多一個

#include <QtWidgets>

#include "button.h"

//! [0]
Button::Button(const QString &text, QWidget *parent)
    : QToolButton(parent)
{
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
    setText(text);
}
//! [0]

//! [1]
QSize Button::sizeHint() const
//! [1] //! [2]
{
    QSize size = QToolButton::sizeHint();
    size.rheight() += 20;
    size.rwidth() = qMax(size.width(), size.height());
    return size;
}
//! [2]

----------------------------------------------------------------------------------------------------------------

#include <QtWidgets>

#include <cmath>

#include "button.h"
#include "calculator.h"

//! [0]
Calculator::Calculator(QWidget *parent)
    : QWidget(parent)
{
    sumInMemory = 0.0;
    sumSoFar = 0.0;
    factorSoFar = 0.0;
    waitingForOperand = true;
//! [0]

//! [1]
    display = new QLineEdit("0");
//! [1] //! [2]
    display->setReadOnly(true);
    display->setAlignment(Qt::AlignRight);
    display->setMaxLength(15);

    QFont font = display->font();
    font.setPointSize(font.pointSize() + 8);
    display->setFont(font);
//! [2]

//! [4]
    for (int i = 0; i < NumDigitButtons; ++i) {
        digitButtons = createButton(QString::number(i), SLOT(digitClicked()));
    }

    Button *pointButton = createButton(tr("."), SLOT(pointClicked()));
    Button *changeSignButton = createButton(tr("\302\261"), SLOT(changeSignClicked()));

    Button *backspaceButton = createButton(tr("Backspace"), SLOT(backspaceClicked()));
    Button *clearButton = createButton(tr("Clear"), SLOT(clear()));
    Button *clearAllButton = createButton(tr("Clear All"), SLOT(clearAll()));

    Button *clearMemoryButton = createButton(tr("MC"), SLOT(clearMemory()));
    Button *readMemoryButton = createButton(tr("MR"), SLOT(readMemory()));
    Button *setMemoryButton = createButton(tr("MS"), SLOT(setMemory()));
    Button *addToMemoryButton = createButton(tr("M+"), SLOT(addToMemory()));

    Button *divisionButton = createButton(tr("\303\267"), SLOT(multiplicativeOperatorClicked()));
    Button *timesButton = createButton(tr("\303\227"), SLOT(multiplicativeOperatorClicked()));
    Button *minusButton = createButton(tr("-"), SLOT(additiveOperatorClicked()));
    Button *plusButton = createButton(tr("+"), SLOT(additiveOperatorClicked()));

    Button *squareRootButton = createButton(tr("Sqrt"), SLOT(unaryOperatorClicked()));
    Button *powerButton = createButton(tr("x\302\262"), SLOT(unaryOperatorClicked()));
    Button *reciprocalButton = createButton(tr("1/x"), SLOT(unaryOperatorClicked()));
    Button *equalButton = createButton(tr("="), SLOT(equalClicked()));
//! [4]

//! [5]
    QGridLayout *mainLayout = new QGridLayout;
//! [5] //! [6]
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
    mainLayout->addWidget(display, 0, 0, 1, 6);
    mainLayout->addWidget(backspaceButton, 1, 0, 1, 2);
    mainLayout->addWidget(clearButton, 1, 2, 1, 2);
    mainLayout->addWidget(clearAllButton, 1, 4, 1, 2);

    mainLayout->addWidget(clearMemoryButton, 2, 0);
    mainLayout->addWidget(readMemoryButton, 3, 0);
    mainLayout->addWidget(setMemoryButton, 4, 0);
    mainLayout->addWidget(addToMemoryButton, 5, 0);

    for (int i = 1; i < NumDigitButtons; ++i) {
        int row = ((9 - i) / 3) + 2;
        int column = ((i - 1) % 3) + 1;
        mainLayout->addWidget(digitButtons, row, column);
    }

    mainLayout->addWidget(digitButtons[0], 5, 1);
    mainLayout->addWidget(pointButton, 5, 2);
    mainLayout->addWidget(changeSignButton, 5, 3);

    mainLayout->addWidget(divisionButton, 2, 4);
    mainLayout->addWidget(timesButton, 3, 4);
    mainLayout->addWidget(minusButton, 4, 4);
    mainLayout->addWidget(plusButton, 5, 4);

    mainLayout->addWidget(squareRootButton, 2, 5);
    mainLayout->addWidget(powerButton, 3, 5);
    mainLayout->addWidget(reciprocalButton, 4, 5);
    mainLayout->addWidget(equalButton, 5, 5);
    setLayout(mainLayout);

    setWindowTitle(tr("Calculator"));
}
//! [6]

//! [7]
void Calculator::digitClicked()
{
    Button *clickedButton = qobject_cast<Button *>(sender());
    int digitValue = clickedButton->text().toInt();
    if (display->text() == "0" && digitValue == 0.0)
        return;

    if (waitingForOperand) {
        display->clear();
        waitingForOperand = false;
    }
    display->setText(display->text() + QString::number(digitValue));
}
//! [7]

//! [8]
void Calculator::unaryOperatorClicked()
//! [8] //! [9]
{
    Button *clickedButton = qobject_cast<Button *>(sender());
    QString clickedOperator = clickedButton->text();
    double operand = display->text().toDouble();
    double result = 0.0;

    if (clickedOperator == tr("Sqrt")) {
        if (operand < 0.0) {
            abortOperation();
            return;
        }
        result = std::sqrt(operand);
    } else if (clickedOperator == tr("x\302\262")) {
        result = std::pow(operand, 2.0);
    } else if (clickedOperator == tr("1/x")) {
        if (operand == 0.0) {
            abortOperation();
            return;
        }
        result = 1.0 / operand;
    }
    display->setText(QString::number(result));
    waitingForOperand = true;
}
//! [9]

//! [10]
void Calculator::additiveOperatorClicked()
//! [10] //! [11]
{
    Button *clickedButton = qobject_cast<Button *>(sender());
    QString clickedOperator = clickedButton->text();
    double operand = display->text().toDouble();

//! [11] //! [12]
    if (!pendingMultiplicativeOperator.isEmpty()) {
//! [12] //! [13]
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        display->setText(QString::number(factorSoFar));
        operand = factorSoFar;
        factorSoFar = 0.0;
        pendingMultiplicativeOperator.clear();
    }

//! [13] //! [14]
    if (!pendingAdditiveOperator.isEmpty()) {
//! [14] //! [15]
        if (!calculate(operand, pendingAdditiveOperator)) {
            abortOperation();
            return;
        }
        display->setText(QString::number(sumSoFar));
    } else {
        sumSoFar = operand;
    }

//! [15] //! [16]
    pendingAdditiveOperator = clickedOperator;
//! [16] //! [17]
    waitingForOperand = true;
}
//! [17]

//! [18]
void Calculator::multiplicativeOperatorClicked()
{
    Button *clickedButton = qobject_cast<Button *>(sender());
    QString clickedOperator = clickedButton->text();
    double operand = display->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        display->setText(QString::number(factorSoFar));
    } else {
        factorSoFar = operand;
    }

    pendingMultiplicativeOperator = clickedOperator;
    waitingForOperand = true;
}
//! [18]

//! [20]
void Calculator::equalClicked()
{
    double operand = display->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        operand = factorSoFar;
        factorSoFar = 0.0;
        pendingMultiplicativeOperator.clear();
    }
    if (!pendingAdditiveOperator.isEmpty()) {
        if (!calculate(operand, pendingAdditiveOperator)) {
            abortOperation();
            return;
        }
        pendingAdditiveOperator.clear();
    } else {
        sumSoFar = operand;
    }

    display->setText(QString::number(sumSoFar));
    sumSoFar = 0.0;
    waitingForOperand = true;
}
//! [20]

//! [22]
void Calculator::pointClicked()
{
    if (waitingForOperand)
        display->setText("0");
    if (!display->text().contains('.'))
        display->setText(display->text() + tr("."));
    waitingForOperand = false;
}
//! [22]

//! [24]
void Calculator::changeSignClicked()
{
    QString text = display->text();
    double value = text.toDouble();

    if (value > 0.0) {
        text.prepend(tr("-"));
    } else if (value < 0.0) {
        text.remove(0, 1);
    }
    display->setText(text);
}
//! [24]

//! [26]
void Calculator::backspaceClicked()
{
    if (waitingForOperand)
        return;

    QString text = display->text();
    text.chop(1);
    if (text.isEmpty()) {
        text = "0";
        waitingForOperand = true;
    }
    display->setText(text);
}
//! [26]

//! [28]
void Calculator::clear()
{
    if (waitingForOperand)
        return;

    display->setText("0");
    waitingForOperand = true;
}
//! [28]

//! [30]
void Calculator::clearAll()
{
    sumSoFar = 0.0;
    factorSoFar = 0.0;
    pendingAdditiveOperator.clear();
    pendingMultiplicativeOperator.clear();
    display->setText("0");
    waitingForOperand = true;
}
//! [30]

//! [32]
void Calculator::clearMemory()
{
    sumInMemory = 0.0;
}

void Calculator::readMemory()
{
    display->setText(QString::number(sumInMemory));
    waitingForOperand = true;
}

void Calculator::setMemory()
{
    equalClicked();
    sumInMemory = display->text().toDouble();
}

void Calculator::addToMemory()
{
    equalClicked();
    sumInMemory += display->text().toDouble();
}
//! [32]
//! [34]
Button *Calculator::createButton(const QString &text, const char *member)
{
    Button *button = new Button(text);
    connect(button, SIGNAL(clicked()), this, member);
    return button;
}
//! [34]

//! [36]
void Calculator::abortOperation()
{
    clearAll();
    display->setText(tr("####"));
}
//! [36]

//! [38]
bool Calculator::calculate(double rightOperand, const QString &pendingOperator)
{
    if (pendingOperator == tr("+")) {
        sumSoFar += rightOperand;
    } else if (pendingOperator == tr("-")) {
        sumSoFar -= rightOperand;
    } else if (pendingOperator == tr("\303\227")) {
        factorSoFar *= rightOperand;
    } else if (pendingOperator == tr("\303\267")) {
        if (rightOperand == 0.0)
            return false;
        factorSoFar /= rightOperand;
    }
    return true;
}
//! [38]


這個算盤的結果基本上跟我想要的是幾乎一樣了 只差位元轉換的部分 但是這個思路我搞不懂看不懂 有大神可以幫忙解說一下嗎??




离线harold00124

只看该作者 1楼 发表于: 2016-10-31
可能問的太攏統了 真不好意思

我現在想在頭文件設定一祖Qstring的變數input
QString input;

然後主程式在pushbutton的信號槽部分設定
讓input變數先取得原先數字 用插入的方式讓我省去進位的問題 我看網路上的文章好像也都是這樣做的 怎麼到我這邊就沒辦法? 是我漏掉哪個地方嗎?
還是我搞錯了什麼?


void MainWindow::on_pushButton_2_clicked()//1
{
    input=ui->lineEdit->text();
    ui->lineEdit->setText(input+QString::number(1));
}
离线bran_lee

只看该作者 2楼 发表于: 2016-10-31
回 harold00124 的帖子
harold00124:可能問的太攏統了 真不好意思
我現在想在頭文件設定一祖Qstring的變數input
QString input;
....... (2016-10-31 07:20) 

不太懂你要问的意思,你可以把你的输入和期望的输出写出来,这样比较容易理解。
前面你贴出的参考例子,其实思路挺简单的:
1、输入数字就把当前显示的数字后面加数字
2、输入一元操作符,就对当前显示的数字做一次相应的运算
3、输入加或减,就看前面的输入有没有未处理的操作符,如果有乘除,就先做乘除,再看是否有加减,再做加减,刚刚输入的加或减,就作为未处理的操作符
4、输入乘或除,和加减差不多
5、其他操作都很简单,略
6、计算过程中产生的结果,主要就是sumSoFar、factorSoFar 和operand 的切换,calculate函数中,加减用sumSoFar保存结果,乘除用factorSoFar保存结果。
7、sumSoFar和factorSoFar总是作为左操作数,operand 总是作为右操作数。
1条评分金钱+5
harold00124 金钱 +5 感謝回復!!! 2016-10-31
当你只有锤子时,你看什么都像是钉子!
离线cycloveu

只看该作者 3楼 发表于: 2016-10-31
写计算器 必须也得上 策略模式啊,加上模板 逼格就更高了
大道至简 悟在天成
离线harold00124

只看该作者 4楼 发表于: 2016-11-01
感謝大大的提點
現在已經變的比較看的懂了,雖然還是有些語法看不懂(C++能力太薄弱了)
不過整個邏輯過程對小弟來說還是蠻複雜的
但是因為小弟現在能力還不足 要按照自己邏輯憑空生出還是頗有難度

不過現在也沒時間給小弟搞懂下去了 現在只好使用copy大法 然後按照我對這個程式的理解下去做相對的修改
主要是我本身還是習慣直接從ui配合信號槽下去拉控件 還沒辦法像這個範例一樣直接從主文件就能生成一堆控件 太頭痛了
而且交作業給老闆也不能長的太像(被發現就跪了)

現在碰到的問題是進制轉換的部分
我自己弄是希望能讓radioButton 的3個按鍵可以隨意轉換2 10 16進制
寫出來10轉2或者轉16都可以 但是互轉就碰到問題 像是
10進制轉去2進制之後會變成1010 然後就轉不回去了

void MainWindow::on_radioButton_clicked()//2進制
{
    int n;
    QString str;
    n=ui->lineEdit->text().toInt();
    str.setNum(n,2);
    ui->lineEdit->setText(str);
}
void MainWindow::on_radioButton_2_clicked()//10進制
{
    int n;
    QString str;
    n=ui->lineEdit->text().toInt();
    str.setNum(n,10);
    ui->lineEdit->setText(str);
}

void MainWindow::on_radioButton_3_clicked()//16進制
{
    int n;
    QString str;
    n=ui->lineEdit->text().toInt();
    str.setNum(n,16);
    ui->lineEdit->setText(str);
}
离线bran_lee

只看该作者 5楼 发表于: 2016-11-01
回 harold00124 的帖子
harold00124:感謝大大的提點
現在已經變的比較看的懂了,雖然還是有些語法看不懂(C++能力太薄弱了)
不過整個邏輯過程對小弟來說還是蠻複雜的
但是因為小弟現在能力還不足 要按照自己邏輯憑空生出還是頗有難度
....... (2016-11-01 12:10) 

没事多看看文档,qt的文档还是很详细的,你用的toInt()有两个参数,其中有设置进制的参数,默认是10进制所以二进制转十进制出问题
1条评分金钱+10
harold00124 金钱 +10 感謝!! 我在加些條件式判斷看看!! 2016-11-01
当你只有锤子时,你看什么都像是钉子!
离线harold00124

只看该作者 6楼 发表于: 2016-11-02
感谢大大的提点 昨天晚上已经把整个程式都做完了  绝大的主程式都是靠copy的 不过好歹也把他程式要表达的功能搞懂了(虽然里面的语法还是没有完全看懂) 不过复制贴上可能会导致里面有一些多余的函式在内 不过我也看不太懂所以就不删了 不影响功能就好.....
这次就实在是靠copy+自己理解修改+一些添加物(进制转换算是完全经我自己写的,不过没打算让他可以运算 只是单纯的互转而已)
计算机标准型+简单进制转换功能 cal2.rar (11 K) 下载次数:1



下面是代码区
头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QKeyEvent>
#include <QString>
#include <QLabel>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

    void on_pushButton_9_clicked();

    void on_pushButton_10_clicked();

    void on_pushButton_12_clicked();

    void on_pushButton_13_clicked();

    void on_pushButton_14_clicked();

    void on_pushButton_15_clicked();

    void on_pushButton_11_clicked();

    void on_pushButton_19_clicked();

    void on_pushButton_16_clicked();

    void on_pushButton_18_clicked();

    void on_pushButton_25_clicked();

    void on_pushButton_20_clicked();

    void on_pushButton_26_clicked();

    void on_pushButton_21_clicked();

    void on_pushButton_22_clicked();

    void on_pushButton_23_clicked();

    void on_pushButton_24_clicked();

    void on_pushButton_17_clicked();

    void on_radioButton_clicked();

    void on_radioButton_2_clicked();

    void on_radioButton_3_clicked();

private:
    Ui::MainWindow *ui;
    bool waitingForOperand;
    double sumInMemory;
    double sumSoFar;
    double factorSoFar;
    QString pendingAdditiveOperator;
    QString pendingMultiplicativeOperator;
    void abortOperation();
    bool calculate(double rightOperand, const QString &pendingOperator);
    void change(int i,int b);
};

#endif // MAINWINDOW_H


----------------------------------------------------------------------------
----------------------------------------------------------------------------
主文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Qstring>
#include <QMessageBox>
#include <QDebug>
#include <QLineEdit>
int i=1;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->setText("0");
    sumInMemory = 0.0;
    sumSoFar = 0.0;
    factorSoFar = 0.0;
    waitingForOperand = true;


}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()//0
{
    int Value = ui->pushButton->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_2_clicked()//1
{
    int Value = ui->pushButton_2->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_3_clicked()//2
{
    int Value = ui->pushButton_3->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_4_clicked()//3
{
    int Value = ui->pushButton_4->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_5_clicked()//4
{
    int Value = ui->pushButton_5->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_6_clicked()//5
{
    int Value = ui->pushButton_6->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_7_clicked()//6
{
    int Value = ui->pushButton_7->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_8_clicked()//7
{
    int Value = ui->pushButton_8->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_9_clicked()//8
{
    int Value = ui->pushButton_9->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}
void MainWindow::on_pushButton_10_clicked()//9
{
    int Value = ui->pushButton_10->text().toInt();
    if (ui->lineEdit->text() == "0" && Value == 0.0)
        return;

    if (waitingForOperand) {
       ui->lineEdit->clear();
        waitingForOperand = false;
    }
    ui->lineEdit->setText(ui->lineEdit->text() + QString::number(Value));
}

void MainWindow::on_pushButton_20_clicked()//.
{
    if (waitingForOperand)
        ui->lineEdit->setText("0");
    if (!ui->lineEdit->text().contains('.'))
        ui->lineEdit->setText(ui->lineEdit->text() + tr("."));
    waitingForOperand = false;
}
void MainWindow::on_pushButton_12_clicked()//+
{

    QString clickedOperator = ui->pushButton_12->text();
    double operand = ui->lineEdit->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        ui->lineEdit->setText(QString::number(factorSoFar));
        operand = factorSoFar;
        factorSoFar = 0.0;
        pendingMultiplicativeOperator.clear();
    }

    if (!pendingAdditiveOperator.isEmpty()) {
        if (!calculate(operand, pendingAdditiveOperator)) {
             abortOperation();
             return;
         }
            ui->lineEdit->setText(QString::number(sumSoFar));
        } else {
            sumSoFar = operand;
        }
        pendingAdditiveOperator = clickedOperator;
        waitingForOperand = true;
    }
void MainWindow::on_pushButton_13_clicked()//-
{
    QString clickedOperator = ui->pushButton_13->text();
    double operand = ui->lineEdit->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        ui->lineEdit->setText(QString::number(factorSoFar));
        operand = factorSoFar;
        factorSoFar = 0.0;
        pendingMultiplicativeOperator.clear();
    }
        if (!pendingAdditiveOperator.isEmpty()) {
            if (!calculate(operand, pendingAdditiveOperator)) {
                abortOperation();
                return;
            }
            ui->lineEdit->setText(QString::number(sumSoFar));
        } else {
            sumSoFar = operand;
        }
        pendingAdditiveOperator = clickedOperator;
        waitingForOperand = true;
    }
void MainWindow::on_pushButton_14_clicked()//*
{
    QString clickedOperator = ui->pushButton_14->text();
    double operand = ui->lineEdit->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        ui->lineEdit->setText(QString::number(factorSoFar));
    } else {
        factorSoFar = operand;
    }

    pendingMultiplicativeOperator = clickedOperator;
    waitingForOperand = true;
}
void MainWindow::on_pushButton_15_clicked()// /
{
    QString clickedOperator = ui->pushButton_15->text();
    double operand = ui->lineEdit->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        ui->lineEdit->setText(QString::number(factorSoFar));
    } else {
        factorSoFar = operand;
    }

    pendingMultiplicativeOperator = clickedOperator;
    waitingForOperand = true;
}
void MainWindow::on_pushButton_11_clicked()//=
{
    double operand = ui->lineEdit->text().toDouble();

    if (!pendingMultiplicativeOperator.isEmpty()) {
        if (!calculate(operand, pendingMultiplicativeOperator)) {
            abortOperation();
            return;
        }
        operand = factorSoFar;
        factorSoFar = 0.0;
        pendingMultiplicativeOperator.clear();
    }
    if (!pendingAdditiveOperator.isEmpty()) {
        if (!calculate(operand, pendingAdditiveOperator)) {
            abortOperation();
            return;
        }
        pendingAdditiveOperator.clear();
    } else {
        sumSoFar = operand;
    }

    ui->lineEdit->setText(QString::number(sumSoFar));
    sumSoFar = 0.0;
    waitingForOperand = true;
}
void MainWindow::on_pushButton_19_clicked()//C
{
    sumInMemory = 0.0;
    sumSoFar = 0.0;
    factorSoFar = 0.0;
    waitingForOperand = true;
    ui->lineEdit->setText(QString::number(0));

}
void MainWindow::on_pushButton_16_clicked()//sqrt
{
    QString clickedOperator = ui->pushButton_16->text();
    double operand = ui->lineEdit->text().toDouble();
    double result = 0.0;
        if (operand < 0.0) {
            abortOperation();
            return;
        }
        result = std::sqrt(operand);

    ui->lineEdit->setText(QString::number(result));
    waitingForOperand = true;
}
void MainWindow::on_pushButton_17_clicked()//X^2
{
    QString clickedOperator = ui->pushButton_16->text();
    double operand = ui->lineEdit->text().toDouble();
    double result = 0.0;

        result = std::pow(operand, 2.0);

    ui->lineEdit->setText(QString::number(result));
    waitingForOperand = true;
}
void MainWindow::on_pushButton_18_clicked()//1/X
{
    QString clickedOperator = ui->pushButton_16->text();
    double operand = ui->lineEdit->text().toDouble();
    double result = 0.0;

        if (operand == 0.0) {
            abortOperation();
            return;
        }
        result = 1.0 / operand;

    ui->lineEdit->setText(QString::number(result));
    waitingForOperand = true;
}
void MainWindow::on_pushButton_25_clicked()
{

    if (waitingForOperand)
        return;
    QString str = ui->lineEdit->text();
    str.chop(1);
    if (str.isEmpty()) {
        str = "0";
    }
    ui->lineEdit->setText(str);
}
bool MainWindow::calculate(double rightOperand, const QString &pendingOperator)//計算式
{
    if (pendingOperator == tr("+")) {
        sumSoFar += rightOperand;
    } else if (pendingOperator == tr("-")) {
        sumSoFar -= rightOperand;
    } else if (pendingOperator == tr("*")) {
        factorSoFar *= rightOperand;
    } else if (pendingOperator == tr("/")) {
        if (rightOperand == 0.0)
            return false;
        factorSoFar /= rightOperand;
    }
    return true;
}
void MainWindow::on_pushButton_26_clicked()//+-
{
    QString text = ui->lineEdit->text();
    double value = text.toDouble();

    if (value > 0.0) {
        text.prepend(tr("-"));
    } else if (value < 0.0) {
        text.remove(0, 1);
    }
    ui->lineEdit->setText(text);
}
void MainWindow::on_pushButton_21_clicked()//MC
{
    sumInMemory = 0.0;
}
void MainWindow::on_pushButton_22_clicked()
{
    ui->lineEdit->setText(QString::number(sumInMemory));//MR
    waitingForOperand = true;
}
void MainWindow::on_pushButton_23_clicked()//MS
{
    on_pushButton_14_clicked();
    sumInMemory = ui->lineEdit->text().toDouble();
}
void MainWindow::on_pushButton_24_clicked()//M+
{
    on_pushButton_14_clicked();
    sumInMemory += ui->lineEdit->text().toDouble();
}
void MainWindow::abortOperation()
{
    sumInMemory = 0.0;
    sumSoFar = 0.0;
    factorSoFar = 0.0;
    waitingForOperand = true;
    ui->lineEdit->setText(tr("####"));
}

void MainWindow::on_radioButton_clicked()//2進制
{
    if(i==2){//如果原始進制為2
        return;//不回傳值
    }
    if(i==1 || i==3){//如果原始進制為10.16進制
        int b=i;//原始進制給b
        change(2,b);//呼叫程式 b轉2進制
    }
    i=2; //原始進制改2進制
}
void MainWindow::on_radioButton_2_clicked()//10進制
{
    if(i==1){
        return;
    }
    if(i==2 || i==3){
        int b=i;
        change(1,b);
    }
    i=1;
}

void MainWindow::on_radioButton_3_clicked()//16進制
{
    if(i==3){
        return;
    }
    if(i==1 || i==2){
        int b=i;
        change(3,b);
    }
    i=3;
}
void MainWindow::change(int i,int b){
    int n;//2進制
    int a;//16進制
    bool ok;
    QString str;
    str=ui->lineEdit->text();//儲存當前值的str字串
    n=ui->lineEdit->text().toInt();//儲存當前值的10進制狀態
    if(b!=1){//如果原始進制不為10進制 全都轉回10進制
        n=str.toInt(&ok,2); //2進轉回10進
        a=str.toInt(&ok,16);//16進制轉回10進
    }
    switch (i) {//進制互轉
    case 1://轉為10進制
        if (b==1){//如果原始進制為10進制
           return; //傳回原值
        }
        if (b==2){//如果原始進制為2進制
            str.setNum(n,10);//回傳n值
            }
        if(b==3){//如果原始進制為16進制
            str=QString::number(a); //回傳a值
        }
        break;
   case 2://轉為2進制
        if (b==1){//如果原始進制為10進制
           str.setNum(n,2);//轉為2進制
        }
        if (b==2){//如果原始進制為2進制
            return;//不回傳值
            }
        if(b==3){//如果原始進制為16進制
            str.setNum(a,16); //轉為2進制
        }
        break;
    case 3://轉為16進制
         if (b==1){//如果原始進制為10進制
            str.setNum(n,16);//轉為16進制
         }
         if (b==2){//如果原始進制為2進制
             str.setNum(n,16);//轉為16進制
             }
         if(b==3){//如果原始進制為16進制
             return; //不回傳值
         }
         break;
    }
    ui->lineEdit->setText(str);
}




快速回复
限100 字节
 
上一个 下一个