Qt学习3-Qt Creator四则运算计算器(哔站视频学习记录)
計算器中的“=”按鈕這部分的代碼解釋
目錄
制作計算器中的“=”按鈕這部分的代碼解釋
一、代碼部分
二、解釋
三、思路
四、死循環!
一、代碼部分
void Widget::on_equalButton_clicked() {QStack<int> s_num,s_opt; //聲明兩個int類型變量char opt[128]={0};//char型數組int i = 0,tmp = 0,num1,num2;//聲明變量i,tmp,num1,num2//把QString 轉換成 char*QByteArray ba;//字節數組ba.append(expression);//把QString轉換成QByteArraystrcpy(opt,ba.data());//data可以把QByteArray轉換成char *while(opt[i]!='\0'||s_opt.empty()!=true)//在字符串中'\0'用作字符串的結束標志,字符串沒結束且不為空的情況下{if(opt[i]>='0'&&opt[i]<='9')//字符在0-9之間{tmp=tmp*10+opt[i]-'0';i++;if(opt[i]<'0'||opt[i]>'9')//字符不在0-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(num2+num1); //進棧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(num2*num1); //進棧break;case '/':num1 = s_num.top();s_num.pop();num2 = s_num.top();s_num.pop();s_num.push(num2/num1); //進棧break;}}else //新增,解決2*3+7死循環時的問題{s_opt.push(opt[i]);i++;continue;}}}//最后留在棧里的就是結果,將結果顯示ui->mainLineEdit->setText(QString::number(s_num.top())); //QString中有個靜態成員函數number(),可以把數字轉換成字符串。expression.clear(); } int Widget::Priority(char ch) {switch (ch){case '(':return 3;case '*':case '/':return 2;case '+':case '-':return 1;default:return 0;} }pop()刪除棧頂元素
top() 是取出棧頂元素,不會刪掉棧里邊的元素
二、解釋
這里有個優先級函數不好理解
三個并列的條件語句:
條件1:if(s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(s_opt.top() == '(' && opt[i] != ')'))
//如果操作符s_opt是空,或者當前操作符的優先級Priority大于棧頂的優先級,或者棧頂的操作符? ?是‘(’ 不是?')'? ? ? ? ? ?然后把操作符入棧
條件2:if(s_opt.top() == '(' && opt[i] == ')')
//如果操作符是 ‘(’? 不是 ')'? ? ? ? ? ? 直接操作符刪除
條件3:if (Priority(opt[i]) <= Priority(s_opt.top() || (opt[i] == ')' && s_opt.top()) ||
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(opt[i]) == '\0' && s_opt.empty() != true))
//如果當前的操作符小于棧頂操作符,或者操作符是(且位于棧頂,或者操作符不是字符尾和不是空時? ?計算+-*/
例如(3-1)+1
- ‘(’? 滿足條件1的s_opt.empty() == true ,剛開始時s_opt未存入任何操作符,s_opt現在有‘(’
- ‘-’滿足條件1的(s_opt.top() == '(' && opt[i] != ')'),s_opt.top()=='('且不等于‘)’
- ')’滿足條件3的(Priority(opt[i]) <= Priority(s_opt.top() ,Priority(opt[i])是‘)’的優先級0,Priority(s_opt.top())是‘-’號的優先級1,0<1所有滿足條件3,計算3-1,結果保存在s_num=2
- ')’滿足條件2,刪除s_opt里面的操作符
- ‘+’滿足條件1的s_opt.empty() == true,每次計算都會pop刪除棧頂的操作符,所有s_opt此時為0,之前存入的操作符已經被刪除完
- ‘+’滿足條件3的(Priority(opt[i]) <= Priority(s_opt.top(),Priority(opt[i])是當i=7時的第七個字符‘\0’的優先級是0,Priority(s_opt.top())是‘+’號的優先級1,0<1所有滿足條件3,計算2+1=3,結果繼續入棧存入s_num中
三、思路
思路理解:
條件1是存入操作符
條件2在s_opt棧頂是'('和當前操作符是‘)’時刪除s_opt棧頂操作符
條件3判斷操作符優先級,當前操作符 優先級? 小于? 棧頂優先級時進行計算
四、死循環!
出現問題:運行2*3+7的時候報錯!
產生原因:i無法正常加1,一直在i=3時循環
解決方法:
else ?//新增,解決2*3+7死循環時的問題{s_opt.push(opt[i]);i++;continue;}?完整代碼參考博客和嗶站QT基礎教程:
w代碼復現|QT快速入門 (課程來自B站)--其二_OZ__96的博客-CSDN博客
總結
以上是生活随笔為你收集整理的Qt学习3-Qt Creator四则运算计算器(哔站视频学习记录)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-08-23
- 下一篇: FCPX插件 CineFlare Han