第一篇:C++课程设计公司人事管理系统
C++程序设计实践教学环节任务书 承接的项目额(10%)提成,业务经理既拿固定月薪(2000元)也领取提成,财务人员固定工资(2000元),文秘为固定工资(1500元)。
(4)可按姓名显示、查找、增加、删除、修改和保存各类人员的信息。
五、解决方案
一、题目: 公司人事管理系统
(1)分析系统中的各个实体之间的关系及其属性和行为;
(2)根据问题描述,设计系统的类层次;
二、目的与要求(3)完成类层次中各个类的描述(包括属性和方法);(4)完成类中各个成员函数的定义; 1.目的:(5)完成系统的应用模块;(1)基本掌握面向过程程序设计的基本思路和方法;(6)功能调试;(2)达到熟练掌握C语言的基本知识和技能;(7)完成系统总结报告以及系统使用说明书。(3)能够利用所学的基本知识和技能,解决简单的程序设计问题。
六、进度安排 2.要求此次课程设计时间为一周,分四个阶段完成: 基本要求: 1.分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要
(1)要求利用C++语言面向对象的编程思想来完成系统的设计; 求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。
(2)突出C++语言的类和对象的特征,以多个类实现对每一个子功能的封装; 2.编码调试阶段:根据设计分析方案编写C++代码,然后调试该代码,实现课
(3)进行简单界面设计,能够实现友好的交互; 题要求的功能。
(4)具有清晰的程序流程图和类的详细定义; 3.总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、(5)熟练掌握C++语言对文件的各种操作。总体设计、详细设计、编码、测试的步骤和内容。4.考核阶段。创新要求:在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一
七、撰写课程设计报告或课程设计总结 般级别的用户系统功能操作不同。课程设计报告要求:
三、信息描述 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试 的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及公司共有4格记。技术经理。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总 额并显示全部信息,并且老板可以对各种人员进行增加、查寻、修改、删除。
八、参考资料
四、功能描述 1.《C++程序设计》.郑莉.清华大学出版社2.《C++编程思想》.Bruce Eckel [刘宗田].机械工业出版社(1)其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序3.《C++ Primer》中文版.Lippman[潘爱民].中国电力出版社出版 加1。4.《Effective C++中文版》Scott Meyers[侯捷].华中科技大学出版社(2)程序对所有人员有提升级别的功能。
(3)月薪的计算方法是:经理拿固定月薪(5000元),技术人员按完成的代码量(1000元/每千行代码)领取月薪,业务人员的报酬按该推销员当月销售额(15%)与
第二篇:C++课程设计(教务管理系统)
#include
void menu(University uni);//菜单函数声明
class Student//学生类 { public: string name;int age;string sex;int number;string major;
public: void disp_stu();
friend void file_in(University &uni);
friend void file_out(University uni);};void Student::disp_stu(){
}
class Institute//学院类 { public: string name;cout<<“学生姓名:”<
public: void add_stu();
//添加学生
bool delete_stu(int i);
// 删除学生
bool modefy_stu(int i);
//修改学生信息
void disp_ins_1();
// 显示本院学生信息
friend void file_in(University &uni);
friend void file_out(University uni);};void Institute::add_stu(){
} Student *p=new Student;cout<<“学生名字:”;cin>>(*p).name;cout<<“学生年龄:”;cin>>(*p).age;cout<<“学生性别:”;cin>>(*p).sex;cout<<“学生学号:”;cin>>(*p).number;cout<<“学生专业:”;cin>>(*p).major;head.Add(p);//在链表末尾增加一个节点
bool Institute::delete_stu(int i){
} head.Remove(i);//删除链表指定位置节点 return true;bool Institute::modefy_stu(int i){
Student *p=new Student;cout<<“学生名字:”;cin>>(*p).name;cout<<“学生年龄:”;cin>>(*p).age;cout<<“学生性别:”;cin>>(*p).sex;cout<<“学生学号:”;cin>>(*p).number;cout<<“学生专业:”;cin>>(*p).major;head.Remove(i);//删除链表指定位置节点 head.Insert(i,p);//在链表指定位置插入一个新节点
return true;} void Institute::disp_ins_1(){
}
class University//学校类 { public: string name;int age;string addr;List
void design_stu();//学生信息设置 int i;Node
cout<<“学院名字:”< } cout<<“-------”<pData->disp_stu();q=q->pNext; void add_ins(); //添加学院 bool delete_ins(int n); // 删除学院 void design_cqut(); //设置学校信息 bool modefy_cqut(); //修改学校信息 void disp_cqut(); //显示学校信息 void design_ins(); //学院信息设置 bool modefy_ins(int n); //修改学院 void disp_ins(); //显示学院信息 void search_menu();void search_name(string n);//姓名 void search(string n);//性别//函数重载 void search(int n);//学号 bool search_age(int n);//年龄 friend void file_in(University &uni);};friend void file_out(University uni); void University::design_stu(){ int i,m,j;int n;cout<<“ ★★★★★★学生信息设置★★★★★★ ”< { disp_ins(); cout< cout<<“输入学生所在学院序号:”< cin>>m;system(“cls”);//清屏 head.pCurrent=head.pHead;//当前指针指向双向链表头指针 for(j=1;j { } } head.pCurrent=head.pCurrent->pNext;//当前指针指后移 cout<<“输入要添加的学生信息:”;head.pCurrent->pData->add_stu();cout<<“按任意键返回上一级菜单:”< disp_ins(); cout< cout<<“输入学生所在学院序号:”< cin>>m;system(“cls”);//清屏 head.pCurrent=head.pHead;//当前指针指向双向链表头指针 for(j=1;j { head.pCurrent=head.pCurrent->pNext;//当前指针指后移 } } head.pCurrent->pData->disp_ins_1();cout< { disp_ins(); cout< cout<<“输入学生所在学院序号:”< cin>>m;system(“cls”);//清屏 head.pCurrent=head.pHead;//当前指针指向双向链表头指针 for(j=1;j { } } head.pCurrent=head.pCurrent->pNext;//当前指针指后移 head.pCurrent->pData->disp_ins_1();cout< } cin>>n;head.pCurrent->pData->modefy_stu(n);cout<<“按任意键返回上一级菜单:”< void University::add_ins(){ } bool University::delete_ins(int n){ } bool University::modefy_ins(int n){ Institute *p=new Institute;cout<<“学院名字:”;cin>>(*p).name;head.Remove(n);//删除链表指定位置节点 head.Insert(n,p);//在指定位置插入节点信息 return true;head.Remove(n);//删除链表指定位置节点 return true;Institute *p=new Institute;cout<<“学院名字:”;cin>>(*p).name;head.Add(p);//在链表末尾增加一个节点 } void University::disp_ins(){ int i;Node for(i=1;i<=head.size;i++){ cout<pData->name< } void University::design_ins(){ int i;int j;cout<<“ ★★★★★★学院信息设置★★★★★★ ”< cout< { } disp_ins();cout<<“按任意键返回上一级菜单:”< disp_ins(); add_ins(); cout<<“按任意键返回上一级菜单:”< getch();system(“cls”);//清屏 design_ins(); break;} case 3: { } disp_ins();cout<<“输入删除学院序号:”;cin>>j;delete_ins(j);cout<<“按任意键返回上一级菜单:”< disp_ins();cout<<“输入修改学院序号:”;cin>>j;modefy_ins(j);cout<<“按任意键返回上一级菜单:”< } case 5:menu(*this);break;} } bool University::modefy_cqut(){ cout<<“学校名字:”;cin>>name;cout<<“创建年代:”;cin>>age;cout<<“学校地址:”;cin>>addr;return true;} void University::design_cqut(){ int i; University uni;cout<<“ ★★★★★★学校信息设置★★★★★★ cout< switch(i){ case 1: { disp_cqut(); cout<<”按任意键返回上一级菜单:“< getch();system(”cls“);//清屏 design_cqut(); break; } case 2: { modefy_cqut(); cout<<”按任意键返回上一级菜单:“< getch();system(”cls“);//清屏 design_cqut();break;”< } } } case 3:menu(uni);break; void University::disp_cqut(){ cout<<“学校有关信息为:”< } void University::search_name(string n){ int i,j,m=0;head.pCurrent=head.pHead;//当前指针指向学院节点头指针 for(i=0;i for(j=0;j { if(n==head.pCurrent->pData->head.pCurrent->pData->name) { } head.pCurrent->pData->head.pCurrent->pData->disp_stu();m++;head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;//学生当前指针后移 } bool University::search_age(int n){ int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i } cout<<“有”< } head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pHead;for(j=0;j } head.pCurrent->pData->head.pCurrent->pData->disp_stu();m++;head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext;} head.pCurrent=head.pCurrent->pNext;} cout<<“有”< void University::search(string n){ } int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i for(j=0;j if(n==head.pCurrent->pData->head.pCurrent->pData->sex){ head.pCurrent->pData->head.pCurrent->pData->disp_stu();} m++; head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext; } cout<<“有”< int i,j,m=0;head.pCurrent=head.pHead;for(i=0;i head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pHead; for(j=0;j { if(n==head.pCurrent->pData->head.pCurrent->pData->number) { head.pCurrent->pData->head.pCurrent->pData->disp_stu(); m++; } head.pCurrent->pData->head.pCurrent=head.pCurrent->pData->head.pCurrent->pNext; } head.pCurrent=head.pCurrent->pNext;} cout<<“有”< /****************************************信息查询菜***********************************************/ void University::search_menu(){ int i;cout<<“ ★★★★★信息查询显示★★★★★”< switch(i){ case 1: { 单 disp_ins(); cout<<“按任意键返回上一级菜单:”< { } head.pCurrent=head.pHead;//当前指针指向学院节点头指针 for(i=0;i } head.pCurrent->pData->disp_ins_1();head.pCurrent=head.pCurrent->pNext;cout<<“按任意键返回上一级菜单:”< } int j;disp_ins();cout<<“请输入学生所在学院序号:”;cin>>i;system(“cls”);//清屏 head.pCurrent=head.pHead;for(j=1;jpNext;head.pCurrent->pData->disp_ins_1();cout<<“按任意键返回上一级菜单:”< case 4: { string n;cout<<“输入要查询的姓名:”;cin>>n;system(“cls”);//清屏 search_name(n); } cout<<“按任意键返回上一级菜单:”< { } int n1;cout<<“输入要查询的年龄:”;cin>>n1;search_age(n1);cout<<“按任意键返回上一级菜单:”< system(“cls”);//清屏 case 6: { } string n;cout<<“输入要查询的性别:”;cin>>n;system(“cls”);//清屏 search(n);cout<<“按任意键返回上一级菜单:”< } int n;cout<<“输入要查询的学号:”;cin>>n;system(“cls”);//清屏 search(n);cout<<“按任意键返回上一级菜单:”< menu(*this); } } } break;/**********************************************************************/ { int i,j;ifstream inf(“cqutData.txt”,ios::in);inf>>uni.name;inf>>uni.age;inf>>uni.addr;inf>>uni.head.size;//学院个数 for(i=0;i 导出文件数据void file_in(University &uni) Node else uni.head.pEnd->pNext=m;//把节点m赋给下一个学院信息节点 m->pPrev=uni.head.pEnd;//节点m指向学院信息的尾节点 uni.head.pCurrent=uni.head.pEnd=m;//学院信息的尾节点始终指向m节点 inf>>uni.head.pCurrent->pData->head.size;//学生个数 for(j=0;j Student *q=new Student;inf>>q->name;inf>>q->age;inf>>q->sex;inf>>q->number;inf>>q->major; Node n->pPrev=uni.head.pCurrent->pData->head.pEnd; uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pEnd=n;//学生信息的尾节点始终指向n节点 } } } /************************************************************************************/ void file_out(University uni){ ofstream ouf(“cqutData.txt”,ios::out);int i,j;ouf< 导入文件数据ouf< uni.head.pCurrent=uni.head.pHead;//当前指针指向学院节点头指针 for(i=0;i ouf< ouf< uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pHead;//当前指针指向学生节点头指针 for(j=0;j ouf< uni.head.pCurrent->pData->head.pCurrent=uni.head.pCurrent->pData->head.pCurrent->pNext;//学生当前指针后移 } } } uni.head.pCurrent=uni.head.pCurrent->pNext;//学院当前指针后移 /************************退出系统菜单****************************/ void exit(University uni){ } int i;cout<<“是否保存修改内容:”< { } file_out(uni);exit(0);break;case 2:{exit(0);break;} case 3: { menu(uni);break;} case 4: { file_out(uni); } } menu(uni);break; /***************************************************************************************/ void menu(University uni){ system(“cls”);/*清屏*/ int i;cout< 主菜单 cout<<“★★★★★★★★★★★★★主菜单★★★★★★★★★★★★★”< cout< cout< cout< } int main(){ University u; } file_in(u);menu(u);return 0;switch(i){ case 1:uni.design_cqut();break;case 2:uni.design_ins();break;case 3:uni.design_stu();break; case 4:uni.search_menu();break; case 5:exit(uni);break;} C++程序设计实践教学环节任务书 一、题目:学生信息管理系统 二、目的与要求 1.目的: (1)掌握面向对象程序设计的基本思路和方法; (2)了解系统开发的需求分析、类层次设计、模块分解、编码测试、模块 组装与整体调试的全过程; (3)进一步熟悉C++中类的概念、类的封装、继承的实现方式;(4)学会分析简单的实际问题,并能利用所学的知识建立系统的逻辑结构,学会简单的调试技巧和方法。逐步熟悉面向对象程序设计的方法,养成良好的编程习惯。 2.要求基本要求: (1)要求利用C++面向对象的编程思想来完成系统的设计;(2)进行简单界面设计,能够实现友好的交互;(3)具有清晰的程序流程图和数据结构的详细定义;(4)熟练掌握C++对文件的各种操作。 三、信息描述 有关该系统基本信息的描述(如:学号、姓名、系别、班级和各科成绩等)。 四、功能描述 1.添加、删除 系统将提示用户输入新添加学生的信息;由用户输入要删除的学生的学号,然后调用删除函数,删除该名学生的资料。2.查找 首先由用户输入要查找的学生的学号,系统用查找函数查找,然后系统就调用输出函数。 3.修改 首先由用户输入要修改的学生的学号,然后系统用修改函数查找,显示该名学生的资料,然后系统提示用户输入需要修改的项目和新的资料。4.界面要求 开始登录管理界面、主要提示菜单界面(提示用户执行何种操作)等。 五、解决方案 1.分析程序的功能要求,划分程序功能模块。2.画出系统流程图。 3.代码的编写、程序的功能调试。4.完成系统总结报告以及使用说明书 六、进度安排 此次课程设计时间为一周或两周,分四个阶段完成: 1.分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确 设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。 2.编码调试阶段:根据设计分析方案编写代码,然后调试该代码,实现 课题要求的功能。 3.总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需 求分析、总体设计、详细设计、编码、测试的步骤和内容。4.考核阶段。 七、撰写课程设计报告或课程设计总结 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。 八、参考资料 《C++语言程序设计教程》 网上相关资料(....略) 湖南科技大学计算机科学与工程学院 数据库课程设计报告 题目:人事管理管理系统 学 号:1005030221 姓 名:艾向兵 指导教师:张黎 完成时间:2012年1月4日 组员:苏勇,成佳裕,艾向兵 企业人事管理系统主要用于员工个人资料的录入,职务变动的记录和管理。使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分配 1.1系统功能需求分析 人事管理系统主要有以下几项功能要求:.新员工资料的输入。 .自动分配员工编号,并且设置初始的用户密码:.人事变动的记载,包括岗位和部门的调整。.员工信息的查询和修改,包括员工个人信息和密码 1.2 系统功能模块设计 根据系统功能要求,可以将系统分解成几个模块来分别设计应用程序界面,如图,人事资源管理 包括:新员工档案输入,人事变更,员工档案查询 1.3 与其它系统的关系 本关系是公司管理信息系统的基础部分,为其他子系统,如考勤管理系统,工资管理系统和员工培训系统,提供员工的基本信息。同时为其他系统提供了员工登录的密码认证和权限分配。1.4数据库设计 数据库需求分析: 员工信息:员工号,密码,权限,姓名,性别,生日,专业,通讯地址,电话,Email,当前状态,其他。 人事变动:记录号,员工,变动,详细描述 部门设置:部门编号,名称 员工变动代号表 员工信息表 员工职位代码表 管理员登陆界面 信息查询,修改,删除主界面 查询单个员工的界面 总 结 这次的课程设计,是在学习了Java以后通过阅读课本及在图书馆借阅相关书籍同严景、孟珍三人共同完成的。在开发这个系统的过程中,碰到很多或大或小的问题,我们一起思考,一起努力,最后大部分都解决了,得到了现在的这个简单的人事管理系统。 在编制过程中,我们首先考虑到了界面的友好性,并在界面设计时不采用烦琐的细节,使界面简单、清晰,便于操作。一开始我们是想做个登录界面,实现用户的登录权限管理,但试了几次都没有达到预期的效果,最后不得不放弃。 通过这次课程设计,我知道了什么事情都不那么简单,只有努力去做了,你才会有收获,不管收获大小,付出的过程总是有的。有些事情只有亲身感受,你才知道它的价值有多大。同时在遇到困难的时候要沉着冷静,首先要冷静分析问题,对于很难解决的问题要学会请教他人,还可以与别人合作。 在这次数据库系统课程设计中,我主要进行的是界面的设计,以及进行进行整合操作,界面是我学习Java以来第一次做,以前不怎么用的JTabel等,现在都已经熟练的应用了,特别是这次的弹出窗口,我在做这个的时候可谓是一窍不通,因为把按钮JButton定义为了局部变量而在时间响应中而得不到另一个窗口的弹出。 还有就是在整个过程中的ID传递让我不知怎么办,一个简单的参数传递才得以搞定,基础知识还是不够牢靠。在得到修改表的数据库内容后未把值传给表格。 虽然这次课程设计付出了大量的时间,但是我知道我得到的收获远远不是这些时间可以衡量的,它将给我今后的学习和工作带来更多的收益。通过对此课题的开发,使我对用Java开发系统有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如没有设置登录界面,没有考虑到异常等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。 弹出登录程序的界面程序 public void actionPerformed(ActionEvent e){ if(e.getSource()==okButton){ String userID=text.getText();String passWD=String.valueOf(passwd.getPassword());if(userID.equals(“1”)&&passWD.equals(“1”)){ JOptionPane.showMessageDialog(null, “登陆成功!”, “消息”, JOptionPane.INFORMATION_MESSAGE); new UserWindow2().userWindow2();//弹出第二个窗体 } else{ JOptionPane.showMessageDialog(null, “对不起您的用户名或密码错误!”, “错误”,JOptionPane.ERROR_MESSAGE); text.setText(“");passwd.setText(”“);} } if(e.getSource()==deleButton){ text.setText(”“);passwd.setText(”“);} } 进行信息查询,修改,删除的程序响应代码: public void actionPerformed(ActionEvent e){ if(e.getSource()==button1){ new UserWindow3(); } if(e.getSource()==button2){ UserWindow7 u= new UserWindow7();u.userWindow7();} if(e.getSource()==button3){ UserWindow5 u=new UserWindow5(); u.userWindow5();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ int id= Integer.parseInt(text0.getText());//得到用户编号 String name=text1.getText();//得到用户姓名 String sex=text2.getText();//得到性别 String birthDay=text3.getText();//得到生日 String department=text4.getText();//得到所在部门 String job =text5.getText();//得到职位 String education=text6.getText();//得到教育程度 String spcialty=text7.getText();//专业技能 String address=text8.getText();//得到地址 String tel=text9.getText();//得到电话 String email=text10.getText();//得到电子邮箱 String state=text11.getText();//得到员工状态 String remark=text12.getText();//得到备注 Insert in=new Insert();// boolean b; b=in.insert(id,name,sex,birthDay,department,job,education,spcialty,address,tel,email,state,remark);if(b){ JOptionPane.showMessageDialog(null, ”数据保存成功!“, ”消息“, JOptionPane.INFORMATION_MESSAGE);} } } public void actionPerformed(ActionEvent e){ // TODO Auto-generated method stub id = Integer.parseInt(text.getText()); if(e.getSource()==button){ UserWindow8 us = new UserWindow8();us.userWindow8(id); } Container container=this.getContentPane();container.setLayout(new BorderLayout()); JPanel pan =new JPanel();JLabel lab = new JLabel(”请输入工号:“);JTextField text=new JTextField(10);JButton button =new JButton(”查询“);JButton button1=new JButton(”删除“);pan.add(lab);pan.add(text);pan.add(button);pan.add(button1);container.add(pan); String []titles={”员工编号“,”姓名“,”性别“,”生日“,”部门“,”职务“,”教育程度“,”专业技能“,”家庭住址“,”联系电话“,”电子邮箱"}; String [][]userInfo={}; JTable table =new JTable(userInfo,titles);table.isCellEditable(2,2);JScrollPane scrollpane =new JScrollPane(taboooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo......................le); container.add(scrollpane,BorderLayout.SOUTH); 课 程 设 计 课程名称 C++课程设计 题目名称 图书管理系统 2016 年月 29 日 目录 一.设计内容与要求...............................................................................................................2 二.设计思路:.......................................................................................................................4 三.关键模块实现及主要代码...............................................................................................4 四.实验结果及分析.............................................................................................................13 五、心得体会.........................................................................................................................16 六、参考文献.........................................................................................................................17 一.设计内容与要求 (1)、设计一个图书管理系统,能够实现用户信息管理,图书信息的 录入、查询、删除等功能。 (2)、实现用户管理,系统具有用户注册功能。管理员的账号和密码由系统指定,登录后可进行修改。一般用户注册后才能登录使用系统。管理员具有录入、查询、删除图书信息及一般用户的功能。一般用户只有图书查询功能。 (3)、登录功能,只有注册了的用户才能进入系统,没有注册的则有提示信息出现。 (4)、图书管理功能,管理员能够录入、查询、删除图书信息。(5)、图书查询功能,管理员及一般用户能够通过图书的基本信息,如图书作者、书名、出版社、出版日期等等,进行查询。 提示:上述为基本功能,可参考实际的系统进行扩展。 二.设计思路: 为了实现用户信息以及图书信息的管理,建立一个用户CUser类与图书信息CBoodata类,其中CUser类应该包含用户账号以及密码,CBookdata类应该包含图书作者,书名,出版社,出版日期。同时应该建立两个dat文件,一个为存储用户信息,一个用来储存图书信息。程序主要分为4个页面:(1)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。 (2)图书查询页面。由Cdialog类派生出CSearch类。包含读取所有图书数据响应函数,以及根据作者姓名或者书名来查询图书响应函数。 (3)管理员图书管理页面。由Cdialog类派生出CBookdata类。包含读取所有图书响应函数,添加图书响应函数,修改图书响应函数,删除图书响应函数。(4)用户信息管理页面,由Cdialog类派生出CUserdata类。包含读取所有用户信息响应函数,删除用户响应函数、添加用户响应函数、修改用户信息响应函数。 因为本人能力有限,而且自己是根据老师给的教程以及结合书本内容来完成课程设计,于是我第一想到的就是应数组来存储信息,而不是用链表,所以,对于文件数据的删除与修改,难免会过于乏力。 三.关键模块实现及主要代码 (1)自己建立的类 1.用户类: class CUser { public: int num;char password[20];}; 2.图书信息类: class Book //图书类 { public: char author[10]; //设置作者姓名 char bname[20]; //设置图书书名 char pub_name[20]; //设置出版社名称 int pub_date; //设置出版年月 }; (2)登录页面,由Cdialog类派生出CMyprojectDlg类,用来处理账号注册与用户登录。1.用户注册处理响应函数: void CMyprojectDlg::OnButton3() //用户注册 { // TODO: Add your control notification handler code here ////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持用户记录数,//后面依次保持用户记录注意,写用户的每个信息的顺序要与读取时的顺序一致。 UpdateData(TRUE);CUser user;int n_user=0; //用户的个数,管理员默认为第一个。自己输入为账号:1111,密码:0000。 int size=0; fstream file(“user.dat”,ios::in|ios::out);// 建立一个文件类,关于其用法,请baidu。 file.seekg(ios::beg); //将文件指针指向文件头。 file.read((char*)&n_user,sizeof(n_user)); //读取用户数。 n_user+=1;file.seekp(ios::beg);file.write((char*)&n_user,sizeof(n_user));//写学生记录个数 user.num=m_num; //之前定义user.password为string,导致密码匹配时有错误。。。 memcpy(user.password,m_password.GetBuffer(m_password.GetLength()),m_password.GetLength());// 把类CString对象的内容赋值到字符数组中 user.password[m_password.GetLength()]=' ';//在数组末尾加结束符号 //在文件末尾,把新的记录写入。 file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg); //这里出错 file.write((char*)&user.num,sizeof(user.num));file.write((char*)&user.password,sizeof(user.password)); file.close(); ///////////////////////////////////////////////////////////////////////////////////////// //用消息框提示 CString str;str.Format(“成功注册,成为第 %d 个注册用户,请按确定返回重新登录.”,n_user-1); ///因为第一个为管理员,不算为用户人数。 AfxMessageBox(str); } 2.用户登录处理响应函数。其中包含判断是管理员,还是普通用户。void CMyprojectDlg::OnButton2() //用户登录 { // TODO: Add your control notification handler code here UpdateData(TRUE); CUser m_user[100];int i;int size;int n_user=0;//文件中用户的个数 ////////////////////////////////////////////////////////////////////////////////////////// //读取文件中的用户记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。 //根据记录个数,依次读取用户记录 放在成员变量m_st数组中(已在类体中声明了) CFile file; file.Open(“user.dat”,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件 if(size>0){ file.SeekToBegin(); file.Read(&n_user,sizeof(n_user));} if(n_user>0 && n_user<99)//实验中限定为0~100个用户记录 { for(i=0;i { //请注意与写入数据的顺序要保持一样,否则会读错数据。 file.Read(&(m_user[i].num),sizeof(m_user[i].num)); file.Read(&(m_user[i].password),sizeof(m_user[i].password)); } } file.Close();///////////////////////////////////////////////// if(m_num==1111&&m_password==“0000”) //管理员进入管理员页面 { CAdministrators administrators; administrators.DoModal();} CString str_password;for(i=0;i //普通用户,进入图书查询页面 { str_password=m_user[i].password; if(m_user[i].num==m_num) { if(str_password==m_password) { CSearch search; search.DoModal(); } else { CString str; str.Format(“密码或者账号错误,请重新输入!”); AfxMessageBox(str); } } } } (3)图书查询页面。包含读取所有图书数据,以及根据作者姓名或者书名来查询图书。1.读取所有图书响应函数。 void CSearch::OnButton5() //显示出所有图书 { // TODO: Add your control notification handler code here int i;int size;int n_book=0;//文件book的本数 ////////////////////////////////////////////////////////////////////////////////////////// //读取文件中的书本记录,注意读取顺序与写入的顺序要一致,文件最开始的4个字节是表示记录个数。 //根据记录个数,依次读取书籍记录 放在成员变量m_user_book数组中(已在类体中声明了) CFile file; file.Open(“book.dat”,CFile::modeReadWrite);size=GetFileSize((void*)file.m_hFile,NULL);//读取文件大小,size==0表示是空文件 if(size>0){ file.SeekToBegin(); file.Read(&n_book,sizeof(n_book));} if(n_book>0 && n_book<99)//实验中限定为0~100个书本记录 { m_num_book=n_book; for(i=0;i { //请注意与写入数据的顺序要保持一样,否则会读错数据。 file.Read(&(m_user_book[i].author),sizeof(m_user_book[i].author)); file.Read(&(m_user_book[i].bname),sizeof(m_user_book[i].bname)); file.Read(&(m_user_book[i].pub_name),sizeof(m_user_book[i].pub_name)); file.Read(&(m_user_book[i].pub_date),sizeof(m_user_book[i].pub_date)); } } file.Close();///////////////////////////////////////////////// //在列表控件中显示所有条记录 //插入每列的表头; m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1); m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1);//每一行插入一条书本记录 for(i=0;i CString str; str=m_user_book[i].author; m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据) str=m_user_book[i].bname; m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名 str=m_user_book[i].pub_name; m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社 str.Format(“%d”,m_user_book[i].pub_date); ///整型变为字符串,便于在控件显示 m_list.SetItemText(i,3,str);//设置第i行第3列的的数据为出版日期 } } 2.图书查询响应函数。 void CSearch::OnButton4() //查询图书 { // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();int num=0;//表示查找结果的个数 int i; for(i=0;i { CString str; int ret1=0,ret2=0; str=m_user_book[i].author; ret1=str.Find(m_author,0);//ret1>=0, 表示str中包含了m_author的字段 str=m_user_book[i].bname; ret2=str.Find(m_bname,0);//ret2>=0, 表示str中包含了m_bname的字段 if(ret1>=0) //按作者查询 { str=m_user_book[i].author; m_list.InsertItem(num,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据) str=m_user_book[i].bname; m_list.SetItemText(num,1,str);//设置第i行第1列的的数据为书名 str=m_user_book[i].pub_name; m_list.SetItemText(num,2,str);//设置第i行第2列的的数据为出版社 str.Format(“%d”,m_user_book[i].pub_date); ///整型变为字符串,便于在控件显示 m_list.SetItemText(num,3,str);//设置第i行第3列的的数据为出版日期 num+=1;//结果+1; } } } (4)管理员图书管理页面。包含读取所有图书,添加图书,修改图书,删除图书的功能。1.读取所有图书功能实现与(3)的实现一样。2.添加图书响应函数。 void CBookdata::OnButton7() //添加图书 { UpdateData(TRUE);Book book;int n_book=0; //书本的个数 int size=0; fstream file(“book.dat”,ios::in|ios::out);// 建立一个文件类,关于其用法,请baidu。 file.seekg(ios::beg); //将文件指针指向文件头。 file.read((char*)&n_book,sizeof(n_book)); //读取书籍数。 ////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持书本记录数,//后面依次保持书本记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 n_book+=1;file.seekp(ios::beg);file.write((char*)&n_book,sizeof(n_book));//写学生记录个数 memcpy(book.author,m_add_author.GetBuffer(m_add_author.GetLength()),m_add_author.GetLength());// 把类CString对象的内容赋值到字符数组中 book.author[m_add_author.GetLength()]=' ';//在数组末尾加结束符号 memcpy(book.bname,m_add_bname.GetBuffer(m_add_bname.GetLength()),m_add_bname.GetLength());// 把类CString对象的内容赋值到字符数组中 book.bname[m_add_bname.GetLength()]=' ';//在数组末尾加结束符号 memcpy(book.pub_name,m_add_pub_name.GetBuffer(m_add_pub_name.GetLength()),m_add_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中 book.pub_name[m_add_pub_name.GetLength()]=' ';//在数组末尾加结束符号 book.pub_date=m_add_pub_date; //在文件末尾,把新的记录写入。 file.seekp(4+(n_book-1)*54,ios::beg); file.write((char*)&book.author,sizeof(book.author));file.write((char*)&book.bname,sizeof(book.bname));file.write((char*)&book.pub_name,sizeof(book.pub_name));file.write((char*)&book.pub_date,sizeof(book.pub_date)); file.close();///////////////////////////////////////////////////////////////////////////////////////// //用消息框提示 CString str;str.Format(“文件中已有 %d 本书籍记录.”,n_book);AfxMessageBox(str);} 3.修改图书响应函数。 void CBookdata::OnButton5() //修改图书,,必须先读取图书才能修改图书。{ // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1); m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1); CString str_author,str_bname,str_pub_name,str; //将book类的字符串数组赋值为字符串变量,方便比较。 CFile file;// 建立一个文件类,关于其用法,请baidu。 file.Open(“book.dat”,CFile::modeReadWrite);//打开文件 file.SeekToBegin(); file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数 for(int i=0;i { str_author=m_book[i].author; str_bname=m_book[i].bname; str_pub_name=m_book[i].pub_name; if(str_author==m_author||str_bname==m_bname||str_pub_name==m_pub_name||m_book[i].pub_date==m_pub_date) { memcpy(m_book[i].author,m_modify_author.GetBuffer(m_modify_author.GetLength()),m_modify_author.GetLength());// 把类CString对象的内容赋值到字符数组中 m_book[i].author[m_modify_author.GetLength()]=' ';//在数组末尾加结束符号 memcpy(m_book[i].bname,m_modify_bname.GetBuffer(m_modify_bname.GetLength()),m_modify_bname.GetLength());// 把类CString对象的内容赋值到字符数组中 m_book[i].bname[m_modify_bname.GetLength()]=' ';//在数组末尾加结束符号 memcpy(m_book[i].pub_name,m_modify_pub_name.GetBuffer(m_modify_pub_name.GetLength()),m_modify_pub_name.GetLength());// 把类CString对象的内容赋值到字符数组中 m_book[i].pub_name[m_modify_pub_name.GetLength()]=' ';//在数组末尾加结束符号 m_book[i].pub_date=m_modify_pub_date; } ////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 file.Write(&m_book[i].author,sizeof(m_book[i].author)); file.Write(&m_book[i].bname,sizeof(m_book[i].bname)); file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name)); file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date)); ///////////////////////////////////////////////////////////////////////////////////////// //在列表控件中显示所有条记录 str=m_book[i].author; m_list.InsertItem(i,str);//InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据) str=m_book[i].bname; m_list.SetItemText(i,1,str);//设置第i行第1列的的数据为书名 str=m_book[i].pub_name; m_list.SetItemText(i,2,str);//设置第i行第2列的的数据为出版社 str.Format(“%d”,m_book[i].pub_date); ///整型变为字符串,便于在控件显示 m_list.SetItemText(i,3,str);//设置第i行第3列的的数据为出版日期 } file.Close(); //用消息框提示 str.Format(“成功修改书籍记录.”);AfxMessageBox(str);} 4.删除图书响应函数。 void CBookdata::OnButton6() //删除图书,,读取了图书数据后才能删除图书 { // TODO: Add your control notification handler code here UpdateData(TRUE);m_list.DeleteAllItems();m_list.InsertColumn(0,“作者”,LVCFMT_LEFT,100,1); m_list.InsertColumn(1,“书名”,LVCFMT_LEFT,100,1);m_list.InsertColumn(2,“出版社”,LVCFMT_LEFT,100,1);m_list.InsertColumn(3,“出版日期”,LVCFMT_LEFT,100,1); CString str_author,str_bname,str_pub_name,str; //将book类的字符串数组赋值为字符串变量,方便比较。 int n_book,n_flag=0; // n_flag为删除标志,1为有元素删除了 CFile file;// 建立一个文件类,关于其用法,请baidu。 file.Open(“book.dat”,CFile::modeReadWrite);//新建一个文件并且打开文件 file.SeekToBegin(); file.Write(&m_num_book,sizeof(m_num_book));//写书本记录本数,先填入本来的书本数。 for(int i=0;i { str_author=m_book[i].author; str_bname=m_book[i].bname; str_pub_name=m_book[i].pub_name; if(str_author==m_del_author||str_bname==m_del_bname||str_pub_name==m_del_pub_name||m_book[i].pub_date==m_del_pub_date) { n_flag=1; //删除标志置1 i+=1; //第i个元素为要删除元素,跳过 } ////////////////////////////////////////////////////////////////////////////////////// //以下代码主要还是把这条记录写入文件,注意写入的格式:文件的前四个字节是保持 学生记录数,//后面依次保持学生记录注意,写学生的每个信息的顺序要与读取时的顺序一致。 file.Write(&m_book[i].author,sizeof(m_book[i].author)); file.Write(&m_book[i].bname,sizeof(m_book[i].bname)); file.Write(&m_book[i].pub_name,sizeof(m_book[i].pub_name)); file.Write(&m_book[i].pub_date,sizeof(m_book[i].pub_date)); } if(n_flag==1) { n_book=m_num_book-1; //表示删除了一本书,则将文件的书本数减1。 file.SeekToBegin(); file.Write(&n_book,sizeof(n_book));//写书本记录本数,先填入本来的书本数。 //用消息框提示 str.Format(“成功删除书籍记录.”); AfxMessageBox(str); } else { //用消息框提示 str.Format(“没有这一本书的记录,不能删除.”); AfxMessageBox(str); } file.Close();} (5)、用户信息管理页面,包含读取所有用户信息,删除、添加、修改用户信息。1.读取所有用户信息以(4)基本相同。 2.删除用户信息实现基本方法与(4)基本相同。3.添加用户信息实现基本方法与(4)基本相同。4.修改用户信息实现基本方法与(4)基本相同。 四.实验结果及分析 (1.)登录页面 成功注册 普通用户成功登录页面 查询结果 管理员登录页面 图书管理页面 成功添加图书。 用户信息管理页面 分析:基本功能是可以实现的,但是因为是用数组来存放图书信息与用户信息,所以对于数据大了之后处理能力不够方便以及效率不高。而且删除信息的时候只是删除该条数据的信息,数据后面的信息往上移动,所以最后面会有两条重复的信息,虽然文件开头储存信息数目已经减一,读取数据是按照文件开头储存的信息数目来读取信息,但是有时候读取会有乱码。我在程序中找不到那个隐藏的bug,五、心得体会 这次C++课程设计学到了很多,懂得了C++看起来虽然简单,可是要用这个计算机语言来实现一些有用的功能,怎么运用确实是一门挺高深的学问,我们学习计算机语言不能只是看书看概念,要多上机实验,这样才能对计算机语言有比较深的了解,才能够提高自己的编程以及调试找BUG的能力。现在来总结一下编程过程中遇到的一些值得注意的问题。 1.派生出一个类时,为编辑框增加变量名后,然后在类声明中自己增加类成员,如果再想在对话框中增加编辑框并且添上变量名会出现错误。(如下,在Csearch 类中自己添加下面箭头指向的代码后,会出现下图右的错误,解决方法是把箭头指向的代码放到//}}AFX_DATA后面,因为此语句为MFC对话框自行添加编辑变量的结束,如果我们将自己定义的变量也添加到此语句前,编译器不清楚是MFC自行添加的变量还是用户自行添加的变量。)2.遇到编译器没有出错,可是运行结果与自己想象的不一样,很可能是逻辑错误。如: 在用户注册时,我是将用户数据直接存到文件尾,这是不正确的,因为管理员页面有删除用户的功能,这个功能的原理是先读文件头的用户数(假定为10个),然后将用户的数据先读取出来,然后经过一个判断,再储存重新储存回文件,而文件中储存的用户数据大小是没有变化的,也就是说文件尾会有两份最后一个用户的数据(即如果删除的是第七个,文件中最后会有两份第十个用户的数据,文件头的记录用户数为9个),如果添加用户直接储存在文件尾则会储存在第11个用户的位置,可是以后读取的话只是读取到第10个。所以会出现读取错误,密码不匹配的问题。应该根据记录的用户数让文件指针指向最后一个用户数据后面。file.seekp(4+(n_user-1)*sizeof(CUser),ios::beg); 以上两个问题是困扰我比较久的,其他问题经过百度还有自己的调试,解决还算快,不值得重点说。 六、参考文献 1.C++面向对象程序设计(第二版) 谭浩强 编著 2.成绩管理系统MFC教程 3.CNDN论坛,关于文件操作的指针运算。第三篇:C++课程设计学生信息管理系统
第四篇:人事管理系统Java课程设计报告
第五篇:C++课程设计(简单图书管理系统)