文件管理系统开发案例_第1页
文件管理系统开发案例_第2页
文件管理系统开发案例_第3页
文件管理系统开发案例_第4页
文件管理系统开发案例_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文件管理系统开发案例

----学生成绩管理系统的设计教学目的:了解文件管理系统的设计步骤。将课程的主要知识内容融会贯通于该案例中。变松散的知识点的学习为知识的灵活掌握与应用。分别从结构化层面和面向对象的层面了解抽象思维的设计思想。训练学生的综合设计和调试程序的能力。教学讲解重点:避免原有内容的重复讲解,突出强调难点和易错点的讲解,包括:复杂数据结构的访问层次和语句结构根据函数功能确定函数参数及返回值类型单链表的操作函数中表头指针的变化根据文件操作数据类型和文件的有无选取正确的文件打开方式和文件读写函数。通过代码的不同组织了解不同层次的抽象设计思想,包括函数库、接口、类等概念,进一步区分结构化程序设计过程和面向对象设计中函数的不同使用方式和意义通过代码组织理解文件包含的作用、掌握多文件操作的方法。引导学生思考如何对系统功能的进一步完善和对代码的进一步优化。学生成绩管理系统设计要求:学生信息以数据文件的形式存放在磁盘中,包括学号、姓名、班级、语文、数学、英语三门课程的成绩,系统对学生信息可以进行各种增、删、改、排序及对文件进行读写等功能。需求分析总体设计详细设计及编码代码组织---编程抽象一、需求分析能从文件中读入学生记录存于计算机中,同时也能将学生记录保存到磁盘文件;能按不同方式添加新学生记录;能对指定的学生记录进行修改、删除;能按照不同条件查询学生记录能对学生成绩进行统计并显示统计结果可对学生表按条件进行排序可用菜单形式显示系统功能供用户选择,并能从不同功能操作中返回到菜单成绩管理更新模块输入模块查询模块统计模块输出模块文件输入键盘输入按学号查询按姓名查询增加记录删除记录修改记录排序记录输出至文件屏幕显示统计各段人数系统功能模块图二、总体设计基本流程功能模块设计数据结构设计函数功能描述开始打开文件读文件并存入数组或链表调用菜单函数选择菜单操作退出系统吗调用相应函数完成相应操作已存盘否调用存盘函数结束否是否是1、基本流程输入模块:实现将数据输入数组或链表查询模块:在数组或链表中实现按不同字段进行查询更新模块:实现对记录的增、删、改、排序等操作统计模块:实现各种统计功能输出模块:实现将处理后的数据写入文件或在屏幕上输出的功能。2、功能模块设计学生成绩信息结构structstudent{charnum[8];charname[20];

ints[3];//三门课成绩}若通过数组实现,则定义结构数组structstudentstu[N];N为已定义过的符号常量若通过单链表实现,则单链表结点结构定义:structnode{

charnum[8];charname[20];

ints[3];

structnode*next;}3、数据结构设计voiddisplay(student

stu[],int

len)功能:显示长度为len的学生表中存储的学生记录。voidsearch(student

stu[],int

len)

功能:在长度为len的学生表中按姓名或学号查找指 定的学生记录。intappend(studentstu[],intlen)功能:在长度为len的学生表的末尾添加新的学生记录int

del(student

stu[],int

len)功能:从长度为len的学生表中删除指定学号的学生voidmodify(student

stu[],int

len)功能:修改长度为len的学生表中指定学号的学生记录4、函数功能描述(数据结构以结构数组为例)voidcount(student

stu[],int

len)功能:对长度为len的学生表按要求进行统计voidsort(student

stu[],int

len)功能:将长度为len的学生表中记录按要求排序voidsave(student

stu[],int

len)功能:将长度为len的学生表中记录保存到文件int

readfile(student

stu[])功能:将文件中的学生数据读入到学生记录表中,并返回表中的记录数。voidmenu()功能:显示系统提供的可选菜单项voidmain()整个系统的控制部分。三、详细设计及编码1、主函数的设计:启动程序后,首先从文件中将学生信息读入到结构数组或链表中,然后进入菜单界面供用户选择,根据选择项执行相应的操作,直到退出该管理系统。菜单界面如下:根据前面的基本流程设计出如下的主函数:清屏,原型包含在stdlib.h中voidmain(){ structstudentstu[N];

int

len;

intchoice; charch;

len=readfile(stu);//调用读文件函数

cout<<"按任意键继续"<<endl;

getchar(); while(1)//注意该循环退出的条件 {system("cls");//清屏函数 menu();//调用菜单显示函数

cout<<"选择菜单项(0~8):";

cin>>choice;

if(choice==0)//选择退出 { cout<<"\n保存到文件吗?"<<endl;

cin>>ch;

if(ch=='y'||ch=='Y')

save(stu,len);

cout<<"\n欢迎再次使用,按任意键退出"<<endl;

getchar();break; }增强交互

switch(choice) { case1:display(stu,len);break; case2:search(stu,len);break; case3:len=append(stu,len);break; case4:len=del(stu,len);break; case5:modify(stu,len);break; case6:count(stu,len);break; case7:sort(stu,len);break; case8:save(stu,len);break; default:

cout<<"\n输入错误,按任意键继续"<<endl;

getchar(); }}}2、menu函数的设计该函数功能很简单,只需在屏幕上按要求显示菜单项,请自行完成设计。3、display函数的设计分析:遍历长度为len的结构数组stu,输出每个学生的所有信息。注意对结构数组成员的访问层次,尤其是成员本身又为数组的学生成绩,需逐一访问。如第i个学生的第j门课的成绩需表示为:stu[i].s[j]故遍历需双重循环。请自行完成代码设计。4、search函数的设计设计思路:在长度为len的学生表中按姓名或学号查找指定的学生记录,因有不同的查询条件,所以需设计二级菜单,分别按学号和姓名查询学生记录,根据查询情况分别输出查询到的学生信息或是未找到的提示,然后返回到上级菜单。该函数的流程如下:开始选择查找方式按学号?选择错误否按姓名?否输入待查学号最后一个学生?是取第一个学生比较找到否?否否取下一个学生比较找到否?是输出未找到提示否输出找到的记录是结束同按学号查找过程,略voidsearch(student

stu[],int

len){int

choice,i,j;charnum[8],name[20];

system("cls");

cout<<"1.按学号查询2.按姓名查询\n";

cout<<"输入查找方式[1,2]:";

cin>>choice;

if(choice==1){cout<<"输入学号:"<<endl;

cin>>num;

for(i=0;i<len;i++)

if(strcmp(stu[i].num,num)==0){cout<<"学号\t姓名\t语文\t数学\t英语\t总分"<<endl;

cout<<stu[i].num<<'\t'<<stu[i].name<<'\t';

for(j=0;j<3;j++)

cout<<stu[i].s[j]<<"\t";

cout<<stu[i].s[0]+stu[i].s[1]+stu[i].s[2]<<endl;

cout<<"按任意键继续"<<endl;

getchar();return; }

cout<<"\n未找到该生记录,按任意键继续\n";

getchar();return;} 字符串比较必须通过此函数elseif(choice==2){cout<<"输入姓名:"<<endl;

cin>>name;

for(i=0;i<len;i++)

if(strcmp(stu[i].name,name)==0){cout<<"学号\t姓名\t语文\t数学\t英语\t总分"<<endl;

cout<<stu[i].num<<'\t'<<stu[i].name<<'\t';

for(j=0;j<3;j++)

cout<<stu[i].s[j]<<"\t";

cout<<stu[i].s[0]+stu[i].s[1]+stu[i].s[2]<<endl;

cout<<"按任意键继续"<<endl;

getchar();return; }

cout<<"\n未找到该生记录,按任意键继续\n";

getchar();return;}else{cout<<"\n选择错误,按任意键返回"<<endl;

getchar();}}?思考:比较按姓名和学号两种方式查询的代码,函数如何优化更简洁5、append函数的设计设计思路:在学生表中添加新的学生记录。首先输入要添加的学生学号,在原表中查找该学号的记录是否已存在。若已存在,则选择是否重新输入新学生记录,如选择“是”,则返回①;否则结束函数返回主菜单。若原表中不存在该学号的学生,则继续输入要添加的学生的姓名和三门课的成绩。添加成功后,学生表的实际长度增加1.根据上述设计思路,请自行完成如下形式的函数设计int

append(student

stu[],int

len)?思考:该函数的类型为何要定义为int类型int

append(student

stu[],int

len){inti;charnum[8],ch;

system("cls");while(1){cout<<"输入学号(输入'0'返回菜单):"<<endl;

cin>>num;if(strcmp(num,"0")==0) returnlen;

for(i=0;i<len;i++){if() {cout<<"学号"<<num<<"已存在,重试(y/n):";

cin>>ch;

if(ch=='y'||ch=='Y') ; else {cout<<"按任意键返回"<<endl;

getchar();returnlen; } } }strcmp(stu[i].num,num)==0break

if(i==len)//要添加的学生记录不在原表中 break;}

strcpy(stu[len].num,num);

cout<<"输入姓名:"<<endl;

cin>>stu[len].name;

cout<<"输入语文成绩【0~100】:"<<endl;

cin>>stu[len].s[0];

cout<<"输入数学成绩【0~100】:"<<endl;

cin>>stu[len].s[1];

cout<<"输入英语成绩【0~100】:"<<endl;

cin>>stu[len].s[2];;returnlen;}len++6、del函数的设计设计思路:为简单起见,本例中该函数只考虑按学号删除的情况,实际应用中还可按姓名删除学生记录。本例中该函数的设计思路:①若学生表为空表,则做相应的提示,然后退出该函数;若非空,则转②②在表中查找待删除学生的学号。③若找到,该学生后的所有记录前移一位删除该记录,然后退出该函数;若未找到,则提示该学生不存在,重新输入新学号后,转②继续查找。根据上述设计思路,请自行完成如下形式的函数设计int

del(student

stu[],int

len)7、modify函数的设计设计思路:①若学生表为空表,则做相应的提示,然后退出该函数;若非空,则转②②在表中查找待修改学生的学号。③若找到,输入该学生的新信息,然后退出该函数;若未找到,则提示该学生不存在,重新输入新学号后,转②继续查找。请自行完成代码设计8、count函数的设计分析:该函数的功能是对学生成绩表的统计,统计的内容可以很多,包括每门课程和总分的最高最低分、包括各分数段的人数等,也适宜设计成二级菜单的形式供用户选择,请大家自行完善。9、sort函数的设计设计思路:该函数的功能是对学生成绩表按条件排序,排序的条件可以是学号、成绩等,也适宜设计成二级菜单的形式供用户选择。设计程序时注意如下内容:若按学号等字符串类型的成员排序的话,注意比较的方法要通过strcmp函数实现,而不能直接用关系比较运算比较此类成员交换元素时结构变量允许整体赋值,无需逐个成员交换10、save函数的设计分析:该函数实现的是将存储于结构数组中的学生记录写入磁盘文件的功能。对结构数组适宜选择块读写。函数中注意对文件正确打开与否的判别、对读写成功与否的不同提示等等。代码请自行设计。11、readfile函数的设计分析:函数实现从磁盘文件读学生数据到结构数组的功能。对结构数组选择块读写。设计中两个关键点:因学生表的初始长度取决于文件中的记录数,所以读文件的过程中要记录下学生记录的总数,作为函数的返回值提供给其它操作使用。因数据可从文件读也可从键盘输入,所以以读的方式打开一个可能存在也可能不存在的文件应选用“ab+”方式。int

readfile(student

stu[]){FILE*fp;

inti=0,len;

fp=fopen("c:\\student","ab+");

if(fp==NULL){ cout<<"无法打开文件student\n"; exit(0);}

while(!feof(fp)){if(fread(&stu[i],sizeof(student),1,fp)==1) i++;}

len=i;

fclose(fp);

cout<<"文件中学生记录数为:"<<len<<endl;returnlen;}四、代码的组织(1)

----结构化C层面上的编程抽象函数与接口:定义函数的目的之一是将整个程序分成多个可操作的部分以降低复杂性;接口则是在更高层次上降低复杂性。函数使其调用者将访问需要的一系列步骤组合为一个操作;接口则是使其客户将访问需要的一系列函数实现成一个编程抽象。接口是库和其客户间的边界,提供库和客户间的交流渠道,也是分离二者的屏障;在不显示库的实现细节的情况下,为客户提供有关使用库的信息。使用由库导出定义的任何源文件只包括其客户需要了解的有关库的信息(只包括函数原型)库代码client.cppmylib.hmylib.c客户文件接口文件库文件managelib.h内容(接口文件)structstudent{ charnum[8]; charname[20];

ints[3];};voiddisplay(student

stu[],int

len);voidsearch(student

stu[],int

len);int

append(student

stu[],int

len);……学生成绩管理系统案例的代码组织managelib.cpp文件(库文件,包括必要的头文件)#include"managelib.h"#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"string.h"voiddisplay(student

stu[],int

len){int

i,j;

if(len==0){cout<<"无记录,按任意键返回"<<endl;

getchar();return;}……(略)此处略去前面定义的除主函数外的所有函数运行时将接口文件插入至此,进一步理解文件包含的作用scoremanage.cpp文件内容(客户文件)#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"string.h"#include"managelib.h"#defineN20voidmain(){……//主函数的具体实现

……}代码的组织(2)

----面向对象的编程抽象定义一个学生成绩管理类scoremanage,将对学生信息管理的操作都作为类的成员函数定义在类体内,组织在文件funlib.h。将类成员函数在类体外实现,组织在funlib.cpp中。structstudent{charnum[8];charname[20];

ints[3];};接口文件funlib.h包括一个student结构类型和一个成绩管理类scoremanage的定义classscoremanage{private: studentstu[N];

int

len;public:

scoremanage(studentstu1[],intlen1)//构造函数 { len=len1;

for(inti=0;i<len;i++)

stu[i]=stu1[i]; } voiddisplay(); voidsearch(); voidappend();

……};注意:类的成员函数可直接操作类的成员stu,无需通过参数使用。思考:append函数和del函数的返回值为何为void类型,与前面结构化程序不同?funlib.cpp文件(类的成员函数实现)#include"funlib.h"voidscoremanage::display(){int

i,j;

if(len==0){cout<<"无记录,按任意键返回"<<endl;

getchar();return;}

……//输出信息的语句略去}其它成员函数实现略成员函数类体外实现类成员,无需也不能重定义#include"funlib.h"voidmain(){ structstudentstu[N];

int

len,i=0;……//通过读文件获取stu内容和记录个数len

scoremanage

sm(stu,len);

……} 客户文件manmain.cpp创建scoremanage类对象,自动调用构造函数注意对类对象成员函数调用的方法有别于结构化,如:sm.display();面向对象方法的代码实现请自行完成五、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论