序言

为了下学期校招单位的Qt岗,我将我大一做过的两个项目又拿出来重做了下,分别是计算圆面积APP和仿计算器APP。这个计算器是不含括号的但是有优先级的,基本原理就是先转为逆波兰表达式,再计算结果。计算圆面积APP被命名为first而仿计算器APP命名为second,first用的是UI设计的,即拖动相应的部件并调整大小;而second使用的是布局管理器(QGridLayout)来实现的,纯代码类型。

现在来看项目first。


圆面积计算APP(项目名:first)

结果展示

具体思路

它的主要想法是输入圆的半径R,通过圆面积公式来计算面积S。全部文件如下所示:

类名为dialog主要的逻辑公式写在dialog.cpp中如下所示:

void Dialog::on_countBtn_clicked()
{bool ok;QString tempStr;QString valueStr=ui->radiusLineEdit->text();//传过来的信号(半径R)int valueInt=valueStr.toInt(&ok);//将字符串R转为数字double area=valueInt*valueInt*3.14159;//逻辑计算ui->radiusLabel->setText(tempStr.setNum(area));//返回给槽
}

on_countBtn_clicked函数定义在类Dialog中,是一个private slots,类Dialog如下所示:

class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private slots:void on_countBtn_clicked();//计算按钮private:Ui::Dialog *ui;
};

这个APP比较简单,也不涉及什么算法。只有dialog.h和dialog.cpp需要修改小小的两个地方。下面来看第二个项目。

仿计算器APP(项目名:second)

结果展示

项目结构

具体思路

使用了布局管理器(QGridLayout)一行4个空,一共5行。用了三个label和12个button ,C键是clear的意思,直接作清空操作。该项目的类名也叫second,second类定义如下所示:

class second : public QWidget {
Q_OBJECTpublic:QString h="";//h用于存放当前的式子explicit second(QWidget *parent = nullptr);~second() override;private:Ui::second *ui;//定义各个部件QLabel *text_content, *answer, *question;QPushButton *cal,*one,*two,*three,*four,*five,*six,*seven,*eight,*nine,*zero,*clear,*plus,*minus,*cheng,*chu;private slots://计算的核心函数,具体定义在second.cpp中void CAL();//为了方便,就不在second.cpp中定义了,但这是不规范的。//用于定义每个按钮的行为,对应哪个按钮从函数名就可以看出。void One(){h+='1';question->setText(h);};void Two(){h+='2';question->setText(h);};void Three(){h+='3';question->setText(h);};void Four(){h+='4';question->setText(h);};void Five(){h+='5';question->setText(h);};void Six(){h+='6';question->setText(h);};void Seven(){h+='7';question->setText(h);};void Eight(){h+='8';question->setText(h);};void Nine(){h+='9';question->setText(h);};void Zero(){h+='0';question->setText(h);};void Plus(){h+='+';question->setText(h);};void Minus(){h+='-';question->setText(h);};void Cheng(){h+='*';question->setText(h);};void Chu(){h+='/';question->setText(h);};void Clear(){h="";question->setText(h);};};

接着我要在second.cpp中写上面那个CAL函数的逻辑,及计算逆波兰表达式的函数,其中还有一个change函数,用于计算出逆波兰表达式,而CAL则是计算逆波兰表达式的结果。具体逻辑如下:

//手撕单链表用于表示栈stack,没有用STL。
//定义结点
struct node
{double data;node *next;
public:node();
};node::node() {}//定义栈
class stack
{
private:node* top;
public:stack() { top = NULL; }//初始化,构造函数~stack();void push(double e);//入栈操作double pop();//退栈操作double getTop();//取顶部操作bool isEmpty() { if (top == NULL) return true; else return false; }//判空操作
};double stack::getTop()
{if (top != NULL)return top->data;
}stack::~stack()
{node* p;while (top){p = top->next;delete top;top = p;}
}void stack::push(double e)
{node* p = new node;if (!p){//cout << "内存分配失败" << endl;return;}p->data = e;p->next = top;top = p;
}double stack::pop()
{if (top == NULL){//cout << "溢出" << endl;}double temp = top->data;node* p = top;top = top->next;delete p;return temp;
}struct Node
{double data;Node *next;
};
class sqqueue
{
private:Node *front;Node *rear;
public:sqqueue();~sqqueue();void enqueue(double e);double dequeue();bool isEmpty();double getFront();
};double sqqueue::getFront()
{return front->next->data;
}sqqueue::sqqueue()
{front = new Node;front->next = NULL;rear = front;
}sqqueue::~sqqueue()
{Node *p=NULL;while (front != NULL){p = front;front = front->next;delete p;}
}void sqqueue::enqueue(double e)
{Node *s = new Node;s->data = e;s->next = rear->next;rear->next = s;rear = s;if (front->next == NULL)front->next = s;
}double sqqueue::dequeue()
{double e;Node *p = NULL;if (rear == front){//cout << "下溢" << endl;}p = front->next;e = p->data;front->next = p->next;if (p->next == NULL)rear = front;delete p;return e;
}sqqueue output;
stack s;
stack a;//计算出具体的逆波兰表达式
void change(std::string str)
{double num;double temp;for (int i = 0; i < str.length();){if (str[i] >= '0'&&str[i] <= '9'){temp = str[i++] - '0';while (i < str.length() && str[i] >= '0'&&str[i] <= '9'){temp = temp * 10 + (str[i] - '0');i++;}output.enqueue(temp);}else{if (((str[i] == '+' || str[i] == '-')&&(s.getTop() == -3|| s.getTop() == -4))|| ((str[i] == '+' || str[i] == '-') && (s.getTop() == -1 || s.getTop() == -2))|| ((str[i] == '*' || str[i] == '/') && (s.getTop() == -3 || s.getTop() == -4))){while (!s.isEmpty()){output.enqueue(s.pop());}}switch (str[i]){case '+':s.push(-1); break;case '-':s.push(-2); break;case '*':s.push(-3); break;case '/':s.push(-4); break;default:break;}i++;}}while (!s.isEmpty()){output.enqueue(s.pop());}
}//计算逆波兰表达式的结果
void second::CAL()
{QString valueStr;QString tempStr=question->text();//获取信号std::string str=tempStr.toStdString();//将Qt的Qstring转化为string(C++标准的)change(str);double temp;double r, l;while (!output.isEmpty()){if (output.getFront() >= 0){a.push(output.dequeue());}else{double x = output.dequeue();if (x == -1){r = a.pop();l = a.pop();temp = l + r;a.push(temp);}else if (x == -2){r = a.pop();l = a.pop();temp = l - r;a.push(temp);}else if (x == -3){r = a.pop();l = a.pop();temp = l * r;a.push(temp);}else if (x == -4){r = a.pop();l = a.pop();temp = l / r;a.push(temp);}}}double ans=a.pop();answer->setText(valueStr.setNum(ans));//传给槽
}

具体的项目可以看我的Github,这是地址: https://github.com/timTianWSRF/Qt_calculator-tim-

Qt练手——计算圆面积和计算器(不含括号)相关推荐

  1. Java练手小项目——BMI计算器

    最近有一个减肥的朋友想要知道自己的BMI是多少,问我能不能给他做一个计算BMI的工具(无中生友).于是用Java简单写了一个.一起来看看吧. 身体质量指数是BMI指数(身体质量指数,简称体质指数),是 ...

  2. 占星骰子合集(练手+计算飞宫转宫)

    抱歉啊,练手程序少写一行代码pause,造成一直在运行,已修正! 练手的: @echo off setlocal enabledelayedexpansion echo 占星骰子练手程序 echo. ...

  3. QT练手小项目:飞机大战

    目录 1.项目简介 2.创建项目 3.设置主场景导入资源 3.1配置文件 3.2主场景的初始化 3.3资源导入 4.地图滚动的实现 4.1创建地图文件和类 4.2添加地图类的成员函数和成员属性 5.创 ...

  4. QT练手小项目-——天气播报小狗(ui展示分析,构造实现,json格式数据分析,界面交互,天气图标处理,小狗语音)

    前言 经过之前一段时间的QT学习,做出一个小软件来总结自己掌握关于qt的知识点.网络上有许多免费的天气接口(api),有xml格式的,也有json格式的.具体xml和json有什么区别,这里我就不去深 ...

  5. qt练手小项目之打地鼠

    项目简介:总共有4*4(16)块的区域(item),该区域是地鼠出没的地方,每隔800毫秒出现1-2只地鼠,然后用锤子去敲击,在地鼠消失之前可以无限敲打,敲中一次得分面板加1分 未敲中得分面板减一  ...

  6. jQuery仿苹果手机版计算器-练手项目

    这几天在看jQuery,试着写了一个仿苹果手机版计算器的练手项目,目前功能还有些bug,不能实现连续运算,输入两个数后必须点击=号才能继续输入第三个数继续运算(希望有大神可以指正改进的办法).实现效果 ...

  7. java编程计算器程序代码_34 个送给 Java 程序员的练手项目合集

    人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 在这一点上,编程和打篮球很像:你得亲自上场去打,才能学会篮球:同样,亲手敲下代码,才能真正学会「编程」.太多人看完一本书.几个 G 的视频后 ...

  8. 基于QT天气预报项目,推荐初学者练手

    文章目录 前言 本项目基于QT平台开发的一款天气预报,一个适合小白练手的项目.使用到了技术有HTTP编程.定位API.天气预报API.JSON解析,unicode转化为汉字.分享给大家一起讨论学习: ...

  9. 棱形旋转c语言程序_C 语言时隔 5 年重回巅峰,这 20 个热门项目拿去练手!

    在上个月的 TIOBE 编程语言排名中,C 语言和 Java 的差距只有 0.01%.在近日 TIOBE 公布的 2020 年 5 月编程语言排行榜中,C 语言成功超越了 Java,重返第一的王者宝座 ...

最新文章

  1. 华为--PPP典型配置举例
  2. 常见拒绝服务型攻击原理及行为特征
  3. Windows Powershell的一些常规操作命令
  4. ITK:可视化静态密集2D水平集零集
  5. 解决element-ui table 表格排列错位问题
  6. python开方运算符_Pytorch Tensor基本数学运算详解
  7. 如何从头到脚彻底解决一个MySQL Bug
  8. 移动互联网之路-李晓斌
  9. 【ROS】ros入门21讲(上)
  10. c3p0数据库连接池配置总结
  11. java递归算法经典实例_java简单编程题问第五个人多少岁?java递归算法经典实例...
  12. 我们一般用的正则表达式合集和工具 any-rule
  13. WinHex license添加(v19测试可用)
  14. 微信公众号H5音频视频自动播放(安卓,苹果)
  15. 为什么拉格朗日对偶函数一定是凹函数(逐点下确界)
  16. cmos sensor camera banding 现象发生原因及相关问题
  17. 画中画 视频叠加 视频覆盖 overlay
  18. 【GraphVisual】画节点与线以及移动节点线随着移动
  19. IDC(国际数据公司),如何查询免费报告
  20. 音视频篇 - 音视频基础概念

热门文章

  1. 手把手教你写一份好的技术简历
  2. 新版中日交流标准日本语初级第三课之基本课文I
  3. 通过数据库设计工具chiner导出word格式表结构
  4. LabVIEW数据类型与数据库数据类型的关系
  5. 华为荣耀 v9报了个很奇怪得错误
  6. 一起来聆听亚马逊跨境电商新老麦家的心声
  7. 华为,H3C,RG交换机堆叠与群集总结
  8. 程序员创业的瓶颈及破解方法
  9. 汽车数字钥匙设计03:UWB测距原理
  10. 阿里云国际版香港服务器测试数据,本次测试使用LemonBench脚本进行。