第一篇:C++课程设计学生成绩管理分析系统
五、解决方案 C++程序设计实践教学环节任务书
1.分析程序的功能要求,划分程序功能模块。
2.画出系统流程图。
一、题目: 学生成绩管理分析系统 3.代码的编写。定义类和各个功能函数。
4.程序的功能调试。
二、目的与要求 5.完成系统总结报告以及使用说明书。
1.目的:
六、进度安排
1)巩固C++基础知识;此次课程设计时间为一周或两周,分四个阶段完成:
2)能够运用面向对象方法进行类的设计; 1.分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要
3)锻炼学生编程能力,解决实际问题的能力。求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。2.编码调试阶段:根据设计分析方案设计类并编写代码,然后调试该代码,实
2.要求现课题要求的功能。3.总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、基本要求: 总体设计、详细设计、编码、测试的步骤和内容。
1)按照软件开发流程进行开发 4.考核阶段。
2)类的设计合理;包括类的继承多态等;
3)模块划分清晰合理;
七、撰写课程设计报告或课程设计总结
4)实用性好。课程设计报告要求: 创新要求:
在基本要求达到后,可进行创新设计,比如系统用户功能控制,对管理员级和一总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步般级别的用户系统功能操作不同。骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
三、信息描述
八、参考资料1.《C++程序设计》.郑莉.清华大学出版社 有关该系统基本信息的描述,如:学号、姓名、系别、班级和所选科目及各科成绩2.《C++编程思想》.Bruce Eckel [刘宗田].机械工业出版社等。3.《C++ Primer》中文版.Lippman[潘爱民].中国电力出版社出版4.《Effective C++中文版》Scott Meyers[侯捷].华中科技大学出版社
四、功能描述
1.学生基本信息及成绩所选科目成绩的录入修改和删除。
2.基本信息的查询(分系、班级;分科目)。
3.对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率);
4.对所开课程的成绩分析(求其平均成绩,最高分和最低分);
5.对学生考试成绩进行排名(单科按系别或班级进行排名,对每一个班级,同一
学期学生总体成绩进行排名,并显示各科成绩信息)
第二篇:C++课程设计学生信息管理系统
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++语言程序设计教程》
网上相关资料(....略)
第三篇: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 { 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++课程设计 题目名称 图书管理系统 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论坛,关于文件操作的指针运算。 1、课程设计的目的、任务 《汇编语言》课程设计对于巩固汇编语言理论知识,加强学生的实际动手能力和提高学生综合素质十分必要。课程设计的目的主要是通过程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。 2、软件需求分析和设计 2.1学生成绩管理系统是对学生成绩的管理,其中包括以下几个模块:(1).插入一个数据(插入学生学号以及语数外三个成绩)。(2)修改一个数据。(3)删除学生成绩数据。(4)查找学生成绩。(5)查看学生成绩的排名(6)查看学生成绩分布(7)按esc键退出系统 2.2学生成绩管理系统应该包含以下信息:学号,语文成绩,英语成绩,数学成绩。因此,系统应该提供以下功能:(1)输出显示菜单。(2)输入学生的成绩(3)修改学生成绩(4)删除学生成绩(5)查询学生成绩(6)显示学生成绩排名(7)显示成绩分布统计(8)按esc键退出系统 2.3依据程序的功能需求,该系统的功能结构图如下 系统功能结构图 2.4 程序流程图: 主程序流程图 查找学生成绩 插入学生学号及成绩 修改学生的成绩 显示各个学科各分数段的人数 3、程序实现说明 3.1学生管理系统中各子程序如下: (1).输入全部学生学号以及语文,英语,数学三科的成绩。子程序名:insert 子程序描述:该子程序为输入字程序。系统在开始的时候是没有数据的,通过该子程序可以初始化系统,将学生的学号及成绩输入系统。 代码: insert proc near;定义进程子程序:插入学生,学号及 成绩 call input;调用input add n,1 ret insert endp (2).修改输入的成绩。子程序名:modify 子程序描述:通过子程序修改学生的成绩 代码: modify proc near;定义进程子程序:修改学生学号,成绩 md1:output mess1;输出mess1 shuru;调用宏shuru:二位数据输入 mov bl,n mov bh,0 mov al,dl mov si,0 md: cmp al,xh[si];先查找输入的学生是否存在 je qq1_1;查到的话,就跳转到qq1_1输入修改的值,也就是重新输入。;结果相等则跳转到qq1_1 add si,1 cmp si,bx jbe md;小于等于则跳转到md output mess;输出mess jmp md1;不相等继续输入学号 qq1_1:;转入修改的值重新输入。mov di,si output mess2 output mess4 mov si,0 mov cx,3 qq3_1:shuruu;cmp dx,78h; jbe qq2_1;output ts3;jmp qq1_1;qq2_1:mov buf[si],dl output bg;add si,1 loop qq3_1 mov al,buf[0];mov chi[di],al mov al,buf[1] 分别输入语文,英语,数学成绩,并将其放 在缓冲区buf中 比较输入的成绩是否大于120,如果大于120的 话,那么重 新输入成绩 小于等于则转移到qq2_1 输出ts3 跳转到qq1_1 输出空格 将存入buf中的成绩,分别赋值给存放对应科 目的成绩的数组 mov eng[di],al mov al,buf[2] mov mat[di],al ret modify endp (3).删除学生的成绩。子程序名:delete 子程序描述:通过子程序删除学生的成绩 代码: de proc near;删除某个学生的记录 sc1:output mess1 shuru;调用宏shuru,接受输入的学号 mov bl,n mov bh,0 mov al,dl mov si,0 sc: cmp al,xh[si];查询输入学号的学生信息是否存在,不存在的话,重新输入学号 je sc2;相等则转移到sc2 add si,1 cmp si,bx jbe sc;小于等于则转移到sc output mess;输出mess jmp sc1 sc2: sub bx,si cmp bx,0 je sc3;相等则转移到sc3 mov cx,bx sc4:mov dl,chi[si+1] mov chi[si],dl mov dl,eng[si+1] mov eng[si],dl mov dl,mat[si+1] mov mat[si],dl mov dl,xh[si+1] mov xh[si],dl add si,1 loop sc4;loop循环指令,执行操作(cx)<--(cx)-1.若 cx!=0,跳转到标号sc处循环执行;cx=0,则推出 循环,执行loop的下一条指令 sub n,1 sc3: ret de endp (3).查询学生的成绩。子程序名:find 子程序描述:通过子程序查询学生的成绩 代码: find proc near;定义进程子程序:查找学生成绩 call sum;求学生的总成绩 call ping;求学生的平均成绩 bj1:output mess1;输出mess1 shuru;二位数数据输入 mov bl,n mov bh,0 mov al,dl mov si,0 bj: cmp al,xh[si];将输入的学号与输入的学号相比,je i;存在的话,将此学生的成绩输出。je表示结果相 等则转移。add si,1 cmp si,bx jbe bj;output mess jmp bj1 i: output strr2 shuzi xh[si];shuzi output bg;mov al,chi[si] cbw;shuzii ax;shuzii output bg;mov al,eng[si] cbw;shuzii ax;shuzii output bg mov al,mat[si] cbw shuzii ax output bg; mov al,pj[si] cbw 小于等于则转移到bj 为二位数据输出 输出空格 将字节变为字 为三位数据输出。输出空格 将字节变为字 为三位数据输出 输出空格的字符串,用于与标题栏对齐 shuzii ax output bg mov ax,si mov bl,2 mul bl mov bx,ax shuzii zc[bx];shuzii为三位数据输出 output bg;输出空格的字符串,用于与标题栏对齐 shuzi mc[si];shuzi为二位数据输出 ret find endp (4).显示学生的成绩排名。子程序名:show 子程序描述:通过子程序显示学生的成绩排名 代码: show proc near;定义进程子程序:显示结果排名 call sum;调用宏sum call ping;调用宏ping call rank;调用宏rank call shuchu;调用宏shuchu ret show endp 3.2程序运行抓图: 主菜单 修改学生成绩 删除学生成绩 显示各个学科各分数段的人数 4、程序总结 通过两个星期的学习,努力,终于完成了报告。系统可以很好的运行。这两个多星期的时间,几乎每天不是在敲代码,就是在看代码,查书,上网。系统中用到了很多最近才学习的知识,比如宏,子程序。这些都使得代码的运行效率提高了,代码行数减少了。系统还用到了bios的清屏功能。这些功能如果不是做课程设计,我想我很难会接触到这些知识。 由于自己对知识掌握的不是很牢固,其中也会碰到一些困难。每当遇到问题的时候,我会先上网去查找,看看有没有人提过这方面的问题。互联网是强大的,大部分的问题通过网络都可以解决。部分找不到的问题,我就去请教班里学得好的同学。他们对知识的掌握远超过我。这样下来,很多问题都迎刃而解了。 课程设计是一个很好的掌握书本上知识的过程。平时上课之后,自己都不会想着去敲一些代码联系联系。通过做课程设计,将理论与实践结合了起来,对知识的理解更加深入了。第四篇:C++课程设计(简单图书管理系统)
第五篇:语言课程设计-学生成绩管理系统