学生成绩管理系统链表版.docx

上传人:b****8 文档编号:9362218 上传时间:2023-02-04 格式:DOCX 页数:50 大小:1.13MB
下载 相关 举报
学生成绩管理系统链表版.docx_第1页
第1页 / 共50页
学生成绩管理系统链表版.docx_第2页
第2页 / 共50页
学生成绩管理系统链表版.docx_第3页
第3页 / 共50页
学生成绩管理系统链表版.docx_第4页
第4页 / 共50页
学生成绩管理系统链表版.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

学生成绩管理系统链表版.docx

《学生成绩管理系统链表版.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统链表版.docx(50页珍藏版)》请在冰豆网上搜索。

学生成绩管理系统链表版.docx

学生成绩管理系统链表版

《C语言应用》实验报告

题目

学生成绩管理系统(链表版)

第1章需求分析3

第2章总体设计3

2.1系统的程序流程图3

2.2系统的全局变量和常量3

2.3系统的函数介绍3

第3章详细设计3

3.1主函数设计3

3.2录入函数设计4

3.3排序函数设计4

3.4查找函数设计4

3.5修改函数设计4

3.6插入函数设计4

3.7删除函数设计4

3.8保存函数设计4

3.9显示函数设计4

3.10退出函数设计4

第4章测试5

总结5

参考文献5

附录程序源代码5

 

第1章第1章需求分析

(1)能完成学生成绩的插入、查询、修改、删除、输出等功能;

(2)采用单链表存储结构实现;

(3)所有数据以外部文件方式保存

第2章第2章总体设计

2.1系统的程序流程图

绘制一个系统的总体程序流程图,主要展示系统从开始以后,可以经过哪些流程,最后结束。

按姓名修改某位同学的成绩按姓名修改某位同学的成绩输出链表内容输出链表内容

2.2系统的全局变量和常量

系统全局变量intn;chara;

头文件:

#include"stdio.h"

#include"time.h"

#include"string.h"

#include"stdlib.h"

#include"conio.h"

2.3系统的函数介绍

把系统中的每个函数的原型列出来,解释一下函数的返回值及形式参数的含义;最后,再介绍一下每个函数的功能。

voidCreate(intn)//创建链表

voidList()//输出链表内容

voidlist()//输出链表所有内容

voidsave()//文件保存

voidsave1()//文件保存

voidread()//文件读取

voidread1()//文件读取

voidSAVE(){//保存到可浏览文件

voidSAVE1()//保存到可浏览文件

voidsort_data_copy(Lstu*p,Lstu*s)//交换排序时的值

voidsort()//对初始成绩进行排序

voidsort1()//对所有数据进行排序

voidsearch_print(Lstu*p)//输出查找信息

voidsearch_choose()//选择按分数段查找方式

voidsearch()//查找

voidmodify_choose(Lstu*p,intn)//选择修改方式

voidmodify()//按姓名修改

voidInsert()//按序号插入

voiddel()//按姓名删除

voidstatistics()//成绩统计

intmenu()//菜单(主界面)

 

第3章第3章详细设计

按函数,写出函数的原型声明,并画出每个函数的程序流程图。

3.1主函数设计

函数

3.2录入函数设计

添加的信息包括学号(不允许重复)、姓名(不允许重复)、语文成绩、数学成绩和英语成绩,如流程图所示:

本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图所示。

尾插法建立单链表操作示意图

 

3.3排序函数设计

可按照学号、语文成绩、数学成绩、英语成绩和平均分分别排序。

如图所示:

3.4查找函数设计

按姓名、学号和分数段查找学生成绩的流程图分别如下图4.3所示。

图4.3按姓名查找学生成绩信息流程图

在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。

当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。

直到p为NULL时查找失败。

单链表查找过程如图4.4所示。

图4.4单链表查找过程的示意图

按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。

(3)学生成绩修改模块

 

3.5修改函数设计

首先要查找与要修改数据相匹配的信息,若没有则返回失败。

否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。

3.6插入函数设计

首先要确定插入数据的位置,执行插入操作,然后再输入数据并保存到单链表。

3.7删除函数设计

当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。

其流程图如下:

删除操作定义为将单链表的第i个结点删去。

因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图4.6所示。

在单链表中删除结点指针的变化情况

3.8保存函数设计

输入学生信息应保存到学生基本信息文件中,修改后的信息将可保存到可浏览的文件,如图所示:

3.9显示函数设计

从单链表表头遍历整个单链表,将所有数据输出。

其部分代码如下:

voidread(){//文件读取

FILE*fp;

Lstu*p,*p1;

if((fp=fopen("初始值二进制.txt","rb"))==NULL)

{

printf("Cannotopenthefile\n");

exit(0);

}head=(Lstu*)malloc(sizeof(Lstu));

p1=head;

while(!

feof(fp)){

p=(Lstu*)malloc(sizeof(Lstu));

if(fread(p,sizeof(Lstu),1,fp)==1)

{

p1->next=p;

p1=p1->next;

}

}head=head->next;fclose(fp);

}

3.10退出函数设计

第4章第4章测试

主要进行功能性测试,即验证各个功能模块是否正确运行。

可以采用运行系统进行截图的方法来验证系统结果的正确性。

在完成了系统各方面的设计后,并不是可以运行就完成的,为了保证系统性能的稳定性跟安全性等,就要对系统做测试。

测试环境如下:

硬件:

P4C2.4GHz,500GB硬盘,2内存;

软件:

Windows7PersonalSP1,分辨率1366*768,MicrosoftVisualC++6.0。

运行的主界面如图所示:

1点击1输入学生相关信息,如图所示:

2浏览初始学生信息,如图所示:

 

3查看初始学生总分及平均分,如图所示:

4查找,如图所示:

按姓名查找:

5初始学生成绩排序,如图所示:

 

按平均成绩进行排序:

6插入新成绩,如图所示:

7按姓名修改某位学生的成绩,如图所示:

选择修改数学成绩:

8按姓名删除某位学生的成绩,如图所示:

9浏览所有学生的信息及排名,如图所示:

10保存最终结果到可浏览的文件中,如图所示:

⑾统计,如图所示:

总结

写这次实验课的收获和感想。

参考文献

附录程序源代码

//程序名称:

xsglxt.CPP

//程序功能:

采用链表与文件实现一个简单的学生成绩管理系统。

#include"stdio.h"

#include"time.h"

#include"string.h"

#include"stdlib.h"

#include"conio.h"

#defineNULL0

typedefstructLstu{

intcla,ID;

longnum;

charname[20];

charsex[20];

floatchinese,math,english;

floatsum,ave;

Lstu*next;

}Lstu;

Lstu*head;

voidCreate(intn){//创建链表

Lstu*p,*s;

inti;

for(i=0;i

if(i==0){

p=(Lstu*)malloc(sizeof(Lstu));

printf("请输入第%d个人的信息\n",i+1);

printf("请输入班级:

");scanf("%d",&p->cla);

printf("请输入学号:

");scanf("%ld",&p->num);

printf("请输入姓名:

");scanf("%s",p->name);

printf("请输入性别:

");scanf("%s",p->sex);

printf("请输入语文成绩:

");scanf("%f",&p->chinese);

printf("请输入数学成绩:

");scanf("%f",&p->math);

printf("请输入英语成绩:

");scanf("%f",&p->english);

p->sum=p->chinese+p->math+p->english;

p->ave=p->sum/3;

head=p;

if(n==1){

p->next=NULL;}}

else{

s=(Lstu*)malloc(sizeof(Lstu));

printf("请输入第%d个人的信息\n",i+1);

printf("请输入班级:

");scanf("%d",&s->cla);

printf("请输入学号:

");scanf("%ld",&s->num);

printf("请输入姓名:

");scanf("%s",s->name);

printf("请输入性别:

");scanf("%s",s->sex);

printf("请输入语文成绩:

");scanf("%f",&s->chinese);

printf("请输入数学成绩:

");scanf("%f",&s->math);

printf("请输入英语成绩:

");scanf("%f",&s->english);

s->sum=s->chinese+s->math+s->english;

s->ave=s->sum/3;

p->next=s;p=s;

s->next=NULL;}

}

}

voidList(){//输出链表内容

Lstu*p;

inti=0;

p=head;

if(p==NULL){

printf("Sorry,It'saEmptyList\n");}

else{

printf("\n\n\t------------------------------------------------------------------\n");

printf("\t%-5s%-5s%-10s%-8s%-7s%-10s%-10s%-10s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩","英语成绩");

printf("\t------------------------------------------------------------------\n");

while(p){i++;p->ID=i;

printf("\t%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f\n",p->ID,p->cla,p->num,p->name,p->sex,p->chinese,p->math,p->english);

printf("\t------------------------------------------------------------------\n");

p=p->next;

}

}

}

voidlist(){//输出链表所有内容

Lstu*p;

inti=0;

p=head;

if(p==NULL){

printf("Sorry,It'saEmptyList\n");}

else{

printf("\n----------------------------------------------------------------------------------\n");

printf("%-5s%-5s%-7s%-8s%-7s%-10s%-10s%-10s%-8s%-8s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩",

"英语成绩","总分","平均分");

printf("----------------------------------------------------------------------------------\n");

while(p){i++;p->ID=i;

printf("%-4d%-6d%-12d%-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f%-8.2f\n",p->ID,p->cla,p->num,p->name,p->sex,

p->chinese,p->math,p->english,p->sum,p->ave);

printf("----------------------------------------------------------------------------------\n");

p=p->next;

}

}

}

voidsave(){//文件保存

FILE*fp;

Lstu*p;

p=head;

if((fp=fopen("初始值二进制.txt","wb"))==NULL)

{

printf("Cannotopenthefile");

exit(0);

}

while(p){

fwrite(p,sizeof(Lstu),1,fp);

p=p->next;}

fclose(fp);

}

voidsave1(){//文件保存

FILE*fp;

Lstu*p;

p=head;

if((fp=fopen("初始值二进制备用.txt","wb"))==NULL)

{

printf("Cannotopenthefile");

exit(0);

}

while(p){

fwrite(p,sizeof(Lstu),1,fp);

p=p->next;}

fclose(fp);

}

voidread(){//文件读取

FILE*fp;

Lstu*p,*p1;

if((fp=fopen("初始值二进制.txt","rb"))==NULL)

{

printf("Cannotopenthefile\n");

exit(0);

}head=(Lstu*)malloc(sizeof(Lstu));

p1=head;

while(!

feof(fp)){

p=(Lstu*)malloc(sizeof(Lstu));

if(fread(p,sizeof(Lstu),1,fp)==1)

{

p1->next=p;

p1=p1->next;

}

}head=head->next;fclose(fp);

}

voidread1(){//文件读取

FILE*fp;

Lstu*p,*p1;

if((fp=fopen("初始值二进制备用.txt","rb"))==NULL)

{

printf("Cannotopenthefile\n");

exit(0);

}head=(Lstu*)malloc(sizeof(Lstu));

p1=head;

while(!

feof(fp)){

p=(Lstu*)malloc(sizeof(Lstu));

if(fread(p,sizeof(Lstu),1,fp)==1)

{

p1->next=p;

p1=p1->next;

}

}head=head->next;fclose(fp);

}

voidSAVE(){//保存到可浏览文件

FILE*fp;

Lstu*p;inti=0;

p=head;

if((fp=fopen("初始值可浏览文件.txt","w+"))==NULL)

{

printf("Cannotopenthefile");

exit(0);

}

fprintf(fp,"\n\n\t------------------------------------------------------------------\n");

fprintf(fp,"\t%-5s%-5s%-10s%-8s%-7s%-10s%-10s%-10s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩","英语成绩");

fprintf(fp,"\t------------------------------------------------------------------\n\n");

while(p){

i++;p->ID=i;

fprintf(fp,"\t%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f\n",p->ID,p->cla,p->num,p->name,

p->sex,p->chinese,p->math,p->english);

fprintf(fp,"\t------------------------------------------------------------------\n");

p=p->next;

}

fclose(fp);

}

voidSAVE1(){//保存到可浏览文件

FILE*fp;charfilename[20];

Lstu*p;inti=0;

p=head;

printf("请输入保存到可浏览文件的文件名:

");

scanf("%s",filename);

if((fp=fopen(filename,"w+"))==NULL)

{

printf("Cannotopenthefile");

exit(0);

}

fprintf(fp,"\n----------------------------------------------------------------------------------\n");

fprintf(fp,"%-5s%-5s%-7s%-8s%-7s%-10s%-10s%-10s%-8s%-8s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩",

"英语成绩","总分","平均分");

fprintf(fp,"----------------------------------------------------------------------------------\n");

while(p){

i++;p->ID=i;

fprintf(fp,"%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f%-8.2f\n",p->ID,p->cla,p->num,p->name,p->sex,

p->chinese,p->math,p->english,p->sum,p->ave);

fprintf(fp,"-------------------------------------------------------------------------------\n");

p=p->next;

}

fclose(fp);

}

voidsort_data_copy(Lstu*p,Lstu*s){//交换排序时的值

intcla1;

cla1=p->cla;p->cla=s->cla;s->cla=cla1;

longnum1;

num1=p->num;p->num=s->num;s->num=num1;

charname1[20];

strcpy(name1,p->name);strcpy(p->name,s->name);strcpy(s->name,name1);

charsex1[20];

strcpy(sex1,p->sex);strcpy(p->sex,s->sex);strcpy(s->sex,sex1);

floatchinese1;

chinese1=p->chinese;p->chinese=s->chinese;s->chinese=chinese1;

floatmath1;

math1=p->math;p->math=s->math;s->math=math1;

floatenglish1;

english1=p->english;p->english=s->english;s->english=english1;

floatsum1;

sum1=p->sum;p->sum=s->sum;s->sum=sum1;

floatave1;

ave1=p->ave;p->ave=s->ave;s->ave=ave1;

}

voidsort(){//对初始成绩进行排序

Lstu*p,*s;

intn;chara;

read();p=head;

if(p==NULL){

printf("Sorry,It'saEmptyList\n");

printf("\n按Enter键继续\n");a=getch();}

else{while

(1){system("cls");printf("\n排序前结果为:

\n");read();list();

printf("\t*=*=*=*=*=*=*=*=*=*=*=按学号排序

(1)\n");

printf("\t*=*=*=*=*=*=*=*=*=*=*=按语文成绩排序

(2)\n");

printf("\t*=*=*=*=*=*=*=*=*=*=*=按数学成绩排序(3)\n");

printf("\t*=*=*=*=*=*=*=*=*=*=*=按英语成绩排序(4)\n");

printf("\t*=*=*=*=*=*=*=*=*=*=*=按平均分排序(5)\

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1