简易计算器

1 篇文章 0 订阅

实现方法可能不是很妥当,但勉强基本功能还是能用的。

================================================================================================

环境:WINDOWS 10环境,安装QT库和QT Creator开发环境。

功能:

1、具备基础的加减乘除、退格、清屏等功能。

2、具备多位数计算能力。

3、具备带小数的计算能力。

1 .设计思路

数字及运算符都是Button控件,通过点击不同按钮后台接收到不同的信息,做出不同的处理。

首先是将接收到的数字及运算符作为字符存进字符串中,若输入了运算符则在将其append加入字符串时前后都加上空格。若点击<-- 将字符串长度减1实现退格操作。若点击了CE将字符串中数据清空同时数据显示也清空实现清空操作。当点击了”=”后对数据进行处理。

数据处理分几步:

  1. 将字符串按空格分割放入字符列表里
  2. 计算集合长度(即数据和运算符一个多少个)
  3. 集合中奇数位置放的是数据将其转为float型数据
  4. 遍历符号将乘除换为加:将*或者/前后数字进行运算并将其运算值作为符号前一位的值,将其符号置+,将符号后的数字置0。例如:15*2-2/5 转换后 30+0-0.4+0
  5. 将转换后的数据进行简单加减运算。

2 .系统实现

在dialog.ui中添加Push Button(数字键+运算符+操作)、LineEdit(显示输入及计算结果)、Label(提示文字),效果如下图:

                                                                            

                                                                                         图2.1效果图

选中某一Button右击,选择“转到槽”,选clicked(),此时可以在对应的按键槽函数中补充操作处理代码。

2.1“0-9”以及“.”对应函数

 点击0时,就将字符串“0”赋值给str,然后将str追加到字符串str1后面,最后将其在lineEdit中显示出来。其中str1是定义在头文件dialog.h中变量

void Dialog::on_pushButton_19_clicked()

{

    QString str="0";

    str1.append(str);

    ui->lineEdit->setText(str1);

}

按键1-9以及小数点.添加槽函数都类似于0的代码。

2.2四则运算对应函数

点击“+”时,就将字符串“+”赋值给str,接着将一个空格追加到字符串str1后面,然后再把str追加到字符串str1后面,最后再将一个空格追加到字符串str1后面,然后将其在lineEdit中显示出来。这样做便于后续按空格分隔字符串。

void Dialog::on_pushButton_6_clicked()

{

    QString str="+";

    str1.append(" ");

    str1.append(str);

    str1.append(" ");

    ui->lineEdit->setText(str1);

}

其他“-”“*”“/”添加槽函数都类似于“+”的代码。

2.3退格及清空对应函数

 退格操作槽函数。

void Dialog::on_pushButton_clicked()

{

    str1=str1.left(str1.length()-1);

    ui->lineEdit->setText(str1);

}

清空(CE)对应槽函数

void Dialog::on_pushButton_2_clicked()

{

    str1.clear();

    ui->lineEdit->clear();

    ui->lineEdit_2->clear();

}

2.4“=”操作处理

  1. 首先将结果框先进行清空操作,将字符串按空格分隔为字符列表。

ui->lineEdit_2->clear();

QStringList Str_List=str1.split(" ");

      2.计算list集合长度,len是定义在头文件dialog.h中变量。

len=Str_List.length();

      3.将数字由字符转为double类型

分隔后的字符串我们不难发现奇数位是数字,偶数位是运算符,数组下标是0开始的,arry数组是定义在头文件dialog.h中的,故有:

for(int i=0;i<len;i=i+2){

        arry[i]=Str_List[i].toDouble();

}

       4.将“*”“/”运算化为“+”运算

将“*”或者/前后数字进行运算并将其运算值作为符号前一位的值,将其符号置+,将符号后的数字置0。

for(int i=1;i<len;i=i+2)  

    {

        if(Str_List[i]=="*")

        {

            arry[i-1]=arry[i-1]*arry[i+1];

            arry[i+1]=0;

            Str_List[i]="+";

        }

        if(Str_List[i]=="/")

        {

            if(arry[i+1]!=0)

                 arry[i-1]=arry[i-1]/arry[i+1];

            else

                 arry[i-1]=0;

            arry[i+1]=0;

            Str_List[i]="+";

        }

}

        5.进行最后加减运算

将数组中第一个值先赋给结果数组,然后再进行基础的加减运算。result定义在头文件dialog.h中变量

result=arry[0];

    for(int i=1;i<len;i=i+2)  //对进行过乘、除的数据进行想加减

    {

        if(Str_List[i]=="+")

            result=result+arry[i+1];

        if(Str_List[i]=="-")

            result=result-arry[i+1];

    }

 

                                 图5.1 加法运算                                    图5.2 减法运算

                                图5.3 带小数的加减混合运算                      图5.4带小数的加减乘除混合运算

//dialog.cpp文件
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

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

void Dialog::on_pushButton_3_clicked()
{
    QString str="7";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_4_clicked()
{
    QString str="8";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_5_clicked()
{
    QString str="9";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_8_clicked()
{
    QString str="4";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_9_clicked()
{
    QString str="5";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_10_clicked()
{
    QString str="6";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_13_clicked()
{
    QString str="1";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_14_clicked()
{
    QString str="2";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_15_clicked()
{
    QString str="3";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_19_clicked()
{
    QString str="0";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_20_clicked()
{
    QString str=".";
    str1.append(str);
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_6_clicked()
{
    QString str="+";
    str1.append(" ");
    str1.append(str);
    str1.append(" ");
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_11_clicked()
{
    QString str="-";
    str1.append(" ");
    str1.append(str);
    str1.append(" ");
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_16_clicked()
{
    QString str="*";
    str1.append(" ");
    str1.append(str);
    str1.append(" ");
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_21_clicked()
{
    QString str="/";
    str1.append(" ");
    str1.append(str);
    str1.append(" ");
    ui->lineEdit->setText(str1);
}

void Dialog::on_pushButton_2_clicked()
{
    str1.clear();
    ui->lineEdit->clear();
    ui->lineEdit_2->clear();
}

void Dialog::on_pushButton_clicked()
{
    str1=str1.left(str1.length()-1);
    ui->lineEdit->setText(str1);
}


void Dialog::on_pushButton_17_clicked()
{
    ui->lineEdit_2->clear();
    QStringList Str_List=str1.split(" ");//将字符串按空格分割为字符列表
    len=Str_List.length(); //计算list集合长度
    for(int i=0;i<len;i=i+2)  //将数字由字符转为float类型
    {
        arry[i]=Str_List[i].toDouble();
    }
    for(int i=1;i<len;i=i+2)  //将*或者/前后数字进行运算并将其运算值作为符号前一位的值,将其符号置+,将符号后的数字置0
    {
        if(Str_List[i]=="*")
        {
            arry[i-1]=arry[i-1]*arry[i+1];
            arry[i+1]=0;
            Str_List[i]="+";
        }
        if(Str_List[i]=="/")
        {
            if(arry[i+1]!=0)
                 arry[i-1]=arry[i-1]/arry[i+1];
            else
                 arry[i-1]=0;
            arry[i+1]=0;
            Str_List[i]="+";
        }
    }
    result=arry[0];
    for(int i=1;i<len;i=i+2)  //对进行过乘、除的数据进行想加减
    {
        if(Str_List[i]=="+")
            result=result+arry[i+1];
        if(Str_List[i]=="-")
            result=result-arry[i+1];
    }

    ui->lineEdit_2->setText(tr("%1").arg(result));
    str1.clear();
}


//在dialog.h里面private添加私有变量
    Ui::Dialog *ui;
    QString str1;
    float arry[20];
    float result;
    int len;

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值