1. 程式人生 > 其它 >Qt實現計算器介面和基本運算

Qt實現計算器介面和基本運算

用Qt來實現一個簡單的計算器。

按鈕設定

//按鍵
private slots:
    void on_oneButton_clicked();

    void on_twoButton_clicked();

    void on_threeButton_clicked();

    void on_fireButton_clicked();

    void on_fourButton_clicked();

    void on_sixButton_clicked();

    void on_sevenButton_clicked();

    void on_eightButton_clicked();

    
void on_nineButton_clicked(); void on_zeroButton_clicked(); void on_addButton_clicked(); void on_subButton_clicked(); void on_mulButton_clicked(); void on_divButton_clicked(); void on_leftButton_clicked(); void on_rightButton_clicked(); void on_clearButton_clicked();
void on_deleteButton_clicked(); void on_equalButton_clicked();
//運算
void Widget::on_equalButton_clicked()
{
    QStack<int>  s_num, s_opt;
    char opt[128]={0};
    int i=0,tmp=0,num1,num2;

    //把QString 轉換成char*
        QByteArray ba;
        ba = expression.toLatin1();
        strcpy(opt,ba.data());

    
while(opt[i] != '\0' || s_opt.empty() != true) { if(opt[i] >= '0' && opt[i] <= '9') { tmp = tmp *10 + opt[i] - '0'; i++; if(opt[i] < '0' || opt[i] > '9') { s_num.push(tmp); tmp = 0; } } else//操作符 { if(s_opt.empty() == true||Priority(opt[i]) >=Priority(s_opt.top()) || (s_opt.top() == '(' && opt[i] != ')')) { s_opt.push(opt[i]); i++; continue; } if(s_opt.top() == '(' && opt[i] == ')') { s_opt.pop(); i++; continue; } if(Priority(opt[i]) <= Priority(s_opt.top())||(opt[i] == ')'&& s_opt.top() !='(')|| (opt[i]=='\0'&& s_opt.empty()!=true)) { char ch = s_opt.top(); s_opt.pop(); switch(ch) { case '+': num1=s_num.top(); s_num.pop(); num2=s_num.top(); s_num.pop(); s_num.push(num1+num2); break; case '-': num1=s_num.top(); s_num.pop(); num2=s_num.top(); s_num.pop(); s_num.push(num2-num1); break; case '*': num1=s_num.top(); s_num.pop(); num2=s_num.top(); s_num.pop(); s_num.push(num1*num2); break; case '/': num1=s_num.top(); s_num.pop(); num2=s_num.top(); s_num.pop(); s_num.push(num2/num1); break; } } } } ui->mainLineEdit->setText(QString::number(s_num.top())); expression.clear(); } int Widget::Priority(char ch) { switch (ch) { case '(': return 3; case '*': case '/': return 2; case '+': case '-': return 1; default: return 0; } }