教师住房管理系统
- 格式:docx
- 大小:141.73 KB
- 文档页数:11
设 计 文 档 设计任务 教师住房管理系统 该系统在磁盘中存贮全校住学校宿舍的教师住房信息。对每一住户存贮如下信息:户主:姓名,性别,职称(教授、副教授、讲师、助教),出生年月,参加工作年月,最后学历(博士、硕士、本科、其它);家庭成员:对每一个成员,存贮姓名、性别、出生年月:现住房等级:分居在集体宿舍|一室|一室一厅|二室|二室一厅|三室|三室一厅|。现住房面积:(单位;平方米)。当学校有房源后,各住户可提出分房申请(含姓名、申请住房的等级)。 系统功能要求如下: 1.创建存贮教师住房信息的存贮系统; 2.分房时,系统应为申请者输入申请信息(存盘)。对于所有分房者按申请等级不同(共6级)分别按分数高低列表(一种等级一张表)输出(同时存盘)。计分方法如下:职称分;教授,20分;副教授,16分;讲师,12分;助教,8分。工龄分:每年0.5分;每月0.0416分。年龄分:每岁0.1分;每月0.0083分。学龄分:博士,4.5分;硕士,3.25分,本科,2分;其它,0分。每张表应含申请该等级的姓名、职称、参加工作年月、最后学历、原住房等级、职称分、工龄分、年龄分、学龄分及总分。每张表按总分从高到低排列。 3.可输出婚后仍分居集体宿舍者的户主姓名及出生年月,这类教师的总数。 4.可输出未住上三室一厅或三室的副教授,教授姓名及现住房标准,这类教师的总数。 5.可输出未住上一室一厅及以上等级的具有博士学位的教师姓名及住房标准。 6.可输出全校教师人均(包括家庭人口)住房面积。
任务分析 首先创建教师住房信息类,包书户主信息,家庭成员信息,住房情况等(其中可以定义结构体或类或枚举类型表示某部分信息,如住房等级可用枚举类型表示),应派生自CObject类,并实现序列化操作; 然后在文档类中添加存储教师住房信息的链表或数组(可用MFC的集合类),在文档类Serialize函数中实现序列化;
通过菜单打开对话框,在对话框中输入有关信息和查询信息(用多个对话框); 视图类显示查询结果;教师住房的信息可保存到文件并可读出。
设计思路与流程 由于家庭成员,户主和教师均具有相同的属性,即出生日期,姓名,性别等,故先创建一个 People类,用来表达家庭成员和户主,然后教师类继承自Person类,以此摆脱重复的代码。 家庭成员信息是一个People类的链表,作为教师类的数据成员,住房等级、教育等级、最后学历等信息以枚举类型保存。 输出信息时,由于显示结果的绝大部分代码相同,唯一不同的是控制输出的条件,比如输出未住上一室一厅及以上等级的具有博士学位的教师。这种情况下可以将另写一个输出的函数,其参数为一个函数指针,输出函数通过传入的函数来判断是否输出某一项。比如输出未住上一室一厅及以上等级的具有博士学位的教师可以写成如下形式: bool HighNoFilter( Professor *professor ) { if (professor->mTitle < INSTRUCTOR && professor->mHouse < THREEROOM) return true; else return false; }
void CKitten_mfcView::OnHighNo() { Output( HighNoFilter ); }
即先声明一个过滤函数,然后消息响应函数通过此过滤函数来滤除不想要输出地项。 另外在输出住房等级、最后学位的中文表达形式时,也有非常方便的方式,首先声明一个数组,依次储存住房等级的中文字符串,由于枚举类型的值也从0开始递增,所以可以直接用枚举类型的值作为数组的索引取出其中文字符串。具体实现如下:
首先声明数组: static CString sSexNames[SEX_COUNT];
CString People::sSexNames[SEX_COUNT] = { "男", "女" }; 然后指名中文表达时可以直接用 Professor::sSexNames[teacher->mSex];
这样代码简洁高效,且不容易出错。 进行排序时,一种方法是先在Document类中将数据项排好然后输出,另一种方法是使用LIstCtrl提供的SortItems函数,该函数需要提供一个函数指针,其原型为: int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
为了使用这个函数排序,我在添加每个项时都将要排序的数字作为ItemData储存起来,然后定义自己的CompareFunc: int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { double score1 = (double) lParam1; double score2 = (double) lParam2; if (score1 > score2) return -1; else if (score1 < score2) return 1; else return 0; } 最后调用SortItems排序既可: listCtrl.SortItems (CompareFunc, (DWORD) pDoc);
功能介绍
点击录入教师住房信息菜单项可以录入教师的各项信息,比如姓名,年龄,住房等级,教育水平,家庭成员等。
点击“输出婚后仍分居集体宿舍者的户主姓名及出生年月”等菜单项可以打印出相应的教师信息。
同时已经录入的教师可以进行申请住房的操作,分房时,系统可以为申请者输入申请信息(存盘)。对于所有分房者按申请等级不同(共6级)分别按分数高低列表(一种等级一张表)输出(同时存盘)。
另外本程序的错误检测非常完备,对于各种情况都有考虑,可以报告诸如年龄不正确,数据项未填写,申请房屋小于现有住房等错误。
文件与对象描述
ApplyHouseDlg.cpp: 申请住房对话框的类 ApplyHouseDlg.h: 申请住房对话框的类声明 MainFrm.cpp: 主窗口类 MainFrm.h: 主窗口类声明 NewFamilyMemberDlg.cpp: 新增家庭成员对话框 NewFamilyMemberDlg.h:新增家庭成员对话框声明 NewProfessorDlg.cpp: 新增教师信息对话框 NewProfessorDlg.h:新增教师信息对话框声明 P09009331.cpp: 主程序 P09009331Doc.cpp: Document类 P09009331Doc.h: Document类声明 P09009331.h: 包含所有的头文件 P09009331View.cpp: View类 P09009331View.h: View类声明 People.cpp: 家庭成员和户主类 People.h: 家庭成员和户主类声明 Professor.cpp: 教师类 Professor.h: 教师类声明
个各类声明: ///////////////////////////////////////////////////////////////////////////// // ApplyHouseDlg dialog class ApplyHouseDlg : public CDialog { // Construction public: ApplyHouseDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data CKitten_mfcDoc* pDoc; //{{AFX_DATA(ApplyHouseDlg) enum { IDD = IDD_APPLAYHOUSE }; CComboBox mcApplier; int mHouse; CString mName; //}}AFX_DATA
// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(ApplyHouseDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected:
// Generated message map functions //{{AFX_MSG(ApplyHouseDlg) virtual BOOL OnInitDialog(); virtual void OnOK(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
///////////////////////////////////////////////////////////////////////////// // NewFamilyMemberDlg dialog
class NewFamilyMemberDlg : public CDialog { // Construction public: NewFamilyMemberDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data //{{AFX_DATA(NewFamilyMemberDlg) enum { IDD = IDD_ADDMEMBER }; CString mBlood; CString mName; //}}AFX_DATA