lzufe-wxy

第一次作业-计算器软件开发

[实验目的]

1.掌握软件开发的基本流程

2.掌握软件设计和开发的基本工具

3.理解集成软件开发环境在软件开发过程中的作用

[实验内容]

1.设计一个可实现加、减、乘、除功能的计算器软件

2.使用牛顿迭代法完成算术开方的运算

3.将自己编写的算术开方功能集成到计算器程序中,使计算器软件除了具备加、减、乘、除功能外,还具备算术开方功能

[设计流程图]

设计一个计算器程序,实现加、减、乘、除,算数开方运算。设计流程图:

 

[代码]

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include<QString>
#include<QStack>
#include<QTime>
#include<iterator>
#include<QLineEdit>
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
p

ublic:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    QString input="0"; //输入框
    bool flat=false;
private slots:
    void on_pushButton_2_clicked();
 
    void on_pushButton_clicked();
 
    void on_pushButton_3_clicked();
 
    void on_pushButton_you_clicked();
 
    void on_pushButton_ce_clicked();
 
    void on_pushButton_4_clicked();
 
    void on_pushButton_5_clicked();
 
    void on_pushButton_6_clicked();
 
    void on_pushButton_jia_clicked();
 
    void on_pushButton_clear_clicked();
 
    void on_pushButton_7_clicked();
 
    void on_pushButton_8_clicked();
 
    void on_pushButton_9_clicked();
 
    void on_pushButton_jian_clicked();
 
    void on_pushButton_chu_clicked();
 
    void on_pushButton_0_clicked();
 
    void on_pushButton_deng_clicked();
 
    void on_pushButton_cheng_clicked();
 
    void on_pushButton_zuo_clicked();
 
    void on_pushButton_point_clicked();
 
    void on_pushButton_10_clicked();
 
private:
    Ui::Widget *ui;
};
 
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
 
#include<iostream>
using namespace std;
#include<stack>
#include<vector>
#include<cstdlib>
#include<limits.h>
#include<QDebug>
 
bool isNum(char ch);
bool isOperate(char ch);
int level(char ch);
double scd(string s);
double getValue(vector<string> V);
vector<string> midToPost(string s);
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::on_pushButton_2_clicked()
{
 
    if(input=="0")
    input='2';
    else input=input+'2';
    //inputLine->setText(input);
    ui->lineEdit->setText(input);
 
}
 
void Widget::on_pushButton_clicked()
{
    if(input=="0")
    input='1';
    else input=input+'1';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_3_clicked()
{
    if(input=="0")
    input='3';
   else
    {
        input=input+'3';
    }
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_you_clicked()
{
    if(input=="0")
    input=')';
    else input=input+')';
   // inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_ce_clicked()
{
    input = input.left(input.length()-1); //减去一字符
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_4_clicked()
{
    if(input=="0")
    input='4';
    else input=input+'4';
   // inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_5_clicked()
{
    if(input=="0")
    input='5';
    else input=input+'5';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_6_clicked()
{
    if(input=="0")
    input='6';
    else input=input+'6';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}

void Widget::on_pushButton_clear_clicked()
{
    input='0';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_7_clicked()
{
    if(input=="0")
    input='7';
    else input=input+'7';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_8_clicked()
{
    if(input=="0")
    input='8';
    else input=input+'8';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_9_clicked()
{
    if(input=="0")
    input='9';
    else input=input+'9';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_jian_clicked()
{
    if(input=="0")
    input='-';
    else input=input+'-';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_chu_clicked()
{
    if(input=="0")
    input='/';
    else input=input+'/';
   // inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_0_clicked()
{
    if(input=="0")
    input='0';
    else input=input+'0';
   // inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_cheng_clicked()
{
    if(input=="0")
    input='*';
    else input=input+'*';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_zuo_clicked()
{
    if(input=="0")
    input='(';
    else input=input+'(';
   // inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_point_clicked()
{
    if(input=="0")
    input='.';
    else input=input+'.';
    //inputLine->setText(input);
     ui->lineEdit->setText(input);
}
 
void Widget::on_pushButton_deng_clicked()
{
 
    string inputTemp = input.toStdString();
    vector<string> expression = midToPost(inputTemp);
    double value = getValue(expression);
    if(value != INT_MAX) {
      input=input+"="+QString::number(value);
     // inputLine->setText(input);
       ui->lineEdit->setText(input);
    }else{
      input=' ';
      input=input+"错误,请重新输入";
      //inputLine->setText(input);
       ui->lineEdit->setText(input);
    }
}
bool isNum(char ch) {
    if(ch >= '0' && ch <= '9') return true;
    else return false;
}
 
bool isOperate(char ch) {
    if(ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')')
    return true;
    else return false;
}
 
int level(char ch) {
    switch(ch) {
        case '(' :
            return 5;
        case '*' :
            return 4;
        case '/' :
            return 4;
        case '+' :
            return 3;
        case '-' :
            return 3;
        case ')':
            return 2;
    }
}

/*字符串转数字*/
double scd(string s) {
    if(s.length() == 0) return INT_MAX;
 
    bool flag = false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s[i] == '-') continue;
        else if(s[i] == '.' && !flag) {
            if(i > 0 && isNum(s[i-1])) {
                flag = true;
                continue;
            }
            else return INT_MAX;
        }
        else if(isNum(s[i])) continue;
        else return INT_MAX;
    }
 
    double result = atof(s.c_str());
    return result;
}
 
 /*由中缀表达式得到后缀表达式, 向量V存储结果*/
vector<string> midToPost(string s) {
    stack<char> S; /*符号栈*/
    vector<string> V; /*后缀表达式*/
    int i = 0;
    while(i < s.length()) {
        if(isNum(s[i])) {
            string str = "";
            while(isNum(s[i]) || s[i] == '.') {
                str += s[i];
                i++;
            }
            V.push_back(str);
        }
 
        else if(isOperate(s[i])){
            /*负数情况*/
            if(s[i] == '-' && (i == 0 || !isNum(s[i-1]))) {
                string str = "-"; i++;
                while(isNum(s[i]) || s[i] == '.') {
                    str += s[i]; i++;
                }
                V.push_back(str);
            }else{
                if(S.empty()){
                    S.push(s[i]); i++;
                }else {
                    int initial = level(s[i]);
                    if(initial == 2) {
                        while(level(S.top()) != 5 && !s.empty()) {
                            string str = "";
                            str += S.top();
                            V.push_back(str);
                            S.pop();
                        }
                        if(S.top() == '(') S.pop(); i++;
                    } else {
                        while(!S.empty() && initial <= level(S.top()) && level(S.top()) != 5) {
                            string str = "";
                            str += S.top();
                            V.push_back(str);
                            S.pop();
                        }
                        S.push(s[i]); i++;
                    }
                }
            }
        }
        else{
            cout << "表达式出错" << endl;
            V.clear();
            return V;
        }
    }
    while(!S.empty()) {
        string str = ""; str += S.top();
        S.pop();
        V.push_back(str);
    }
    //for(int i = 0; i < V.size(); i++) cout << V[i] << "[]";
    return V;
}
 
/*后缀表达式得到最终结果*/
double getValue(vector<string> V) {
    stack<double> S;
    for(int i = 0; i < V.size(); i++) {
    /*操作运算符*/
        if(V[i].length() == 1 && isOperate(V[i][0])) {
            double a = 0, b = 0;
            if(!S.empty()) {
                a = S.top(); S.pop();
            }else return INT_MAX;
 
            if(!S.empty()) {
                b = S.top(); S.pop();
            }else return INT_MAX;
 
            switch(V[i][0]) {
                case '+':
                    S.push(b+a);
                    break;
                case '-':
                    S.push(b-a);
                    break;
                case '*':
                    S.push(b*a);
                    break;
                case '/':
                    S.push(b/a);
                    break;
                default:
                    return INT_MAX;
            }
        }else {
            if(scd(V[i]) == INT_MAX) return INT_MAX;
            else S.push(scd(V[i]));
        }
    }
    if(S.empty()) return INT_MAX;
 
    double value = S.top();
    S.pop();
    return value;
}


牛顿迭代算法实现开平方 

double mysqrt(double x)

{
if (x == 1 || x == 0)
return x;
double temp = x / 2;
while (1)
{
double a = temp;
temp = (temp + x / 2) / 2;
if (a - temp < 0.001&&a>temp)
return temp;
}
}

void Widget::on_pushButton_10_clicked()
{
 
     this->close();//退出计算器
}
测试用例:

乘法测试如下

 

 注:99*99=9801加法测试如下

 注:1+2=3。

posted on 2023-10-13 22:34  agonyyy  阅读(35)  评论(0编辑  收藏  举报

导航