毕业生档案管理系统
发布时间:2011-07-03 11:01:47
发布时间:2011-07-03 11:01:47
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课程 | 程序设计语言|| |
课程设计名称 | 毕业生档案管理系统 |
指导教师 | 张贯虹 屠菁 |
姓名 | |
学号 | |
专业班级 | |
2010年6月
一、需求分析
(一)课程设计目的
《程序设计语言II》是计算机专业一门重要的专业基础课。此次课程设计的目的是以程序设计语言II为基础,通过完成一些具有一定难度的课程设计题目的编写、调试、运行工作,进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。从而提高自我分析问题、解决问题的能力。通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《程序设计语言II》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象的程序设计方法。
(6)进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。
(二)课程设计名称及内容
1、课程设计名称:毕业生档案管理系统
2、课程设计内容:设计一个毕业生档案信息管理系统,能够对学生的信息进行管理, 编写一个学生管理系统,每个学生应该包含如下信息:所学专业、毕业时间、工作单位、个人信息(姓名,出生日期,性别,民族,籍贯,学历)、联系方式(手机,家庭电话,工作单位电话)。
一、 任务和要求
实现任意添加毕业生信息
实现查询毕业生信息(按所学专业、毕业时间、性别查询、籍贯)
实现编辑(修改)毕业生信息
实现保存和浏览毕业生信息
测试数据:程序应输入不少于10人的学生信息进行测试。
二、 设计方案提示
实现提示
①: 使用单链表实现本程序要求,单链表每个节点存储一个学生的信息。
②: 创建一个链表类(List),链表类可实现如下功能:创建链表,插入节点,删除节点,编辑节点,显示节点,保存链表信息等功能,读入数据文件等功能(详细说明请查看源代码)。
③: 创建一个操作类(Operater),操作类实现如下功能:显示菜单,操作链表。
二. 设计
1.设计思想:
1)使用C++语言设计毕业生档案管理系统,使其能完成对学生的信息管理,对毕业生信息的任意添加(STU.addstu())、查询(STU.chaxun())、删除(STU.del())、修改(STU.edit())及浏览(STU.disp())
2)面向对象的设计思想,为了提高代码的可重用性,程序采用面向对象的程序设计方法。采用C++的封装特性将对象的属性和方法封装成一个类,类的属性即为成员变量,方法为成员函数。尽可能把对属性的处理放在其所属类的内部,而不是让别的类对其进行处理。比如:对结点的初始化,应当在结点类的内部进行,而不应该交给链表处理,尽管结点是链表的内嵌对象。
3)为了保持各个类的的独立性,并方便以后重用这些类,也为了方便调试时更加容易定位错误,采用多文件组织结构。每个类都有一个.h文件用以保存类定义以及一个.cpp文件保存类的实现。通过包含相应的头文件来将所有的类串联成一个完整的程序。
2.功能设计:
通过运用switch语句,实现对以下功能的选择1:STU.addstu()添加毕业生信息2:STU.chaxun()查询毕业生信3:STU.del()删除毕业生信息4:STU.edit()修改毕业生信息5:STU.disp()显示毕业生生信息。并用四个函数来实现各个部分的功能:void addstu();void disp();void del();void sdatabase::chaxun();voidsdatabase::edit();和break来实现。并一一完成各个函数功能的实现过程。
3、详细设计:
共同的基类student包括如下信息:class student//基类
private:
char name[10];
char sex[5];
char mz[10]; //民族
char jiguan[10]; //籍贯
char xueli[10]; //学历
char major[10]; //专业
char adr[30]; //工作地点
char birthday[20]; //定义出生日期字符串
char graduate[20]; //定义毕业日期字符串
Connection cn; //定义一个联系方式对象
public:
void addstu() //增加毕业生信息
void disp() //显示毕业生信息
void setname(char na[])//设置毕业生姓名
void setjiguan(char jg[])//设置毕业生籍贯
void setmz(char m[]) //设置毕业生民族
void setxueli(char xl[])//设置毕业生学历
void setmajor(char mj[])//设置毕业生所学专业
void setadr(char ad[])//设置毕业生工作地点
void setbirthday(char bd[])//设置毕业生出生日期
void setgraduate(char gr[])//设置毕业生的毕业日期
void setcell(char ce[])//设置其手机号码
void sethome(char ho[])//设置其家庭电话
void setwork(char wk[])//设置其工作电话
在主函数中运用Switch(choice)选择需要的功能,
case '1': STU.addstu() //用类对象调用添加信息函数
break;
case '2':
STU.chaxun();//用类对象调用查询函数
break;
case '3':
STU.del();//用类对象调用删除函数
break;
case '4':
STU.edit();//用类对象调用修改函数
break;
case '5':
STU.disp();//用类对象调用显示毕业生信息函
break;
case '0':
break;
default:
cout<<"请输入正确的选项:"<
break;
三. 调试及测试
1、调试过程中遇到的主要问题及解决方法
在执行程序进行一些操作时,经常发生崩溃的情况。其根本原因在于访问了未被初始化的指针。如在进行结点的删除操作时发生崩溃,主要原因在于起初我未能全面考虑删除操作的各种情况,设计算法时某些内存存在多次释放的情况,导致了程序的崩溃。一般情况下遇到因指针操作不当而导致程序崩溃时,最好的解决办法便是在函数内部设置断点(F9),然后单步调试运行,在这过程中观察指针的变化,从而找出具体的原因并解决。在执行打开操作时,经常出现诸如“烫烫烫烫烫烫赵烫烫烫汉烫烫烫究烫烫搪糜烫烫谭饰烫烫烫”这样的乱码。其原因在于我认为从文件中读取数据到链表与用户自己录入数据的过程是相同的,实则不同。因为,当用户输完一组数据选择继续输入时,Input()函数分配内存,用以存储用户即将输入的数据。但Open()函数会不一样:它在分配内存后无法保证这块内存会被写入数据,用户无法保证,系统也无法保证。故而,链表中的最后一个结点总是乱码。因此在读完文件中的所有数据后,回收多分配的内存。
2、对设计和编码的回顾讨论和分析:
按照该程序的内容、任务及要求,创建一个操作类(Operater),操作类实现如下功能:显示菜单,操作链表。通过类的组合实现程序所要求的功能,并用文件存储数据,用C++中的文件处理函数。
3、程序运行的时空效率分析
4、测试数据集
1)运行程序会出现如下画面,按照提示进行选择
2)首先选择1,然后按enter键,按照提示实现对学生信息的输入,如下图
3)然后选择2,根据提示输入选项,实现对毕业生信息的查询
4)选择4,对学生信息进行修改,并根据提示选择要修改的信息
5)选择5,查看学生的信息
6)选择0完成进行对信息的保存并退出系统
四、经验和体会。
这次编写C++程序是我认识到了自身对课本知识掌握的熟练程度,在通过写《毕业生档案管理系统》程序的过程中,不仅让我复习了所学习的知识,还能让我知道哪些知识掌握的不牢固。编写如此大的C++程序需要很多的知识,需要把一些知识点紧密的联系起来,对知识的熟练运用,从而达到系统的所有功能。在编写代码过程中,先写好框架,把要用到的类的定义全部编写好,然后尽可能逐一实现各个功能,可以不是一下写完所有的函数实现,而是写一个函数调试一个函数,保证其正确后再便写下一个函数,因为如果在写完所有的函数后再调试,各个函数间互相影响将是错误难以查找修改。能够运用所学知识,开发小型的应用系统。掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。对给定的设计题目,能够有清晰的思路,知道如何进行分析,给出相应的数学模型。掌握面向对象的程序设计方法进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。总而言之,通过这样的课程设计能够让我们学到好多东西,养成自我完成特定题目的能力及独立思考的习惯。
附录:主要源程序
#include
#include
#include
#include
const int max=100;
int i;
class Connection //建立联系方式类
{
public:
char cellphone[20];
char homephone[20];
char workphone[20];
};
class student //建立学生类
{
private:
char name[10];
char sex[5];
char mz[10]; //民族
char jiguan[10]; //籍贯
char xueli[10]; //学历
char major[10]; //专业
char adr[30]; //工作地点
char birthday[20]; //定义出生日期字符串
char graduate[20]; //定义毕业日期字符串
Connection cn; //定义一个联系方式对象
public:
void addstu() //增加毕业生信息
{
cout<<"请输入毕业生姓名:"<
cout<<"请输入毕业生性别:"<
cout<<"请输入毕业生的民族:"<
cout<<"请输入毕业生籍贯:"<
cout<<"请输入毕业生学历:"<
cout<<"请输入毕业生所学专业:"<
cout<<"请输入毕业生工作地点:"<
cout<<"请输入毕业生出生日期:"<
cout<<"请输入毕业生毕业日期:"<
cout<<"请输入毕业生手机号:"<
cout<<"请输入毕业生家庭电话:"<
cout<<"请输入毕业生工作电话:"<
}
void disp() //显示毕业生信息
{
cout<<"姓名:"<
}
void setname(char na[])//设置毕业生姓名
{ strcpy(name,na); }
void setsex(char se[]) //设置毕业生性别
{ strcpy(sex,se);}
void setjiguan(char jg[])//设置毕业生籍贯
{ strcpy(jiguan,jg);}
void setmz(char m[]) //设置毕业生民族
{ strcpy(mz,m);}
void setxueli(char xl[])//设置毕业生学历
{ strcpy(xueli,xl); }
void setmajor(char mj[])//设置毕业生所学专业
{ strcpy(major,mj);}
void setadr(char ad[])//设置毕业生工作地点
{ strcpy(adr,ad);}
void setbirthday(char bd[])//设置毕业生出生日期
{ strcpy(birthday,bd); }
void setgraduate(char gr[])//设置毕业生的毕业日期
{ strcpy(graduate,gr); }
void setcell(char ce[])//设置其手机号码
{ strcpy(cn.cellphone,ce); }
void sethome(char ho[])//设置其家庭电话
{ strcpy(cn.homephone,ho); }
void setwork(char wk[])//设置其工作电话
{ strcpy(cn.workphone,wk); }
char *getmajor()//找到毕业生的专业
{
return major;
}
int maj(char ma[])
{
if(strcmp(major,ma)==0)
return 0;
}
int gradu(char g[])
{
if(strcmp(graduate,g)==0)
return 0;
}
int se(char s[])
{
if(strcmp(sex,s)==0)
return 0;
}
int jigua(char j[])
{
if(strcmp(jiguan,j)==0)
return 0;
}
int nam(char xing[])
{
if(strcmp(name,xing)==0)
return 0;
}
};
class sdatabase
{
private:
int top;
student stu[max];
public:
sdatabase() //构造函数将毕业生信息.txt读到stu[]
{
student s;
top=-1;
ifstream file("毕业生信息.txt",ios::binary);
while (1)
{
file.read((char *)&s,sizeof(s));
if (!file)break;
top++;
stu[top]=s;
}
file.close();
}
void addstu() //添加毕业生信息
{
top++;
stu[top].addstu();
stu[top].disp();
}
void disp()
{
for(i=0;i<=top;i++)
stu[i].disp();
}
void chaxun();
void edit();
void del() //删除毕业生信息
{
cout<<"请输入要删除的毕业生姓名:"<
char xing[20];
cin>>xing;
for(i=0;i<=top;i++)
{
if(stu[i].nam(xing)==0)
{
for(;i<=top;i++)
stu[i]=stu[i+1];
top--;
}
}
}
~sdatabase() //析构函数将read[]写到毕业生信息.txt
{
ofstream file("毕业生信息.txt",ios::out);
for (int i=0;i<=top;i++)
{
file.write((char *)&stu[i],sizeof(stu[i]));
}
file.close();
}
};
void sdatabase::chaxun() //查询毕业生信息函数
{
cout<<"\t\t\t======查询毕业生信息======"<
cout<<"\t\t\t 1.按照所学专业查找 "<
cout<<"\t\t\t 2.按照毕业时间查找 "<
cout<<"\t\t\t 3.按照性别查找 "<
cout<<"\t\t\t 4.按照籍贯查找 "<
int ch;
cout<<"请选择查询方式:"<
switch(ch)
{
case 1:
char zhuanye[20];
cout<<"请输入你要查找毕业生的专业: ";
cin>>zhuanye;
for(i=0;i<=top;i++)
{
if(stu[i].maj(zhuanye)==0)
{
stu[i].disp();
}
}
break;
case 2:
cout<<"请输入要查找的毕业生的毕业日期:"<
char g[20];
cin>>g;
for(i=0;i<=top;i++)
{
if(stu[i].gradu(g)==0)
{
stu[i].disp();
}
}
break;
case 3:
cout<<"请输入要查找的毕业生的性别:"<
char s[20];
cin>>s;
for(i=0;i<=top;i++)
{
if(stu[i].se(s)==0)
{
stu[i].disp();
}
}
break;
case 4:
cout<<"请输入要查找的毕业生的籍贯:"<
char j[20];
cin>>j;
for(i=0;i<=top;i++)
{
if(stu[i].jigua(j)==0)
{
stu[i].disp();
}
}
break;
default:
cout<<"请输入正确的选项:"<
break;
}
}
void sdatabase::edit() //修改信息函数
{
student *s;
s=NULL;
char xing[20];
char choice;
cout<<"请输入要修改的毕业生姓名:"<
cin>>xing;
for(i=0;i<=top;i++)
{
if(stu[i].nam(xing)==0)
{
s=&stu[i];
s->disp();
}
}
if(s==NULL)
cout<<"Not find!"<
else
{
char xingming[10],bie[2],mz[4],jg[10],xl[4],mj[10],ad[10],bd[10],gd[10],ce[11],h[11],w[11];
cout<<"\t\t\t 修改毕业生信息 "<
cout<<"\t\t\t 1.修改姓名 "<
cout<<"\t\t\t 2.修改性别 "<
cout<<"\t\t\t 3.修改名族 "<
cout<<"\t\t\t 4.修改籍贯 "<
cout<<"\t\t\t 5.修改学历 "<
cout<<"\t\t\t 6.修改所学专业 "<
cout<<"\t\t\t 7.修改工作地点 "<
cout<<"\t\t\t 8.修改出生日期 "<
cout<<"\t\t\t 9.修改毕业时间 "<
cout<<"\t\t\t a.修改手机号码 "<
cout<<"\t\t\t b.修改家庭电话 "<
cout<<"\t\t\t c.修改工作电话 "<
cout<<"请输入要修改的选项:"<
cin>>choice;
switch(choice)
{
case '1':
cout<<"请输入修改后的姓名:"<
cin>>xingming;
s->setname(xingming);
s->disp();
break;
case '2':
cout<<"请输入修改后的性别:"<
cin>>bie;
s->setsex(bie);
s->disp();
break;
case '3':
cout<<"请输入修改后的民族:"<
s->setmz(mz);
s->disp();
break;
case '4':
cout<<"请输入修改后的籍贯:"<
s->setjiguan(jg);
s->disp();
break;
case '5':
cout<<"请输入修改后的学历:"<
s->setxueli(xl);
s->disp();
break;
case '6':
cout<<"请输入修改后的专业:"<
s->setmajor(mj);
s->disp();
break;
case '7':
cout<<"请输入修改后的工作地点:"<
s->setadr(ad);
s->disp();
break;
case '8':
cout<<"请输入修改后的出生日期:"<
s->setbirthday(bd);
s->disp();
break;
case '9':
cout<<"请输入修改后的毕业日期:"<
s->setgraduate(gd);
s->disp();
break;
case 'a':
cout<<"请输入修改后的手机号码:"<
s->setcell(ce);
s->disp();
break;
case 'b':
cout<<"请输入修改后的家庭电话:"<
s->sethome(h);
s->disp();
break;
case 'c':
cout<<"请输入修改后的工作电话:"<
s->setwork(w);
s->disp();
break;
default:
cout<<"请输入正确的选项."<
break;
}
}
}
void main()
{
char choice;
sdatabase STU;
do
{
cout<<"\t\t\t 欢迎使用毕业生档案管理系统 ! "<
cout<<"\t\t\t "<
cout<<"\t\t\t 1.添加毕业生信息 "<
cout<<"\t\t\t "<
cout<<"\t\t\t 2.查询毕业生信息 "<
cout<<"\t\t\t "<
cout<<"\t\t\t 3.删除毕业生信息 "<
cout<<"\t\t\t "<
cout<<"\t\t\t 4.修改毕业生信息 "<
cout<<"\t\t\t "<
cout<<"\t\t\t 5.显示毕业生信息 "<
cout<<"\t\t\t "<
cout<<"\t\t\t 0.退出系统并保存 "<
cout<<"\t\t\t "<
cout<<" \t\t\t "<
cout<<"请选输入菜单选项:";
cin>>choice;
switch(choice)
{
case '1':
STU.addstu();
break;
case '2':
STU.chaxun();
break;
case '3':
STU.del();
break;
case '4':
STU.edit();
break;
case '5':
STU.disp();
break;
case '0':
break;
default:
cout<<"请输入正确的选项:"<
break;
}
}
while(choice!='0');
}