第一次嘗試使用Qt進行開發。在此之前還尚未接觸到過這一類的ui設計,是以通過寫電腦的方式對Qt進行熟悉。
先上結果圖
僅僅實作了 加減乘除和不嵌套使用的括号 以及小數 後退 清空功能
首先是需求分析:
- 要實作那些功能
- 如何表達目前的輸入情況
- 如何實作權重問題和括号的位置識别
以下是功能的實作構思及代碼
- 上界面也是表達式界面,是執行操作的數字和符号的儲存地和使用者輸入的顯示處。
- 下界面顯示使用者目前輸入的界面,每當輸入新輸入的資料與該界面已經顯示的資料不同時将重置顯示。
-
如使用者輸入了123,此時下界面顯示為123,當在輸入+時 下界面将清空并顯示+,再此輸入數字或括号時 下界面會再次清空顯示目前輸入。
代碼如下
方法類:
void Calculate::appendData(QString str)
{
if (str == "+" || str == "-" || str == "*" || str == "/" || str == "(" || str == ")" )
{
if (str=="(")
{
m_datas.append(str);
m_currDatas = str;
m_expression += str;
}
else if (str==")")
{
m_datas.append(m_currDatas);
m_datas.append(str);
m_currDatas = str;
m_expression += str;
}
else if (m_currDatas=="(")
{
m_datas.append(str);
m_currDatas = str;
m_expression += str;
}
else if(m_currDatas==")")
{
m_datas.append(str);
m_expression += str;
m_currDatas = str;
}
else
{
m_datas.append(m_currDatas);
m_datas.append(str);
m_currDatas = str;
m_expression += str;
}
}
else if (str=="=")
{
if (m_currDatas != ")")
{
m_datas.append(m_currDatas);
}
}
else
{
if (m_currDatas=="(")
{
m_currDatas = "";
m_currDatas += str;
m_expression += str;
}
else
{
m_currDatas += str;
m_expression += str;
}
}
}
寫的很長但其實是把簡單問題複雜化了,寫完後發現 寫一個函數來判定下界面為空就輸出表達式的上一個字元串,這樣可以節省三分之二的代碼。是以這是一長串廢代碼。
視窗:
//數字
void MainWindow::on_all_click()
{
QPushButton *p = static_cast<QPushButton *>(sender());
calc->currDataClear();
QString str = p->text();
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
void MainWindow::on_leftDrackets_click()
{
QString str = "(";
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
void MainWindow::on_rightDrackets_click()
{
QString str = ")";
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
//後退
void MainWindow::on_zuo_click()
{
calc->retreat();
ui->le_2->setText(calc->getCurrData());
ui->le_1->setText(calc->getExpression());
}
//操作符
void MainWindow::on_deng_click()
{
QString str = "=";
calc->appendData(str);
calc->calculateResult();
ui->le_2->setText(calc->outResult());
calc->clearAll();
}
void MainWindow::on_cheng_click()
{
QString str = "*";
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
void MainWindow::on_chu_click()
{
QString str = "/";
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
void MainWindow::on_jia_click()
{
QString str = "+";
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
void MainWindow::on_jian_click()
{
QString str = "-";
calc->appendData(str);
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
void MainWindow::on_C_click()
{
calc->clearAll();
ui->le_1->setText(calc->getExpression());
ui->le_2->setText(calc->getCurrData());
}
視窗上的輸入 m_datas 是一個Qlist 的QString。
資料的錄入完成後剩下的就是操作部分
資料操作的時候存在着權重問題可以将加減、乘除、括号分開操作順序如下
-
處理括号 括号的優先級是最高,也是裡面最難處理的。先将m_datas中的資料周遊分别存入 QList m_Numbers
(數字)和 QList m_Symbols(符号)中;
當周遊到左括号且下一位不是右括号時 将m_datas.at(i+1)位加入m_Symbols中,将m_datas.at(i)加入m_Numbers中 ,同時删除m_datas.at(i),當周遊到右括号時調用priorityCalculate();(加法);
當周遊完成後m_datas中括号内的資料都被操作完成此時i指在左括号的位置 。
for (int i = 0; i < m_datas.length();i++)
{
if (m_datas.at(i) == "(")
{
i++;
while (m_datas.at(i) != ")")
{
if (m_datas.at(i + 1) != ")")
{
m_Symbols.append(m_datas.at(i + 1));
}
m_Numbers.append(m_datas.at(i));
m_datas.removeAt(i);
if (m_datas.at(i) != ")")
{
m_datas.removeAt(i);
}
}
m_datas.removeAt(i);
priorityCalculate();
m_datas[i - 1] = m_result.at(0);
m_result.clear();
m_Numbers.clear();
m_Symbols.clear();
}
}
priorityCalculate()函數調用完成後将結果指派給m_datas.at(i),此時的m_datas中就隻有 + - * / 這四個符号 在進行周遊将資料與字元分開調用priorityCalculate()函數即可;
2. 乘除的處理:priorityCalculate()函數如下:
void Calculate::priorityCalculate()
{
int n = 0;
while (n < m_Symbols.length())
{
if (m_Symbols.at(n) == "*" || m_Symbols.at(n) == "/")
{
double x = 0;
double y = 0;
x = m_Numbers.at(n).toDouble();
y = m_Numbers.at(n + 1).toDouble();
if (m_Symbols.at(n) == "*")
{
double result = x*y;
m_Numbers[n + 1] = QString::number(result, 'f', 5);
m_Numbers.removeAt(n);
m_Symbols.removeAt(n);
}
else
{
double result = x / y;
m_Numbers[n + 1] = QString::number(result, 'f', 5);
m_Numbers.removeAt(n);
m_Symbols.removeAt(n);
}
continue;
}
n++;
}
if (m_Symbols.length() != 0)
{
addition();
}
else
{
m_result.append(m_Numbers[0]);
}
}
- 加法的處理:addition()函數代碼如下
void Calculate::addition()
{
int a = 0;
for (; a < m_Symbols.length(); )
{
double x = 0;
double y = 0;
double result = 0;
x = m_Numbers.at(a).toDouble();
y = m_Numbers.at(a + 1).toDouble();
if (m_Symbols.at(a)=="+")
{
result = x + y;
m_Numbers[a + 1] = QString::number(result);
m_Numbers.removeAt(a);
m_Symbols.removeAt(a);
}
else
{
result = x - y;
m_Numbers[a + 1] = QString::number(result);
m_Numbers.removeAt(a);
m_Symbols.removeAt(a);
}
}
m_result.append(m_Numbers.at(a));
}
以上就是本計算的主要功能代碼!
該計算機的健壯性方面為進行完善,隻是對Qt熟悉的一個小項目,有什麼建議的可以在評論中提出。
如需要源碼請轉至:資源下載下傳中心
第一次寫部落格有問題的希望能夠指出。(錯别字請了解)