数据结构-计算器实验报告
Posted 上衫_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-计算器实验报告相关的知识,希望对你有一定的参考价值。
一、实验目的和要求
1. 设计并实现计算器。
要求:在课后作业-03、课后作业-05的作业内容基础上
(1)增加图形交互功能。
(2)增加3个逻辑运算符 &&、||、 !,并能处理逻辑运算符和算术运算符的混合运算。
(3)增加容错功能,能进行异常处理。
二、实验环境
Qt 5.9
三、实验内容
在课后作业-03、课后作业-05的作业内容基础上
(1)增加图形交互功能。
(2)增加3个逻辑运算符 &&、||、 !,并能处理逻辑运算符和算术运算符的混合运算。
(3)增加容错功能,能进行异常处理。
四、实验过程
用文字、图(流程图等)、表格等方式记录实验过程中分析、设计工作。
4.1 任务定义和问题分析
实验第一个要求是添加三个逻辑运算符,还是原来的套路,比较运算符之间的优先级来进行计算。
第二个要求是增加图形界面,本来打算使用MFC编写,可是后来发现Qt要简单的多,最终就用Qt编写。
第三个要求是增加容错,应该就是在计算之前检查一下表达式是否有错误,防止程序崩掉。
4.2 数据结构的选择和概要设计
数据结构选择用栈
采用运算符优先级比较来计算表达式,设置一全局变量QString line来保存表达式,按下相应的按键后,将对应的符号添加到line中,按下等于号后,先检查一下表达式是否有误,然后进行计算,显示结果。
4.3 详细设计
1.输入表达式
为了将每一个符号添加到line中,设置void add_and_update()函数,将其与每个按键的信号相连,及每按一个键都会调用此函数,利用sender()函数来判断是哪一个按键发送的信号,将其对应的符号添加到line中。
2.计算输入的表达式
这里用了一个信号可以对应对个槽的机制,将‘=’按键与两个槽链接void add_and_update()和void caculate(),由于链接顺序不同,会先调用void add_and_update()将‘#’添加到line中;再调用void caculate()计算表达式。
3.容错
计算表达式前,先对表达式进行检查,若表达式有错弹出报错窗口并结束程序。
计算表达式时,若出现除数为零的情况,弹出报错窗口,结束程序。
计算过程中,若出现num栈为空但char_n栈不为空的情况,弹出报错窗口,结束程序。
4.逻辑运算符的计算:
与和或通过运算符优先级的比较来计算;
非直接在入栈计算,检测到符号“!”后,在num栈中取出一数,计算即可。
QString line; 用来保存用于计算的表达式。
QString line0; 用来保存用于显示的表达式。
QString history; 用来保存曾经正确计算的表达式,并将其显示出来。
QStack char_n; 用来保存字符。
QStack num; 用来保存数字。
QString s; 计算时将line赋值给它。
double result; 最后计算的结果。
void add_and_update(); 将运算符添加到line中。
void caculate(); 计算表达式。
bool check(); 检查表达式是否有误。
int getindex(char i); 得到对应字符的下标。
char getpriority(char i, char j); 通过下标来获取字符的优先级。
int hextobin(int i,int* n); 将十进制数转为二进制数。
int bintohex(int *p,int j) 将二进制数转为十进制。
int or_num(int j,int k); 对1,0进行或运算。
int and_num(int j,int k); 对1,0进行与运算。
int o_r(int j,int k); 对两个十进制数进行或运算。
int a_nd(int j,int k); 对两个十进制数进行与运算。
double caculator(char i, double j, double k);计算双目运算符
五、测试及结果分析
对各种数据运行程序和算法的结果记录和分析,并对错误所作的修改和结果。
5.1 实验数据
1+8/4-1!
5|8
9&(5+3)
9&1!
5.83.2-3
9/(4+8-12)
8-5
5.2 结果及分析
六、实验收获
熟悉了Qt的使用,对Qt图形界面有了一定的了解
七、附录(源代码)
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui
class Widget;
class Widget : public QWidget
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected slots:
void add_and_update();
void caculate();
private:
Ui::Widget *ui;
;
#endif // WIDGET_H
main.h
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<Qstack>
#include<QString>
#include<iostream>
#include<cmath>
#include<QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);
connect(ui->number0,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number1,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number2,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number3,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number4,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number5,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number6,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number7,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number8,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->number9,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->jia,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->jian,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->cheng,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->chu,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->zuokuohao,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->youkuohao,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->dengyu,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->dengyu,SIGNAL(clicked(bool)),this,SLOT(caculate()));
connect(ui->c,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->shanchu,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->And,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->Not,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->Or,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->dian,SIGNAL(clicked(bool)),this,SLOT(add_and_update()));
connect(ui->clearhistory,SIGNAL(clicked(bool)),this,SLOT(clear()));
setFixedSize(this->width(),this->height());//禁止改变窗体大小
Widget::~Widget()
delete ui;
QString line;
QString line0;
QString history;
QStack<char> char_n;
QStack<double> num;
QString s;
double result;
bool check()
QString error[8]="/","*","+","-","&","|",")","!";
QString error2[67]="|&","&|","!|","!&","&-","&+","&*","&/","|+","|-","|*","|/","+&","+|","-&","-|","/|",
"/&","*&","*|","/*","*/","+-","-+","/-","-/","+/","/+","*+","+*","-*","*-","-)","(-",
"(+","+)","/)","(/","*)","(*","+-","-+","--","++","//","**","&&","||","!!","-.","+.",
"/.","*.","!.","&.","|.",".-",".+","./",".*",".!",".&",".|",".(",".)","(.",").";
for(int i=0;i<8;i++)
if(line0.startsWith(error[i]))
return false;
for(int i=0;i<67;i++)
if(line0.contains(error2[i],Qt::CaseSensitive))
return false;
return true;
int getindex(char i)
switch (i)
case '+':
return 0;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
case '(':
return 4;
case ')':
return 5;
case '&':
return 6;
case '|':
return 7;
case '#':
return 8;
default:
return -1;
char getpriority(char i, char j)
const char data[][9] =
'>', '>', '<', '<', '<', '>', '>', '>', '>',
'>', '>', '<', '<', '<', '>', '>', '>', '>',
'>', '>', '>', '>', '<', '>', '>', '>', '>',
'>', '>', '>', '>', '<', '>', '>', '>', '>',
'<', '<', '<', '<', '<', '=', '<', '<', '0',
'>', '>', '>', '>', '0', '>', '>', '>', '>',
'<', '<', '<', '<', '<', '>', '>', '>', '>',
'<', '<', '<', '<', '<', '>', '<', '>', '>',
'<', '<', '<', '<', '<', '0', '<', '<', '=',
;
int c = getindex(i);
int d = getindex(j);
return data[c][d];
int hextobin(int i,int* n)
int j = 0;
while (i)
n[j] = i % 2;
i /= 2;
j++;
return j;
int or_num(int j,int k)
if (j==1||k==1)
return 1;
return 0;
int and_num(int j,int k)
if (j==1&&k==1)
return 1;
return 0;
int bintohex(int *p,int j)
int n = 0;
for (int i = 0; i < j; i++)
if (p[i]==1)
n += pow(2, i);
return n;
int o_r(int j,int k)
int n1[1000]=0, n2[1000以上是关于数据结构-计算器实验报告的主要内容,如果未能解决你的问题,请参考以下文章
智能车竞赛技术报告 | 智能车视觉 - 中原工学院 - 逐鹿 - 分母队