资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
信息科学与技术学院
《数据结构》课程设计报告
题目名称:
学生管理系统
专业班级:
11级计科2班
学生姓名:
陶 鑫
学生学号:
指导教师:
郭 理
完成日期: -01-09
1 课程设计的目的 1
1.1 课程设计的目的 1
1.2 课程设计的题目 1
1.3 题目要求 1
2 概要设计 2
2.1 存储结构 2
2.2 基本操作 3
3 详细设计 3
3.1 流程图 3
3.2 源程序 10
4 测试 21
5 课程设计总结 29
6参考书目: 29
1 课程设计的目的
1.1 课程设计的目的
更好的掌握数据结构这门课程, 会用数据结构的基本思想及算法解决实际问题。更好的掌握链表, 能进行各种基本的操作, 提高编程能力。
1.2 课程设计的题目
《学生管理系统》
1.3 题目要求
使用下面的数据, 用C/C++设计一个简单的学籍管理系统, 实现出最基本的功能。
学生基本信息文件(A.TXT)及其内容: A.TXT文件不需要编程录入数据, 可用文本编辑工具直接生成
学号 姓名 性别 宿舍号码 电话号码
01 张成成 男 501 87732111
02 李成华 女 101 87723112
03 王成凤 女 101 87723112
04 张明明 男 502 87734333
05 陈东 男 501 87732111
06 李果 男 502 87734333
07 张园园 女 102 87756122
… …. .. … ………..
学生成绩基本信息文件(B.TXT)及其内容:
学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分
01 A01 大学物理 3 66 78 82
02 B03 高等数学 4 78 -1 90
01 B03 高等数学 4 45 -1 88
02 C01 VF 3 65 76 66
… …. ………. .. .. …
(一) 功能要求及说明:
(1) 数据录入功能: 对B.TXT进行数据录入,只录入每个学生的学号、 课程编号、 课程名称、 学分、 平时成绩、 实验成绩、 卷面成绩共7个数据. 综合成绩、 学分由程序根据条件自动运算。
综合成绩的计算:如果本课程的实验成绩为-1, 则表示无实验, 综合成绩=平时成绩*30%+卷面成绩*70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩*15%+实验成绩*.15%+卷面成绩*70% .
实得学分的计算: 采用等级学分制.
综合成绩在90-100之间 ,应得学分=学分*100% 综合成绩在80-90之间 ,应得学分=学分*80%
综合成绩在70-80之间 ,应得学分=学分*75% 综合成绩在60-70之间 ,应得学分=学分*60%
综合成绩在60以下 ,应得学分=学分*0%
( 2) 查询功能: 分为学生基本情况查询和成绩查询两种
A: 学生基本情况查询:
A1----输入一个学号或姓名( 可实现选择) , 查出此生的基本信息并显示输出。
A2---输入一个宿舍号码, 可查询出本室所有的学生的基本信息并显示输出。
B: 成绩查询:
B1: 输入一个学号时, 查询出此生的所有课程情况, 格式如下:
学 号: xx 姓 名: xxxxx
课程编号: xxx 课程名称: xxxxx 综合成绩: xxxx 实得学分: xx
课程编号: xxx 课程名称: xxxxx 综合成绩: xxxx 实得学分: xx
课程编号: xxx 课程名称: xxxxx 综合成绩: xxxx 实得学分: xx
… … … … ……… … …
共修: xx科, 实得总学分为: xxx
( 3) 删除功能: 当在A.TXT中删除一个学生时, 自动地在B.TXT中删除此人所有信息。
(4 ) 排序功能: 能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
( 二) 其它要求:
( 1) 只能使用C/C++语言, 源程序要有适当的注释, 使程序容易阅读
( 2) 至少采用文本菜单界面( 如果能采用图形菜单界面更好)
( 3) 学生可自动增加新功能模块( 视情况可另外加分)
( 4) 写出课程设计报告, 具体要求见相关说明文档
2 概要设计
2.1 存储结构
首先, 为了能使自己得到锻炼, 存储结构我使用了顺序存储与链式存储, 学生基本信息用的数组来存储, 对学生成绩基本信息使用链表进行存储。结构体定义如下:
//学生基本信息的结构体定义
typedef struct student
{string xuehao; //学号
string name; //姓名
string gender; //性别
string sushe; //宿舍号
string tel;//电话
}student;
//学生成绩信息的结构体定义
typedef struct grade
{string xuehao;//学号
string courseno; //课程号
string coursename; //课程名称
int xuefen; //学分
int pingshi; //平时成绩
int shiyan; //实验成绩
int juanmian;//卷面成绩
float zonghe;//综合成绩
float shide;//实得学分
grade *next;
}grade;
2.2 基本操作
( 1) 数据录入功能
( 2) 查询功能
( 3) 删除功能
( 4) 排序功能
( 5) 显示所有学生信息
( 6) 保存
( 7) 退出
3 详细设计
3.1 流程图
各个算法的设计如下:
1.主函数: int main( );
从A.txt中读取存储的学生基本信息到内存, 以便进行处理, 过程如图1
开始
创立存储学生信息的单链表的头结点
将学生信息读取到内存
调用菜单函数
结束
图 1
2. 菜单函数: void menu(student *stu,grade *head,grade *gra);
stu是指向学生基本信息数组的指针, head是指向学生成绩信息链表头结点的指针, gra是指向学生成绩信息链表最后一个结点的指针。
用于进行指示进行各种操作, 是与每个函数都相联系的一个函数, 功能操作见图2
6保存
0退出
开始
输入i
菜单
4排序
3删除
5显示学生信息
2查询
1数据录入
其它有误误
结束
6保存
0退出
开始
输入i
菜单
4排序
3删除
5显示学生信息
2查询
1数据录入
其它有误误
图2
3. 数据录入函数: void luru(grade *gra);
其中gra是指向单链表最后一个结点的指针, 用于后插法中进行插入。
将学生成绩信息依次输入单链表中, 其中单链表边输入边创立, 综合成绩和实得学分可由计算机自己计算。流程图见图3
判断成绩范围
应得学分=学分*100%
应得学分=学分*80%
应得学分=学分*75%
应得学分=学分*60%
应得学分=0
结束
综合成绩=平时成绩*15%+实验成绩*.15%+卷面成绩*70%
输入学生平时成绩
输入学生实验成绩
输入学生卷面成绩
输入学生课程编号
输入学生的学号
输入学生学分
开始
gra->shiyan=-1
综合成绩=平时成绩*30%+卷面成绩*70%
输入学生平时成绩
输入学生实验成绩
输入学生卷面成绩
输入学生课程编号
输入学生的学号
输入学生学分
开始
gra->shiyan=-1
Y N
综合成绩=平时成绩*30%+卷面成绩*70%
90-100 80-90 70-80 60-70 60以下
图3
4.查询功能: void lookfor(student *p,grade *head);
P为指向学生基本信息数组的指针, head为指向学生成绩链表的头结点的指针。
有学生基本情况查询和成绩查询两种大功能, 基本情况查询又分为按学号或姓名查找单个学生基本信息, 也可输入宿舍号查询整个宿舍学生的基本信息。成绩查询只要输入学号便可查询相应学生的成绩信息。见图4
1.输入一个学号或姓名
2.输入一个宿舍号码
a 按学号查找
b 按姓名查找
输出一个宿舍学生信息
输出相应学生信息
输出相应学生所有成绩
结束
开始
输入i
A:学生基本情况查询
B:成绩查询
输入j
输入学号
图4
5. 删除功能: void del(student *stu,grade *head);
stu为指向学生基本信息数组的指针, head为指向学生成绩链表的头结点的指针。
执行删除功能时在存储学生基本信息的数组中与存储学生成绩信息的链表中同时删除该学生信息, 以便进行下面操作与向文件中存储信息。功能见图5
开始
输入要删除学生的学号
在学生基本信息中删除
在学生成绩基本信息中删除
结束
图5
6. 排序功能: void sort(grade *head);
head为指向学生成绩链表的头结点的指针。
下面流程图实现的是按综合成绩升序排序, 使用的选择排序法, 虽说使用的存储结构为链式存储结构, 但排序时并非改变的指针指向, 而是只修改存储的信息, 指针指向不用改变。如图6
开始
head=head->next
head->next! =NULL
p=head->next
P! =NULL
head->zonghe>p->zonghe
交换相邻节点中数据
p=p->next
结束
N
Y
P! =NULL
head->zonghe>p->zonghe
交换相邻节点中数据
p=p->next
N
Y
N
Y
head=head->next
图6
7. 显示所有学生信息: void show(student *stud);
stud为指向学生基本信息数组的指针
用于显示内存中学生基本情况信息, 以便更好了解学生的一些情况.
开始
i=1
stud[i].xuehao!="0"
输出学号, 姓名, 性别, 宿舍, 电话号
结束
N
Y
i++
图7
8. 保存功能:void save1(student *stud); void save2(grade *head);
stud为指向学生基本信息数组的指针, head为指向学生成绩链表的头结点的指针。函数用于将内存中数据存储到文件中以便更好保存信息。
开始
输入i
i==1
I==2
保存学生基本信息到A.TXT
保存学生成绩信息到B.TXT
输入有误, 重新操作!
结束
N
Y N
Y
图8
3.2 源程序
#define num 10
#include <iostream>.
#include <string>
#include<fstream> //定义文件输入输出流
using namespace std;
//学生基本信息的结构体定义
typedef struct student
{string xuehao; //学号
string name; //姓名
string gender; //性别
string sushe; //宿舍号
string tel;//电话
}student;
//学生成绩信息的结构体定义
typedef struct grade
{string xuehao;//学号
string courseno; //课程号
string coursename; //课程名称
int xuefen; //学分
int pingshi; //平时成绩
int shiyan; //实验成绩
int juanmian;//卷面成绩
float zonghe;//综合成绩
float shide;//实得学分
grade *next;
}grade;
void luru(grade *gra);
void menu(student *stu,grade *head,grade *gra);
void lookfor(student *p,grade *head);
void sort(grade *head);
void out(grade *head);
void sort1(grade *head);
void del(student *stu,grade *head);
void show(student *stu);
void save1(student *stud);
void save2(grade *head);
void leave();
//数据录入
void luru(grade *gra)
{string str;
cout<<"请输入学生的学号, "<<endl;
cin>>str;
gra->xuehao=str;
cout<<"请录入该生课程编号"<<endl;
cin>>gra->courseno;
cout<<"请录入该生课程名称"<<endl;
cin>>gra->coursename;
cout<<"请录入该生学分"<<endl;
cin>>gra->xuefen;
cout<<"请录入该生平时成绩"<<endl;
cin>>gra->pingshi;
cout<<"请录入该生实验成绩"<<endl;
cin>>gra->shiyan;
cout<<"请录入该生卷面成绩"<<endl;
cin>>gra->juanmian;
//综合成绩计算
if(gra->shiyan==-1)
gra->zonghe=gra->pingshi*0.3+gra->juanmian*0.7;
else
gra->zonghe=gra->pingshi*0.15+gra->juanmian*0.7+gra->shiyan*0.15;
//实得学分的计算
if(gra->zonghe>=90&&gra->zonghe<=100)
gra->shide=gra->xuefen;
else if(gra->zonghe>=80)
gra->shide=gra->xuefen*0.8;
else if(gra->zonghe>=70)
gra->shide=gra->xuefen*0.75;
else if(gra->zonghe>=60)
gra->shide=gra->xuefen*0.60;
else if(gra->zonghe<60)
gra->shide=0;
else
cout<<"您输入有误,请按提示操作! "<<endl;
}
//查询功能
void lookfor(student *p,grade *head)
{char i,k;
string str;
int j,x=0;
float sum=0;
cout<<"-------------------------------------------------"<<endl;
cout<<"-- A:学生基本情况查询 B:成绩查询 --"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>i;
switch(i)
{//学生基本情况查询
case 'A':cout<<"-------------------------------------------------"<<endl;
cout<<"--1.输入一个学号或姓名 2.输入一个宿舍号码 --"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>j;
//A1----输入一个学号或姓名( 可实现选择) , 查出此生的基本信息并显示输出。
if(j==1)
{ cout<<"*****************************************************"<<endl;
cout<<"************a 按学号查找 b 按姓名查找************"<<endl;
cout<<"*****************************************************"<<endl;
cin>>k;
if(k=='a')
{cout<<"请输入学号: "<<endl;
cin>>str;
for( j=1;j<8;j++)
{if(p[j].xuehao==str)
cout<<p[j].xuehao<<" "<<p[j].name<<" "<<p[j].gender<<" "<<p[j].sushe<<" "<<p[j].tel;
cout<<endl;
}
}
else if(k=='b')
{cout<<"请输入姓名: "<<endl;
cin>>str;
for( j=1;j<8;j++)
{if(p[j].name==str)
cout<<p[j].xuehao<<" "<<p[j].name<<" "<<p[j].gender<<" "<<p[j].sushe<<" "<<p[j].tel;
cout<<endl;
}
}
}
//A2---输入一个宿舍号码, 可查询出本室所有的学生的基本信息并显示输出。
else if(j==2)
{cout<<"请输入宿舍号: "<<endl;
cin>>str;
for( j=1;j<8;j++)
{if(p[j].sushe==str)
cout<<p[j].xuehao<<" "<<p[j].name<<" "<<p[j].gender<<" "<<p[j].sushe<<" "<<p[j].tel;
cout<<endl;
}
}
else
cout<<"您输入有误,请按提示操作! "<<endl;
break;
//成绩查询
case 'B':
cout<<"请输入要查询学生的学号: "<<endl;
cin>>str;
for(j=1;j<8;j++)
{if(p[j].xuehao==str)
cout<<"学号: "<<str<<"\t"<<"姓名: "<<p[j].name<<endl;
}
head=head->next;//指向首元结点
while(head!=NULL)
{
if(head->xuehao==str)
{cout<<"课程编号: "<<head->courseno<<"\t"
<<"课程名称: "<<head->coursename<<"\t"
<<"综合成绩: "<<head->zonghe<<"\t"
<<"实得学分: "<<head->shide<<endl;
x++;
sum=sum+head->shide;
}
head=head->next; //指针后指
}
cout<<"共修: "<<x<<"科, 实得总学分为: "<<sum<<endl;
break;
default:cout<<"您输入有误,请按提示操作! "<<endl;
}
}
//删除功能
void del(student *stu,grade *head)
{string str;
grade *p=head->next;
grade *q;
cout<<"请输入要删除学生的学号: "<<endl;
cin>>str;
//在学生基本信息中删除
for(int i=1;stu[i].xuehao!="0";i++)
{
if(stu[i].xuehao==str)
{ for(int j=i;stu[j].xuehao!="0";j++)
{stu[j].gender=stu[j+1].gender;
stu[j].name=stu[j+1].name;
stu[j].sushe=stu[j+1].sushe;
stu[j].tel=stu[j+1].tel;
stu[j].xuehao=stu[j+1].xuehao;
}
stu[j].gender="0";
stu[j].name="0";
stu[j].sushe="0";
stu[j].tel="0";
stu[j].xuehao="0";
}
}
//在学生成绩基本信息中删除
while(p)
{
if(p->xuehao==str)
{head->next=p->next;
q=p;
p=p->next;
delete q;
}
else
{p=p->next;
head=head->next;
}
}
cout<<"删除成功! "<<endl;
}
//排序功能
//按综合成绩升序排序
void sort(grade *head)
{grade *temp=new grade;
grade *h=head;
for(head=head->next;head->next;head=head->next)
{for(grade *p=head->next;p;p=p->next)
{
if(head->zonghe>p->zonghe)
{temp->xuehao=head->xuehao;
head->xuehao=p->xuehao;
p->xuehao=temp->xuehao;
temp->courseno=head->courseno;
head->courseno=p->courseno;
p->courseno=temp->courseno;
temp->coursename=head->coursename;
head->coursename=p->coursename;
p->coursename=temp->coursename;
temp->xuefen=head->xuefen;
head->xuefen=p->xuefen;
p->xuefen=temp->xuefen;
temp->pingshi=head->pingshi;
head->pingshi=p->pingshi;
p->pingshi=temp->pingshi;
temp->shiyan=head->shiyan;
head->shiyan=p->shiyan;
p->shiyan=temp->shiyan;
temp->juanmian=head->juanmian;
head->juanmian=p->juanmian;
p->juanmian=temp->juanmian;
temp->zonghe=head->zonghe;
head->zonghe=p->zonghe;
p->zonghe=temp->zonghe;
temp->shide=head->shide;
head->shide=p->shide;
p->shide=temp->shide;//数据交换
}
}
}
cout<<"按综合成绩升序排序为: "<<endl;
out(h);
}
//按实得学分降序排序
void sort1(grade *head)
{grade *temp=new grade;
grade *h=head;
for(head=head->next;head->next;head=head->next)
{for(grade *p=head->next;p;p=p->next)
{
if(head->shide<p->shide)
{temp->xuehao=head->xuehao;
head->xuehao=p->xuehao;
p->xuehao=temp->xuehao;
temp->courseno=head->courseno;
head->courseno=p->courseno;
p->courseno=temp->courseno;
temp->coursename=head->coursename;
head->coursename=p->coursename;
p->coursename=temp->coursename;
temp->xuefen=head->xuefen;
head->xuefen=p->xuefen;
p->xuefen=temp->xuefen;
temp->pingshi=head->pingshi;
head->pingshi=p->pingshi;
p->pingshi=temp->pingshi;
temp->shiyan=head->shiyan;
head->shiyan=p->shiyan;
p->shiyan=temp->shiyan;
temp->juanmian=head->juanmian;
head->juanmian=p->juanmian;
p->juanmian=temp->juanmian;
temp->zonghe=head->zonghe;
head->zonghe=p->zonghe;
p->zonghe=temp->zonghe;
temp->shide=head->shide;
head->shide=p->shide;
p->shide=temp->shide;
}
}
}
cout<<"按实得学分降序排序为: "<<endl;
out(h);
}
//输出学生成绩信息
void out(grade *head)
{head=head->next;
cout<<"学号"<<" "<<"课程编号"<<" "<<"课程名称\t"<<" " <<"学分"<<" "<<" 平时成绩"<<" "
<<"实验成绩"<<" "<< "卷面成绩"<<" "<< "综合成绩"<<" "<< "实得学分"<<endl;
while(head)
{cout<<head->xuehao<<"\t"<<head->courseno<<"\t"<<head->coursename<<"\t"<<head->xuefen<<"\t"<<head->pingshi<<"\t"<<head->shiyan<<"\t"<<head->juanmian<<"\t"<<head->zonghe<<" \t"<<head->shide<<endl;
head=head->next;
}
}
//显示所有学生信息
void show(student *stud)
{for(int i=1;stud[i].xuehao!="0";i++)
{
cout<<stud[i].xuehao<<" "<<stud[i].name<<" "<<stud[i].gender<<" "<<stud[i].sushe<<" "<<stud[i].tel;
cout<<endl;
}
}
//将学生信息保存到A.txt
void save1(student *stud)
{ofstream outfile("A.txt",ios::out); //打开文件
if(!outfile)
{
cerr<<" 打开文件失败, 程序中止!"<<endl;
exit(1); //打开文件失败, 终止程序
}
for(int i=0;stud[i].xuehao!="0";i++)
{
outfile<<stud[i].xuehao<<" "<<stud[i].name<<" "<<stud[i].gender<<" "<<stud[i]
展开阅读全文