赞
踩
目录
目录
Qt [1] 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
alt+anter | 自动创建类定义的实现 |
F1 | 查看帮助文档 |
Shift + F2 | 函数的声明和定义之间快速切换 |
F4 | 在 cpp 和 h 文件切换 |
Ctrl + Enter | 在当前行的下方插入空白行 |
Ctrl + / | 注释当前行 或者选中的区域 |
Ctrl + B | Build 项目 |
ctrl+D | 删除当前行 |
Ctrl + I | 自动缩进当前行,格式化代码 |
Ctrl +Shift + Enter | 到上一行添加空白行 |
通过源文件wiget编写QPushbutton按钮和改变QPushbutton的大小与位置
- QPushButton*btn=new QPushButton;
- btn->show();//show以顶层方式弹出窗口控件
- btn->setParent(this);
- //显示文本
- btn->setText("第一个按钮");
- QPushButton*btn2=new QPushButton("第二个按钮",this);
- //移动btn2
- btn2->move(100,100);
- //重置窗口大小
- resize(1280,960);
- //设置固定的窗口大小
- setFixedSize(600,400);
- //设置窗口标题
- setWindowTitle("calculator");
- ui->setupUi(this);
以按钮4为例,通过字符和文本显示出按钮4:
- void Widget::on_fourButton_clicked()
- {
- expression+="4";
- ui->mainLineEdit->setText(expression);
- }
运行结果如下:
以2*3+1为例,将数字放入队列queue中,操作符放入栈中。首先遍历表达式将数字直接放入队列中,如果遍历到操作符再判断优先级,如果当前操作符的优先级低于栈中操作符的优先级,则栈中操作符出栈入队列,反之则直接入栈,最后再判断栈中是否为空,如果为不为空,则出栈直至栈空为止。
第一步:
queue | stack |
2 | * |
第二步:
queue | stack |
1 | + |
* | |
3 | |
2 |
第三步:
queue | stack |
+ | 空 |
1 | |
* | |
3 | |
2 |
以+、-*、/为例,通过优先级的大小,可以知道+、-是一级,*、/是2级可以得出函数
- int Judge(QChar ch)
- {
- if(ch=='+'||ch=='-')return 1;
- if(ch=='*'||ch=='/')return 2;
- }
- for(int i=0;i<pre_expression.size();i++){
- if(pre_expression[i][0]<='9'&&pre_expression[i][0]>='0'){
- q.push(pre_expression[i]);
- }
- else {
-
- if(s.empty()&&pre_expression[i][0]!='(')s.push(pre_expression[i]);//如果栈是空的直接入栈
- else
- {
- //栈是非空的,依次弹出栈中优先级高于或者等于当前运算符的所有运算符
- //再把当前运算符入栈
-
- //如果当前运算符是+,*,-,/,log,^
- if(pre_expression[i][0]=='l'||pre_expression[i][0]=='^'||pre_expression[i][0]=='%'||pre_expression[i][0]=='+'||pre_expression[i][0]=='-'||pre_expression[i][0]=='*'||pre_expression[i][0]=='/')
- {
- while(!s.empty()&&s.top()!="("){//当遇到(或者栈空则停止
- //依次弹出栈中优先级栈中优先级高于或者等于当前运算符的所有运算符
-
- if(Judge(pre_expression[i][0])<=Judge(s.top()[0])){
- QString temp=s.top();
- s.pop();
- q.push(temp);
- //break;
- }
- else break;
- }
- s.push(pre_expression[i]);
- }
- }
- }
如果最后栈中还是非空的话就可以直接出栈
- //如果栈非空,则把栈中元素pop,放入队列中
- while(!s.empty()){
- QString temp=s.top();
- q.push(temp);
- s.pop();
- }
由于输入的操作数是字符串,因此应该对数据进行预处理。以23+56为例,应该把输入的字符串分为23,+,56三个部分。首先定义一个字符数组pre_expression,可以将数据分组完成后按顺序加入字符数组。
pre_expression | 数据 |
pre_expression[0] | 23 |
pre_expression[1] | + |
pre_expression[2] | 56 |
代码段:
- vector<QString> pre_expression;
- //遍历expression
- for(int i=0;i<expression.size();i++)
- {
- //如果遇到的第一个数是数字或者小数点
- if(expression[i]<='9'&&expression[i]>='0'){
- QString t;
- if(expression[i]<='9'&&expression[i]>='0'){
- for(int j=i;j<expression.size();j++){
- if((expression[j]<='9'&&expression[j]>='0')||expression[i]=='.'){
-
- t+=expression[j];
- i++;
- }
- else{
- i--;
- break;
- }
- }
- }
- //将字符串t赋值给pre_expression
- pre_expression.push_back(t);
- }
- else {
- //如果遇到操作符则直接给pre_expression
- QString t;
- t.push_back(expression[i]);
- pre_expression.push_back(t);
- }
- }
由于所有的符号都在队列中,于是可以再用一个栈。对于所有的数字直接出队列入栈,然后如果碰到操作符,可以对栈顶2个元素进行处理,最终的栈顶元素就是答案。以2*3+1为例子。
第一步:
queue | stack |
+ | 3 |
1 | 2 |
* |
第二步:
queue | stack |
+ | 6 |
1 |
第三步:
queue | stack |
空 | 7 |
1.如果有操作符是栈中元素只有1个,以+为例:
- if(s.size()>=2){
- double a=s.top();
- s.pop();
- double b=s.top();
- s.pop();
- b+=a;
- s.push(b);
- q.pop();
- }
- else return "error";
2.当队列为空时:
- if(q.empty()){
- q.push("error");
- }
- else return q;
3.当(和)数量不匹配时:
- int count=0;
- for(int i=0;i<expression.size();i++){
- if(expression[i]=='(')count++;
- else if(expression[i]==')')count--;
- if(count<0){
- expression+="error";
- break;
- }
- }
- if(count>0){
- for(int i=0;i<count;i++)expression+=')';
- }
4.当(之后直接输入-时:
- int p=i+1;
- if(p<pre_expression.size()&&pre_expression[p][0]=='-'&&s.top()=='('){
- q.push("0");
- }
5当第一个字符是-时:
if(pre_expression[0]=="-")pre_expression.insert(pre_expression.begin(),"0");
6当不能连续输入操作符时:
if(expression.right(1)=="l"||expression.right(1)=="^"||expression.right(1)=="%"||expression.right(1)=="+"||expression.right(1)=="-"||expression.right(1)=="*"||expression.right(1)=="/"||expression.right(1)==".")return;
- else if(q.front()=="%"){
- if(s.size()>=2){
- double a=s.top();
- s.pop();
- double b=s.top();
- s.pop();
- b=b-int(b/a)*a;
- s.push(b);
- q.pop();
- }
- else return "error";
- }
- else if(q.front()=="^"){
- if(s.size()>=2){
- double a=s.top();
- s.pop();
- double b=s.top();
- s.pop();
- b=pow(b,a);
- s.push(b);
- q.pop();
- }
- else return "error";
- }
由于换底公式lga/lgb就可以得到以b为底a为真数的值,因此该计算器log函数就是以这样的操作数为原理。
- else if(q.front()=="l"){
- if(s.size()>=2){
- double a=s.top();
- s.pop();
- double b=s.top();
- s.pop();
- b=log(b)/log(a);
- s.push(b);
- q.pop();
- }
- else return "error";
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。