资源描述
实 验 报 告
学生姓名:
学生学号:
实验起至日期:
指导教师:
科学计算器 实验报告内容
一.实验目的与要求
1、要求实现具有加,减,乘,除基本四则运算功能
2、要求能包含操作数(整形、浮点数)、操作符、优先级,实现基于括号的优先级控制
3、设计基于MFC框架的,具有友好界面的Windows应用程序
4、科学计算器要求具有科学函数计算功能,主要包括三角函数,根号等,如算式有错误提示和处理算式越复杂,得分越高。
二.设计思路(包括算法基本流程设计,程序接口设计)
1、获取用户通过键盘或者界面输入的表达式,记为总表达式
2、将总表达式中的所有常数符号代换为相应的字数字串
3、判断总表达式中括号是否匹配,如不匹配,反馈信息并则退出,否则进入步骤4)
4、找到处在总表达式最内部的括号对(按从里到外,从左到右的顺序),提取括号内的表达式,记为子表达式
5、计算子表达式中的所有单目运算符, 结果正确则将计算结果转换为字符串放回子表达式,否则输出错误信息并退出
6、计算子表达式中的所有双目运算符,结果正确则将计算结果转换为字符串放回子表达式,否则输出错误信息并退出
7、将子表达式的计算结果转换为字符串插入总表达式
8、判断当前总表达式是否为纯数值,如果不是纯数值则返回步骤4),否则将结果转换为字符串
9、输出字符串结果
另:本计算器可以算多个括号,但是不能算括号里嵌套括号的算式。在开方sqrt,倒数1/x和三角函数sin,cos,tan,cot计算时,如果需要计算一个算式的这些值,要加括号来实现。除了AC清除以外,还加了一个Backspace来删除前面一个输入的值,方便操作。
三.实验中遇到的问题现象与具体解决步骤
问题1:不知道如何实现小数点的功能
解决方法:在拆开运算符和操作数的时候,增加一个变量,就可以同时完成进位和小数,网上可以搜到很多类似的代码,可以借鉴。
问题2:原本想以自然的方式来实现开方,三角函数的功能,就是按这些按钮,然后就可以读入跟在他后面的数字,写好代码以后没有反应。
解决方法:参考windows自带的计算器,发现要先输入要计算的算式或者数字,再点函数的按键,传给这些函数参数,就修改了代码,实现变的容易多了。
问题3:一开始接触MFC计算器,根本无从下手,没有任何头绪,很多借来的书也看不懂。
解决方法:先建好界面,然后逐个按钮添加代码,有些代码通过看书上的例子以及上网搜索都可以得到。然后再与同学一起交流讨论,逐渐理清自己的思路,才开始做得比较顺利。
四.基本界面与操作方法说明
1. 数字,小数点,括号,+,-,*,/,按键只要按下,就会直接显示在编辑框里,按下等于,就可在编辑框里得到的结果。
2. Backspace用来删除输入错误的单个字符,AC清空整个对话框为0。
3. 计算开方,三角函数、倒数的时候,先输入要进行开方,自然对数,三角函数的数值或者算式(算式前后一定要加括号),然后再按相应按键,不需要按等于,即可得到结果,如果后面还有要算的式子,可以在得到结果后继续输入。
4. 该计算器还实现了报错功能,比如输入式子不正确,会弹出提示报错消息框,还考虑到了除数为0等情况。
5.在做完后为了独特美观,还自己做了图标。
五. 参考书目
1、《Visual C++.NET编程实例》 苏峰 黄金双 汤蕾编著 清华大学出版社
2、《C++技术内幕第四版》 潘爱民译 清华大学出版社
3、
4、 微软计算器
模板实现矩阵基本运算 实验报告内容
一.实验目的与要求
1.实现矩阵的“加”、“减”、“乘”、“转置” ;
2.内存动态分配并用随机数填充;
3.注意“加”、“减”、“乘” 要进行条件的判断;
4.进行int,double的选择;
二.设计思路(包括算法基本流程设计,程序接口设计)
1、用户输入行列数,并进行类型选择。
2、随机生成矩阵。
3、选择操作类型,转置只需要一个矩阵即可。其他操作需再生成一个矩阵。
4、如果矩阵不能进行运算(行列数不等等情况),利用try-catch语句弹出“Error!”的提示消息框。
三. 实验中遇到的问题现象与具体解决步骤
问题1:没有想到合适的变量保存矩阵
解决方法:类模板成员变量中声明T **matrix,即指向指针的指针,可以动态的保存矩阵。
问题2:用随机数产生矩阵的时候用rand(),发现每次运行程序产生的矩阵是相同的,就是产生的伪随机数。
解决方法:利用srand()函数,向里面传参数time(0),得到真正的随机矩阵。
问题3:不知道如何通过一个按钮产生矩阵到edit框里。
解决方法:直接在操作符的那些按钮上加代码,使得点击之后直接在result那个框里显示,减少麻烦。
问题4:矩阵输出的时候不是按行和列,只是一长串空格间隔的数字。
解决方法:老师上课演示时讲到“\r\n”语句可以换行,并且把edit框的属性需要设置成多行显示。
问题5:后来发现最简单的可以用类模板实现一系列加减乘等操作,但当时矩阵已经做完,于是又做了一个简单的,体验一下类模板。发现确实用类模板比较方便
解决方法:先建立一个矩阵的模板类,里面重载运算符+,-,*,实现矩阵的加减乘基本运算并判断加减乘的条件把自己定义的模板类Myjz.h加到juzhengDlg中,就可以运用这个模板类。以下以加法为例展示一下
四.基本界面与操作方法说明
该程序共分成三个功能框,矩阵1,矩阵2和最后的运算结果。
在矩阵1下面的框内输入行数row和列数column以及点击要产生的矩阵类型,再点击“随机矩阵生成”即可,矩阵2操作方法类似。
要进行的运算都在中间的功能框中,计算加减乘时,输入矩阵1和2,然后点要进行的运算即可在上面的编辑框中得到结果。转置只针对矩阵1。计算转置只需点击TransPose即可获得。
五. 参考书目
1、《Visual C++.NET编程实例》 苏峰 黄金双 汤蕾编著 清华大学出版社
2、《Visual C++.NET实例入门》 彭海河 李忠琪 姜志辉编著 海洋出版社
3、
六. 关键代码
#if !defined(AFX_MYJZ_H__7843512B_344B_464F_8ED3_1F409F25035E__INCLUDED_)
#define AFX_MYJZ_H__7843512B_344B_464F_8ED3_1F409F25035E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
template<typename T>
class CMyjz
{
public:
CMyjz();
virtual ~CMyjz();
void set(const int,const int);
void myrand();
CMyjz<T> plus(const CMyjz<T> &);
CMyjz<T> minus(const CMyjz<T> &);
CMyjz<T> mul(const CMyjz<T> &);
CString print();
private:
int row;
int col;
T **p;
};
#endif // !defined(AFX_MYJZ_H__7843512B_344B_464F_8ED3_1F409F25035E__INCLUDED_)
职工信息管理系统 实验报告内容
一. 实验目的与要求
该系统在磁盘上存贮某单位所有职工的基本信息,对于每一个职工存贮:职工编号、姓名、性别、出生年月、职称、最后学历,工资和婚否。
系统功能要求如下:
1.创建存贮该单位职工信息的存贮系统。(第一次输入职工基本信息时);
2.增加职工信息,增加新职工时辖人新职工的基本信息;
3.删除某职工的基本信息。(如,死亡或离职);
4.修改某职工(指定职工编号)的某些信息(如,加工资、获得新学位、晋升职称、结婚或离婚)。
5. 可以输出符合某种特征的职工信息列表:
*全体职工信息列表;
*某职称的职工信息列表;
*某年月以后出生的职工信息列表;
*某年月以前出生的职工信息列表;
*未婚职工信息列表。
二.设计思路(包括算法基本流程设计,程序接口设计)
1. 设计一个CStaff的员工类,包含变量工编号、姓名、性别、出生年月、职称、最后学历,工资和婚姻状况,派生自CObject类,并实现序列化操作。
2.
3. 设计七个对话框,并相应的建七个类,CAddstaffDlg,CChangeDlg,CDeletestaffDlg,CSelectzhichengDlg,CHunyinchaDlg,CDateDlg,CDate2Dlg分别实现添加员工,修改职工信息,删除职工信息,根据职称查找职工信息,根据婚姻状况查找职工信息,根据日期分别看该日期前以及该日期后的功能。
3. 在主菜单“操作”中的添加,修改,删除均为对文档数据的更改,所以三个函数都写在CP09013309_6Doc这个类里。在P09013309_6Doc这个类中,用到了MFC集合类,并定义了一个CStaff类型的指针,十分方便的对存入的数据进行添加,修改,删除的操作。
4. 所以与显示相关的,指定编号员工工资信息输出,和其他查询的所有信息的输出,都写在CP09013309_6View里。定义存储信息的链表数据结构,始终显示各项信息的项目名称,并添加OnUpdate函数,实时的显示更新信息。
三.实验中遇到的问题现象与具体解决步骤
问题1:不知道怎么点菜单,就可以弹出一个对话框
解决方法:最开始一直试着把对话框的ID和菜单上项目的ID连在一起,后来发现根本不需要这样麻烦。给菜单上ID添加一个Command函数,在里面定义这个对话框类型的对象,这个对象再调用DoModal函数,就会自动弹出一个对话框。
问题:2:不能显示出各项项目名称
解决方法:看老师传的课件里面,在CP09013309_6View这个类的PreCreateWindow这个函数中加一条语句“cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;”问题就解决了,通过上网查,知道这条语句的作用是设计输出的风格。
问题3:明明OnUpdate这个函数都加了,但还是不能实时更新数据
解决方法:在CP09013309_6Doc这个类里,在那些操作函数的末尾加一句
UpdateAllViews(NULL),问题就解决了。在我的实践中,试图在一个ID上添加两个不同类的函数,似乎是不可行的。
问题4:不能定义MFC集合类
解决方法:定义声明的时候不断报错,在StdAfx.h这个文件里include头文件<afxtempl.h>,才能够成功定义。
问题5:ComboBox怎样添加下拉条目
解决方法:看似复杂,实际上很简单。一开始是根据老师所提供的课件里面的操作步骤做的,但后来通过上网搜查,发现了一种更简单的方法:只要把ComboBox拉长,加数据加在属性的Data里,需要换行时用到Ctrl+Enter,最后即可显示。并且在我的实践中,同时用这两种办法也可以,但允许的时候下拉条里面每个数据都会显示两个,因为重复加了。
另外,有很重要的一点是下拉条会根据输入中文的首字母自动排序,一开始我忽略了这一点,运行的时候发现输入的信息都错位了,只能在到switch语句里面把几个case调整一下顺序,根据首字母排序就可以了。
问题6:在我的程序中,职工可修改的信息既有CString类型的,也有int类型的,但我设置修改的那个edit框是CString类型的,int类型的无法修改
解决方法:由于没有想到合适的方法,于是就那个唯一的一个int类型的单独放在外面,给用户提示,若要修改此信息,请输入XXXX。虽然有点不美观,但却是最简单的一种修改办法。
问题7:在题目的要求中,要显示“某年月以后出生的职工信息列表”以及“某年月以前出生的职工信息列表”,但我在一开始创建的时候就将出生年月那个edit框输入的数据设为CString类型,没有办法直接比较。
解决办法:通过上网查找和不断尝试,终于发现可以先把CString类型转化成COleDateTime类。先加头文件#include <afxdisp.h> ,然后在函数每次循环查找职工下面加入代码“COleDateTime temp;temp.ParseDateTime(m_date); ”这两行代码就可以把CString类型转化成COleDateTime类。然后再通过COleDateTimeSpan设置一个a来比较输入日期与员工出生年月:“COleDateTimeSpan datecha=pstaff->m_date-m_change;double a= datecha.GetTotalDays()”,这样只要将a与0比较,即可知道是在输入的日期前还是在输入的日期后了。
四. 基本界面与操作方法说明
1、 这是打开运行以后的界面
2、 点击“操作”下面的添加员工信息,就跳出添加员工信息的框
3、逐个输入并保存文档
4、 再重新运行打开文档
5、 进行修改以及删除操作
6、 查询(查询可按照职称,婚姻状况,以及根据你所选择的显示出“某年月以后出生的职工信息列表”以及“某年月以前出生的职工信息列表”)
五. 参考书目
1、
2、《Visual C++.NET编程实例》 苏峰 黄金双 汤蕾编著 清华大学出版社
3、《Visual C++.NET实例入门》 彭海河 李忠琪 姜志辉编著 海洋出版社
4、
六. 关键代码
七. MFC心得体会
其实在大一下半学期一开始的时候,真的是一头雾水,完全没有头绪。每次弄 完一个对话框的界面以后就开始发愣,不知道代码要加在哪边。但之后的半个学期加上短学期对MFC的学习,我对基于对话框和单文档的MFC程序都有了一定程度的了解。虽然在短学期开学一周以后我就住院开刀了,但在家里的时候也经常看相关书籍并且咨询同学,同学们的指导建议都十分中肯,等到我回来的时候编写第三个职工信息管理系统就感觉相对比较顺利,并且MFC本身带有很多封装好的类,调用十分方便,很少几行代码就可以展示出成熟的界面。如果不想让编写的出的程序界面古板单调,还可以在网上搜到把界面变的更美观舒适的办法。
而且,有了老师之前操作sportman的演示以及提供的课件,我们的工作量大大的减少了。但不得不说mfc很神奇,有时却又让人摸不到头脑,不知道为什么在一个意想不到的地方添加一条语句,原本运行不了的程序就成功运行了。特别是在编最后一个职工信息管理系统的时候。很多类库和宏都不明所以,想真正学通MFC,要深入浅出,看似容易的表面操作,深入的源代码是很复杂的,只有读懂源代码,才能真正清楚各个类之间是怎样相互联系的。并且我们做的只是基于对话框和单文本的,这还相对比较简单,很多实现的方式都大同小异,所以只要理解了一个,那么其他对话框也就可以举一反三,做起来就比较顺手了。
现在我的程度是可以上网上CSDN论坛,找到我想要实现内容的方法,然后照做。内容可以实现,但是只是表面,要学的理解的东西还有很多。如果以后有兴趣还想钻研一下MFC编程,一定要认真读更多的相关书籍,并且进行更多的练习。同时,多与同学交流讨论也是一种极好的破解难题的办法。
15
展开阅读全文