Qt版科学计算器
转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907
之前做过《VC版科学计算器》,这也是我学VC++时的第一个大作业,通过科学计算器的开发使用我学到了很多东西,也让我逐渐喜欢上了编程。最近在学习Qt,所以将当时在VC下写过的一些东西在Qt下重写了一遍,其实主要还是与显示等有关的东西需要重写,要使用Qt的显示方式,而其他的核心的算法等都还是使用VC下C++的源码。
下面是Qt版的运行截图:
标准版:
科学版:
头文件中变量和槽的声明:
class CalculatorScientific : public QMainWindow
{
Q_OBJECT
public:
explicit CalculatorScientific(QWidget *parent = 0);
~CalculatorScientific();
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();
void subToMemory();
private:
Ui::CalculatorScientific *ui;
double angleToArc(double angle);
double getPi();
void abortOperation();
bool calculate(double rightOperand, const QString &pendingOperator);
double sumInMemory;
double sumSoFar;
double factorSoFar;
QString pendingAdditiveOperator;
QString pendingMultiplicativeOperator;
bool waitingForOperand;
};转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907
信号和槽的关联代码:
//NumberKey
connect(ui->pushButton_Zero, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_One, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Two, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Three, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Four, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Five, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Six, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Seven, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Eight, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Nine, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_A, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_B, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_C, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_D, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_E, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_F, SIGNAL(clicked()), this, SLOT(digitClicked()));
connect(ui->pushButton_Pi, SIGNAL(clicked()), this, SLOT(digitClicked())); //OperatorKey
connect(ui->pushButton_Add, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked()));
connect(ui->pushButton_Sub, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked()));
connect(ui->pushButton_Mul, SIGNAL(clicked()), this, SLOT(multiplicativeOperatorClicked()));
connect(ui->pushButton_Div, SIGNAL(clicked()), this, SLOT(multiplicativeOperatorClicked()));
connect(ui->pushButton_Mod, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked()));
connect(ui->pushButton_And, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked()));
connect(ui->pushButton_Xor, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked()));
connect(ui->pushButton_X_y, SIGNAL(clicked()), this, SLOT(additiveOperatorClicked()));
再看一下计算函数的实现代码:
bool CalculatorScientific::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;
} else if (pendingOperator == tr("%")) {
sumSoFar = fmod(sumSoFar,rightOperand);
} else if (pendingOperator == tr("And")) {
sumSoFar = (int)sumSoFar & (int)rightOperand;
} else if (pendingOperator == tr("Xor")) {
sumSoFar = (int)sumSoFar ^ (int)rightOperand;
} else if (pendingOperator == tr("x^y")) {
sumSoFar = pow(sumSoFar,rightOperand);
}
return true;
}
void CalculatorScientific::unaryOperatorClicked()
{
QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());
QString clickedOperator = clickedButton->text();
double operand = ui->lineEdit_display->text().toDouble();
double result = 0.0;
if (clickedOperator == tr("Sqrt")) {
if (operand < 0.0) {
abortOperation();
return;
}
result = sqrt(operand);
} else if (clickedOperator == tr("x^2")) {
result = pow(operand, 2.0);
} else if (clickedOperator == tr("x^3")){
result = pow(operand, 3.0);
} else if (clickedOperator == tr("1/X")) {
if (operand == 0.0) {
abortOperation();
return;
}
result = 1.0 / operand;
} else if (clickedOperator == tr("ln")) {
if (operand < 0.0) {
abortOperation();
return;
}
result = log(operand);
} else if (clickedOperator == tr("log")) {
if (operand < 0.0) {
abortOperation();
return;
}
result = log10(operand);
} else if (clickedOperator == tr("sin")) {
if(ui->radioButton_Arc->isChecked())
result = sin(operand);
else
result = sin(angleToArc(operand));
} else if (clickedOperator == tr("sinh")) {
result = sinh(operand);
} else if (clickedOperator == tr("cos")) {
if(ui->radioButton_Arc->isChecked())
result = cos(operand);
else
result = cos(angleToArc(operand));
} else if (clickedOperator == tr("cosh")) {
result = cosh(operand);
} else if (clickedOperator == tr("tan")) {
if(ui->radioButton_Arc->isChecked())
result = tan(operand);
else
result = tan(angleToArc(operand));
} else if (clickedOperator == tr("tanh")) {
result = tanh(operand);
} else if (clickedOperator == tr("n!")) {
if (operand < 0.0) {
abortOperation();
return;
}
result = 1;
for(int i = 1; i <= (int)operand; i++)
result *= i;
} else if (clickedOperator == tr("e^x")) {
result = exp(operand);
} else if (clickedOperator == tr("10^x")) {
result = pow(10,operand);
} else if (clickedOperator == tr("Int")) {
result = (int)(operand);
} else if (clickedOperator == tr("Not")) {
result = ~(int)(operand);
}
ui->lineEdit_display->setText(QString::number(result));
waitingForOperand = true;
}转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907
原文地址:http://blog.csdn.net/u012027907/article/details/43971999