资源描述
1需求分析
1.1研究背景
教诲信息化必将涉及许多详细技术和机器在教诲中应用,它使得某些人往往以技术论,机器论观点来结识教诲信息化目,以为教诲信息化就是以机器代替教师授课,代替教诲写板书 ,就是以电子教材代替印刷教材,就是实现网上学习……,并以代替性、省力性、顺利性、效率性作为评价教诲信息化尺度。而成绩管理系统将大大提高教师管理效率,使得教师可以针对学生详细状况进行进一步教诲,培养跨世纪创新人才,是实现教诲当代化。教诲信息化应以新教诲思想、教诲观念指引信息技术在教诲各个部门、各个领域广泛应用,应依照创新人才培养规定,运用信息技术,摸索新教诲模式,增进教诲当代化。只有在这样基本上指引信息技术教诲应用,才是咱们所需要教诲信息化。也就相应产生了对学生成绩高效管理。
1.2课题研究目及意义
当前国内各院高校学生成绩管理水平普遍不高,有还停留在纸质基本上,这种管理手段已不能适应时代发展,由于它挥霍了许多人力和物力。在当今信息时代这种老式管理办法必然会被计算机为基本信息管理系统所代替。成绩管理系统提供了强大管理功能,以便管理员对考试成绩等信息添加、修改、删除、查询、分类等操作。本系统将提高管理人员工作效率和工作质量。
如今,计算机网络带动了全球信息化得进程。在高校中,信息化带来老式教学、科研模式变化,需要新管理机制:以信息技术为手段校务管理,也需要新机制,即需要一种数字化校园(Digital Campus)。数字校园建设也是高校信息化重要构成某些。
成绩管理是学校管理中异常重要一种环节,作为学校,除了育人,就是与育知,学生成绩管理计算机化是整个学校教务管理中重要一某些,能否实现这一步关系到学校办学整体效率高低,在于它重要性,学生成绩管理系统开发与应用就逐渐提入议程,并占着重要分量。
运用成绩管理系统可以减轻学院教学人员工作量,加快查询速度,加强管理,以及国家各部门关于信息化步伐,是各项管理更加规范化。同步也可以是学生可以尽快懂得自己考试成绩,投入新课程学习或复习。并且也可为高校教诲在将来市场竞争力提高打下坚实基本。
1.3课题规定
1.以线性链表存储涉及学号、姓名、c语言成绩学生信息。
2.在程序执行过程中,依照输出提示信息,通过键盘输入程序中运算命令;相应输入数据和运算成果显示在其后。
3.程序执行命令涉及:
<1>.输入学生信息
<2>.显示所有信息
<3>.查询学生信息
<4>.删除学生信息
<5>.插入学生信息
<6>.修改学生信息
<7>.显示分类信息
<0>.退出系统
2概要设计
2.1 抽象数据类型定义
为实现上述程序功能,以线性链表为存储构造,为此,进行抽象数据类型定义:
ADT Student{
数据对象:D={e1,e2,e3|e1,e2,e3∈student(储存学生信息构造体)}
数据关系:R={<e1,e2,e3>}
基本操作P:
creatList(&L)
操作成果:构造一种空线性链表。
getelem(L,e ,&p);
初始条件:线性链表L已存在。
操作成果:在L中查找具有e元素p节点与否存在,若存在则返回OK,否则返回ERROR。
input(&L);
初始条件:线性链表L已存在。
操作成果:向链表尾插入新节点信息。
all(&L);
初始条件:线性链表L已存在。
操作成果:显示线性链表L所有节点信息。
list(&L);
初始条件:线性链表L已存在。
操作成果:查询与否存在给定信息节点,若存在则返回OK,否则返回ERROR。
dele(&L);
初始条件:线性链表L已存在。
操作成果:删除给定信息节点,若成功则返回OK,否则返回ERROR。
append(&L);
初始条件:线性链表L已存在。
操作成果:在给定信息节点后插入所输入信息节点,若成功则返回OK,否则返回ERROR。
modify(&L);
初始条件:线性链表L已存在。
操作成果:查询所输入信息结点,并修改其信息。
classify(&L);
初始条件:线性链表L已存在。
操作成果:按照给定条件将所有结点信息分类,并输出各类别信息。
} ADT Student
2.2 程序流程图
开始
NO
输入口令
主菜单
NO
选取序号与否符合规定
Yes
修改学生信息
退出系统
显示分类信息
插入学生信息
删除学生信息
查询学生信息
显示所有信息
输入学生信息
3详细设计
3.1 存储构造及方式
本系统得学生信息采用构造体student定义,并用单链表存储:
typedef struct student
{
char num[13];//学号
char name[15];//姓名
int score;//c语言成绩
}student;
typedef struct node
{
student data;//数据域
struct node *next;//指针域
}stunode,*pstunode;
3.2 重要功能函数
1,输入学生信息:调用函数Status input(pstunode &head),一方面判断输入合法性,后将该条信息添加到链表尾部,用于选取与否继续输入,否则返回主菜单。其代码如:
Status input(pstunode &head)//输入学生信息
{
system("cls");
char m;
………
}while(m=='y'||m=='Y');
return OK;
}
2,显示所有学生信息:调用函数Status all(pstunode &head),其代码如:
Status all(pstunode &head)//显示所有信息
{
system("cls");
pstunode p;
……
system("pause");
return OK;
}
3,查询学生信息:调用函数Status list(pstunode &head),提示输入要查询学生学号,并判断其合法性,后将信息输出,并退出返回主菜单。代码如:
Status list(pstunode &head)//查询学生信息
{
system("cls");
char num3[13];
……
system("pause");
return OK;
}
4,删除学生信息:调用函数Status dele(pstunode &head),提示输入要删除学生学号,判断其与否存在,若存在则将其从链表中删除,提示删除成功后退出并返回主菜单。代码如:
Status dele(pstunode &head)//删除学生信息
{
system("cls");
char num1[13];
……
system("pause");
return OK;
}
5,插入学生信息:调用函数Status append(pstunode &head),提示输入学生学号,判断其合法性,然后输入要插入学生信息,并将其插入该节点之后,退出并返回主菜单。代码如:
Status append(pstunode &head)//插入学生信息
{
system("cls");
……
system("pause");
return OK;
}
6,修改学生信息:调用函数Status modify(pstunode &head),提示输入要修改学生学号,验证合法性后进行修改,修改成功退出并返回主菜单。其代码如:
Status modify(pstunode &head)//修改学生信息
{
system("cls");
……
system("pause");
return OK;
}
7,显示分类信息:调用函数Status classify(pstunode &head),按照60分如下、60~79分、80~89分、90分以上进行学生信息分类,并显示。其代码如:
Status classify(pstunode &head)//显示分类信息
{
system("cls");
……
system("pause");
return OK;
}
8,查找学生信息:调用函数Status getelem(pstunode head,char number[11],pstunode &p)。其代码如:
Status getelem(pstunode head,char number[11],pstunode &p)//查找学生信息
{
p=head->next;
……
return OK;
}
9,保存学生信息:调用函数Status save(pstunode &head),将输入所有信息保存在c盘下sort文献中。其代码如:
Status save(pstunode &head)//保存学生信息
{
ofstream out;
out.open("c:\\sort.txt");
for(pstunode p=head->next;p;p=p->next)
out<<p->data.num<<"\t"<<p->data.name<<"\t"<<p->data.score<<endl;
out.close();
return OK;
}
10,读文献:调用函数Status start(pstunode &head),在c盘下查找sort文献,并将数据读入。其代码如:
Status start(pstunode &head)//读文献
{
pstunode p,q;
……
system("pause");
return OK;
}
4 调试分析
通过一周代码编写与调试,我终于将各个模块整合了起来,在这个过程中,我遇到了诸多问题,如数据未定义,括号不匹配,漏掉分号等简朴语法错误,同步也有如循环条件判断错误导致死循环,指针使用前未赋值导致系统报错,逻辑错误而无法产生对的成果等较复杂状况。但通过自己不断查阅资料,不断重新编写终于解决了这些问题。同步考虑到程序健壮性规定,我增长了该系统对不合法数据辨认功能,并可以及时反馈给顾客。
每一件事,过程才是最美好,我写完一种功能模块,进行不断调试,当看到期待成果呈当前面前时,由衷喜悦溢于言表;特别当所有功能模块整合到一块后,通过调试能被主函数成功调用时,那感觉太妙了。
总来说,本次课程设计,令人受益匪浅。对数据构造这门课程学习了诸多理论知识,但是理论与实践距离很大,开始时对构造体,对链表体会只是在乎识层面,而通过这次课程设计,真真正正运用它们来储存学生信息时,我才结识到它们都是较好工具,好像也有了可触感觉。同步,我也深深体会到自己C语言知识还是那么浅薄,而这次也让自己动手能力和独立思考能力有了很大提高。
5 顾客手册
1. 本程序运营环境为WINDOWS操作系统,运营软件为Microsoft Visual C++;
2. 开始运营程序,输入登录密码“ting”,开始进入主菜单。
3. 若顾客初次登陆,则应一方面进行学生信息录入,否则即可按照主菜单选项选取所要执行功能,须进行合法数据输入。
4. 当输入1,则进行学生信息输入操作,按规定输入学号(不大于12位整数),姓名(不大于15字符串),每次均用回车键结束输入。
5. 当输入2,则显示已录入所有学生信息。
6. 当输入3,则进行学生信息查询操作,顾客需要输入所要查询学生学号或姓名,若该学生信息存在,则系统会显示该学生所有信息。
7. 当输入4,则进行删除学生信息操作,顾客需要输入所要删除学生学号,若该学号存在,系统会将其删除。
8. 当输入5,则进行插入学生信息操作,该操作是在已经录入一位学生后插入新学生信息。顾客需要一方面输入该已录入学生学号,后输入新学生信息。
9. 当输入6,则进行修改学生信息操作,顾客需要输入需要修改学生学号或姓名,若该学生信息存在,则会提示继续输入修改信息,否则退出返回主菜单。
10. 当输入7,则按照c语言成绩将学生信息以60分如下、60~79分、80~89分、90分以上级别别进行分类并显示。
11. 当输入0,则退出系统,并保存最后所有学生信息,程序运营完毕。
6 测试数据及成果
1,使用密码,初次进入学生记录簿信息管理系统:
2,进入系统界面,对不合法输入做出判断:
3,选取1,输入学生信息,并对不合法输入作出判断:
4,显示所有信息:
5,查询学生信息:
6,删除学生信息,并对不合法输入作出判断,后显示成果:
7,插入学生信息,后显示成果:
8,修改学生信息,对不合法输入做出判断,后显示成果:
9,显示分类信息:
10,退出系统并保存信息,所输入信息将保存在C盘下sort文献下。
参照文献
[1] 严蔚敏,吴伟民编著. 数据构造(C语言版). 北京:清华大学出版社,1997.04
[2] 孟爱国,左利芳,谢中科等编著.C语言程序设计.上海:复旦大学出版社,.2
[3] 马春江,李慧勇,孟繁军编著. 新编数据构造教程.北京:中华人民共和国电力出版社,
[4] 孙淑霞,肖阳春,魏琴等.C/C++程序设计教程(第2版)。北京:电子工业出版社,.03
[5] 谭浩强。C++程序设计。北京:清华大学出版社,,06
[6] 朱战立编著.数据构造——使用C++语言.西安:西安电子科技大学出版社,.2
[7] 缪淮扣,顾训穰,沈俊编著.数据构造:C++实现.北京:科学出版社,
附录 源代码程序
#include <fstream.h>
#include "iostream.h"
#include "string.h"
#include <conio.h>
#include "iomanip.h"
#include "stdlib.h"
#define ERROR 0
#define OK 1
#define N 2
typedef int Status;
typedef struct student
{
char num[13];//学号
char name[15];//姓名
int score;//c语言成绩
}student;
typedef struct node
{
student data;//数据域
struct node *next;//指针域
}stunode,*pstunode;
Status getelem(pstunode head,char number[11],pstunode &p);//查找学生信息
Status input(pstunode &head);//输入学生信息
Status all(pstunode &head);//显示所有信息
Status list(pstunode &head);//查询学生信息
Status dele(pstunode &head);//删除学生信息
Status append(pstunode &head);//插入学生信息
Status modify(pstunode &head);//修改学生信息
Status classify(pstunode &head);//显示分类信息
void password()//使用密码进入
{
char str1[7];
system("cls");
cout<<endl<<endl<<endl;
cout<<setw(30)<<"请输入口令:";
cin>>str1;
cout<<endl<<endl<<endl;
if (strcmp(str1,"ting")!=0)
{
cout<<setw(40)<<"口令不对的!请重新输入!\n";
system("pause");
password();
}
return;
}
char menu()//主菜单
{
system("cls");
int n=1;
char select;
cout<<endl<<endl<<endl;
cout<<setw(19)<<""<<"***********[主菜单]************"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".输入学生信息"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".显示所有信息"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".查询学生信息"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".删除学生信息"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".插入学生信息"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".修改学生信息"<<endl<<endl;
cout<<setw(26)<<""<<n++<<".显示分类信息"<<endl<<endl;
cout<<setw(26)<<""<<"0.退出系统"<<endl<<endl<<endl;
cout<<setw(22)<<""<<"〔请选取〕:";
cin>>select;
if(select>='0'&&select<='7');
else
{
cout<<endl<<setw(26)<<"非法数据!请重新输入!";
system("pause");
select=menu();
}
return select;
}
char Exit()//退出系统
{
system("cls");
char s;
cout<<setw(36)<<"拟定退出系统请输入\"Y\"或\"y\" "<<endl;
cin>>s;
return s;
}
void creatList(pstunode &head)//建立带表头空链表
{
head=(pstunode)malloc(sizeof(stunode));
if(!head) exit(0);
head->next=NULL;
}
Status input(pstunode &head)//输入学生信息
{
system("cls");
char m;
char s[50];
int i,k;
pstunode p,q,frist,last;
for(q=head;q->next;q=q->next);
last=q;
do
{ frist=( pstunode)malloc(sizeof(stunode));
if(!frist) return ERROR;
cout<<setw(25)<<"请输入学生学号: ";
do//学号过长或为非整数时则重新输入
{
k=1;
cin>>s;
if(strlen(s)<=12) strcpy(frist->data.num,s);
else {k=0;cout<<"您输入学号过长(不大于12位),请重新输入:";} //学号过长则重新输入
for(i=0;s[i]!=0;i++)
{
if(s[i]>='0'&&s[i]<='9') continue;
else {k=0;cout<<"您输入学号为非整数,请重新输入: ";break;}
}
}while(k==0);
for(p=head->next;p;p=p->next)
if(strcmp(frist->data.num,p->data.num)==0)//如果学号输入重复则退出
{
free(frist);
cout<<"该学号已存在!"<<endl;
system("pause");
return ERROR;
}
cout<<setw(25)<<"请输入学生姓名: ";
do//姓名过长则重新输入
{
k=1;
cin>>s;
if(strlen(s)<=15)
strcpy(frist->data.name,s);
else
{k=0;cout<<"您输入姓名过长(不大于15位),请重新输入:";}
}while(k==0);
cout<<setw(25)<<"请输入该学生c语言成绩: ";
cin>>frist->data.score;
frist->next=NULL;
last->next=frist;
last=frist;
cout<<endl<<endl;
cout<<"继续输入请按\"y\"或\"Y\",否则按任意键结束输入:"<<endl;
m=getch();
cout<<m<<endl;
}while(m=='y'||m=='Y');
return OK;
}
Status all(pstunode &head)//显示所有信息
{
system("cls");
pstunode p;
p=head->next;
if(!head->next) {cout<<"该系统学生信息为空!"<<endl;system("pause");return ERROR;}
else while(p)
{
cout<<"学号:"<<setiosflags(ios::left)<<setw(13)<<p->data.num<<"姓名:"<<setw(15)<<p->data.name<<"该学生c语言成绩为:"<<p->data.score<<endl;
p=p->next;
cout<<endl<<endl;
}
system("pause");
return OK;
}
Status all2(pstunode &head)//显示所有信息,为classify()所特殊调用
{
pstunode p;
p=head->next;
if(!head->next) {cout<<"该类学生信息为空!"<<endl<<endl<<endl;return ERROR;}
else while(p)
{
cout<<"学号:"<<setiosflags(ios::left)<<setw(13)<<p->data.num<<"姓名:"<<setw(15)<<p->data.name<<"该学生c语言成绩为:"<<p->data.score<<endl;
p=p->next;
cout<<endl;
}
cout<<endl<<endl;
return OK;
}
Status list(pstunode &head)//查询学生信息
{
system("cls");
char num3[13];
pstunode p;
if(!head->next) {cout<<"该系统学生信息为空!"<<endl;system("pause");return ERROR;}
cout<<"请输入您想查询学生学号或者姓名:"<<endl;
cin>>num3;
if(!getelem(head,num3,p)) return ERROR;//查找,若不成功则退出
cout<<"该学生学号是:"<<p->data.num<<endl;
cout<<"该学生姓名是:"<<p->data.name<<endl;
cout<<"该学生c语言成绩为:"<<p->data.score<<endl;
cout<<endl;
system("pause");
return OK;
}
Status dele(pstunode &head)//删除学生信息
{
system("cls");
char num1[13];
pstunode p1,p2;//p1为要删除节点,p2为其前一种节点
if(!head->next) {cout<<"该系统学生信息为空!"<<endl;system("pause");return ERROR;}
cout<<"请输入要删除学生学号"<<endl;
cin>>num1;
p1=head->next;
while(strcmp(p1->data.num,num1)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next ;
}
if(strcmp(p1->data.num,num1)==0)
{
if(p1==head->next)
head->next=p1->next;
else
p2->next=p1->next;
free(p1);
cout<<"学号为"<<num1<<"学生信息已删除!"<<endl;
}
else
{cout<<"学号"<<num1<<"不存在!"<<endl;system("pause");return ERROR;}
system("pause");
return OK;
}
Status append(pstunode &head)//插入学生信息
{
system("cls");
char num[13];
char s[50];
int i,k;
if(!head->next) {cout<<"该系统学生信息为空!"<<endl;system("pause");return ERROR;}
pstunode p1,p2,p3;//p1为指向要插入前驱节点,p2指向要插入新节点,p3用于循环
cout<<"请输入你要在该学生后插入新学生信息,则其学号为:"<<endl;
cin>>num;
cout<<endl;
if(!getelem(head,num,p1)) return ERROR;//查找,若不成功则退出
p2=(pstunode)malloc(sizeof(stunode));
cout<<"请输入您想插入学生学号,姓名,c++成绩:"<<endl;
do//学号过长或为非整数时则重新输入
{
k=1;
cin>>s;
if(strlen(s)<=12)
strcpy(p2->data.num,s);
else
{k=0;cout<<"您输入学号过长(不大于12位),请重新输入:";}//学号过长则重新输入
for(i=0;s[i]!=0;i++)
{
if(s[i]>='0'&&s[i]<='9') continue;
else {k=0;cout<<"您输入学号为非整数,请重新输入: ";break;}
}
}while(k==0);
for(p3=head->next;p3;p3=p3->next)//如果学号输入重复则退出
if(strcmp(p2->data.num,p3->data.num)==0)
{
cout<<"该学号已存在!"<<endl;
system("pause");
return ERROR;
}
cout<<setw(25)<<"请输入学生姓名: ";
do//姓名过长则重新输入
{
k=1;
cin>>s;
if(strlen(s)<=15)
strcpy(s,p2->data.name);
else {k=0;cout<<"您输入姓名过长(不大于15位),请重新输入:";}
}while(k==0);
cout<<setw(25)<<"请输入该学生c语言成绩: ";
cin>>p2->data.score;
p2->next=p1->next;
p1->next=p2;
system("pause");
return OK;
}
Status modify(pstunode &head)//修改学生信息
{
system("cls");
pstunode p;
char num[13];
char s[50];
int i,k;
if(!head->next) {cout<<"该系统学生信息为空!"<<endl;system("pause");return ERROR;}
cout<<"请输入要修改学生学号或姓名: ";
cin>>num;
if(!getelem(head,num,p)) return ERROR;//查找,若不成功则退出
cout<<"请输入该学生学号: ";
do//学号过长或为非整数时则重新输入
{
k=1;
cin>>s;
if(strlen(s)<=12)
strcpy(s,p->data.num);
else
{k=0;cout<<"您输入学号过长(不大于12位),请重新输入: ";} //学号过长则重新输入
for(i=0;s[i]!=0;i++)
{
if(s[i]>='0'&&s[i]<='9') continue;
else {k=0;cout<<"您输入学号为非整数,请重新输入: ";break;}
}
}while(k==0);
cout<<"请输入学生姓名: ";
do//姓名过长则重新输入
{
k=1;
cin>>s;
if(strlen(s)<=15)
strcpy(p->data.name,s);
else
{k=0;cout<<"您输入姓名过长(不大于15位),请重新输入:";}
}while(k==0);
cout<<"请输入学生c语言成绩: ";
cin>>p->data.score;
system("pause");
return OK;
}
Status classify(pstunode &head)//显示分类信息
{
system("cls");
pstunode p,q1,q2,q3,q4,s;
pstunode L1,L2,L3,L4;
creatList(L1);
creatList(L2);
creatList(L3);
creatList(L4);
q1=L1;
q2=L2;
q3=L3;
q4=L4;
if(!head->next) {cout<<"该系统学生信息为空!"<<endl;system("pause");return ERROR;}
for(s=head->next;s;s=s->next)
{
p=( pstunode)malloc(sizeof(stunode));
if(!p) return ERROR;
if(s->data.score<60)
{
strcpy(p->data.name,s->data.name);strcpy(p->data.num,s->data.num);p->data.score=s->data.score;//复制数据
p->next=NULL;q1->next=p;q1=p;
}
else if(s->data.score>=60&&s->data.score<80)
{
strcpy(p->data.name,s->data.name);strcpy(p->data.num,s->data.num);p->data.score=s->data.score;//复制数据
p->next=NULL;q2->next=p;q2=p;
}
else if(s->data.score>=80&&s->data.score<90)
{
strcpy(p->data.name,s->data.name);strcpy(p->data.num,s->data.num);p->data.score=s->data.score;//复制数据
p->next=NULL;q3->next=p;
展开阅读全文