zoukankan      html  css  js  c++  java
  • 优化了一波计算器

    如图

    源码

      1 #include "mainwindow.h"
      2 #include "ui_mainwindow.h"
      3 #include<QString>
      4 
      5 
      6 char *q;
      7 int k=0;
      8 
      9 
     10 
     11 double biaodas();
     12 double xiang();
     13 double yinz()//求一个因子的值
     14 {
     15     double res = 0;
     16     char tem = q[k];
     17     if (tem == '(')//因子可能是一个括号包起来的表达式,递归到求表达式
     18     {
     19         k++;
     20         res = biaodas();
     21         k++;
     22     }
     23     else if(tem=='s')
     24     {
     25         if(q[k+1]=='q')
     26         {
     27             k+=4;
     28             res=sqrt(yinz());
     29         }
     30         else {
     31             k+=3;
     32             res=sin(yinz());
     33         }
     34 
     35     }
     36     else if(tem=='c')
     37     {
     38         k+=3;
     39         res=cos(yinz());
     40     }
     41     else if(tem=='t')
     42     {
     43         k+=3;
     44         res=tan(yinz());
     45     }
     46     else if(tem=='l')
     47     {
     48         k++;
     49         if(q[k]=='g')
     50         {
     51             k++;
     52             res=log10(yinz());
     53         }
     54         if(q[k]=='n')
     55         {
     56             k++;
     57             res=log(yinz());
     58         }
     59     }
     60     else//计算出多个十进制数字符连续组成的数的大小
     61     {
     62         if(q[k]=='p'&&q[k+1]=='i')
     63         {
     64             k+=2;
     65             res=3.14159265;
     66             return res;
     67         }
     68         while (isdigit(tem))//判断tem是不是十进制的字符
     69         {
     70             res = res * 10 + tem - '0';
     71             k++;
     72             tem = q[k];
     73         }
     74         if (tem == '.')//判断有没有小数
     75         {
     76             double k1 = 10;
     77             k++;
     78             tem=q[k];
     79             while (isdigit(tem))
     80             {
     81                 res += (tem-'0') / k1;
     82                 k1 *= 10;
     83                 k++;
     84                 tem = q[k];
     85             }
     86         }
     87     }
     88     return res;
     89 }
     90 double xiang()//求一个多项式的值
     91 {
     92     double res = yinz();
     93     int flag = 1;
     94     while (flag)
     95     {
     96         char tem = q[k];
     97         if (tem == '*' || tem == '/')//判断乘除把多项式的求解分解为求多个因子的值
     98         {
     99            k++;
    100             double va = yinz();
    101             if (tem == '*')
    102                 res *= va;
    103             else
    104                 res /= va;
    105         }
    106         else flag = 0;
    107     }
    108     return res;
    109 }
    110 double biaodas()//求表达式的值
    111 {
    112     double res = xiang();
    113     int flag = 1;
    114     while (flag)
    115     {
    116         char tem = q[k];
    117         if (tem == '+' || tem == '-')//判断乘除把表达式的求解分解为求多多项式的值
    118         {
    119             k++;
    120             double va = xiang();
    121             if (tem == '+')
    122                 res += va;
    123             else
    124                 res -= va;
    125         }
    126         else flag = 0;
    127     }
    128     return res;
    129 }
    130 
    131 
    132 
    133 
    134 
    135 
    136 
    137 
    138 
    139 
    140 
    141 
    142 
    143 
    144 
    145 
    146 MainWindow::MainWindow(QWidget *parent) :
    147     QMainWindow(parent),
    148     ui(new Ui::MainWindow)
    149 {
    150     ui->setupUi(this);
    151 }
    152 QString str;
    153 int i=0;
    154 
    155 MainWindow::~MainWindow()
    156 {
    157     delete ui;
    158 }
    159 
    160 void MainWindow::on_pushButton_clicked()
    161 {
    162     char *p=str.toLatin1().data();
    163     if(i==0)
    164     {
    165         str+='1';
    166         i++;
    167     }
    168     else
    169     {
    170         if(p[i-1]==')'||p[i-1]=='i');
    171         else
    172         {
    173             str+='1';
    174             i++;
    175         }
    176     }
    177     ui->textBrowser->setText(str);
    178 }
    179 
    180 void MainWindow::on_pushButton_2_clicked()
    181 {
    182     char *p=str.toLatin1().data();
    183     if(i==0)
    184     {
    185         str+='2';
    186         i++;
    187     }
    188     else
    189     {
    190         if(p[i-1]==')'||p[i-1]=='i');
    191         else
    192         {
    193             str+='2';
    194             i++;
    195         }
    196     }
    197     ui->textBrowser->setText(str);
    198 }
    199 
    200 void MainWindow::on_pushButton_3_clicked()
    201 {
    202     char *p=str.toLatin1().data();
    203     if(i==0)
    204     {
    205         str+='3';
    206         i++;
    207     }
    208     else
    209     {
    210         if(p[i-1]==')'||p[i-1]=='i');
    211         else
    212         {
    213             str+='3';
    214             i++;
    215         }
    216     }
    217     ui->textBrowser->setText(str);
    218 }
    219 
    220 void MainWindow::on_pushButton_4_clicked()
    221 {
    222     char *p=str.toLatin1().data();
    223     if(i==0)
    224     {
    225         str+='4';
    226         i++;
    227     }
    228     else
    229     {
    230         if(p[i-1]==')'||p[i-1]=='i');
    231         else
    232         {
    233             str+='4';
    234             i++;
    235         }
    236     }
    237     ui->textBrowser->setText(str);
    238 }
    239 
    240 void MainWindow::on_pushButton_5_clicked()
    241 {
    242     char *p=str.toLatin1().data();
    243     if(i==0)
    244     {
    245         str+='5';
    246         i++;
    247     }
    248     else
    249     {
    250         if(p[i-1]==')'||p[i-1]=='i');
    251         else
    252         {
    253             str+='5';
    254             i++;
    255         }
    256     }
    257     ui->textBrowser->setText(str);
    258 }
    259 
    260 void MainWindow::on_pushButton_6_clicked()
    261 {
    262     char *p=str.toLatin1().data();
    263     if(i==0)
    264     {
    265         str+='6';
    266         i++;
    267     }
    268     else
    269     {
    270         if(p[i-1]==')'||p[i-1]=='i');
    271         else
    272         {
    273             str+='6';
    274             i++;
    275         }
    276     }
    277     ui->textBrowser->setText(str);
    278 }
    279 
    280 void MainWindow::on_pushButton_7_clicked()
    281 {
    282     char *p=str.toLatin1().data();
    283     if(i==0)
    284     {
    285         str+='7';
    286         i++;
    287     }
    288     else
    289     {
    290         if(p[i-1]==')'||p[i-1]=='i');
    291         else
    292         {
    293             str+='7';
    294             i++;
    295         }
    296     }
    297     ui->textBrowser->setText(str);
    298 }
    299 
    300 void MainWindow::on_pushButton_8_clicked()
    301 {
    302     char *p=str.toLatin1().data();
    303     if(i==0)
    304     {
    305         str+='8';
    306         i++;
    307     }
    308     else
    309     {
    310         if(p[i-1]==')'||p[i-1]=='i');
    311         else
    312         {
    313             str+='8';
    314             i++;
    315         }
    316     }
    317     ui->textBrowser->setText(str);
    318 }
    319 
    320 void MainWindow::on_pushButton_9_clicked()
    321 {
    322     char *p=str.toLatin1().data();
    323     if(i==0)
    324     {
    325         str+='9';
    326         i++;
    327     }
    328     else
    329     {
    330         if(p[i-1]==')'||p[i-1]=='i');
    331         else
    332         {
    333             str+='9';
    334             i++;
    335         }
    336     }
    337     ui->textBrowser->setText(str);
    338 }
    339 
    340 void MainWindow::on_pushButton_10_clicked()
    341 {
    342     char *p=str.toLatin1().data();
    343     if(i==0)
    344     {
    345         str+='.';
    346         i++;
    347     }
    348     else
    349     {
    350         if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='('||p[i]==')'||p[i-1]=='i');
    351         else
    352         {
    353             str+='.';
    354             i++;
    355         }
    356     }
    357     ui->textBrowser->setText(str);
    358 }
    359 
    360 void MainWindow::on_pushButton_11_clicked()
    361 {
    362     char *p=str.toLatin1().data();
    363     if(i==0)
    364     {
    365         str+='0';
    366         i++;
    367     }
    368     else
    369     {
    370         if(p[i]==')'||p[i-1]=='i');
    371         else
    372         {
    373             str+='0';
    374             i++;
    375         }
    376     }
    377     ui->textBrowser->setText(str);
    378 }
    379 
    380 void MainWindow::on_pushButton_12_clicked()
    381 {
    382     char *p=str.toLatin1().data();
    383     if(i==0);
    384     else
    385     {
    386         if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='.'||p[i]=='(');
    387         else
    388         {
    389             str+='+';
    390             i++;
    391         }
    392     }
    393     ui->textBrowser->setText(str);
    394 }
    395 
    396 void MainWindow::on_pushButton_13_clicked()
    397 {
    398     char *p=str.toLatin1().data();
    399     if(i==0);
    400     else
    401     {
    402         if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='.'||p[i]=='(');
    403         else
    404         {
    405             str+='-';
    406             i++;
    407         }
    408     }
    409     ui->textBrowser->setText(str);
    410 }
    411 
    412 void MainWindow::on_pushButton_14_clicked()
    413 {
    414     char *p=str.toLatin1().data();
    415     if(i==0);
    416     else
    417     {
    418         if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='.'||p[i]=='(');
    419         else
    420         {
    421             str+='*';
    422             i++;
    423         }
    424     }
    425     ui->textBrowser->setText(str);
    426 }
    427 
    428 void MainWindow::on_pushButton_15_clicked()
    429 {
    430     char *p=str.toLatin1().data();
    431     if(i==0);
    432     else
    433     {
    434         if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='.'||p[i]=='(');
    435         else
    436         {
    437             str+='/';
    438             i++;
    439         }
    440     }
    441     ui->textBrowser->setText(str);
    442 }
    443 
    444 void MainWindow::on_pushButton_16_clicked()
    445 {
    446     char *p=str.toLatin1().data();
    447     if(i==0)
    448     {
    449         str+='(';
    450         i++;
    451     }
    452     else
    453     {
    454         if(p[i-1]=='('||p[i-1]==')'||(p[i-1]<='9'&&p[i-1]>='0'));
    455         else
    456         {
    457             str+='(';
    458             i++;
    459         }
    460     }
    461     ui->textBrowser->setText(str);
    462 }
    463 
    464 void MainWindow::on_pushButton_17_clicked()
    465 {
    466     char *p=str.toLatin1().data();
    467     if(i==0)
    468     {
    469         str+=')';
    470         i++;
    471     }
    472     else
    473     {
    474         if((p[i-1]<='9'&&p[i-1]>='0')||p[i-1]=='i')
    475         {
    476             str+=')';
    477             i++;
    478         }
    479     }
    480     ui->textBrowser->setText(str);
    481 }
    482 
    483 void MainWindow::on_pushButton_18_clicked()
    484 {
    485     if(str.length()!=0)
    486     {
    487         str.chop(1);
    488         i--;
    489     }
    490     ui->textBrowser->setText(str);
    491 }
    492 
    493 void MainWindow::on_pushButton_19_clicked()
    494 {
    495     q=str.toLatin1().data();
    496     k=0;
    497     QString str2=QString("%1").arg(biaodas());
    498     ui->textBrowser->setText(str2);
    499     i=0;
    500     str.clear();
    501 }
    502 
    503 void MainWindow::on_pushButton_20_clicked()
    504 {
    505     char *p=str.toLatin1().data();
    506     if(i==0){
    507         str.append("sin");
    508         i+=3;
    509     }
    510     else if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='(')
    511     {
    512         str.append("sin");
    513         i+=3;
    514     }
    515     ui->textBrowser->setText(str);
    516 }
    517 
    518 void MainWindow::on_pushButton_21_clicked()
    519 {
    520     char *p=str.toLatin1().data();
    521     if(i==0){
    522         str.append("cos");
    523         i+=3;
    524     }
    525     else if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='(')
    526     {
    527         str.append("cos");
    528         i+=3;
    529     }
    530     ui->textBrowser->setText(str);
    531 }
    532 
    533 void MainWindow::on_pushButton_22_clicked()
    534 {
    535     char *p=str.toLatin1().data();
    536     if(i==0){
    537         str.append("tan");
    538         i+=3;
    539     }
    540     else if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='(')
    541     {
    542         str.append("tan");
    543         i+=3;
    544     }
    545     ui->textBrowser->setText(str);
    546 }
    547 
    548 void MainWindow::on_pushButton_23_clicked()
    549 {
    550     char *p=str.toLatin1().data();
    551     if(i==0){
    552         str.append("lg");
    553         i+=2;
    554     }
    555     else if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='(')
    556     {
    557         str.append("lg");
    558         i+=2;
    559     }
    560     ui->textBrowser->setText(str);
    561 }
    562 
    563 void MainWindow::on_pushButton_24_clicked()
    564 {
    565     char *p=str.toLatin1().data();
    566     if(i==0){
    567         str.append("ln");
    568         i+=2;
    569     }
    570     else if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='(')
    571     {
    572         str.append("ln");
    573         i+=2;
    574     }
    575     ui->textBrowser->setText(str);
    576 }
    577 
    578 void MainWindow::on_pushButton_25_clicked()
    579 {
    580     char *p=str.toLatin1().data();
    581     if(i==0){
    582         str.append("sqrt");
    583         i+=4;
    584     }
    585     else if(p[i-1]=='+'||p[i-1]=='-'||p[i-1]=='*'||p[i-1]=='/'||p[i-1]=='(')
    586     {
    587         str.append("sqrt");
    588         i+=4;
    589     }
    590     ui->textBrowser->setText(str);
    591 }
    592 
    593 void MainWindow::on_pushButton_26_clicked()
    594 {
    595     str.clear();
    596     i=0;
    597     ui->textBrowser->setText(str);
    598 }
    599 
    600 void MainWindow::on_pushButton_27_clicked()
    601 {
    602     char *p=str.toLatin1().data();
    603     if(i==0){
    604         str.append("pi");
    605         i+=2;
    606     }
    607     else if((p[i-1]<='9'&&p[i-1]>='0')||p[i-1]=='.'||p[i-1]==')');
    608     else
    609     {
    610         str.append("pi");
    611         i+=2;
    612     }
    613     ui->textBrowser->setText(str);
    614 }

    程序下载地址

    链接:https://pan.baidu.com/s/1mkaf4lM

    密码:rfpd

  • 相关阅读:
    大话设计模式读书笔记(七) 原型模式
    大话设计模式读书 笔记(六) 工厂方法模式
    知识点:什么是交换机?什么是路由?什么是静态路由和动态路由?
    Docker:PostgreSQL-11配置数据持久化
    Docker:docker创建容器时报错:WARNING: IPv4 forwarding is disabled. Networking will not work.
    Docker:docker安装部署jenkins
    Docker:Centos7更新yum源下载docker
    Docker:docker国内镜像加速
    SpringBoot:SpringCloud与SpringBoot兼容版本参(其它组件兼容情况)
    SpringCloud:SpringBoot整合SpringCloud项目
  • 原文地址:https://www.cnblogs.com/miaos/p/miaoz-2-2.html
Copyright © 2011-2022 走看看