数据库原理
课程设计
设计题目:学生信息管理数据库系统设计
学 生 侯鹏涛 学 生 闫立波
学 生 李跃 学 生 惠超
学 生 王真龙 学 生 刘豪杰
专 业 计算机科学与技术
班 级 计科一班
西安理工大学高科学院
20##年 第 2 学期
目 录
1 概 述......................................................... 1
1.1 课程设计目的.................................................. 1
1.2 课程设计内容.................................................. 1
2 系统总体设计.................................................... 1
2.1 系统目标...................................................... 1
2.2 主体功能...................................................... 2
2.3 系统流程...................................................... 3
2.4 开发环境...................................................... 4
3系统详细设计.................................................... 4
3.1系统主界面设计................................................ 4
3.2 输入模块设计.................................................. 5
3.3 输出模块设计.................................................. 5
3.4 查询模块设计.................................................. 5
3.5 更改模块设计.................................................. 5
3.6 统计模块设计.................................................. 5
3.7 保存退出模块设计.............................................. 5
4 测试............................................................ 6
4.1 测试方案...................................................... 6
4.2 测试结果...................................................... 6
5 小结........................................................... 10
参考文献......................................................... 12
小组分工..........................................................13
学生学籍管理系统程序的设计与实现
1 概 述
1.1 课程设计目的
1、巩固并加深学生对C++语言程序设计知识的理解;
2、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;
3、进一步掌握和应用VC++ 6.0集成开发环境;
4、提高运用C++语言解决实际问题的能力;
5、初步掌握开发小型实用软件的基本方法,能独立设计、实现具有实际功能的小系统;
6、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。
1.2 课程设计要求
1、根据分组情况对规定的课程设计题目要求进行分析、设计;
2、利用Visual C++独立编写程序代码,并调试程序使其能正确运行;
3、源程序要有适当的注释,使程序容易阅读;
4、设计完成的软件要便于操作和使用,采用模块化设计方法,可以根据实际情况选择SDI、MDI或Dialog-Based方式实现系统;
5、要求系统的用户界面尽量简单、合理,鼓励学生自动增加新功能模块(视情况可另行加分);
6、完成并提交课程设计报告,具体要求见相关说明文档。
1.3 课程设计内容
课题名称:学籍管理系统
说明:学生学籍记录以下信息:姓名、家庭住址、学号,成绩、性别等。可以用能表示学生学籍信息的类存储数据。
要求:
1) 具备对学籍的管理功能(添加、删除、排序)
2) 具备按姓名、学号查询学生学籍的功能。
3)给定某个班级的班号,显示该班所有学生的作业完成情况;
4)给定某位学生的学号,修改该学生的作业完成信息;
5)给定某位学生的学号,删除该学生的信息;
6)提供一些统计各类信息的功能。
2 系统总体设计
2.1 系统目标
(1) 根据查询条件实现学生的作业的完成情况查询
(2) 学生的作业完成信息的增加、删除、修改
(3) 方便各任课教师记录,统计所带班学生的在作业完成情况,提高工作效率,减轻负担;总结经验,提高教学质量
(4) 为教务处管理人员提供各学期、各班级学生的作业完成情况,以作为其进行作业分数的汇总,分析和总结评比的依据。
2.2 主体功能
据需求把整个系统分化成不同的模块,每个模块完成一个特定的子功能。把这些模块结合起来组成一个整体。逐一实现各个功能。
图2-1 系统功能模块图
2.3 系统流程
图3-1
² 数据的录入:如录入学生的基本信息
² 数据的修改:如修改指定学号、或者指定姓名的学生信息,
² 数据的插入:插入某个学生信息;
² 数据的查询:如按学号查询、按姓名查询等;
² 数据的删除:如删除指定学号、或者指定姓名的学生;
² 列出不及格学生清单(学号、姓名、不及格的课程和成绩)。
² 用文件把数据保存起来
2.4 开发环境
² 系统开发环境:Microsoft Visual C++ 6.0
² 系统开发语言:C语言
3系统详细设计
3.1系统主界面设计
由主函数界面分成留个子模块
图4-1
3.2 输入模块设计
数据的录入: 录入学生的基本信息,如姓名、学号
3.3 输出模块设计
两部分:1.按总分名次输出 2.按学号顺序输出
3.4 查询模块设计
查询信息:本功能实现是调用struct stu *findnum(void)函数查找该条信息的地址,然后再采用for循环进行信息的输出,本功能的实现比较简单,难点在于对函数的调用的灵活运用。
3.5 更改模块设计
信息的修改:本系统采用的是按学号查找信息,系统采用一个由判断语句和循环语句构成的查询函数struct stu *findnum(void)来提供信息存储地址;再按照地址来进行修改,其中采用switch语句和循环语句来控制使系统能够提供选择修改的功能。在这一功能的设计中,作者感到课程信息的修改中的添加课程信息功能是一个难点,解决方案是按插入方案来进行设计。
增加信息:本系统采用的是按学号顺序来进行插入的,在这一功能的设计中,首先在开辟一个结构体空间将插入学生的信息存储于其中,在采用判断语句和循环语句来查找该条信息应该插入位置的地址,将上一结点的下行指针指向本结点,再将该节点的下行指针指向下一个结点从而达到插入信息的目的。在这一功能的设计中作者感到插入的具体算法是个难点,本系统采用的教材书本上的方法。
删除信息:系统采用按学号删除的方案,在这一功能的设计中我没有采用直接调用struct stu *findnum(void)函数,而是又重写查找地址程序,这是出于考虑系统功能的更好实现而采用的举措。具体删除算法采用该节点上一个结点的下行指针直接指向该结点下一个结点从而达到删除该结点的目的。在此功能的设计中,本作者感到难点不在于算法而在于思维设计的是否缜密。
3.6 统计模块设计
排序学生成绩:通过菜单选择排序依据,采用排序算法(冒泡、插入、选择等)对数据进行排序并输出结果。首先要读文件。
3.7 保存退出模块设计
每次执行完修改信息包括添加、录入、修改、删除等都需要保存信息。当然在每个修改函数最后都需要调用一下保存函数。
4 测试
4.1 测试方案
测试方案一:登录学生作业完成管理系统
测试方案二:录入学生信息
测试方案三:显示学生信息
测试方案四:查找学生作业完成情况的信息
测试方案五:修改学生作业完成情况的信息
测试方案六:删除学生信息
测试结果七:添加学生信息
测试结果八:保存退出
4.2 测试结果
测试结果一:
图 6-1
测试结果二:
测试方案三:
图7-1
测试结果三:
图7-2
测试结果四:
图8-1
测试结果五:
图8-2
测试结果六:
图9-1
测试结果七:
图9-2
测试结果八:
图10-1
5 小结
为期两周的课程设计结束了,在老师和同学的帮助下,我基本完成系统的设计。我按照系统工程软件设计的要求,从需求分析,概念设计,总体设计,详细设计,系统测试等各个步骤,分步完成系统的各项任务,实现了系统中的学生作业完成情况的查询,学生信息更新,学生信息添加等模块的功能。
在这两个星期里我收获如下:
1、巩固和加深了对C++的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
根据我在课程设计中遇到的问题,我将在以后的学习当中注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
参考文献
[1]谭浩强.C++程序设计(第二版)[M].北京:清华大学出版社,2012.
[2]谭浩强.C++程序设计题解与上机指导(第二版)[M].北京:清华大学出版社,2012.
小组分工:
王真龙: 课程设计目的及内容;
侯鹏涛: 系统总设计;
李悦: 输入,输出,查询模块设计;
闫立波: 更改,通缉,保存退出模块设计;
惠超,刘豪杰:测试方案以及测试结果.
第二篇:《C++程序设计语言》课程设计报告(学生学籍管理系统)
南京航空航天大学
《C++程序设计语言》课程设计报告
学 生 学 籍 管 理 系 统
小组成员:081110310 曲 健
指导教师:陈 丹
完成日期:二○一二年四月十八日
1
目 录
一、需求分析 ..................................................................................... 3
二、程序的主要功能 .......................................................................... 4
三、程序运行平台 .............................................................................. 5
四、系统总框架图 .............................................................................. 5
五、程序类的说明 .............................................................................. 6
六、模块分析 ..................................................................................... 8
七、比较有特色的函数 ...................................................................... 9
八、存在的不足与对策 .................................................................... 12
九、程序源代码 ............................................................................... 13
2
一、需求分析
? 学籍管理现状
1、目前国内大中专院校众多,在校的学生人数占据了社会人口很大一部分,是社会群体中的新生力量;
2、对学生学籍的管理是各大院校日常管理中不可忽视的一个重要环节;
3、随着计算机等高新科技的发展,对学籍的管理早已不能仅仅满足于纸质文件。 因此,开发出一套计算机学生学籍管理系统显得很有必要。
? 本系统存在的价值
1、满足了各大院校对学籍管理的强烈要求;
2、力图用最少的代码完成最多的功能,代码简洁没有冗余;
3、系统操作简便明了,根据提示即可进行简便常用的日常学籍管理;
4、占用资源少、需求大、简便易操作,多彩的可视化界面。
综合以上众多优势,证明了本系统存在的价值。
? 选择C++的理由
C++为了解决程序设计的复杂性,美国贝尔实验室于19xx年开始研制一种“带类”的C,到19xx年才正式命名为C++。
C++语言吸收了C和Simula 67的精髓,具有C无可比拟的优越性。C++结构清晰、易于维护、已于拓展,同时又不失效率。
(节选自《C++简明教程》(皮德常),电子工业出版社)
综合以上优点,我们选定C++为本次系统的程序设计语言。
3
二、程序的主要功能
? 显示全部学生信息
显示全部学生的学生信息。包括学号、姓名、电话、住址、绩点、奖惩信息、学生证预约记录等
? 查找指定信息
通过输入学号,查找并输出指定学生的全部信息
? 开具学籍证明
通过输入学号,开具该学生的学籍证明保存到Apply.txt文件中,并在屏幕上输出 ? 学生证预约登记
记录指定学生的学生证预约登记记录
? 奖惩信息录入
记录指定学生的奖惩信息记录
? 按学号排序后输出
按学号排序后输出到屏幕,并保存到PeoInfo.txt文件
? 按绩点高低排序输出
按绩点高低排序后输出到屏幕,并保存到PeoInfo.txt文件
? 清除数据文件
清除PeoInfo.txt文件中的全部信息
? 学生信息更新/修改
通过学号更新/修改该学生的信息
? 作者&版权信息
显示作者及课设的相关信息
4
三、程序运行平台
Microsoft Visual C++ 6.0
四、系统总框架图
(图4-1)
(图4-2)
5
五、程序类的说明
? Stu类的说明
class Stu //父类,公用类
{
protected:
Info *person;
fstream people; //创建二进制文件
public:
Stu();
virtual Info *SearNum(char *)=0; //按学号查找学生信息,纯虚函数 bool operator>(const Info *); //比较成绩高低,重载>运算符 friend void InputOne(Info *p1); //友元函数
void creat(); //创建链表
~Stu();
};
? Show类的说明
class Show:public Stu //Stu的子类,显示模块,抽象类 {
public:
void ShowOne(Info *); //显示指定的学生信息
void ShowAll(); //显示所有学生的信息
Info *SearNum(char *);
void ListNum(); //按学号排序输出
void ListMark(); //按绩点高低排序输出
};
? Manage类的说明
class Manage:public Show //Show的子类,管理模块,多重继承 {
public:
Info *SearNum(char *);
void Apply(char *); //学籍证明
6
void Book(char *); //学生证预约 void Change(char *); //信息更新/修改 void GoodBad(char *); //奖惩情况录入 };
? WrongIn类的说明
class WrongIn
{ };
//用于捕捉输入异常7
六、模块分析
? 显示模块
显示全部学生的学生信息。包括学号、姓名、电话、住址、绩点、奖惩信息、学生证预约记录等
? 查找模块
通过输入学号,查找并输出指定学生的全部信息
? 管理模块
1、开具学籍证明。通过输入学号,开具该学生的学籍证明保存到Apply.txt文件中,并在屏幕上输出;
2、学生证预约登记。记录指定学生的学生证预约登记记录;
3、奖惩信息录入。记录指定学生的奖惩信息记录;
4、学生信息更新/修改。通过学号更新/修改该学生的信息;
? 输出模块
1、按学号排序后输出。按学号排序后输出到屏幕,并保存到PeoInfo.txt文件;
2、按绩点高低排序输出。按绩点高低排序后输出到屏幕,并保存到PeoInfo.txt文件; ? 清除模块
清除PeoInfo.txt文件中的全部信息
? 作者&版权信息模块
显示作者及课设的相关信息
8
七、比较有特色的函数
? 纯虚函数SearNum
virtual Info *SearNum(char *)=0; //按学号查找学生信息,纯虚函数
? Creat函数
void Student::creat() //创建链表
{
Info *head;
Info *p1,*p2;
int n=0;
char GoOn='Y';
p1=p2=new Info;
InputOne(p1);
people.write((char *)p1, sizeof(*p1)); //二进制输出文件 head=NULL;
while(GoOn=='Y'||GoOn=='y')
{
n++;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
system("COLOR 1e");
cout << "是否继续输入? Y/N:";
cin >> GoOn; cin.ignore();
if(GoOn!='Y' && GoOn!='y') //判断输入是否结束 {
people.close();
break;
}
p1=new Info;
InputOne(p1);
people.write((char *)p1, sizeof(*p1));
}
p2->next=NULL;
person=head;
}
——该函数通过指针和链表,动态存储学生信息,并保存到文件中
9
? SearNum函数
Info *Student::SearNum(char *a) //按学号查找学生信息
{
system("COLOR 3d");
Info *p;
cout << "开始按学号查找!\n";
p=person;
bool record=false;
while(p!=NULL && !record)
{
if(strcmp(p->num,a)==0)
{
ShowOne(p);
return p;
record=true;
}
p=p->next;
}
if(!record)
cout << "没有查找到相关数据!\n";
}
——该函数通过链表查找数据,运用了布尔类型
? >运算符重载函数
bool Student::operator > (const Info *right)
{
if(person->mark > right->mark)
return true;
else return false;
}
——该函数重载了>运算符,便于直接比较两结构体所存储数据的绩点高低
? ListNum函数
void Student::ListNum() //按学号排序输出
{
Info *p1,*p2,*temp,*now;
int i=0;
system("COLOR 3f");
cout << "开始按学号排序!\n";
now=person;
10
p1=person;
p2=person->next;
while(p2 && i++<=N)
{
if(strcmp(p2->num,p1->num)>0 && p1==person) //插入到头结点之前
{
temp=p2;
p2=temp->next; //在原链表中删除p2的信息
person=temp;
temp->next=p1; //p2插入到最前
}
if(strcmp(p2->num,p1->num)>0)
{
temp=p2;
p2=temp->next;
temp->next=p1;
p1=temp;
}
now=now->next;
p1=now;
p2=now->next;
}
fstream listnum;
listnum.open("PeoInfo.txt",ios::out | ios::binary);
p1=person;
while(p1)
{
listnum.write((char *)p1, sizeof(*p1));
p1=p1->next;
}
listnum.close();
ShowAll();
}
——运用链表和指针按学号大小排序全部学生信息
11
八、存在的不足与对策
? 类对象中的信息存储问题
描述:类对象中用数组存储所有学生的信息,显得较为复杂,不方便管理和操作。在数据的处理时造成一定的麻烦。
对策:类外部定义Info 结构体,在类内部用结构体+链表的方式存储学生的信息
? 文件写入的问题
描述:用普通文件存储学生信息显得较为复杂,数据录入较为繁琐,不便于操作。 对策:采用二进制文件的方式,整块录入结构体数据文件。方便、快捷。
? 链表排序问题
描述:对链表的操作掌握的不够熟练,对创建好的链表进行排序时显得手足无措,不能善于利用指针。
对策:参考相关书籍,请教老师等。
? 程序细节问题
描述:由于首次进行比较大规模的程序设计,程序中的很多输入输出细节没有注意到,导致某些格式不统一。
对策:小组成员轮流校对程序,发现问题并改进。
12
九、程序源代码
另附:1、程序单文件原始代码“学生学籍管理_单文件代码.cpp”;
2、多文件组织后的“学生学籍管理_多文件组织”工程文件夹。
/*
本程序应用了:
布尔类型 格式化输入输出
cin.getline() 引用作为函数参数
函数重载 内存的动态分配
二进制文件 结构体指针
构造函数 析构函数
静态数据成员 函数覆盖
纯虚函数 抽象类
友元函数 >运算符重载
继承和多重继承 异常处理
通过链表动态存储数据
多文件组织
等C++的特色功能
*/
#include<iostream>
using namespace std;
#include<fstream>
#include<stdlib.h>
struct Info
{
char num[20]; //学号
char name[8]; //姓名
char phone[12]; //电话
char adres[40]; //住址
float mark; //绩点
char other[100]; //奖惩信息
char book; //学生证预约
Info *next;
};
static int N; //记录信息的条数,静态变量
class Stu //父类,公用类
{
13
protected:
Info *person;
fstream people; //创建二进制文件
public:
Stu();
virtual Info *SearNum(char *)=0; //按学号查找学生信息,纯虚函数 bool operator>(const Info *); //比较成绩高低,重载>运算符 friend void InputOne(Info *p1); //友元函数
void creat(); //创建链表
~Stu();
};
class Show:public Stu //Stu的子类,显示模块,抽象类 {
public:
void ShowOne(Info *); //显示指定的学生信息
void ShowAll(); //显示所有学生的信息
Info *SearNum(char *);
void ListNum(); //按学号排序输出
void ListMark(); //按绩点高低排序输出
};
class Manage:public Show //Show的子类,管理模块,多重继承 {
public:
Info *SearNum(char *);
void Apply(char *); //学籍证明
void Book(char *); //学生证预约
void Change(char *); //信息更新/修改
void GoodBad(char *); //奖惩情况录入
};
class WrongIn //用于捕捉输入异常
{ };
Stu::Stu()
{
N=0;
person=new Info; //内存动态分配
people.open("PeoInfo.txt",ios::out | ios::binary);
if(people.fail())
{
cout<<"创建文件PeoInfo.txt出错! \n" ;
14
exit(0);
}
}
Stu::~Stu()
{
people.close();
}
void InputOne(Info *p1) //输入一个学生信息
{
system("COLOR 3f");
cout << "\n请输入下面的数据!\n" ;
cout << "学号: ";
cin.getline(p1->num,20);
cout << "姓名: ";
cin.getline(p1->name,8);
cout << "电话: ";
cin.getline(p1->phone,12);
cout << "住址: ";
cin.getline(p1->adres,40);
cout << "绩点: ";
cin >> p1->mark; cin.ignore(); //略过换行符
cout << "备注: ";
cin.getline(p1->other,100);
cout << "学生证预约办理? Y/N:";
cin >> p1->book; cin.ignore();
N++;
}
void Show::ShowOne(Info *p) //显示指定的学生信息
{
system("COLOR 3f");
cout
"=================================================\n\n";
cout << "学号: " << p->num << endl;
cout << "姓名: " << p->name << endl;
cout << "电话: " << p->phone << endl;
cout << "住址: " << p->adres << endl;
cout << "绩点: " << p->mark << endl;
cout << "备注: " << p->other << endl;
cout << "学生证预约办理Y/N: " << p->book << endl;
cout
"=================================================\n";
15 << <<
}
void Stu::creat() //创建链表
{
Info *head;
Info *p1,*p2;
int n=0;
char GoOn='Y';
p1=p2=new Info;
InputOne(p1);
people.write((char *)p1, sizeof(*p1)); //二进制输出文件 head=NULL;
while(GoOn=='Y'||GoOn=='y')
{
n++;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
system("COLOR 1e");
cout << "是否继续输入? Y/N:";
cin >> GoOn; cin.ignore();
if(GoOn!='Y' && GoOn!='y') //判断输入是否结束 {
people.close();
break;
}
p1=new Info;
InputOne(p1);
people.write((char *)p1, sizeof(*p1));
}
p2->next=NULL;
person=head;
}
Info *Show::SearNum(char *a) //按学号查找学生信息 {
system("COLOR 3d");
Info *p;
cout << "开始按学号查找!\n";
p=person;
bool record=false;
while(p!=NULL && !record)
{
if(strcmp(p->num,a)==0)
16
{
ShowOne(p);
return p;
record=true;
}
p=p->next;
}
if(!record)
cout << "没有查找到相关数据!\n";
return NULL;
}
Info *Manage::SearNum(char *a) //按学号查找学生信息 {
system("COLOR 3d");
Info *p;
cout << "开始按学号查找!\n";
p=person;
bool record=false;
while(p!=NULL && !record)
{
if(strcmp(p->num,a)==0)
{
ShowOne(p);
return p;
record=true;
}
p=p->next;
}
if(!record)
cout << "没有查找到相关数据!\n";
return NULL;
}
void Show::ShowAll() //显示所有学生的信息 {
char again;
fstream showAll;
system("COLOR 1e");
cout << "\n\n*** 下面显示所有学生的信息 ***\n" ; showAll.open("PeoInfo.txt",ios::in | ios::binary);
if(showAll.fail())
{
cout<<"打开文件PeoInfo.txt出错! \n" ;
17
exit(0);
}
showAll.read((char *)person, sizeof(*person));
while( !showAll.eof())
{
cout << "学号: " << person->num << endl;
cout << "姓名: " << person->name << endl;
cout << "电话: " << person->phone << endl;
cout << "住址: " << person->adres << endl;
cout << "绩点: " << person->mark << endl;
cout << "备注: " << person->other << endl;
cout << "学生证预约办理Y/N: " << person->book << endl;
cout << "\n请按回车键,显示下一条信息!\n";
cin.get(again);
showAll.read((char *)person,sizeof(*person));
}
cout<<"显示完毕!\n";
showAll.close();
}
void Manage::Apply(char *a) //开具学籍证明
{
Info *p;
p=SearNum(a);
system("COLOR 2e");
fstream apply;
apply.open("Apply.txt",ios::out);
cout << "=================================================\n\n";
cout << " 证 明 \n"; cout << " " << p->name <<"同学(学号:"<<p->num<<"),系我校在校学生。\n";
cout << " 特此证明。\n\n";
cout << " 南京航空航天大学\n\n"; cout << "=================================================\n";
cout << endl << "已按上述格式保存到Apply.txt文件中!\n";
apply << "=================================================\n\n";
apply << " 证 明 \n"; apply << " " << p->name <<"同学(学号:"<<p->num<<"),系我校在校学生。\n";
apply << " 特此证明。\n\n";
apply << " 南京航空航天大学\n\n"; 18
apply
"=================================================\n";
apply.close();
}
void Manage::Book(char *a) //学生证预约办理
{
Info *p;
p=SearNum(a);
p->book='Y';
system("COLOR 3e");
cout
"=================================================\n\n";
cout << "预约信息已记录!请尽快提交相关证明!\n\n";
cout
"=================================================\n";
}
void Manage::GoodBad(char *a) //学生奖惩情况录入功能
{
Info *p;
p=SearNum(a);
system("COLOR 5e");
cout
"=================================================\n\n";
cout << "请输入该同学的奖惩情况:\n";
cin >> p->other;
fstream GoodBad;
GoodBad.open("PeoInfo.txt",ios::out | ios::binary);
p=person;
while(p)
{
GoodBad.write((char *)p, sizeof(*p));
p=p->next;
}
GoodBad.close();
cout << "奖惩情况录入完毕!感谢使用\n\n";
cout
"=================================================\n";
}
bool Stu::operator > (const Info *right) //运算符重载
{
if(person->mark > right->mark)
19 << << << << <<
return true;
else return false;
}
void Show::ListNum() //按学号排序输出
{
Info *p1,*p2,*temp,*now;
int i=0;
system("COLOR 3f");
cout << "开始按学号排序!\n";
now=person;
p1=person;
p2=person->next;
while(p2 && i++<=N)
{
if(strcmp(p2->num,p1->num)>0 && p1==person) //插入到头结点之前
{
temp=p2;
p2=temp->next; //在原链表中删除p2的信息 person=temp;
temp->next=p1; //p2插入到最前
}
if(strcmp(p2->num,p1->num)>0)
{
temp=p2;
p2=temp->next;
temp->next=p1;
p1=temp;
}
now=now->next;
p1=now;
p2=now->next;
}
fstream listnum;
listnum.open("PeoInfo.txt",ios::out | ios::binary);
p1=person;
while(p1)
{
listnum.write((char *)p1, sizeof(*p1));
p1=p1->next;
}
listnum.close();
ShowAll();
20
}
void Show::ListMark() //按绩点高低排序输出 {
Info *p1,*p2,*temp,*now;
int i=0;
system("COLOR 3f");
cout << "开始按学号排序!\n";
p1=person;
p2=person->next;
now=person;
while(p2!=NULL && i++<=N)
{
if(p2>p1 && p1==person) //插入到头结点之前 {
temp=p2;
p2=temp->next; //在原链表中删除p2的信息 person=temp;
temp->next=p1; //p2插入到最前
}
if(p2>p1)
{
temp=p2;
p2=temp->next;
temp->next=p1;
p1=temp;
}
now=now->next;
p1=now;
p2=now->next;
}
fstream listnum;
listnum.open("PeoInfo.txt",ios::out | ios::binary);
p1=person;
while(p1)
{
listnum.write((char *)p1, sizeof(*p1));
p1=p1->next;
}
listnum.close();
ShowAll();
}
void Manage::Change(char *a) //学生信息更新/修改
21
{
Info *p;
system("COLOR 4e");
p=SearNum(a);
cout << "=================================================\n\n";
cout << "请输入该同学更新/修改后的信息:\n";
cout << "学号: " << p->num << endl;
cout << "姓名: ";
cin.getline(p->name,8);
cout << "电话: ";
cin.getline(p->phone,12);
cout << "住址: ";
cin.getline(p->adres,40);
cout << "绩点: ";
cin >> p->mark; cin.ignore(); //略过换行符
cout << "备注: ";
cin.getline(p->other,100);
cout << "学生证预约办理? Y/N:";
cin >> p->book; cin.ignore();
fstream Change;
Change.open("PeoInfo.txt",ios::out | ios::binary);
p=person;
while(p)
{
Change.write((char *)p, sizeof(*p));
p=p->next;
}
Change.close();
cout << "该同学信息更新/修改完毕!感谢使用\n\n";
cout << "=================================================\n";
}
void main()
{
system("COLOR 1e");
Info *p;
Manage manage;
Show show;
int want;
char use='Y';
char sear[20];
cout << "【欢迎使用学生学籍管理系统】\n请先录入要管理的学生信息 22
\n";
show.creat();
cout << "\n学生信息已正常录入,并保存到PeoInfo.txt文件中\n"; while(use=='y' || use=='Y')
{
cout << "\n*****************学生学籍管理系统*****************\n";
cout << "请输入要使用功能的数字代码\n";
cout << " 【 1】 显示全部学生信息\n";
cout << " 【 2】 查找指定信息\n";
cout << " 【 3】 开具学籍证明\n";
cout << " 【 4】 学生证预约登记\n";
cout << " 【 5】 奖惩信息录入\n";
cout << " 【 6】 按学号排序后输出\n";
cout << " 【 7】 按绩点高低排序输出\n";
cout << " 【 8】 清除数据文件\n";
cout << " 【 9】 学生信息更新/修改\n";
cout << " 【10】 作者&版权信息\n";
cout << "************--Powered By 303-4 NUAA--************\n";
try //异常处理模块
{
cin >> want; cin.ignore();
if(want > 10 || want < 1)
throw WrongIn();
}
catch(WrongIn)
{
cout << "输入有误!请重新输入要使用的功能代码:";
cin >> want; cin.ignore();
}
switch(want)
{
case 1: show.ShowAll(); break;
case 2:
{
cout << "请输入要查找的学号:";
cin >> sear;
p=show.SearNum(sear);
} break;
case 3:
{
cout << "请输入要开具学籍证明的学生的学号:";
23 @
cin >> sear;
manage.Apply(sear);
} break;
case 4:
{
cout << "请输入要预约办理学生证的学生的学号:"; cin >> sear;
manage.Book(sear);
} break;
case 5:
{
cout << "请输入要录入奖惩信息的学生的学号:"; cin >> sear;
manage.GoodBad(sear);
} break;
case 6:
{
cout << "按任意键开始排序!";
cin >> sear;
show.ListNum();
} break;
case 7:
{
cout << "按任意键开始排序!";
cin >> sear;
show.ListMark();
} break;
case 8:
{
cout << "按任意键开始清除!\n";
fstream clean;
clean.open("PeoInfo.txt",ios::out);
cout
"=================================================\n";
cout << "清除完毕!\n";
cout
"=================================================\n";
clean.close();
} break;
case 9:
{
cout << "请输入要更新/修信息改的学生的学号:"; cin >> sear; cin.ignore();
manage.Change(sear);
24 << <<
} break;
case 10:
{
cout << "\n*****************学生学籍管理系统*****************\n";
cout << "南京航空航天大学·《C++程序设计语言》课程设计\n\n";
cout << " 小组成员:081110310 曲 健\n"; cout << " 081110311 代永轩\n"; cout << " 081110312 方 祥\n"; cout << " 081110313 许 云\n\n"; cout << " 指导教师:陈 丹\n";
cout << " 完成日期:二○一二年四月十七日\n"; cout << "\n (基于Microsoft Visual C++ 6.0)\n";
cout << "************--Powered By 303-4 @ NUAA--************\n";
} break;
default: break;
}
cout << "\n系统执行完毕,是否使用其他功能? Y/N:";
cin >> use;
if(use=='n' || use=='N')
{
cout << "=================================================\n";
cout << " 感谢使用!再见!\n";
cout << "=================================================\n";
}
}
}
25