计算机软件技术实习项目一
简易计算器
一、实验内容
(1) 学习图形界面的设计,利用 QT的UI设计功能实现计算机界面的设计。
(2) 能通过设计的按钮控件输入数字和运算符并实现算术运算,并保存历史的表达式运算记录。
(3) 能够自行判断一些常见的运算逻辑问题。
二、开发流程。
1,UI界面设计
2,界面设计结束后,建立按钮和文本框和对应槽函数的连接,文本初始化等。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->pushButton_0->setFont(QFont("宋体", 10));
ui->pushButton_1->setFont(QFont("宋体", 10));
ui->pushButton_2->setFont(QFont("宋体", 10));
ui->pushButton_3->setFont(QFont("宋体", 10));
ui->pushButton_4->setFont(QFont("宋体", 10));
ui->pushButton_5->setFont(QFont("宋体", 10));
ui->pushButton_6->setFont(QFont("宋体", 10));
ui->pushButton_7->setFont(QFont("宋体", 10));
ui->pushButton_8->setFont(QFont("宋体", 10));
ui->pushButton_9->setFont(QFont("宋体", 10));
ui->pushButton_c->setFont(QFont("宋体", 10));
ui->pushButton_cheng->setFont(QFont("宋体", 10));
ui->pushButton_chu->setFont(QFont("宋体", 10));
ui->pushButton_del->setFont(QFont("宋体", 10));
ui->pushButton_dengyu->setFont(QFont("宋体", 10));
ui->pushButton_jia->setFont(QFont("宋体", 10));
ui->pushButton_jian->setFont(QFont("宋体", 10));
ui->pushButton_xiaoshudian->setFont(QFont("宋体", 10));
ui->pushButton_youkuohao->setFont(QFont("宋体", 10));
ui->pushButton_zuokuohao->setFont(QFont("宋体", 10));
ui->pushButton_his->setFont(QFont("宋体", 10));
ui->pushButton_close->setFont(QFont("宋体", 10));
QFont textEditFont ( "Microsoft YaHei", 25, 75);
ui->textEdit->setReadOnly(true);
ui->textEdit->setText("0");
on_actionRight_triggered();
setWindowTitle("calculator");
strin ="#";
connect(ui->pushButton_0,&QPushButton::clicked,[=](){pushButton_0();});
connect(ui->pushButton_1,&QPushButton::clicked,[=](){pushButton_1();});
connect(ui->pushButton_2,&QPushButton::clicked,[=](){pushButton_2();});
connect(ui->pushButton_3,&QPushButton::clicked,[=](){pushButton_3();});
connect(ui->pushButton_4,&QPushButton::clicked,[=](){pushButton_4();});
connect(ui->pushButton_5,&QPushButton::clicked,[=](){pushButton_5();});
connect(ui->pushButton_6,&QPushButton::clicked,[=](){pushButton_6();});
connect(ui->pushButton_7,&QPushButton::clicked,[=](){pushButton_7();});
connect(ui->pushButton_8,&QPushButton::clicked,[=](){pushButton_8();});
connect(ui->pushButton_9,&QPushButton::clicked,[=](){pushButton_9();});
connect(ui->pushButton_cheng,&QPushButton::clicked,[=](){pushButton_cheng();});
connect(ui->pushButton_chu,&QPushButton::clicked,[=](){pushButton_chu();});
connect(ui->pushButton_jia,&QPushButton::clicked,[=](){pushButton_jia();});
connect(ui->pushButton_jian,&QPushButton::clicked,[=](){pushButton_jian();});
connect(ui->pushButton_xiaoshudian,&QPushButton::clicked,[=](){pushButton_xiaoshudian();});
connect(ui->pushButton_youkuohao,&QPushButton::clicked,[=](){pushButton_youkuohao();});
connect(ui->pushButton_zuokuohao,&QPushButton::clicked,[=](){pushButton_zuokuohao();});
connect(ui->pushButton_c,&QPushButton::clicked,[=](){pushButton_c();});
connect(ui->pushButton_del,&QPushButton::clicked,[=](){pushButton_del();});
connect(ui->pushButton_dengyu,&QPushButton::clicked,[=](){pushButton_dengyu();});
connect(ui->pushButton_his,&QPushButton::clicked,[=](){pushButton_his();});
connect(ui->pushButton_close,&QPushButton::clicked,[=](){pushButton_close();});
}
3,编写数字按钮等简单按钮槽函数。(大体一致)
void Widget::pushButton_0(){
if(strin=="#") ui->textEdit->clear();
bracketdigiterror();
strin+="0";
on_actionRight_triggered();
ui->textEdit->textCursor().insertText("0");
}
4,编写量化字符优先级并比较,判断数字,字符数字转换等函数。
void Widget::on_actionRight_triggered(){//向右对齐
ui->textEdit->setAlignment(Qt::AlignRight);
}
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;
}
5,三个判错函数
void Widget::operror(int num)//判错函数1
{
char*s=strin.toLocal8Bit().data();
if(!isdigit(s[strlen(s)-2])&&s[strlen(s)-2]!=')')
{
QMessageBox::about(this,"输入有误","您输入的双目运算符无左值");
strin.chop(1);
for(int i=1;i<=num;i++)
ui->textEdit->textCursor().deletePreviousChar();
}
}
void Widget::digitbracketerror()//判错函数2
{
char*s=strin.toLocal8Bit().data();
if(isdigit(s[strlen(s)-1])||s[strlen(s)-1]==')')
{
QMessageBox::about(this,"输入有误","您要输入的左括号前是数");
strin+="+";
ui->textEdit->textCursor().insertText("+");
}
}
void Widget::bracketdigiterror()//判错函数3
{
char* s=strin.toLocal8Bit().data();
if(s[strlen(s)-1]==')')
{
QMessageBox::about(this,"输入有误","您要输入的数字前是右括号");
strin+="*";
ui->textEdit->textCursor().insertText("*");
}
}
6,编写等于号槽函数。
void Widget::pushButton_dengyu(){
char *s=strin.toLocal8Bit().data();
if(strcmp(s,"")==0){
history<<"0";
ui->textEdit->clear();
ui->textEdit->textCursor().insertText("0");
on_actionRight_triggered();
}
else{
string s = strin.toStdString();
double num= getValue(midToPost(s));
QString ans;
ans = QString::number(num,10,5);
strin+="=";
strin+=ans;
history<<strin;
ui->textEdit->clear();
ui->textEdit->textCursor().in