[计算机软件及应用]QT计算器.doc_第1页
[计算机软件及应用]QT计算器.doc_第2页
[计算机软件及应用]QT计算器.doc_第3页
[计算机软件及应用]QT计算器.doc_第4页
[计算机软件及应用]QT计算器.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

QT 课程 程序设计题目:科学计算器姓名:杨平学号:201005070116学院:信息技术与科学专业:软件工程 2012年12月10日1. 功能需求分析1.1 功能划分 本次我们设计的计算器在功能上大致与Windows系统自带的计算器程序相似,但在某些细节处加入了我们设计同学的独特创新和技巧,具体体现见详细设计部分。对于我们所设计的科学计算器,其功能大致可以如下划分: 算术型计算器功能可以进行加(+)、减(-)、乘(*)、除(/)、开方(sqrt)、百分数(%)等简单算术计算。 科学型计算器功能可以进行乘方、开方、指数、对数、三角函数、等方面的运算。 一元运算和多元运算可以进行表达式和简单运算,且切换较为快捷。1.2 功能描述 对于算术型计算器的功能大家已经非常熟悉,就不再赘述。这里只对科学型计算器功能中的特殊符号、必要函数及技巧创新功能部分作简单描述。 特殊符号和函数Pi 。即 3.1415926 Ln 自然对数,ln(x)是以e为底的x的对数 Log 以10为底的对数,10是可以省略的S in 正弦函数 Arcsin 反正弦函数 Cos 余弦函数 Tan 正切函数 n! 阶乘 Mod 取模运算Clear 清空 等等这些符号有利于我们计算,方便快捷的得出结果。使用数据记录:我们都知道,现在市面上一般的计算器虽然在计算上能满足用户的需求,但对于一些重要的数据和运算过程、记录,就无法实现重要过程和数据的记录,所以这项功能的添加让我们的计算器更加科学化,人性化,用户不必要再担心运算的出错和检查的麻烦。这也是我们所设计的计算器相比于其他计算器的重要优点之一。2. 详细设计2.1 普通计算功能(1)界面设计界面设计我们是使用Qt creator进行设计的,首先创建一QMainWindow(parent).ui,这个界面为QWidget。然后在左侧的Widget Box找相应的控件添加到QMainWindow(parent)里。首先提出一个lineEdit控件作为算式显示窗口和结果显示窗口,在提取出30个QpushButton为0到9按键和加减乘除按键、括号按键、开根号按键、小数点按键、%按键、取模按键、阶乘按键、取倒按键、等于按键、历史按键、标准/科学模式切换按键。然后再把各个pushButton名字改成相应的符号,并且改对应pushbutton的属性,保存后取Qt creator编译QMainWindow(parent).ui,运行程序就可以显示相应界面。具体界面设计效果如下:且各组件的属性设置如下:(2)程序具体实现现在.h文件中对各个按键在私有槽中进行声明,例如: public slots: void clickbtn1();就对1键(槽函数)进行声明,然后就可以在.cpp进行编写程序。声明first,second两个整形表示第一个输入和第二个输入,然后用Qt(Qstring)封装好的append()函数进行添加,当然,这里牵涉到本程序对Btn按键的函数声明,并且使用setText函数,使其按键符号点击后可以在lineEdit上显示,在这里用的是信号和槽的机制,具体的信号于槽的链接在后面会详细说明。2.2 科学计算器功能本界面的主要功能是在普通计算器的基础上,添加了一些科学计算的功能,具体实现的操作功能包括三角函数运算()、反三角函数运算()、双曲三角函数运算()、对数运算()、弧度运算、角度运算、梯度运算。(1) 界面设计 为了隐藏的需要,我们采用Group Box的组件,然后设置“”按键,通过点击“”按键可将窗口由标准型切换为科学型(此时“”按键变为“”按键,再点击一次即可变回标准型),切换为科学型窗口后,在普通窗口的基础上添加一些QPushButton按钮,修改其属性,使其变成相应的功能键,再从左边把QComboBox拖到科学计算窗口中,并修改其属性,用户可以在下拉框中,选择自己想要实现的运算类型(如:弧度、梯度;不同对数运算),然后用对上述按键在窗口中进行合理布局,最后用QtCreator对所设计的界面进行编译形成ui文件,点击运行即可查看所设计界面。 具体界面设计效果如下: 下拉框中显示的设计如下: 各组件的属性设置如下:(2) 程序具体实现这里仍使用信函和槽连接机制,我们没有使用信号和槽编辑器,而是直接在.cpp文件中添编写其代码来实现,首先在.h文件中对各个按键进行声明,如:void clicksin();就是对sin按键进行声明,再到.cpp文件中编写相应的代码实现其功能,当Jing_zhan_unary变量为ture时,执行clickTrigJIng_zhan_TS(“sin”),或当Jing_zhan_Expression变量为ture时,执行sinBian_lian=true;clickJing_zhan_Pro(sin,mu_qianSin);实现sin的运算功能。2.3 计算历史显示功能 本模块包括本系统的删除、保存功能。(1) 界面介绍 这里我要用两个QpushButton控件和一个LineEdit控件,两个QpushButton控件分别表示删除算式、算式另存为,在修改其属性,再拖拽一个LineEdit控件,它用来显示计算机执行的历史事件,而且还可以在其上点击选择算式。 具体界面设计效果如下: 各组件的属性设置如下:(2) 程序具体实现另存为算式:首先声明一个另存为的函数void calculate:clickHistorySaveas(),添加一个QFileDialog控件作为另存为显示窗口,再把QFileDialog名字改成相应的另存为,并且改对应QFileDialog的属性,然后查询算式表(message),查找最后一个id的值,然后id加一,再把次id和窗口提取的算式存入数据库算式表(message)中,然后通过槽函数ui-statusBar-showMessage(Version+ : +tr(已保存),10000);查询整个message表把表中的内容显示出来。删除算式:先用currentIndex().row()把鼠标点中的行选中。提出行数,声明model,再用model中封装好的函数删除这一行,在加上警告函数,判断是否删除,就可以了。2.4 删除功能此功能为删除窗口中的最后一个字符,具体编写过程为:提取窗口中的内容,并把窗口中的内容存放到一个QString型变量中,然后用Qt现有的已经封装好的函数,把这个变量从左边开始将其最后一个字符去掉,使其长度减少一,将改变后的字符串在存放到这个变量中,再把这个变量重新返回到窗口中,这样就达到删除的功能了。2.5 清空功能此功能为清空显示窗口,这里用Qt封装好的函数clear(),直接把窗口给清空,这样就达到效果。2.6 操作类型切换功能在菜单栏里添加操作类型选择按键,在操作类型按键下有一元顺序运算和表达式运算两个子选项,当选择一元顺序运算时,将“(”按键和“)”按键设置为不可点击即,而当选择表达式运算时,将“1/x”按键和“”按键设置为不可点击。由于在不同的操作类型下,有些运算符不适用,故将其设置为不可点击,这样可以防止用户进行违规操作。 具体界面设计效果如下:3. 系统的实现:计算分简单计算和科学计算两种功能,又由于要实现表达式的功能,故应该将其分开实现,所以,我们在程序中设置了两逻辑变量进行区分,如下所示。 bool Jing_zhan_unary=false; /一元操作 bool Jing_zhan_Expression=true; /表达式操作 当然,对于下面具体步骤中出现的函数,我们有必要在此说明,这其中也包括整个程序的核心算法。考虑到程序中出现了众多信号与槽的链接,故采用手工链接的方式进行。首先在calculate.h中声明如下槽函数:public slots: void clickSifirla(); void clickbtn(QString); void clickbtn1(); void clickbtn2(); void clickbtn3(); void clickbtn4(); void clickbtn5(); void clickbtn6(); void clickbtn7(); void clickbtn8(); void clickbtn9(); void clickbtn0(); void clickPoint(); void clickPointControl(); void clickClear(); void clickPlus(); void clickDecrease(); void clickMultiply(); void clickEliminate(); void clickEql(); void clickJing_zhan_(); void clickJing_zhan_2(QStringList &diziPro,QString isaret); void clickBackspace(); void clickChangesign(); void clickSqrt(); void click_G(); void clickCi(); void click_1_x(); void clickJie_cheng(); void clickSwitch(); void clickSimple(); void clickSin(); void clickCos(); void clickTan(); void clickCot(); void clickPi(); void clickE(); void clickArcsin(); void clickArccos(); void clickArctan(); void clickArccot(); void clickSinh(); void clickCosh(); void clickTanh(); void clickCoth(); void clickLog(); void clickHistory(); void clickHistoryDelete(); void clickHistorySaveas(); void clickExpression(); void clickunary(); void clickReplaceTur(QLabel*,QLabel*,bool); void clickJing_zhan_caozuoleixing(); void clickJing_zhan_Pro(QString,QString,bool); void clickTrigJing_zhan_IO(QStringList &diziPro,bool &trigVar,QString,QString); void clickTrigJing_zhan_IS(QString); void clickYerReplace(QStringList &diziPro,int,double); void clickMod(); void clickZkuohao(); void clickYkuohao(); double clickDonusum(int,double); void clickQ_zhishu(); 在calculate.cpp中calculate:calculate(QWidget *parent) : QMainWindow(parent),ui(new Ui:calculate)构造函数中进行信号于槽的链接,也就是各按键及工具条等组件的动作响应关系(函数)如下: connect(ui-btnSwitch,SIGNAL(clicked(),this,SLOT(clickSwitch(); /科学 和 简单 快速切换键 connect(ui-btnHistory,SIGNAL(clicked(),this,SLOT(clickHistory(); / 历史键 connect(ui-btn1,SIGNAL(clicked(),this,SLOT(clickbtn1(); / 1 connect(ui-btn2,SIGNAL(clicked(),this,SLOT(clickbtn2(); / 2 connect(ui-btn3,SIGNAL(clicked(),this,SLOT(clickbtn3(); / 3 connect(ui-btn4,SIGNAL(clicked(),this,SLOT(clickbtn4(); / 4 connect(ui-btn5,SIGNAL(clicked(),this,SLOT(clickbtn5(); / 5 connect(ui-btn6,SIGNAL(clicked(),this,SLOT(clickbtn6(); / 6 connect(ui-btn7,SIGNAL(clicked(),this,SLOT(clickbtn7(); / 7 connect(ui-btn8,SIGNAL(clicked(),this,SLOT(clickbtn8(); / 8 connect(ui-btn9,SIGNAL(clicked(),this,SLOT(clickbtn9(); / 9 connect(ui-btn0,SIGNAL(clicked(),this,SLOT(clickbtn0(); / 0 connect(ui-btnPoint,SIGNAL(clicked(),this,SLOT(clickPoint(); /小数点的实现 connect(ui-btnClear,SIGNAL(clicked(),this,SLOT(clickClear(); / Clear按键的实现 connect(ui-btnPlus,SIGNAL(clicked(),this,SLOT(clickPlus(); / 加法 connect(ui-btnDecrease,SIGNAL(clicked(),this,SLOT(clickDecrease(); /减号 connect(ui-btnMultiply,SIGNAL(clicked(),this,SLOT(clickMultiply(); /乘号 connect(ui-btnEliminate,SIGNAL(clicked(),this,SLOT(clickEliminate(); /除号 connect(ui-btnEql,SIGNAL(clicked(),this,SLOT(clickEql(); /等号 connect(ui-btnBackspace,SIGNAL(clicked(),this,SLOT(clickBackspace(); /退格 connect(ui-btnChangesign,SIGNAL(clicked(),this,SLOT(clickChangesign(); /改变符号 connect(ui-btnSqrt,SIGNAL(clicked(),this,SLOT(clickSqrt(); / 开根号 connect(ui-btn_G,SIGNAL(clicked(),this,SLOT(click_G(); /按百分比的形式显示乘积结果 connect(ui-btnCi,SIGNAL(clicked(),this,SLOT(clickCi(); / 实现 connect(ui-btn_1_x,SIGNAL(clicked(),this,SLOT(click_1_x(); / 1/x 功能键实现 connect(ui-btnJie_cheng,SIGNAL(clicked(),this,SLOT(clickJie_cheng(); / 阶乘 connect(ui-btnSin,SIGNAL(clicked(),this,SLOT(clickSin(); / Sin connect(ui-btnCos,SIGNAL(clicked(),this,SLOT(clickCos(); / Cos connect(ui-btnTan,SIGNAL(clicked(),this,SLOT(clickTan(); / Tan connect(ui-btnCot,SIGNAL(clicked(),this,SLOT(clickCot(); / Cot connect(ui-btnPi,SIGNAL(clicked(),this,SLOT(clickPi(); / Pi connect(ui-btnE,SIGNAL(clicked(),this,SLOT(clickE(); / exp connect(ui-btnArcsin,SIGNAL(clicked(),this,SLOT(clickArcsin(); / Asin connect(ui-btnArccos,SIGNAL(clicked(),this,SLOT(clickArccos(); / Acos connect(ui-btnArctan,SIGNAL(clicked(),this,SLOT(clickArctan(); / Atan connect(ui-btnArccot,SIGNAL(clicked(),this,SLOT(clickArccot(); / Acot connect(ui-btnLog,SIGNAL(clicked(),this,SLOT(clickLog(); / Log connect(ui-btnMod,SIGNAL(clicked(),this,SLOT(clickMod(); / Mod connect(ui-btnDelete,SIGNAL(clicked(),this,SLOT(clickHistoryDelete(); / 历史框中 删除键 connect(ui-btnSaveas,SIGNAL(clicked(),this,SLOT(clickHistorySaveas(); / 历史框中 另存为键 connect(ui-btnZkuohao,SIGNAL(clicked(),this,SLOT(clickZkuohao(); / ( connect(ui-btnYkuohao,SIGNAL(clicked(),this,SLOT(clickYkuohao(); / ) connect(ui-action_Ke_xue,SIGNAL(triggered(),this,SLOT(clickSwitch(); /动作 科学型 connect(ui-action_History,SIGNAL(triggered(),this,SLOT(clickHistory(); /动作 历史 connect(ui-action_Simple,SIGNAL(triggered(),this,SLOT(clickSimple(); /动作 简单 connect(ui-action_Expression,SIGNAL(triggered(),this,SLOT(clickExpression(); /多元表达式 connect(ui-action_unary,SIGNAL(triggered(),this,SLOT(clickunary(); /一元顺序运算 connect(ui-btnSinh,SIGNAL(clicked(),this,SLOT(clickSinh(); / Sinh connect(ui-btnCosh,SIGNAL(clicked(),this,SLOT(clickCosh(); / Cosh connect(ui-btnTanh,SIGNAL(clicked(),this,SLOT(clickTanh(); / Tanh connect(ui-btnCoth,SIGNAL(clicked(),this,SLOT(clickCoth(); / Coth connect(ui-btnQ_zhishu,SIGNAL(clicked(),this,SLOT(clickQ_zhishu(); / a*b 功能键的实现 接下来,对部分重要的槽函数进行说明。首先,由于本课题的方向行,所以,在实现科学型计算器前,我们必须弄得一般计算器Btn键的工作原理,而这部分,在Qt事例中用详细的说明,这里我们就不必指出。考虑到表达式和简单的区别,我们分两种情况进行编写。当然,在后续的函数中,这种分别讨论的情况是经常出现的,这也从侧面说明了bool Jing_zhan_unary,Jing_zhan_Expression的重要性。具体代码如下:void calculate:clickbtn(QString btn) if(Jing_zhan_unary=true) clickSifirla(); if(Jing_zhan_Bian_lian=true) ui-LineEdit1-setText(); Jing_zhan_Bian_lian=false; if(zeroBian_lian=true) ui-LineEdit1-setText(btn); else qian_= ui-LineEdit1-text(); qian_.append(btn); ui-LineEdit1-setText(qian_); zeroBian_lian=false; safetyJing_zhan_=false; else if(Jing_zhan_Expression=true) if(mu_qianEql=true) ui-LineEdit1-setText(); clickSifirla(); qian_= ui-LineEdit1-text(); qian_.append(btn); ui-LineEdit1-setText(qian_); 而一般的数字键,只需调用此槽函数即可,如下所示:void calculate:clickbtn1() clickbtn(1); 当然,由于0变量的特殊性,所以,需要对其添加额外的约束才能实现,代码如下:void calculate:clickbtn0() clickSifirla(); if(Jing_zhan_unary=true) if(Jing_zhan_Bian_lian=true) ui-LineEdit1-setText(); Jing_zhan_Bian_lian=false; if(ui-LineEdit1-text()=) ui-LineEdit1-setText(0); zeroBian_lian=true; else if(zeroBian_lian=false) qian_=ui-LineEdit1-text(); qian_.append(0); ui-LineEdit1-setText(qian_); safetyJing_zhan_=false; else if(Jing_zhan_Expression=true) clickbtn(0); 说完计算器Btn键的功能实现,接下来,对于任何计算器,其“”键无意是对计算器功能的实现的直接展示。对于一般的简单计算器,由于有Math.h的支持,实现起来较为容易,但是,对于表达式计算器,这就是对我们整个程序逻辑关系的真确与否的直接表现,可想其重要性。具体代码如下:void calculate:clickEql() if(Jing_zhan_unary=true) if(mu_qianEql=false) clickJing_zhan_(); safetyJing_zhan_=false; Jing_zhan_Bian_lian=true; pointBian_lian=false; first_shu=true; Jing_zhan_=; else if(Jing_zhan_Expression=true) mu_qianEql=true; qian_= ui-LineEdit1-text(); qian_.append(=); ui-LineEdit1-setText(qian_); clickJing_zhan_(); 可能大家看到这里会觉得这不算什么,其实不然,因为大多数程序都被封装在void clickJing_zhan_()函数中。接下来,我们将进入本程序的核心代码中,由于代码过长,考虑到简单计算器运算实现的简单性,我们只列举出如下关于表达式部分的代码(void clickJing_zhan_()中)。else if(Jing_zhan_Expression=true) if(ZkuohaoCounter!=YkuohaoCounter) qDebug(错误); else backuptext=ui-LineEdit1-text(); ui-texthistory-insertPlainText(QString:number(history_Counter)+ - +backuptext); for(int triCounter=0;triCounterbackuptext.size();triCounter+) backuptext.replace(QString(arcsin),QString(?); backuptext.replace(QString(arccos),QString(&); backuptext.replace(QString(arctan),QString(); backuptext.replace(QString(sinh),QString(e); backuptext.replace(QString(cosh),QString(r); backuptext.replace(QString(tanh),QString(t); backuptext.replace(QString(coth),QString(y); backuptext.replace(QString(sin),QString(); backuptext.replace(QString(cos),QString(); backuptext.replace(QString(tan),QString(); backuptext.replace(QString(cot),QString(); backuptext.replace(QString(log),QString(|); backuptext.replace(QString(ln),QString(|); backuptext.replace(QString(mod),QString(*); backuptextBas=backuptext; backuptextSon=backuptext; int Counter=0; /计数器 while(CounterJing_zhan_Counter) int size=backuptext.size(); yer=backuptext.indexOf(ArrayJing_zhan_sign.value(Counter); ArrayyeIsaret=backuptext.at(yer); backuptextBas.remove(yer,size-1); backuptextSon.remove(0,yer+1); Array.append(backuptextBas); Array.append(ArrayyeIsaret); backuptext=backuptextSon; backuptextBas=backuptextSon; Counter=Counter+1; int yerEql=backuptextSon.indexOf(=); backuptextSon.remove(yerEql,yerEql); Array.append(backuptextSon); Array.append(=); qDebug()Array; if(kuohaoBian_lian=true) while(Array.contains()=true) int ZkuohaoYer=Array.lastIndexOf(); int YkuohaoYer=Array.indexOf(),ZkuohaoYer); for(int kopyaCounter=ZkuohaoYer+1;kopyaCounter=YkuohaoYer;kopyaCounter+) Arraykuohao.append(Array.value(kopyaCounter); clickJing_zhan_2(Arraykuohao,); Array.replace(ZkuohaoYer,QString:number(Results); for(int i=ZkuohaoYer+1;i=YkuohaoYer;i+) int i2=ZkuohaoYer+1; Array.removeAt(i2); if(Array.value(ZkuohaoYer-1)=) Array.removeAt(ZkuohaoYer-1); Array.removeAt(ZkuohaoYer); Arraykuohao.clear(); kuohaoBian_lian=false; clickJing_zhan_2(Array,=); 以上程序具体只是为我们开辟了表达式计算器实现的可能,具体的计算实现过程封装在void clickJing_zhan_2()中,这里就不指出,详细过程见附录。最后,出于对本设计科学方面计算实现说明的目的,我们举出了程序中,在这部分中最为核心的代码,也就是在进行表达式计算时,调用的函数void clickTrigJing_zhan_IO() 如下:void calculate:clickTrigJing_zhan_IO(QStringList &ArrayPro,bool &trigBian_lian,QString Jing_zhan_,QString Jing_zhan_sign) if(Jing_zhan_Expression=true) if(trigBian_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论