课程设计报告书
设计名称: 数据结构(C++版)
题 目: 学生成绩管理系统
学生姓名: XXX
专 业: 计算机科学与技术
班 别: 计科本XXX班
学 号: XXXXXX
指导老师: XXX
日 期: 20## 年 7 月 12 日
一.问题描述:
设计目的:
1.掌握线性链表的建立。
2.掌握线性链表的基本操作。
3.掌握查找的基本算法。
设计内容:
利用线性链表实现学生成绩管理系统,具体功能:输入、输出、插入、删除、查找、追加、读入、显示、退出,并能在屏幕上输出操作前后的结果。
二.基本要求
1.写出系统需求分析,并建模。
2.编程实现,界面友好。
3.输出操作前后的结果。
三.工具/准备工作
在此次课程设计中,我们用到了Microsoft Visual C++ V6.0,所以在开始课程设计前我们首先要安装好这个软件。此外,在开始编程之前要做好相应的系统构思,以及想好实现相应的功能的算法。
四.分析与实现
1.系统功能分析
本系统主要实现对学生成绩信息进行管理,需要实现以下几个方面的管理功能:
(0)创建学生成绩信息:输入学生的信息。
(1)查找学生成绩信息:按学号、姓名查找。
(2)修改学生成绩信息:找到要修改的学号,修改相应信息。
(3)追加学生成绩信息:找到要追加的学生成绩的学号,对相应科目的成绩进行追加。
(4)显示学生成绩信息:显示全部学生的成绩信息
(5)插入学生成绩信息:插入一个新的学生。
(6)删除学生成绩信息;按学号、姓名删除。目或者总分排序。
2.系统模块结构图
3.模块分析:
3.1系统首页:
功能介绍:输入相应功能序号即可进行相应的功能操作。
图1.系统首页
相应的代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAX 100
typedef struct student{
int num;
char name[20];
int english;
int chinese;
int math;
int total;
int length;
struct student *next ;
}s,*LinkList;
int main()
{ cout<<"\t\t\t 欢迎登录学生成绩管理系统!"<<endl;
cout<<"\t\t\t+------------------------------------------+"<<endl;
cout<<"\t\t\t|序号 |请选择相应的操作功能的序号: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 0 |请输入学生的相关信息与成绩: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 1 |按学生学号查询学生成绩: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 2 |按学生姓名查询学生成绩: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 3 |追加学生的成绩信息: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 4 |显示全部学生的信息: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 5 |插入学生信息: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 6 |修改学生信息: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
cout<<"\t\t\t| 7 |删除学生信息: |"<<endl;
cout<<"\t\t\t+-----+------------------------------------+"<<endl;
int flag=1,flag1=1;
LinkList l;
l=(LinkList)malloc(sizeof(student));
l->next=NULL;
char ch,ch2;
while(flag){
cout<<"请输入你要进行的操作数:"<<endl;
cin>>ch;
while(ch>'7'||ch<'0')
{
cout<<"输入有误,请重新输入"<<endl;
cin>>ch;
}
switch(ch)
{
case '0':{input(l);cout<<"学生的基本信息存储成功"<<endl;}break;
case '1':{check(l);}break;
case '2':check_name(l);break;
case '3':add(l);break;
case '4':output(l);break;
case '5':insert_stu(l);break;
case '6':xiugai(l);break;
case '7':Delete_stu(l);break;
}
cout<<"你要继续操作还是退出(y/n)"<<endl;
cin>>ch2;
while(flag1)
{
if((ch2=='Y')||(ch2=='y'))
{
flag=1;
flag1=0;
}
else if((ch2=='N')||(ch2=='n'))
{
//flag=0;
//flag1=0;
}
else {
flag1=1;
cout<<"输入有误,请重新输入(y/n)(y:继续)(n:退出)!"<<endl;
cin>>ch2;
}
}
}
return 0;
}
3.2输入学生信息
功能介绍:输入0,选择进入输入学生信息功能中,输入想输入的学生信息个数,并输入相应的学生信息。
图2.输入信息
相关代码:
int InitLink(LinkList &L)//输入学生信息
{
L=(LinkList)malloc(sizeof(struct student));
L->next=NULL;
return 0;
}
int input(LinkList &L)
{
int i, n;
L->next=NULL;
LinkList p;
LinkList q;
cout<<"请输入学生人数:"<<endl;
cin>>n;
L->length=n;
cout<<"请输入学生的基本信息:"<<endl;
for(i=0;i<L->length;i++)
{
p = (LinkList)malloc(sizeof(student));
cout<<"学号:";
cin>>p->num;
cout<<endl;
cout<<"姓名:";
cin>>p->name;
cout<<endl;
cout<<"英语:";
cin>>p->english;
cout<<endl;
cout<<"语文:";
cin>>p->chinese;
cout<<endl;
cout<<"数学:";
cin>>p->math;
cout<<endl;
p->total=p->english+p->chinese+p->math;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
if (L->next == NULL)
{
L->next = p;
p->next = NULL;
q = p;
}
else
{
p->next = NULL;
q->next = p;
q = p;
}
//L=L->next;
}
return 0;
}
3.3显示学生全部信息
功能简介:显示连表中的全部学生信息。
图3.显示全部信息
相关代码:
int output(LinkList &L)//显示全部信息
{
LinkList p = L->next;
if(L->next==NULL)
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
else{
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
while(p)
{
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
p=p->next;
}
cout<<"+----------------------------------------------+"<<endl;
}
return 0;
}
int check(LinkList &L)
{
int n;
LinkList p=L->next;
if(p==NULL)
{
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
}
else {
cout<<"请输入你要查找的同学的学号:"<<endl;
cin>>n;
while(p&&p->num!=n)
{
p=p->next;
}
if(!p)
cout<<"链表中没有学号为:"<<n<<"的同学信息!"<<endl;
else {
cout<<"学号为:"<<n<<"的同学信息如下:"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
}
}
return 0;
}
int check_name(LinkList &L)
{
char name[20];
LinkList p=L->next;
if(p==NULL)
{
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
}
else {
cout<<"请输入你要查找的同学的姓名:"<<endl;
cin>>name;
while(p&&strcmp(p->name,name)) //strcmp(p->name,name)如果p->name=name,则比较的函数值为0
{
p=p->next;
}
if(!p)
cout<<"链表中没有姓名为:name"<<name<<":的同学信息!"<<endl;
else {
cout<<"姓名为:name="<<name<<":的同学信息如下:"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
}
}
return 0;
3.4学生成绩追加
功能介绍:追加相应学生的相应成绩。
相关代码:
int add(LinkList &L)//追加学生信息
{
int n,i,j,k;
LinkList p=L->next;
if(p==NULL)
{
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
}
else {
cout<<"请输入你要追加的同学成绩的学号:"<<endl;
cin>>n;
while(p&&p->num!=n)
{
p=p->next;
}
if(!p)
cout<<"链表中没有学号为:"<<n<<"的同学信息!"<<endl;
else {
cout<<"请输入要追加的成绩:(相应的追加分数分别为英语i,语文j,数学k,若是不追加,请输入0.)"<<endl;
cout<<"i=";cin>>i;cout<<endl;
cout<<"j=";cin>>j;cout<<endl;
cout<<"k=";cin>>k;cout<<endl;
p->english +=i;
p->chinese +=j;
p->math +=k;
cout<<"学号为:"<<n<<"的同学信息如下:"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
}
}
return 0;
}
3.5修改学生信息
功能介绍:修改相应学号学生信息。
相关代码:
int xiugai(LinkList &L)//修改学生信息
{
int n;
char x;
LinkList p=L->next;
if(p==NULL)
{
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
}
else {
cout<<"请输入你要修改的同学成绩的学号:"<<endl;
cin>>n;
while(p&&p->num!=n)
{
p=p->next;
}
if(!p)
cout<<"链表中没有学号为:"<<n<<"的同学信息!"<<endl;
else {
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"是否要修改学号为"<<n<<"的同学的信息?(y/n)"<<endl;
cin>>x;
if((x=='Y')||(x=='y'))
{
cout<<"姓名修改为:";
cin>>p->name;
cout<<endl;
cout<<"英语成绩修改为:";
cin>>p->english;
cout<<endl;
cout<<"语文成绩修改为:";
cin>>p->chinese;
cout<<endl;
cout<<"数学成绩修改为:";
cin>>p->math;
cout<<endl;
p->total=p->english+p->chinese+p->math;
cout<<"学号为"<<n<<"的同学修改后的信息为:"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
}
}
}
return 0;
}
3.6插入学生信息
功能介绍:在链表的第i个节点插入学生信息。
相关代码:
int insert_stu(LinkList &L)//插入学生信息
{
LinkList p,s=L;
int j,i,flag=1;
if(s->next==NULL)
{
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
}
else{
cout<<"请输入你要在链表第i个位置中插入学生信息的i值:"<<endl;
while(flag){
j=0;
cin>>i;
p=L;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
{
cout<<"输入i值小于1或者大于表长+1,请重新输入!"<<endl;
flag=1;
}
else flag=0;
}
s=(LinkList)malloc(sizeof(student));
cout<<"请输入学生的基本信息:"<<endl;
cout<<"学号:";
cin>>p->num;
cout<<endl;
cout<<"姓名:";
cin>>p->name;
cout<<endl;
cout<<"英语:";
cin>>p->english;
cout<<endl;
cout<<"语文:";
cin>>p->chinese;
cout<<endl;
cout<<"数学:";
cin>>p->math;
cout<<endl;
p->total=p->english+p->chinese+p->math;
cout<<"插入的学生信息为:"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
s->next=p->next;
p->next=s;
}
return 0;
}
3.7删除学生信息
功能介绍:删除某个学生的信息。
相关代码:
int Delete_stu(LinkList &L)//删除学生信息
{int n;
char x;
LinkList q=L,p=L->next;
if(p==NULL)
{
cout<<"链表中没有学生信息,请先输入学生信息!"<<endl;
}
else {
cout<<"请输入你要查找的同学的学号:"<<endl;
cin>>n;
while(p&&p->num!=n)
{q=p;
p=p->next;
}
if(!p)
cout<<"链表中没有学号为:"<<n<<"的同学信息!"<<endl;
else {
cout<<"学号为:"<<n<<"的同学信息如下:"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"学号: 姓名: 英语: 语文: 数学: 总成绩:"<<endl;
cout<<p->num<<" "<<p->name<<" "<<p->english<<" "<<p->chinese<<" "<<p->math<<" "<<p->total<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<"是否要删除该同学信息?(y/n)"<<endl;
cin>>x;
if((x=='Y')||(x=='y'))
{
p=p->next;
q->next=p;
cout<<"该学生信息已删除!"<<endl;
}
}
}
return 0;
}
五.测试与结论
1.系统测试结果如下:
1.1系统首页:
功能介绍:输入相应功能序号即可进行相应的功能操作。
图1.2系统首页
1.2输入学生信息
功能介绍:输入0,选择进入输入学生信息功能中,输入想输入的学生信息个数,并输入相应的学生信息。
图2.2输入学生信息
1.3显示学生全部信息
功能简介:显示连表中的全部学生信息。
图3.2显示全部信息
1.4追加学生信息
图4.2追加学生信息
1.5修改学生信息
功能介绍:修改相应学号学生信息。
图5.2修改学生信息
1.6插入学生信息
功能介绍:在链表的第i个节点插入学生信息。
相关代码:
图6.2插入学生信息
1.7删除学生信息
功能介绍:删除某个学生的信息。
图7.2删除学生信息
2.结论
本课程设计学生成绩管理系统从最后的测试结果来看,基本上实现了成绩管理系统的几大功能:成绩信息输入、成绩信息显示等。并达到操作过程中的直观、方便、实用、安全等要求。系统采用模块化程序设计的方法,既便于系统功能的组合和修改,又便于未参与系统开发的技术维护人员补充和维护。
本系统经过测试,证明其运行是稳定、可靠的。但在系统设计中也也遇到很多的问题,并且本系统的功能还需要不断的完善和改进,在以后空闲时间里逐一进行完善,使系统功能更加完善。
六.课程设计总结
此次数据结构课程设计,从编辑程序到测试,从理论到实践,我学到了很多很多的的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到很多问题,但经过老师的耐心指导和我自己的努力,问题都一一解决了!此外在设计的过程中还发现了自己的很多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,对数据结构有了深入的认识和理解,把以前所学过的知识都重新温故了一遍。