数据结构课程设计报告范超 - 图文

更新时间:2024-07-05 09:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

海南大学信息科学技术学院

数据结构课程设计报告

设计题目: 学生成绩管理系统

专业班级: 12级 通信工程 3 班

姓名: 范超

学号: 20120206310061

指导教师: 吴泽晖

目 录

摘要 1 一、 概述 1 二、 需求分析 1 三、 设计要求 1 四、 概要设计 1 五、 详细设计 2

1、定义结构体 2 2、模块设计 3 六、 源程序 9 七、 运行结果 26 八、 心得体会 30 九、 参考文献 31

【摘要】随着科学的发展和社会的进步,许多过去由人工处理的繁杂事务开始交付计

算机来完成。学生成绩管理系统可以说是每个教育单位的得力助手,他利用计算机对学生成绩进行统一管理,实现学生成绩星系管理工作流程的系统化、自动化和规范化,提高广大教师的工作效率。因此,学生成绩管理系统对教育不嫩或单位越来越重要。此次成绩管理系统用C语言作为程序开发工具,设计一个简单的学生成绩管理系统,完成对学生成绩添加、修改、删除成绩统计功能。

【关键字】成绩管理系统 C语言 添加修改 删除插入 统计管理

一、概述

学生成绩管理系统主要是提供成绩查询,方便管理的一种网上的信息查阅平台,学生可以通过该系统查询自己的成绩,系统管理员可以通过该系统进行学生成绩添加、修改、删除成绩统计功能。

二、需求分析

传统的教务信息统计处理是用手工方式登记,填写,更改和查询,早已不能满足当今庞大的数据管理需求。随着时代的进步和科技的飞速发展,计算机和网络应用已经越来越普及,以计算机网络为平台,设计一个有效的学生成绩管理系统,不仅能节省大量的人力物力,减少费用,而且极大的提高了查询效率,节省了大量的时间,并且成绩管理也变得系统化和自动化。

三、设计要求

对学生信息的输入完成后,实现如下功能:1、对学生信息的查找、删除、修改。2、显示每们课程的平均成绩。3、任意抽取一门课程后,可以按该课程学生成绩对学生信息进行排序。

四、概要设计

此成绩管理系统主要由六大功能模块组成。

(1)输入模块。输入模块主要完成将数据存入的工作。在此成绩管理系统中,记录是从键盘逐个输入学生记录。学生记录由学生基本信息和成绩信息组成。

1

(2)查询模块。查询模块主要完成在输入的数据中查找满足要求的学生记录。在此管理系统中提供了两种查询方法,一种是按学号查询,一种是按姓名查询。

(3)修改模块。修改模块主要是将已输入的数据修改或者重新输入

(4)删除模块。删除模块主要完成输入数据的删除,将不需要的数据删除。 (5)统计模块。统计模块主要完成对各科平均成绩统计和各科成绩排名统计功能。

(6)输出模块。输出记录模块主要是将存储的学生记录信息在屏幕上打印出来。

学生成绩管理系统 输入模块 查询模块 修改模块 删除模块 统计模块 输出模块 从键盘输入 按学号查询 按姓名查询 各科平均成绩 各科成绩排名 输出至屏幕 五、详细设计

1、定义结构体

为了对学生信息进行统一操作,使用了结构体这一数据结构,学生的各项数据信息都能用结构体来表示,具体如下: struct student/*定义结构体*/ {int num;

2

char name[50];/*姓名,长度为50的字符串数组*/ char classes[50];/*班级名称,长度为50的字符串数组*/ double matchps;/*高等数学平时成绩,双精度实型变量*/ double matchks;/*高等数学考试成绩,双精度实型变量*/ double matchzh;/*高等数学综合成绩,双精度实型变量*/ double englishps;/*英语平时成绩,双精度实型变量*/ double englishks;/*英语考试成绩,双精度实型变量*/ double englishzh;/*英语综合成绩,双精度实型变量*/ double clangugeps;/*C语言平时成绩,双精度实型变量*/ double clangugeks;/*C语言考试成绩,双精度实型变量*/ double clangugezh;/*C语言综合成绩,双精度实型变量*/ double politicsps;/*政治平时成绩,双精度实型变量*/ double politicsks;/*政治考试成绩,双精度实型变量*/ double politicszh;/*政治综合成绩,双精度实型变量*/ double ave;/*平均成绩,双精度实型变量*/ }student[1000];/*最多存储1000个学生数据*/

2、模块设计

结构化的程序设计主要靠设计和调用各模块的函数来实现。此程序设计了多个函数,每个函数都能完成一个任务,有的函数和别的函数结合能完成更大的任务。每一个模块功能的实现其实就是对函数的调用。

接下来首先介绍本程序所涉及的子函数,再介绍主函数,最后介绍程序整体的实现过程。

(1)输入模块

输入模块主要是由void Inputfun()和void Getinformation() 两个函数组合得到的模块。

void Inputfun()/*输入学生信息模块*/

此函数只进行输入操作,由于此函数较长并且经常需要被其他子函数调用,所以先进行说明。此函数主要用来输入学生的基本数据,并判断输入是否正确。比如在分数的输入中就限定了只能输入0至100之间的数值,如果输入其他则显

3

示错误,这也符合分数录入规则。需要特别注意的是,这个函数完成了本程序中要做的两个计算。一是在每门课的考试成绩和平时成绩输入后完成了对这门课的综合成绩的计算(考试成绩*0.7+平时成绩*0.3);二是在最后一门课程的综合成绩算出后,计算了该学生四门课的平均成绩。

void Getinformation() /*获得学生信息*/

此函数是为了得到输入的学生信息,它调用了Inputfun()函数,其实它的主体还是Inputfun()函数。

开始 输入学生信息及成绩 1 是否继续?继续按1,结束按0 0 结束 图 输入模块流程图

(2)查找模块

查找模块提供了2种查找方式,该模块调用了void Seekinformation()函数。2种查找方式分别为按学号查找和按姓名查找,2种查找方式分别调用了int Searchbynum (int no)和int Searchbyname (char na[50])函数。

void Seekinformation()/*查询学生信息*/

此函数主要是查询学生信息,它调用了int Searchbynum (int no)和int Searchbyname (char na[50]),提供了2种查询方法(1、按学号查询;2、按姓名查询)。并通过调用void Printinformation(int x)(输出模块)将查询到的学生信息输出在屏幕上。

int Searchbynum (int no)/int Searchbyname (char na[50])

4

这两个函数是按学号查找和按姓名查询模块中的两个重要函数。主要功能是根据用户输入的学号\\姓名返回改学生所在的的数组下标。利用for循环嵌套一个if语句实现,若找到学生该学生信息就返回数组下标,若找不到就返回-1。

开始 按学号查询按1; 按姓名查询按2 1 2 输出学号所对应的信息 输出姓名所对应的信息 1 是否继续?继续按1,结束按0 0 结束 图 查找模块流程图

(3)输出模块

输出模块是所有模块中最简单,但也最重要的模块。输出模块在查找模块、修改模块以及统计模块中都有使用。调用void Printinformation(int x)函数。

void Printinformation(int x)/*输出学生信息*/

此函数较为简单,主要是将输入的学生信息输出至屏幕上。它与其他的函数有紧密的联系,是各个模块中最为重要的函数。

(4)修改模块

修改模块主要调用void Modifyinformation()函数。修改模块还调用了查找模块。

void Modifyinformation() /*修改学生信息*/

5

此函数用于修改学生信息。基本原理就是用输入的新数据覆盖原来的老数据,达到修改的目的。本函数还调用了查找模块的函数,使修改前能按学号或姓名找到要修改的学生信息。修改过程中调用了Inputfun()函数。

开始 调用查找模块找到要修改的信息 输入修改后的信息 1 是否继续?继续按1,结束按0 0 结束 图 修改模块流程图

(5)删除模块

删除模块与修改模块原理基本一致,不同的是修改模块是将查找到的信息进行修改,而删除模块是将查找到的数据删除。此模块调用了void Deleteinformation()函数,同时,该模块也调用了查找模块。

void Deleteinformation() /*删除学生信息*/

函数用于删除学生信息。同样调用了查找模块的函数。删除模块的关键语句是for (i=x;i<999;i++) student[i]=student[i+1];从要删除的那一个数据开始,用后一个数据覆盖它,一直循环到最后,相当于把开始的第一个数据删除了。

6

开始 调用查找模块找到要删除的信息 0 是否删除?是按1,否按0 1 删除成功 是否继续?继续按1,结束按0 1 0 结束 图 删除模块流程图

(6)统计模块

此模块主要调用void Chengjitongji()函数。 void Chengjitongji()/*按要求统计成绩*/

此函数用于按要求统计成绩。有分别统计每门课的平均成绩的功能;还能够按每门课程的成绩对学生进行排序,使学生在该门课的表现一目了然。排序中用到了冒泡排序的方法。

7

开始 每科平均成绩按1; 单科成绩排名按2 1 2 输出该科成绩排名 输出每科的平均成绩 选择要排名的科目 结束 图 统计模块流程图

(7)程序主函数模块 void main() /*主函数*/

主函数是用Switch语句集成各个功能函数。Switch语句是函数的主体: switch(c)/*利用switch语句集成各个功能函数*/

{

case 1 : Getinformation();break;/*获得学生信息*/ case 2 : Seekinformation();break;/*查找学生信息*/ case 3 : Modifyinformation();break;/*修改学生信息*/ case 4 : Deleteinformation();break;/*删除学生信息*/ case 5 : Chengjitongji();break;/*课程成绩的统计*/ case 0 : exit(0);/*退出*/ default: break;

8

}

开始 进入选择菜单 c=1? N Y Y 录入学生信息 查找学生信息 c=2? N c=3? Y 修改学生信息 N 删除学生信息 Y c=4? N c=5? N Y 课程成绩统计 结束 图 程序流程图

六、源程序

#include #include #include #include

9

struct student/*定义结构体*/ {int num;

char name[50];/*姓名,长度为50的字符串数组*/ char classes[50];/*班级名称,长度为50的字符串数组*/ double matchps;/*高等数学平时成绩,双精度实型变量*/ double matchks;/*高等数学考试成绩,双精度实型变量*/ double matchzh;/*高等数学综合成绩,双精度实型变量*/ double englishps;/*英语平时成绩,双精度实型变量*/ double englishks;/*英语考试成绩,双精度实型变量*/ double englishzh;/*英语综合成绩,双精度实型变量*/ double clangugeps;/*C语言平时成绩,双精度实型变量*/ double clangugeks;/*C语言考试成绩,双精度实型变量*/ double clangugezh;/*C语言综合成绩,双精度实型变量*/ double politicsps;/*政治平时成绩,双精度实型变量*/ double politicsks;/*政治考试成绩,双精度实型变量*/ double politicszh;/*政治综合成绩,双精度实型变量*/ double ave;/*平均成绩,双精度实型变量*/

}student[1000];/*最多存储1000个学生数据*/ int a,b,c,d,x,i,j,k; char s1[50]; double f;

void Inputfun()/*输入学生信息模块*/ {

for(; ;)/*设计死循环以至于在输入格式错误时可以再次输入*/ {

printf(\请输入班级名称:\\t\); /*输入班级名称*/ scanf(\,&s1); if(strlen(s1)>20) {

10

}

printf(\您输入的班级名称过长!\\n\); continue;

strcpy(student[i].classes,s1);

break; /*格式正确后跳出死循环*/

} for(; ;) {

printf(\请输入学号:\\t\);/*输入学号*/ scanf(\,&b); if(student[i].num<0) {

printf(\您输入的学号错误!\\n\); continue;

}

student[i].num=b; break; } for(; ;) {

printf(\请输入姓名:\\t\);/*输入姓名*/ scanf(\,&s1); if(strlen(s1)>20) {

printf(\您输入的姓名过长!\\n\); continue; }

strcpy(student[i].name,s1); break; }

11

for(; ;) {

printf(\请输入该生高等数学平时成绩:\\t\);/*输入各科平时成绩和考试成绩*/ scanf(\,&f); if(f>100||f<0) { }

student[i].matchps=f; break; } for(; ;) {

printf(\请输入该生高等数学考试成绩:\\t\); scanf(\,&f); if(f>100||f<0) { }

student[i].matchks=f;

student[i].matchzh=student[i].matchks*0.7+student[i].matchps*0.3;/*按考试成绩70%平时成绩30%算该门课程的最终成绩*/ break; } for(; ;) {

printf(\请输入该生英语平时成绩:\\t\); scanf(\,&f);

12

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

if(f>100||f<0) { }

student[i].englishps=f; break; } for(; ;) {

printf(\请输入该生英语考试成绩:\\t\); scanf(\,&f); if(f>100||f<0) { }

student[i].englishks=f;

student[i].englishzh=student[i].englishks*0.7+student[i].englishps*0.3; break; } for(; ;) {

printf(\请输入该生政治平时成绩:\\t\); scanf(\,&f); if(f>100||f<0) { }

13

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

student[i].politicsps=f; break; } for(; ;) {

printf(\请输入该生政治考试成绩:\\t\); scanf(\,&f); if(f>100||f<0) { }

student[i].politicsks=f;

student[i].politicszh=student[i].politicsks*0.7+student[i].politicsps*0.3; break; } for(; ;) {

printf(\请输入该生C语言平时成绩:\\t\); scanf(\,&f); if(f>100||f<0) { }

student[i].clangugeps=f; break; } for(; ;) {

14

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

printf(\请输入该生C语言考试成绩:\\t\); scanf(\,&f); if(f>100||f<0) { }

student[i].clangugeks=f;student[i].clangugezh=student[i].clangugeks*0.7+student[i].clangugeps*0.3;

student[i].ave=(student[i].matchzh+student[i].englishzh+student[i].clangugezh+student[i].politicszh)/4;/*计算每个学生的平均成绩*/ break; } }

void Getinformation() /*获得学生信息*/ {

printf(\成绩不合理!请您输入合理的成绩.\\n\); continue;

for (i=0;i<1000;i++)/*利用循环连续输入学生信息*/ {

if(i==0) { } else

printf(\请输入下一个学生的信息\\n\\n\); Inputfun();

printf(\继续请按1,返回主菜单请按0.\\n\); scanf(\,&a); if(a==0) break;

15

system(\);

printf(\请根据提示输入学生的信息\\n\\n\);

}

}

int Searchbynum (int no) /*按学号查找*/ { }

int Searchbyname (char na[50])/*按姓名查找*/ { }

void Printinformation(int x)/*输出学生信息*/ {

for (j=0;j<1000;j++) { } return -1;

if (student[j].num==no) { }

return j;

for (k=0;k<1000;k++) { }

return -1;

if (strcmp(student[k].name,na)==0) { }

return k;

if (x==-1)

printf(\该学生信息不存在!\\n\); else {

16

}

}

printf(\班级:%s\\n\,student[x].classes); printf(\学号:%d\\n\,student[x].num); printf(\姓名:%s\\n\\n\,student[x].name);

printf(\高数平时成绩:%5.2f\\n\,student[x].matchps); printf(\高数考试成绩:%5.2f\\n\,student[x].matchks); printf(\高数综合成绩:%5.2f\\n\\n\,student[x].matchzh); printf(\英语平时成绩:%5.2f\\n\,student[x].englishps); printf(\英语考试成绩:%5.2f\\n\,student[x].englishks); printf(\英语综合成绩:%5.2f\\n\\n\,student[x].englishzh); printf(\语言平时成绩:%5.2f\\n\,student[x].clangugeps); printf(\语言考试成绩:%5.2f\\n\,student[x].clangugeks); printf(\语言综合成绩:%5.2f\\n\\n\,student[x].clangugezh); printf(\政治平时成绩:%5.2f\\n\,student[x].politicsps); printf(\政治考试成绩:%5.2f\\n\,student[x].politicsks); printf(\政治综合成绩:%5.2f\\n\\n\,student[x].politicszh); printf(\平均成绩:%5.2f\\n\,student[x].ave);

void Seekinformation()/*查询学生信息*/ {

for(; ;) {

system(\);

printf(\按学号查找请按1,按姓名查找请按2\\n\);/*提供两种查找方式*/ scanf(\,&a); if(a==1) {

printf(\请输入要查找的学生的学号\\n\); scanf(\,&d);

17

}

}

}

x=Searchbynum (d);/*调用按学号查找函数*/ Printinformation(x);

else if (a==2) { }

printf(\继续请按1,返回主菜单请按0.\\n\); scanf(\,&a); if(a==0) break;

printf(\请输入要查找的学生的姓名\\n\); scanf(\,&s1);

x=Searchbyname (s1);/*调用按姓名查找函数*/ Printinformation(x);

void Modifyinformation() /*修改学生信息*/ {

for(; ;) {

system(\);

printf(\请先查找要修改的学生信息!\\n\\n\);

printf(\按学号查找请按1,按姓名查找请按2\\n\);/*先查找后修改*/ scanf(\,&a); if(a==1) { }

18

printf(\请输入要查找的学生的学号\\n\); scanf(\,&d); x=Searchbynum (d);

}

}

else if (a==2) { }

if (x==-1)

printf(\学生信息不存在!\\n\); else { }

printf(\继续请按1,返回主菜单请按0.\\n\); scanf(\,&a); if(a==0) break;

printf(\您要修改的学生信息为:\\n\); Printinformation(x); printf(\请您输入新值\\n\); i=x; Inputfun();

printf(\请输入要查找的学生的姓名\\n\); scanf(\,&s1); x=Searchbyname (s1);

void Deleteinformation() /*删除学生信息*/ {

for (;;) {

system(\);

printf(\请先查找要删除的学生信息!\\n\\n\); printf(\按学号查找请按1,按姓名查找请按2\\n\); scanf(\,&a);

19

if(a==1) { }

else if (a==2) { }

if (x==-1)

printf(\学生信息不存在!\\n\); else { }

printf(\继续请按1,返回主菜单请按0.\\n\); scanf(\,&a); if(a==0)

20

printf(\请输入要查找的学生的学号\\n\); scanf(\,&d); x=Searchbynum (d);

printf(\请输入要查找的学生的姓名\\n\); scanf(\,&s1); x=Searchbyname (s1);

printf(\您要删除的学生信息为:\\n\); Printinformation(x);

printf(\是否真的要删除该生信息?是请按1,否请按0.\\n\); scanf(\,&a); if (a==1) { }

for (i=x;i<999;i++) student[i]=student[i+1]; printf(\删除成功!\\n\);

}

}

break;

void paixugs() /*排序1*/ {

struct student temp; for (j=1;j<1000;j++) {

for (k=0;k<999;k++) {

if (student[k].matchzh

temp=student[k]; student[k]=student[k+1]; student[k+1]=temp; } } }

printf(\学生成绩排序表:\\n\\n\); for (i=0;i<1000;i++) if (student[i].num!=0) {

printf(\学号:%d\\t\,student[i].num); printf(\姓名:%s\\t\,student[i].name);

printf(\第%d名:%5.2f\\n\,(i+1),student[i].matchzh); }

printf(\返回主菜单请按0\\n\); scanf(\,&a); }

21

void paixudl() /*排序2*/ {

struct student temp; for (j=1;j<1000;j++) {

for (k=0;k<999;k++) {

if (student[k].englishzh

temp=student[k]; student[k]=student[k+1]; student[k+1]=temp; } } }

printf(\学生成绩排序表:\\n\\n\); for (i=0;i<1000;i++) if (student[i].num!=0) {

printf(\学号:%d\\t\,student[i].num); printf(\姓名:%s\\t\,student[i].name);

printf(\第%d名:%5.2f\\n\,(i+1),student[i].englishzh); }

printf(\返回主菜单请按0\\n\); scanf(\,&a); }

void paixuyy() /*排序3*/ {

struct student temp; for (j=1;j<1000;j++)

22

{

for (k=0;k<999;k++) {

if (student[k].clangugezh

temp=student[k]; student[k]=student[k+1]; student[k+1]=temp; } } }

printf(\学生成绩排序表:\\n\\n\); for (i=0;i<1000;i++) if (student[i].num!=0) {

printf(\学号:%d\\t\,student[i].num); printf(\姓名:%s\\t\,student[i].name);

printf(\第%d名:%5.2f\\n\,(i+1),student[i].clangugezh); }

printf(\返回主菜单请按0\\n\); scanf(\,&a); }

void paixuwl() /*排序4*/ {

struct student temp; for (j=1;j<1000;j++) {

for (k=0;k<999;k++) {

if (student[k].politicszh

23

{

temp=student[k]; student[k]=student[k+1]; student[k+1]=temp; } } }

printf(\学生成绩排序表:\\n\\n\); for (i=0;i<1000;i++) if (student[i].num!=0) {

printf(\学号:%d\\t\,student[i].num); printf(\姓名:%s\\t\,student[i].name);

printf(\第%d名:%5.2f\\n\,(i+1),student[i].politicszh); }

printf(\返回主菜单请按0\\n\); scanf(\,&a); }

void Chengjitongji()/*按要求统计成绩*/ {int flag=0,s,y;

double gp=0,dp=0,yp=0,wp=0; system(\);

printf(\每门课程平均成绩请按1,单科成绩排序请按2\\n\); scanf(\,&s); if(s==1) {

for (i=0;i<1000;i++) {

gp+=student[i].matchzh; dp+=student[i].englishzh;

24

yp+=student[i].clangugezh; wp+=student[i].politicszh; if (student[i].ave>0) flag++;

}gp=gp/flag;dp=dp/flag;yp=yp/flag;wp=wp/flag; printf(\高等数学平均成绩:\\t%5.2f\\n\,gp); printf(\英语平均成绩:\\t%5.2f\\n\,dp); printf(\语言平均成绩:\\t%5.2f\\n\,yp); printf(\政治平均成绩:\\t%5.2f\\n\,wp); printf(\返回主菜单请按0\\n\); scanf(\,&a);} if(s==2){

printf(\请选择\\n\\n\);

printf(\高等数学成绩排序请按1\\n\); printf(\英语成绩排序请按2\\n\); printf(\语言成绩排序请按3\\n\); printf(\政治成绩排序请按4\\n\); scanf(\,&y);

if(y==1) paixugs();/*调用相应的排序函数*/ if(y==2) paixudl(); if(y==3) paixuyy(); if(y==4) paixuwl();}} void main() /*主函数*/ {

for (;;) {

system(\); printf(\);

printf(\欢迎使用学生成绩管理系统*************\\n\);

25

} }

printf(\ 请从主菜单选择您所需要的操作\\n\);

printf(\); printf(\首次输入学生信息请按\\n\); printf(\查找学生信息\\n\); printf(\修改学生信息\\n\); printf(\删除学生信息\\n\); printf(\课程成绩统计\\n\); printf(\退出\\n\);

printf(\); printf(\请输入你的操作(0-5):\); scanf(\,&c);

switch(c)/*利用switch语句集成各个功能函数*/ { }

case 1 : Getinformation();break;/*获得学生信息*/ case 2 : Seekinformation();break;/*查找学生信息*/ case 3 : Modifyinformation();break;/*修改学生信息*/ case 4 : Deleteinformation();break;/*删除学生信息*/ case 5 : Chengjitongji();break;/*课程成绩的统计*/ case 0 : exit(0);/*退出*/ default: break;

七、运行结果

此次测试输入了5名学生的成绩进行测试。由于按姓名查找和按学号查找功能相似,所以这里只是截图了其中的一种。

26

图 系统开始界面

图 输入学生信息

27

图 按学号查找学生信息

图 修改学生信息

28

本文来源:https://www.bwwdw.com/article/00e.html

Top