可视化程序编程环境实验.docx
- 文档编号:11956988
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:20
- 大小:128.37KB
可视化程序编程环境实验.docx
《可视化程序编程环境实验.docx》由会员分享,可在线阅读,更多相关《可视化程序编程环境实验.docx(20页珍藏版)》请在冰豆网上搜索。
可视化程序编程环境实验
《可视化程序编程环境》
实验报告
项目名称科学计算器的设计与实现
学院计算机学院
专业班级软件工程0603
学号3206007036
姓名莫燕嫦
指导教师黄益民
2008年12月31日
广东工业大学课程设计任务书
题目名称
一个简单计算器的设计
学生学院
计算机学院
专业班级
软件工程0603
姓名
莫燕嫦
学号
3206007036
一、课程设计的内容
系统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境VisualC++,并在此环境下设计并实现一个简单计算器系统,该计算器应能实现如下功能:
1、二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算
2、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运算
3、以角度、弧度两种方式实现上述部分函数
4、具备历史计算的记忆功能
5、对不正确的表达式能指出其错误原因
要求整理上机步骤、完成实验报告、提交可运行的程序,给出实验数据和实验结果。
二、课程设计的要求与数据
1、能独立搭建可视化程序编程环境,掌握VisualC++6的安装、运行和使用。
2、总体要求:
用面向对象编程的思想与方法,实现一个简单计算器的分析与设计阶段的开发工作,开发工具使用VisualC++6。
3、具体要求:
本系统为简单计算器程序开发,实现基本的算术运算以及科学计算,具备计算历史的查询功能,并能检查算术表达式中的错误,分别以二进制、十进制等数制的计算。
4、编写设计方案,设计过程,源程序文件结构,分析实验方案,并对实验做出总结。
三、课程设计应完成的工作
学习面向对象程序设计,学习可视化编程环境的应用。
系统分析、系统设计、编程、调试、功能测试、系统测试、编写实验报告。
四、课程设计进程安排
序号
设计各阶段内容
地点
起止日期
1
学习C++,逐步熟悉VC++编程环境,掌握利用VC++6.0进行面向对象程序设计的基本方法。
教室上课及课后自学
7~10周
2
对系统进行概要设计。
运用VC++向导创建对话框程序,根据要求,初步设计简单计算器的界面。
学生宿舍
11周
3
学习消息映射方法,对系统进行详细设计。
学生宿舍
12、13周
4
为计算器添加科学计算函数,以及进制转换等功能,注意程序的健壮性。
学生宿舍
14~16周
5
系统调试、功能测试、增加输入错误判断,进一步完善系统。
工学1号馆4楼软件实验室415
17周
6
系统测试及完善,整理代码和测试数据,编写实验报告。
工学1号馆4楼软件实验室415
17周
7
提交源代码、可执行程序、电子和纸质实验报告
工学1号馆623
18周
五、应收集的资料及主要参考文献
实验教材:
郑阿奇主编.VisualC++教程.北京:
机械工业出版社,2005.3
实验参考书:
1)陈维兴等编著.C++面向对象程序设计教程上机指导.北京:
清华大学出版社,2001.
2)郑莉编著.C++语言程序设计(含实验指导书).北京:
清华大学出版社,2001.6
3)戴锋编著.VisualC++程序设计基础.北京:
清华大学出版社,2001.4
4)龚沛曾等编著.C/C++程序设计教程.北京:
高等出版社,2004.9
发出任务书日期:
2008年10月10日指导教师签名:
黄益民
计划完成日期:
2008年12月31日基层教学单位责任人签章:
主管院长签章:
一个简单计算器的设计
一、实验目的与要求:
(一)实验目的:
目标是使学生了解可视化程序设计语言的基础知识,掌握面向对象编程的分析设计方法,以及与面向对象技术相关的一些软件开发技术,掌握在VisualC++6环境下进行可视化程序设计技术。
通过实践具体的项目,为他们进一步开展相关领域的学习和科研打下良好的基础。
(二)实验要求:
1.二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算
2.科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行
3.以角度、弧度两种方式实现上述部分函数
4.具备历史计算的记忆功能
5.对不正确的表达式能指出其错误原因
6.整理上机步骤、完成实验报告、提交可运行的程序,给出实验数据和实验结果。
二、需求分析:
1.程序主要实现数字科学计算的功能,以及二进制、八进制、十进制及十六进制数之间的转换和历史记忆等功能;
2.本程序运行的硬件环境:
P42.0/512M/以上;
软件环境:
Windows操作系统,VisualC++6
3.本程序由一个主程序CalculatorDlg及其子程序Calculation、Calculator、CFUNC、CNUM、COP、StdAfx构成;
4.本程序由用户通过鼠标或键盘交互的方式执行,并可对键盘中的字母键进行屏蔽。
5.用户界面如下:
三、系统设计
1、总体设计方案
(1)用MFCAppWizard(exe)创建一个基于对话框应用程序框架。
在ResourceView文件窗口中的主对话框资源IDD_CALCULATOR_DIALOG,利用控件工具栏添加各类按钮控件设计界面。
该计算器由四个对话框组成,一个为主对话框即计算对话框,一个为函数对话框,一个是数字对话框,另一个是操作符对话框。
计算基本操作用按钮实现,改变其ID的值即可。
在该计算器中一共有六个类,除CcalculatorApp每个类的主要功能如下:
CCalculatorDlg是计算器的主要界面,它用来调用管理按键资源CCalculation是计算表达式的算法类,是该计算器的内核部分。
CFUN类主要用来控制函数按键及其资源。
CNUM类用来控制数字按键
CCOP类用来控制操作符按键
(2)按钮控件的消息和消息映射处理:
在CalculatorDlg.cpp:
implementationfile文件中的
BEGIN_MESSAGE_MAP(CCalculatorDlg,CDialog)处添加宏映射定义,在该程序中使用它进行按键消息处理,故在CCalculatorDlg类用了以下消息映射进行消息响应处理。
(3)对各消息处理函数实现功能:
A、数字按钮函数:
1)利用宏映射定义,很容易就可以实现对数字键的消息映射处理,通过获取按钮的ID号,然后就可以在按数字按钮的的时候将按钮上的数字显示到显示框上。
B、操作符按钮操作函数:
1)基本运算符操作主要有:
加(+)、减(—)、乘(*)、除(/)、平方(x^2)、倒数(1/x)、求余(%)。
2)科学计算运算符操作主要有:
正弦(Sin)、余弦(Cos)、正切(Tan)、余切(Cot)、反正弦(Sin-1)、反余弦(Cos-1)、反正切(Tan-1)、反余切(Cot-1)、开方(Sqrt)、指数(log和ln)、e^x(exp)。
科学计算主要是调用math.h库函数里的现成函数就可以实现
C、数字进制函数:
voidCCalculatorDlg:
:
OnBtnConvert()数字进制有四种:
十六进展、十进制、八进制、二进制。
还有两种实现科学计算函数的方式选择:
角度和弧度。
D、运算处理函数:
voidCCalculatorDlg:
:
OnOK()实现了对待计算的表达式是否合法的检查并反馈出错信息,对各种进制的计算和转换,并对计算的结果进行优化和科学计数法。
运算过程中要对一些函数进行报错处理,比如倒数(1/x)的时候,x为0是就要报错。
E、历史计算的记忆功能函数:
voidCCalculatorDlg:
:
OnBtnHistrexp()
2、详细设计
四则运算函数的实现过程:
boolCCalculation:
:
IsDigital(CStringstr)//判断表达式中是否有函数或运算符
{
while(str.GetAt(0)=='-')str.Delete(0);
for(inti=0;i =-1)return0; for(i=0;i<6;i++)if(str.Find(opt2[i])! =-1)return0; return1; } voidCCalculation: : MultiE(CString*strExp)//多元运算 { if(strExp->IsEmpty())*strExp="ERROR_函数表达式为空_"; if(IsDigital(*strExp)){return;} while (1)/*处理所有的一元运算*/ { for(inti=0;i { intpos=strExp->Find(opt[i]); if(pos! =-1) { CStringstr=strExp->Right(strExp->GetLength()-pos-opt[i].GetLength()); doubledx=StoN(str); if(m_strTmp==str){*strExp="ERROR"+str+"_无法识别的函数_";return;} strExp->Delete(pos,strExp->GetLength()-pos); *strExp+=SingleE(opt[i],dx)+m_strTmp; MinusMinus(strExp); if(pos>=1) { charch=strExp->GetAt(pos-1); if(ch>=48&&ch<=57) {*strExp="ERROR_缺少二元运算符_";return;} } break; } } if(i==FUNCNUM)break; } //按运算符优先级处理二元运算 intpos=-1; while (1) { pos=strExp->Find('^'); if(pos==-1)break; elseCalcu(strExp,pos); } while (1) { pos=strExp->Find('/'); if(pos==-1)break; elseCalcu(strExp,pos); } while (1) { pos=strExp->Find('*'); if(pos==-1)break; elseCalcu(strExp,pos); } while (1) { pos=strExp->Find('%'); if(pos==-1)break; elseCalcu(strExp,pos); } pos=0; if(strExp->GetAt(0)=='-'||strExp->GetAt(0)=='+')strExp->Insert(0,"0"); while (1) { inttmpos=strExp->Right(strExp->GetLength()-pos).Find('-'); if(tmpos==-1)break; elsepos+=tmpos; if(pos==0&&strExp->GetAt(pos+1)=='-'||pos>0) { if(strExp->GetAt(pos+1)=='+') { strExp->Delete(pos+1); pos=0; continue; } /*********处理连减(如: ----1)的情况***********/ intnCount=0; while (1) { if(++pos>0) { if(strExp->GetAt(pos)! ='-')break; elsenCount++; } elsebreak; } if(nCount>0) { strExp->Delete(pos-nCount-1,nCount+1); if(nCount%2==0)strExp->Insert(pos-nCount-1,"-"); elseif(pos-nCount-1>0)strExp->Insert(pos-nCount-1,"+"); pos=0; continue; } elsepos--; /***********************************************/ if(pos>0&&strExp->GetAt(pos-1)=='+') { pos++; continue; } Calcu(strExp,pos); } elsepos++; } pos=0; while (1) { pos=strExp->Find('+'); if(pos==-1)break; if(pos==0&&strExp->GetAt(pos+1)=='+'||pos>0) { /*********处理连加(如: ++++1)的情况***********/ intnCount=0; while (1) { if(++pos>0) { if(strExp->GetAt(pos)! ='+')break; elsenCount++; } elsebreak; } if(nCount>0) { strExp->Delete(pos-nCount-1,nCount+1); strExp->Insert(pos-nCount-1,"+"); pos=0; continue; } elsepos--; /***********************************************/ Calcu(strExp,pos); } elsepos++; } } voidCCalculation: : Calcu(CString*strExp,intpos)//判断表达式是否合法 { charch; for(intj=pos-1;j>=0;j--) { ch=strExp->GetAt(j); if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='^') { if(j==0&&ch! ='-'){*strExp="ERROR_缺少参数_";return;} if(j==0&&ch=='-')j=-1;//防止把负号误判为减号 elseif(j>0&&ch=='-'&&! IsDigital(strExp->Mid(j-1,1)))j--; break; } } for(intk=pos+1;k { ch=strExp->GetAt(k); if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='^') { if(ch=='-'&&k>pos+1)break; if(ch=='-'&&k>0&&IsDigital(strExp->Mid(k+1,1)))k++; elsebreak; } } CStringstrExp2=strExp->Mid(j+1,k-j-1); *strExp=strExp->Left(j+1)+TwoE(strExp2)+strExp->Right(strExp->GetLength()-k); if(strExp->Find("#IN")! =-1){*strExp="ERROR_结果有溢出或值域越界_";return;} if(! SynRes(strExp)){*strExp="ERROR_缺少运算符_";return;} MinusMinus(strExp); } CStringCCalculation: : MainPro(CStringstrExp)//主处理函数 { if(strExp.IsEmpty())return"表达式不能为空"; Macro(&strExp); strExp.MakeLower();//表达式全部小写 /**********给表达式加上保护括号************/ strExp.Insert(0,"("); strExp+=")"; /******************************************/ intpos=strExp.Find(""); intn=BraCheck(strExp); CStringstr; str.Format("%d",abs(n)); if(n==1)strExp+=")"; elseif(n==-1)strExp.Insert(0,"("); elseif(n>0)return"缺少"+str+"个右括号"; elseif(n<0)return"缺少"+str+"个左括号"; while(pos! =-1)//去掉表达式中的空格符 { strExp.Delete(pos); pos=strExp.Find(""); } 四、运行结果和测试 1、完成的实用计算器,在计算之前要进行相应的角度或弧度的选择,实验实现了复杂的四则运算及及其它进制的简单运算: 例如输入: (18-5)*2+9/3结果为29.00000000000000 转换成二进制、八进制、十六进制结果分别为: 11101、35、1d 2、在该计算器中实现了输入语法检错,函数范围判断的出错处理功能,它在运行结果处给出错误原因,便于用户纠正。 例如: 当两个数之间缺少运算符时: 当除数为0时: 五、结论与体会: 在做这个课程设计之前,我虽然学过C++语言,但对VisualC++的设计还很陌生,本次的课程设计实验,虽然是设计一个简单的计算器,能实现基本的四则运算,科学计算,进制转换,角度换算,具有历史计算的记忆功能,报错提示等,但对于初学者来说还是比较有难度的。 刚开始设计的时候,遇到很多很多困难,书本上的东西有很多搞不懂的地方,运用课本知识到现实应用中不太理想,但是,通过请教同学,上网查资料,慢慢搞懂了书本知识。 在初用VisualC++6.0的过程中,对整个平台都不了解,但经过找资料,看视频,查找MSDN,请教一些比我早学的同学,慢慢地了解和熟悉了。 MFC的用户界面特别吸引人,而且消息处理函数多而复杂,不了解就很容易出错。 不过通过同学和网络的帮助下,经过不断的调试和改进,自己也对此加深了认识和理解。 通过这一周多的时间设计这个计算器,我提高了自己的编程动手能力和对VisualC++的进一步深入了解,同时也能和周围的同学交流学习,不断的提高自己。 在课程设计过程中,我发觉自己的缺乏了很多关系编程方面的知识,渐渐体会到能力不足所给自己带来的困扰,在以后的课程学习中,我一定要利用好课外空余时间好好学习编程方面的知识来弥补自己的不足,为以后的学习打下坚实的基础。 六、问题与讨论: 1.怎么样利用VC++集成开发环境进行C++程序的书写? 答: 用户只需在打开的VC界面上单击VC的菜单FILE—》NEW—》选择Win32ConsoleApplication,输入工程名,点击OK选择建立一个空的工程,然后再通过FILE菜单在弹出的对话框中选择C++SourceFile输入文件名即可进行C++程序的书写。 2.C++程序对C程序进行了哪些扩充与修改? 答: 1、C++用标准输入输出的头文件iostream.h替代了C语言的stdio.h,用cin、cout和操作运算符>>、<<等实现并扩展了C语言的scanf和printf函数的功能。 2、C++关键字由C语言的32个增加到46个; 3、C++的注释在C语言的/*……*/基础上增加了//开头的行注释; 4、C++基本数据类型增加了一个布尔型(bool); 5、C++增加支持面向对象的Class(类)数据类型; 6、C++增加模板库类型和名字空间; 3.如何根据软件开发需要创建类? 这些类的层次具有什么关系? 答: 用户可以得用微软提供的MFC类库进行软件开发,在MFC中封装了大量的类库供用户使用,从而使代码重用,缩短了软件的开发时间和开发周期。 这些类中出现了大量的派生关系和继承关系,类与类之间的相互调用,互相帮助关系。 4.如何建立类的属性成员、方法成员? 如何确定成员私有、公有或继续关系? 答: 类有三种属性,即private,protect,public,为类建立属性成员只需在类的声明中根据你的需要加入属性成员,选择三种属性中的一个,对于方法成员,则需要给出函数的声明及属性。 类的三种属性的使用方法各不相同,将成员声明为private表示该成员只能由该类的成员函数访问,其它对象无权访问,显示了类的数据封装性。 声明为protect属性则一般用于该成员可以给该类的派生类访问,public属性则表示该属性作为该类的一个对外接口,可以供该类以外的成员进行访问。 5.对比实验2与实验3,控制台程序与MFC在编程上有何区别? 答: 控制台程序是面向过程的编程,而MFC是面向对象的编程;这两者有很大的区别,首先,控制台程序是与DOS环境下相似的环境,但它比DOS环境下强一些,它基于面向过程设计,可视化程度不高。 MFC编程基于面向对象编程,可视化程度高。 其次,两者虽然使用的都是C++语言进行程序的编写,但控制台程序使用的是纯正的C++,而MFC则是使用了大量由API函数封装好的MFC类库进行程序编写。 6.在MFC程序中如何根据软件需要定制类? 答: 按软件需要划分为功能独立的几个部分,分别建类! MFC提供了三种软件开发类,基于单文档,多文档和对话框应用程序,用户可以根据需要通过VC++的classwizard进行适当的选择 7.模态对话框窗口与非模态对话框窗口有何不同? 答: 非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。 模态对话框以一种排它的方式工作,当模态对话框出现时,虽然用户可以看到应用程序的其他界面对象(如菜单,工具栏等),但必须关闭模态对话框后才能对他们进行操作。 而非模态对话框则以非排它的方式工作,非
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可视化 程序 编程 环境 实验