日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt学习3-Qt Creator四则运算计算器(哔站视频学习记录)

發布時間:2023/12/31 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

  • ‘(’? 滿足條件1s_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里面的操作符
  • ‘+’滿足條件1s_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四则运算计算器(哔站视频学习记录)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。