天天看點

Qt入門練習項目——電腦

第一次嘗試使用Qt進行開發。在此之前還尚未接觸到過這一類的ui設計,是以通過寫電腦的方式對Qt進行熟悉。

先上結果圖
           
Qt入門練習項目——電腦
Qt入門練習項目——電腦

   僅僅實作了 加減乘除和不嵌套使用的括号 以及小數 後退 清空功能

首先是需求分析:

  1. 要實作那些功能
  2. 如何表達目前的輸入情況
  3. 如何實作權重問題和括号的位置識别

以下是功能的實作構思及代碼

  • 上界面也是表達式界面,是執行操作的數字和符号的儲存地和使用者輸入的顯示處。
  • 下界面顯示使用者目前輸入的界面,每當輸入新輸入的資料與該界面已經顯示的資料不同時将重置顯示。
  • 如使用者輸入了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。

資料的錄入完成後剩下的就是操作部分

   資料操作的時候存在着權重問題可以将加減、乘除、括号分開操作順序如下

  1. 處理括号   括号的優先級是最高,也是裡面最難處理的。先将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]);
	}

}
           

         

  1. 加法的處理: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熟悉的一個小項目,有什麼建議的可以在評論中提出。

如需要源碼請轉至:資源下載下傳中心

  第一次寫部落格有問題的希望能夠指出。(錯别字請了解)

繼續閱讀