学生成绩管理系统数据结构课程设计.doc
《学生成绩管理系统数据结构课程设计.doc》由会员分享,可在线阅读,更多相关《学生成绩管理系统数据结构课程设计.doc(21页珍藏版)》请在冰豆网上搜索。
重庆科技学院《数据结构》课程设计报告
1系统需求说明书
1.1系统软件界面介绍
1.1系统界面介绍
本系统的软件界卖弄是使用C语言编译生成的一个系统操作菜单。
操作菜单界面总共有七个选项可以供用户操作选择,分别为策划给你记录入、成绩查询、成绩删除、成绩修改、成绩统计、成绩查询、显示所有信息、退出系统。
菜单页面下方有可供用户选择操作项目的指令,当用户选择并输入0-6中的任意数字,系统便会进入相应的功能操作。
如果出现错误操作,系统会给出输入错误请从新输入等提示或者自动跳出回到主菜单界面。
1.2系统设计要求
本系统设计要求使用C语言以及数据与结构的知识点对系统进行编译。
要求学生熟练掌握数据结构的线性表和链表,以及C怨言的文件读一些操作,结构体、指针等知识点,并且学以致用,熟练应用。
在处理数据时要求采用线性表存放成绩信息,结点的数据域可包括:
班级、学号、姓名、课程名称、选课学期和成绩,程序退出时采用文件的形式永久保存成绩信息。
1.3系统设计要求
系统的设计主要从以下几大块进行设计体现:
头文件的定义,包括数据结构中的函数头、结构体的定义,进行一个总体的规划布局。
将与学生有关的个人信息如班级、学号、姓名等都定义为一个节点型的数据然后在创建链表和指向各个数据的节点。
利用抽象数据类型将不同类型的数据进行管理!
其次是主函数的定义和设计,主函数申请并创建一个链表,然后将系统所有的函数功能通过Switch条件语句进行统筹,从而实现对各个子函数的调用。
并且通过文件读写将系统的数据保存到文件当中。
最后便是系统中各个函数块的功能实现。
在写子函数时必须统筹兼顾,考虑到各个方面。
入系统类存的合理分配,如果内存一旦出错系统就回崩溃,信息就有可能出错。
2系统的分析与设计
2.1系统分析
系统的主要工作流程图如下,当进入操作主菜单界面时,会有相应的不同的操作选项供用户选择,但操作完成后就晚会到系统主菜单。
主菜单
Switch
1
成绩录入
2成绩修改
3删除成绩
4
成绩统计
5成绩查询
6显示信息
7
退出系统
程序
结束
图2.1系统操作流程图
2.2系统功能分析
系统主要石油几大函数块来实现整个系统的功能。
1)学生个人成绩信息录入
当用户选择第一项操作时,便进入学生成绩录入的函数。
其流程图如下:
输入姓名
输入班级
输入学号
成绩录入
返回主菜单
输入分数
输入学期
输入科目
图2.2成绩录入操作流程图
2)学生成绩修改
其流程图如下:
成绩修改
输入要修改分数
输入要修改学生学号
返回主菜单
图2.3成绩录入操作流程图
3)学生成绩删除
其流程图如下:
成绩删除
返回主菜单
删除
输入要删除学生学号
图2.4成绩删除操作流程图
4)学生成绩统计
其流程图如下:
成绩删除
统计方式
1
统计所有班级
1
统计某个班级
输入查询班级
返回主菜单
图2.5成绩统计操作流程图
5)学生成绩查询
其流程图如下:
成绩查询
查询方式
2
班级成绩查询
1
个人成绩查询
输入查询学生学号
输入查询班级
返回主菜单
图2.6成绩统计操作流程图
6)所有学生成绩信息显示
其流程图如下:
返回主菜单
成绩显示
图2.7所有学生成绩和个人信息显示操作流程图
3代码实现
3.1创建结构体和链表解释
typedefstruct
{
charNumber[20];//学号
charClass[20];//班级
charName[20];//姓名
charSubject[20];//科目
intterm;//学期
intScore;//分数
}Node;//链表的定义
typedefstruct
{
intcount;
NodeStudent[MAX];
}List;//线性表的定义
typedefstruct
{
charClass[20]; //班级名字
intAcount; //班级优秀的人数
intDcount; //班级不及格的人数
intcount; //班级总人数
}ClassInfor;
创建一个链表,并定义数据对象;在创建线性表用来计数和存储信息。
3.2学生成绩的录入代码解释
voidInsert(List*L,ClassInfor*S)//成绩录入
{
charNumber[20];
charClass[20];
charName[20];
charSubject[20];
intTerm;
intScore;
inti,flag=0;
printf("\n\t\t\t\t请输入学号:
");
scanf("%s",Number);
getchar();
if(strcmp(L->Student[L->count-1].Number,Number)>0)//录入学号与最后学号进行比较
{
printf("\n\n\t\t\t不合法学号,学号应大于%s",L->Student[L->count-1].Number);
return;
}
printf("\n\t\t\t\t请输入班级:
");
scanf("%s",Class);
getchar();
for(i=0;i {
if(strcmp(S[i].Class,Class)==0)
{
S[i].count++;//该班级人数+1
flag=1;
break;
}
}
if(flag==0)
{
printf("\n\n\t\t\t\t请输入正确的班级\n");
return;
}
printf("\n\t\t\t\t请输入姓名:
");
scanf("%s",Name);
printf("\t\t\t");
getchar();
printf("\n\t\t\t\t请输入科目:
");
scanf("%s",Subject);
printf("\n\t\t\t\t请输入学期:
2\n");
Term=2;
printf("\n\t\t\t\t请输入分数:
");
scanf("%d",&Score);
getchar();
if(Score>=90)//优秀人数+1
S[i].Acount++;
if(Score<60)//不及格人数+1
S[i].Dcount++;
//寻找插入位置。
与录入学生班级相同的排一块
for(i=L->count;i>=0;i--)
{
if(strcmp(L->Student[i].Class,Class)==0)
{
strcpy(L->Student[i+1].Number,Number);
strcpy(L->Student[i+1].Class,Class);
strcpy(L->Student[i+1].Name,Name);
strcpy(L->Student[i+1].Subject,Subject);
L->Student[i+1].term=Term;
L->Student[i+1].Score=Score;
L->count++;//所插入班级人数+1
return;
}
else
L->Student[i+1]=L->Student[i];
}
}
该函数实现了对学生成绩信息的录入。
3.3学生成绩的修改代码解释
oidChange(List*L,ClassInfor*S)//成绩修改
{
charNumber[20];//,Class[20];
inti,flag=0;
printf("\n\n\t\t\t请输入要修改学生的学号:
");
scanf("%s",Number);
getchar();
for(i=0;i {
if(strcmp(L->Student[i].Number,Number)==0)//通过比较输入的学号和文件当中存储的学号,然后通过链表访问到该学生。
{
flag=1;
break;
}
}
if(flag==0)
{
printf("\n\n\t\t\t请输入正确的学号!
\n");
return;
}
//输出此人信息
printf("\n\n\t\t\t班级:
%s\n",L->Student[i].Class);
printf("\n\n\t\t\t学号:
%s\n",L->Student[i].Number);
printf("\n\n\t\t\t姓名:
%s\n",L->Student[i].Name);
printf("\n\n\t\t\t学期:
%d\n",L->Student[i].term);
printf("\n\n\t\t\t课程:
%d\n",L->Student[i].Subject);
printf("\n\n\t\t\t分数:
%d\n",L->Student[i].Score);
printf("\n\n\t\t\t请输入修改数据结构后的分数:
");
scanf("%d",&L->Student[i].Score);
getchar();
}
该函数块实现对学生信息的修改,通过了比较,然后由链表访问到。
3.4学生信息的删除代码解释
voidDelect(List*L,ClassInfor*S)//删除学生信息
{
charNumber[20];
inti,j,flag=0;
printf("\n\n\t");
printf("\t\t\t请输入要删除的学号:
");
scanf("%s",Number);
getchar();
for(i=0;icount;i++)
{
if(strcmp(L->Student[i].Number,Number)==0)
{
flag=1;
break;
}
}
if(flag)
{
for(j=0;j {
if(strcmp(S[j].Class,L->Student[i].Class)==0)
{
S[i].count--;//该班级人数