首页 [整理版]VC 多功效计算器

[整理版]VC 多功效计算器

举报
开通vip

[整理版]VC 多功效计算器[整理版]VC 多功效计算器 多功能计算器 1、课程设计的目的 本课程设计以《VC++程序设计》课程为基础,目的是进一步培养学生综合应用VC++的各种编程知识和技巧进行程序设计的能力,最终掌握面向对象的编程技术。通过本次课程设计,学生应能达到具备设计功能较为复杂的Windows应用程序的能力,同时培养学生自主学习和独立创新的精神。 系统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境Visual C++,加深对面向对象编程的思想的认识。能够独立的完成一个简单的编程,实现一个简单计算器的编程和应用...

[整理版]VC     多功效计算器
[整理版]VC 多功效计算器 多功能计算器 1、课程设计的目的 本课程设计以《VC++程序设计》课程为基础,目的是进一步培养学生综合应用VC++的各种编程知识和技巧进行程序设计的能力,最终掌握面向对象的编程技术。通过本次课程设计,学生应能达到具备设计功能较为复杂的Windows应用程序的能力,同时培养学生自主学习和独立创新的精神。 系统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境Visual C++,加深对面向对象编程的思想的认识。能够独立的完成一个简单的编程,实现一个简单计算器的编程和应用,从而更深入的了解Visual C++的工作原理。 2、功能描述 在Visual C++环境下设计并实现一个简单计算器系统,该计算器应能实现如下功能: 1)、二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算 2)、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函 数运算 3)、以角度、弧度两种方式实现上述部分函数 4)、具备历史计算的记忆功能 5)、对不正确的表达式能指出其错误原因 3、案论论证 3.1、可行性分析 本设计是简单计算器。日常计算机使用中,常常涉及到一些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需要空间资源较少,对电脑其他程序的应用影响较小。它的设计按软件 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 的方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美观的软件封面。使用人员能快捷简单地进行操作。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助 3.2、需求分析 本软件主要用于计算机windows 2000/XP以上版本的用户的使用,这次课程设计一般是实现简单计算器的功能。要程序能实现:加,减,乘,除,开方,倒数等运算功能;还要实现数据的输入,输出,计算,显示及程序退出等功能。另外还可以实现多种科学 计算的功能,如:三角函数的计算,弧度与角度间的转换,对数指数的计算等等。 3.3、总体 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 设计 (1)功能框架 图1 功能框架图 (2)主要功能原理: ?正弦、余弦、正切、余切函数: 制度 关于办公室下班关闭电源制度矿山事故隐患举报和奖励制度制度下载人事管理制度doc盘点制度下载 的选择,程序运行默认制度选中角度,当选项中“角度”按钮时,则需将其转换为角度计算,由公式:弧度,PI*角度,180,可将表达式中角度转换为弧度既s[ll-1]=PI*s[ll-1]/180。对于反、正余弦和反正余切,由于C++math.h库函数提供的计算结果是弧度的,所以当选中默认的“弧度”按钮时可不必将计算结果转换,当选中“角度”按钮时,则由公式:角度=弧度*180/PI,既可计算出来。 ?实现进制间浮点数的转换 对不同进制的输入,将其转换为十进制数后出入,显示时转换为所选择的进行输出。 所以进制间的转换输出,其实只是将已存的那个十进制数转换为其他进制输出。 ?历史计算的记忆功能 对(和),使用一个运算符栈和一个操作数栈存储。按(时,进栈保存;按)时,出栈运算。 对MC、MR、MS、M+,使用一个浮点数存储中间值,MC为将其清零,MR为读取其值,MS为保存、M+为在原有值的基础上加当前值。 3.4、详细设计 (1)进行开始编程前的数据结构分析: double m_mem; //中间值 bool m_IsHudu; //弧度、角度判断 void init(); CRect rectSmall; CRect rectLarge; double base; //进制基数 double m_operand; //存储当前输入的操作数 double m_accum; //存储当前的计算处理结果 bool m_bCoff; //表示当前输入是否是小数 double m_coff; //小数输入是的系数 Operator m_operator; //当前运算符 CalcError m_errorState; //当前运算状态 bool m_bOperandAvail; //表示当前是否是新输入数字 (2)界面设计,将要实现的按键添加入: (3)添加按键函数: void CCalculatorDlg::OnAdd() // 加 void CCalculatorDlg::OnAddMi() // +/- void CCalculatorDlg::OnBackspace() // Backspace void CCalculatorDlg::OnClear() // 清除 void CCalculatorDlg::OnClearE() // 清除当前 void CCalculatorDlg::OnDivid() // 除 void CCalculatorDlg::OnEqual() // 等于 void CCalculatorDlg::OnMimus() // 减 void CCalculatorDlg::OnMod() // 取模 void CCalculatorDlg::OnMultiply() // 乘 void CCalculatorDlg::OnPoint() // 小数点 void CCalculatorDlg::OnX2() // 平方 void CCalculatorDlg::OnSin() //sin函数 void CCalculatorDlg::OnTan() // tan函数 void CCalculatorDlg::OnMs() //覆盖记忆 void CCalculatorDlg::OnMr() //读记忆 void CCalculatorDlg::OnMc() //清零记忆 void CCalculatorDlg::OnMadd() //增加记忆 void CCalculatorDlg::OnLog() //log函数 void CCalculatorDlg::OnLn() //ln函数 void CCalculatorDlg::OnCot() //cot函数 void CCalculatorDlg::OnCos() //cos函数 void CCalculatorDlg::OnSqrt() //开方 void CCalculatorDlg::OnXy() //X的Y次方 等等… (4)完善功能: 增加如下函数实现进制转换: char change(int a) //将整数转换为字符 { if(a < 10) return '0'+a; else return 'A'+a-10; } CString ToCString(int base, double m_operand) //将double(根据基数base)转换为 CString { CString temp = "", temp2; if(m_operand == 0) return "0"; __int64 operand = (__int64)m_operand; m_operand = m_operand - operand; //整数部分 while(operand){ temp2.Format("%c", change((int)(operand%base))); temp = temp2 + temp; operand /= base; } temp = temp + "."; //小数部分 while(m_operand > 10e-10){ m_operand *= base; operand = (__int64)m_operand; temp2.Format("%c", change((int)operand)); temp = temp + temp2; m_operand = m_operand - operand; } return temp; } double change2(char a) //将字符转换为浮点数 { if(a >= '0' && a <= '9') return (double) (a - '0'); else return (double) (a - 'A'); } double ToDouble(double base, CString str, int &k) //将CString(根据基数base)转换为 double //k为标志是否删除了小数点 { double num = 0.0; double temp = 1.0/base; int len = str.GetLength(), i = 0; k = 0; //整数部分 while(i < len){ if(str.GetAt(i) == '.') break; num = num*base + change2(str.GetAt(i)); i++; } i++; if(i >= len) k = 1; //小数部分 while(i < len){ num = num + change2(str.GetAt(i)) * temp; temp *= 1.0/base; i++; } return num; } 加入出错处理: if(m_errorState != ErrNone){ if(m_errorState == ErrDivideByZero) m_Edit = "除数不能为零"; else if(m_errorState == ErrModFloat) m_Edit = "浮点数不能取mod"; else if(m_errorState == ErrTanMax) m_Edit = "tan为无穷大"; else if(m_errorState == ErrCotMin) m_Edit = "cot为无穷大"; else if(m_errorState == ErrLogSign) m_Edit = "不可以对负数取对数"; } (5)增加方便用户功能: 加入加速键: 图2 增加控件图 4、运行结果 (1)基本计算器的运行效果如图3所示 图3 基本计算器的运行图 (2)科学计算器的运行效果如图4所示 图4 科学计算器运行效果图 (3)不可以对浮点数进行取模运算,例如9.2 mod 9.2=?。运行结果如图5所示 图5 浮点数不能取摸示意图 (4)不可以对90度角进行正切操作。Tan 90=?。运行结果如图6所示。 图6 90度角不能进行正切操作示意图 (5)不可以对0度角进行取余切操作。Cot0=,。运行结果如图7所示 图7 0度角不能取余示意图 (6)不可以对负数求对数。例如Ln -9=?。运行结果如图8所示 图8 对数不可求对数示意图 (7)不可以对负数进行开方。运行结果如图9所示 图9 负数不能开方示意图 5、心得体会 C++是一种面对对象的编程语言,它跟我们大一学习的面向过程语言C++有很大的不同。在C语言中完全没有类这个概念,平时用的最多的就是数组和结构体。但面向对象的语言就不同了,在软件的开发过程中,我们可以通过编写各种各样不同功能的类去实现我们所想要的功能。而且我们还可以把这些类保存起来,这样,当我们以后要用到 的时候把它加入到工程里面就可以用了。而且,对于以前的一些类,加入它有一些功能我们想拿来用,但是又想在此基础上增加一些新的功能,这怎么办呢,我们可以通过重载这个类,然后加入我们想要的东西,那么在软件开发功能中就可以节省很多的时间,提高软件开发的效率。 刚看到这个课程设计题目的时候,我认为要实现起来并不难。但当我开始做的时候,发现这远没有我想的那么简单,反而是越做越难。这并不是摆一些控件,添加响应就可以实现的了。就拿最简单的加、减、乘、除来说吧。在进行设计的时候,我除了要实现基本的两个数进行简单的四则运算外,还要实现他们连加、连减等。对于除法还要考虑除数不能为零这种情况。在进行科学计算这些功能设计的时候,我发现用常规的方法并不能满足我的要求。为了判断一个表达式的正误还有运算的优先级,我必须用到一个堆栈。为了实现堆栈这个数据结构,我花了不少时间在上面。而对于个别的功能,我是手工写出函数处理的。 在此次实验,我掌握面向对象技术相关的一些软件开发技术。利用MFC类库开发Windows应用程序,消息映射是如何工作的。代码编写能力又有了进一步的提高。 参考文献 [1] 刘於勋等.C++程序设计. [M].科学出版社,2007 [2] 荣钦科技.Visual C++游戏编程基础. [M].电子工业出版社,2004 [3] 揣锦华.面向对象程序设计与VC++实践. [M].西安电子科技大学出版社,2005 [4] 罗伟坚.Visual C++经典游戏程序设计. [M].人民邮电出版社,2006 [5]《Visual C ++ 程序设计—基础与实例分析》,朱晴婷,黄海鹰,陈莲君,[M].清华大学出版社 [6]《Visual C++面向对象与可视化程序设计(第2版)》,黄维通,[M].清华大学出版社 [7] 刘振安、刘燕君、孙忱,《C++语言课程设计》,[M].机械工业出版社,2007年 [8] 严华峰. Visual C++课程设计案例精编. [M].北京:中国水利水电出版社,2002 [9] 张宏军,党留群,赵天巨(Visual C++ 6.0编程案例精解([M].北京:电子工业出版社,2005 附录: 部分程序源代码 //stack.h标准的堆栈模板程序(头文件) #if !defined(STACK_H) #define STACK_h #include #include using namespace std; const int MaxStackSize=50; template class Stack { private: T stacklist[MaxStackSize]; //堆栈的最大尺寸 int top; public: Stack(); void Push(const T& item); //压栈 T Pop(); //出栈 void ClearStack(); //清空堆栈 T Peek() const; //输出堆栈顶部元素(计算结果) int StackEmpty() const; //判断堆栈是否为空 int StackFull() const; //判断堆栈是否已满 }; //构造函数,将top置-1 template Stack::Stack(): top(-1){} //压栈 template void Stack::Push(const T& item) { if (StackFull()) //判断堆栈是否已满 { cerr<<"Stack overflow!"< T Stack::Pop() { T temp; //判断是否为空栈 if(StackEmpty()) { cerr<<"Attempt to pop an empty stack!"< void Stack::ClearStack() { top=-1; } //返回栈顶元素 template T Stack::Peek() const { if(top==-1) //判断top是否有效 { cerr<<"attempt to peek at an empty stack!"< int Stack::StackEmpty() const { return top==-1; } //判断堆栈是否已满 template int Stack::StackFull() const { return top==MaxStackSize-1; } #endif //calculator.h计算器模板类的头文件 } //四则运算函数 template void Calcualator::Run(void) { cout<<"输入要进行的四则运算(后缀法):\n"; char c; T newoperand; while (cin>>c,c!='=') { switch(c) { case '+': case '-': case '*': case '/': case '^': Compute1(c); break; default: //非运算符,则必为操作数,将字符送回 cin.putback(c); //读入操作数并将其存入栈中 cin>>newoperand; Enter(newoperand); break; } } //答案已在栈顶,用peek输出之 if (!S.StackEmpty()) cout<<"结果是:"< void Calcualator::Compute2(char d) { T data,N; cout<<"请输入角度"<>data; N=data*(PI/180); //把输入的角度转换成弧度 S.ClearStack(); cout<<" \n"; Enter(N); //将N存放到栈中 switch(d) { case 'T': S.Push(tan(N));//正切计算 break; case 'S': S.Push(sin(N));//正弦计算 break; case 'c': S.Push(cos(N));//余弦计算 break; default: S.ClearStack(); break; } f (!S.StackEmpty()) cout<<"结果是:"< void Calcualator::trangle(void) {int flag=0; char d do { flag=0; cout<<"#######################################"<>d; if(d!='T'&&d!='S'&&d!='c'&&d!='y')//判断选择代码的输入是否有误,输入错误时,重新输入 {cout<<" Error node,please choose again!"< void Calcualator::com(void) {Calcualator A; int d;char y; do { cout<<"#######################################"<>d; switch (d) { case 1: chengfang(A);//乘方的具体运算函数 break; case 2: kaifang(A);//开方的具体运算函数 break; case 3: jiecheng(A);//阶乘的具体运算函数 break; default: cout<<"Continue,………………(y or N)"<>y; }while(y=='y');//循环语句控制是否继续该类型的计算,否则进入主菜单 } template void Calcualator::Clear() { S.ClearStack(); } #endif //main.cpp源文件 #include "calculator.h" int main() { cout<<" Wellcome to calculator system! \n"; cout<<" \n"; char k; do {cout<<" *************************************************\n"; cout<<"* 请输入所选择的运算: **"<>h; Calcualator CALC; if(h=='k') CALC.com();//进入乘方开方阶乘运算 if(h=='a') CALC.Run();//进入普通四则运算 if(h=='s') CALC.trangle();//进入三角函数的运算 cout<<"进入主菜单?(y or N):"<>k; }while(k=='y'); return 0;
本文档为【[整理版]VC 多功效计算器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_842972
暂无简介~
格式:doc
大小:200KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-10-16
浏览量:32