震惊!!用图形界面装B居然只需要短短110行代码!!

[序]

相信学习C或者C++的学生的最大的痛苦就是每次做的东西的都是CMD的黑框框

虽然很多人会慢慢爱上这个(呸),但是绝大多数的人都走向了另外一条路:图形界面

说到C++的图形界面,都不得不谈一下QT了

QT的教程,资源网上是能找到不少的。(不过最难可能是一般人都不知道自己该搜索些什么)

先推荐一些网站吧,我个人也是在这个收益良多。

QT开源社区

豆子的QT学习之路

我只能说自己在这里确实能找到一些东西,算是福利吧。

[开头]

   标题说是用用来装B的QT,只用110行,我觉得是可以的。

   不是说是那种只是个弹出一个messageBox 那还真的是无聊。

   其实如果你有幸得到一些人的教导的话,你一定会是知道,只是看一个GUI的那种界面,那其实是相当简单的。你只需要理解这些东西的基本概念你就可以做到了。(或者是用QT自带的QT designer 那也是非常简单的,拖鼠标懂么?大概就是这个难度)

   但是要是想要搭建,在一般的内部运行程序和光鲜的GUI之间的桥梁 ,我个人还是推荐先去把Class那些东西看一看。虽然你的实现代码可能会比较简单,你记肯定也是可以记得住的,但要是把Class的东西也看看,那将会是收益匪浅的。(我在我的博客当中也是存有一些关于数据结构的文字,不敢称文章,有兴趣可以去翻一翻)

[正题]

   今天我们讲这个110行代码实现这个装B,其实是非常可能的。

   本次会围绕着一个很简单的数据结构的设计,也就是——计算式的计算。(很明显我已经忘了这个东西叫什么名字了,但理解就好了)

   举个例子: 输入1+2*2 ,然后输出 5。输入(1+2)*2,输出 6

   这就是一个算数的机制。如果按照标准库去做的话,其实也不是很难。 

   但这就是QT集成C++之后的强大之处了。内部有很多很有趣的函数。比如mid函数,就可以完成QString截取的工作。(PS: QString 是QT自带的一个类似于string的东西,我们从各个接口上得到的信息,或者是要在各个接口上显示,都必须要使用这个东西)

[算法]

就是按照栈的思路进行实现的,用操作符栈和数字栈两个来做为辅助。


[代码]:不算系统自动生成的代码段,确实只有110行左右(所附即是mainwindow.cpp文件,但包含系统自动生成的20-30行的代码,都才只有140行,应该算是一个比较小的程序了)


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->setFocus();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_lineEdit_returnPressed()
{
    QString s = ui->lineEdit->text();
    ui->lineEdit->clear();
    s = s.remove(" ");//remove the white space.
    if (s.toLower() == "quit") {
        this->close();
    }
    stack sn;
    stack sc;
    for (int i = 0; i < s.size();) {
        if(s[i] >= '0' && s[i] <= '9') {
            int j = i + 1;
            for (; j < s.size() && ((s[j] >= '0' && s[j] <= '9') || s[j] == '.'); ++j);
            if (j < s.size()) {
                sn.push(s.mid(i,j-i).toDouble());
                i = j;
            } else {
                sn.push(s.mid(i,j-i).toDouble());
                i = j + 1;
            }
        } else if (s[i] == '*' || s[i] == '/' || s[i] == '('){
            sc.push(s[i]);
            i++;
        } else if (s[i] == '+') {
            if (!sc.empty() &&sc.top() == '*') {
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x * y);
            } else if (!sc.empty() &&sc.top() == '/'){
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x / y);
            } else {
                sc.push(s[i]);
            }
            i++;
        } else if (s[i] == '-') {
            if (!sc.empty() && sc.top() == '*') {
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x * y);
            } else if (!sc.empty() &&sc.top() == '/'){
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x / y);
            } else {
                sc.push(s[i]);
            }
            i++;
        } else if (s[i] == ')') {
            if (!sc.empty() &&sc.top() == '(')
                sc.pop();
            else if (!sc.empty() &&sc.top() == '+') {
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x + y);
                sc.pop();
            } else if (!sc.empty() &&sc.top() == '-') {
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x - y);
                sc.pop();
            } else if (!sc.empty() &&sc.top() == '*') {
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x * y);
                sc.pop();
            } else if (!sc.empty() &&sc.top() == '/') {
                double x = sn.top();
                sn.pop();
                double y = sn.top();
                sn.pop();
                sn.push(x / y);
                sc.pop();
            }
            i++;
        }
    }
    while (!sc.empty()) {

        if (sc.top() == '('){

            sc.pop();
            continue;
        } else if (!sc.empty() &&sc.top() == '+') {
            double x = sn.top();
            sn.pop();
            double y = sn.top();
            sn.pop();
            sn.push(x + y);
        } else if (!sc.empty() &&sc.top() == '-') {
            double x = sn.top();
            sn.pop();
            double y = sn.top();
            sn.pop();
            sn.push(x - y);
        } else if (!sc.empty() &&sc.top() == '*') {
            double x = sn.top();
            sn.pop();
            double y = sn.top();
            sn.pop();
            sn.push(x * y);
        } else if (!sc.empty() &&sc.top() == '/') {
            double x = sn.top();
            sn.pop();
            double y = sn.top();
            sn.pop();
            sn.push(x / y);
        }
        sc.pop();

    }
    ui->textEdit_2->setText(s+"="+QString::number(sn.top())+'\n'+"Success calculate!");
}

这就是我的代码实现了,要是有什么不懂,评论区可以评论,给我发CSDN的私信也是可以的。

我是肥宅_Sean 欢迎大家一起学习!

你的关注本身就是对我的支持!

但为了鼓励我更努力的发博文,欢迎下载只有一两个资源点的源码!谢谢!

点击打开下载链接

你可能感兴趣的:(QT,C++,数据结构)