资源描述
武汉长江工商学院
计算机技术系
项目名称: 学生成绩管理系统
学生姓名:
学 号:
班 级:
指导教师:
2013年6月18日
目 录
1 实验目的和意义 1
1.1 目的 1
1.2 意义 1
2 系统功能描述及设计 2
3 系统存储结构设计与描述 4
4 系统功能实现及算法描述 7
4.1学生信息的录入 7
4.2学生信息的浏览 8
4.3学生信息查询 9
4.4学生信息排序 10
4.5对学生信息进行删除 11
4.6对学生信息进行修改 12
4.7对学生信息进行添加 13
4.8对学生成绩进行统计 14
5 系统性能测试 15
5.1录入学生信息功能测试 15
5.2浏览功能测试 15
5.3查询学生信息 16
5.4学生成绩排序 17
5.5实现对学生信息的删除 18
5.6实现对学生信息的修改 19
5.7实现对学生信息的添加 20
5.8实现对学生信息的统计 20
6 设计小结 21
致谢 22
参考文献 23
源代码清单: 25
武汉长江工商学院计算机科学与技术系
1 实验目的和意义
1.1 目的
本课程设计的目的就是要通过一次集中的强化训练,使学生能及时巩固已学的知识,补充未学的但又必要的内容。进行课程设计目的在于加深对程序设计基础理论和基本知识的理解,促进理论与实践的结合,进一步提高程序设计能力。具体目的如下:
(1) 使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
(2) 培养学生综合运用所学知识独立完成课程设计的能力。
(3) 培养学生勇于探索、严谨推理、实事求是、有错必改、用实践来检验理论,全方位考虑问题等科学技术人员应具备的素质。
(4) 提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
(5) 培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,出不培养工程意识和创新能力。
(6) 对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
1.2 意义
随着学校规模迅速扩大,学生管理工作信息量急剧增加,信息变化幅度大,依靠传统的手工管理手段显然已不能适应新时期高校大学生的管理工作,无法完成大量的信息分析和处理。同时,随着学校管理体制改革的深化,学校有关职能部门如何全面、准确、及时地了解和掌握学生的信息,建立科学公正的学生个体和院系学生工作评价体系,已经成为新时期高校学生管理工作面临的一个新课题。为此,建设一套切实可行的学生工作管理系统,结合学校实际,充分利用校园网的资源优势,不仅使信息渠道更为畅通,而且可以资源共享。既为全面了解学生的综合信息提供了方便,使得查询统计更为准确便捷,又可以用电子档案逐步代替或辅佐传统的纸质档案,实现管理手段现代化。
该系统提供学生的基本状况、学习成绩、在校表现和奖惩等全方位的信息资料。在此基础上,构建学生考核、测评标准,建立评价指标体系,对学生进行科学测评,减少传统测评中的人为干扰,使对学生的评价更为客观、全面和科学。
提高学生工作办公自动化程度,建立学生信息库,把学生工作者从日常繁重重复的劳动中解放出来,减轻工作强度,提高工作效率。
2 系统功能描述及设计
本课程设计要求的几个功能在程序里面都能实现,有学生信息的输入、浏览、排序、统计、修改、删除、查询、添加,退出等。根据用户的需求来执行程序。程序总体结构如图(2-1)所示:
学生信息输入负责将学生的信息存储到对应的文本文件中,对学生的信息排序就包括按总分排序和按计算机成绩排序。统计也包括对计算机成绩的统计和对数学和英语成绩的统计。删除就负责对学生信息的删除。查询就可实现对学号的查询。
进入主菜单由函数print();实现。里面有九个功能供其选择
菜单一:信息录入功能,输入选项一进入该功能,根据系统提示输入相应的数据。
菜单二:为学生信息浏览功能,当用户输入二选项时,系统自动用户输入的数据调入内存在输出到显示器上。供用户浏览。
菜单三:为学生信息查询功能,当用户选择第三个功能后是按学号查询。
菜单四:对学生成绩进行排序,当用户进入该功能后有两个选项供其选择,分别是:按计算机和总分排序。
菜单五:学生信息的删除,一般删除学生信息的时候是非常小心的,故当用户选择该功能后为了防止误删,只有按学号查找出要删除信息的同学的信息进行删除操作,操作成功后,系统会给出相应的提示说明操作成功。
菜单六:学生信息的修改,用户在主菜单里里面可选择此功能,进入功能后,会将所有的同学的信息输出供用户参考,当用户输入要查找的同学的学好后可进入选择界面,提示用户是要修改的项目,当用户选择完毕后,直接输入新的数据即可,最后将数据保存到文件中。
菜单五:学生信息的添加,用户可以根据自己的需要来选择添加学生的信息,此功能会调用学生信息的输入来完成,事后给出提示添加成功!
菜单八:学生信息的统计,此选项可以根据用户的不同需要进行统计,可按计算机成绩统计,按英语分数排序和数学分数统计。统计的项目包括:平均分、最高分、最低分、及格率和六十分以下的,还有各个分数段的人数。
菜单九:用户选择此操作后可直接退出软件。
3 系统存储结构设计与描述
struct student
{
long id;
char name[10];
char sex[10];
float computer,math,english;
float total;
}stu[1000]此存储结构包括学生的姓名、学生的性别、学生的学号及学生给门功课的成绩,并且记录下该学生的总分。这些都用结构体变量数组来存储。
1.此外还有文件中数据的读取,此功能用load()函数来实现;
void load()
{
FILE *fp;
int i;
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("Can not open the file!\n");
exit(0);
}
n=fgetc(fp);
for(i=0;i<n;i++)
{
if(fread(&stu[i],sizeof(struct student),1,fp)!=1)
{
printf("Can not open the file!\n");
exit(0);
}
}
fclose(fp);
}此函数会将文件中的数据读取到内存中,并将有多少个学生多为函数的返回值;
此外还用到save()函数对数据的存储。
2.void save()
{
FILE *fp;
int i;
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("Can not open the file!\n");
exit(0);
}
fputc(n,fp);
for(i=0;i<n;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
{
printf("Can not open the file!\n");
exit(0);
}
}
fclose(fp);
}
3.文件中数据的连续输出,此功能用and()函数来实现
void and()
{
FILE *fp;
int i;
if((fp=fopen("data.txt","ab"))==NULL)
{
printf("Can not open the file!\n");
exit(0);
}
fputc(n,fp);
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
{
printf("Can not open the file!\n");
exit(0);
}
}
4.每执行完一个函数后,都要返回主菜单,这时要用back()函数来实现,
void back()//返回
{
printf("是否返回主菜单(yes或no)?");
gets(str);
do
{
scanf("%s",str);
if(strcmp(str1,str)==0)
{
system("cls");
main();
}
else if(strcmp(str2,str)==0)
{
printf("请按任意键退出!\n");
exit(0);
}
else
printf("您输入的数据不正确!请重新输入:");
}while(1);
}
5.进入功能选项,需用select()函数;
void select()//选择
{
int a;
scanf("%d",&a);
switch(a)
{
case 1:write();break;
case 2:scan();break;
case 3:numrefer();break;
case 4:sort();break;
case 5:remove();break;
case 6:revamp();break;
case 7:add();break;
case 8:statistics();break;
case 9:exit(0);break;
default:printf("非法操作!\n");back();break;
}
}
4 系统功能实现及算法描述
4.1学生信息的录入
首先打开文件,用一个循环实现对学生信息的循环录入,再循环内部实现对单个学生信息的录入,然后调用save();函数将内存中的信息存入文件;
流程图4-1如下:
图4-1信息录入函数流程图
4.2学生信息的浏览
首先用只读的方式打开文件,调用load();函数将文件中的信息读入内存,再将内存中的信息逐个输出到显示器上。返回主菜单;
流程图4-2如下:
图4-2信息浏览函数
4.3学生信息查询
首先用只读的方式打开文件,调用load();函数将文件中的信息读入内存,按照学号查询,当两个学号相等时就输出,否则就输出“没有照此同学的信息”
流程图4-3如下:
图4-3查询函数流程图
4.4学生信息排序
首先用只读的方式打开文件,调用load();函数将文件中的信息读入内存,由用户选择要排序的项目(1.为对学号排序。2.为对计算机成绩的排序。)最后将排好序的信息按要求一一输出;
流程图4-4如下:
图4-4排序函数流程图
4.5对学生信息进行删除
首先用只读的方式打开文件,调用load();函数将文件中的信息读入内存,由用户输入要删除同学的学号,得到此同学的信息后,将此同学的信息输出,在进行一次确认“确实要删除此同学的信息吗(Yes/No)”若用户选择yes。则进行删除操作。并最终提示“信息删除成功”,接着询问“还需要删除其他同学的信息吗?(Yes/No)”,若选择“y”,则重复删除操作。若为“no”,则退出,
流程图4-5如下所示:
图4-5信息删除函数流程图
4.6对学生信息进行修改
首先用只读的方式打开文件,调用load();函数将文件中的信息读入内存,由用户输入要修改的学生学号,系统找到对应的学生信息后输出:然后由用户选择要修改的项目(1:修改学号;2:修改姓名 ;3:修改性别;4:修改计算机成绩;5修改英语成绩;6:修改数学成绩)再由用户输入新的值将来的值覆盖掉,将修改后的数据写入文件;
流程图4-6如下:
图4-6修改函数流程图
4.7对学生信息进行添加
先进入选项,后直接用and()函数,提示用户想输入多少人,依次输入学号,姓名,性别,计算机分数,英语分数,数学分数;
流程图4-7如下:
图4-7添加函数流程图
4.8对学生成绩进行统计
首先用只读的方式打开文件,调用load();函数将文件中的信息读入内存,由用户选择需要统计的项目(1:对计算机成绩进行统计2:对英语成绩进行统计3:对数学成绩进行统计),
流程图4-8、4-9如下:
图4-8统计函数流程图
5 系统性能测试
5.1录入学生信息功能测试
用户按要求输入学生的人数,输完后可根据提示分别输出他们的姓名,性别,计算机分数,数学分数,英语分数,并且用户决定是否返回主菜单如图5-1
图5-1信息录入功能测试
5.2浏览功能测试
用户选二后进入,体统会将文件中的学生的信息读入内存,再将内存中的信息再输出到显示器 上如图5-2
图5-2浏览功能测
学生信息一目了然;
5.3查询学生信息
选项三是查询学生信息功能,系统会根据用户输入的学号,再和内存中的数据一一比较直到找到符合要求的学生信息,按学号查询测试如图5-3
图5-3查询信息测试
根据学号查找精确,速度快,可靠性高;
5.4学生成绩排序
进入对学生成绩排序的界面后,用户可以根据自己的需要选择相应的功能:对计算机成绩排序,对总分排序。当用户选择了相应的功能后,可根据需要选择从高到低排序。如图5-5 对计算机进行降序排列功能测试:
图5-5 成绩排序测试
可以再次循环排序,功能多;
如图5-6 对总分成绩进行降序排列:
图5-6 成绩降序测试
5.5实现对学生信息的删除
如果用户需要对学生信息进行删除的话,可以按5,然后根据系统的提示输入需要删除的学生的信息,当系统找出要删除同学的信息后,用户按确定,此时,学生的信息就被彻底删除了。学生信息删除功能测试如图5-7:
图5-7信息删除测试
学生信息的删除后的图片
5.6实现对学生信息的修改
输入要修改的信息的学生的学号,系统会自动找出,然后用户根据需要选择需要修改的项目,可以修改姓名,性别,计算机分数,英语分数,数学分数,选择后输入新数据就行了。信息修改功能测试如图5-8 :
图5-8 信息修改测试
修改后的信息如图5-9 :
图5-9修改后测试
5.7实现对学生信息的添加
当选择了7后,会进入学生信息添加界面,此时用户根据学生的信息录入系统就行了。完成后系统会自动将新的数据保存。学生信息添加功能测试如图5-10:
图5-10信息添加测试
能实现对学生信息的循环添加,并且会有相应的提示;
5.8实现对学生信息的统计
统计可是对不同科目进行统计,统计的项目计算机,英语,数学中的一门的最高分、最低分、平均分以及各分数段之间人数的比例,返回后还可以继续对其他科目进行统计。如图5-8:
6 设计小结
经过一周的课程设计,我学到了很多东西:
(1)定义全局变量N后如果后面的函数中需要使用全局变量N的时候不能再定义局部变量N了,要不然局部变量N与全局变量N的性质不同!!!
(2)培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。
(3)过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
(4)用 #include “stdlib.h”做头文件,用exit可以结束整个程序!!!
致谢
课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。
在这次课程设计中我遇到许多问题和麻烦,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。在此对老师和同学们表示感谢!
46
参考文献
[1] 谭浩强,C语言课程设计(第三版),北京:清华大学出版社, 1996.5
[2] 杨路明,从语言程序设计教程(第二版),北京:邮电大学出版社,2009.7
[3]谭浩强,C语言课程设计(第二版),北京:清华大学出版社, 1991.5
[4]谭浩强,C语言程序设计题解与上机指导,北京:清华大学出版社,1991.3
源代码清单:
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#include"string.h"
void select();//选择
void write();//录入
void scan();//浏览
void numrefer();//查询
void sort();//分类
void remove();//删除
void revamp();//修改
void add();//添加
void statistics();//统计
void menu();//菜单
void main();//主函数
void save();//保存
void load();//导出
void back();//返回
void and();//继续
int n;
char str[10];
char str1[10]="yes",str2[10]="no";
struct student
{
long id;
char name[10];
char sex[10];
float computer,math,english;
float total;
}stu[1000],temp;
void main()//主函数
{
menu();
printf("请输入您的选择:");
select();
}
void save()//保存
{
FILE *fp;
int i;
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("Can not open the file!\n");
exit(0);
}
fputc(n,fp);
for(i=0;i<n;i++)
{
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
{
printf("Can not open the file!\n");
exit(0);
}
}
fclose(fp);
}
void load()//导出
{
FILE *fp;
int i;
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("Can not open the file!\n");
exit(0);
}
n=fgetc(fp);
for(i=0;i<n;i++)
{
if(fread(&stu[i],sizeof(struct student),1,fp)!=1)
{
printf("Can not open the file!\n");
exit(0);
}
}
fclose(fp);
}
void and()//继续
{
FILE *fp;
int i;
if((fp=fopen("data.txt","ab"))==NULL)
{
printf("Can not open the file!\n");
exit(0);
}
fputc(n,fp);
for(i=0;i<n;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
{
printf("Can not open the file!\n");
exit(0);
}
}
void back()//返回
{
printf("是否返回主菜单(yes或no)?");
gets(str);
do
{
scanf("%s",str);
if(strcmp(str1,str)==0)
{
system("cls");
main();
}
else if(strcmp(str2,str)==0)
{
printf("请按任意键退出!\n");
exit(0);
}
else
printf("您输入的数据不正确!请重新输入:");
}while(1);
}
void write()//录入
{
int i,num,j;
char str3[5]="girl";
char str4[5]="boy";
printf("请输入您要录入多少个同学的信息:");
scanf("%d",&num);
for(n=0,i=0;i<num;i++)
{
n++;
printf("该同学的学号被系统自动定为:");
srand(time(NULL));
for(j=0;j<1000;j++)
{
stu[i].id=rand()%1000+2011000;
if(stu[j].id!=stu[i].id)
break;
}
printf("%ld\n",stu[i].id);
printf("请输入学生姓名:");
scanf("%s",stu[i].name);
printf("请输入学生性别(girl或boy):");
gets(stu[i].sex);
do
{
scanf("%s",stu[i].sex);
if(strcmp(stu[i].sex,str3)==0||strcmp(stu[i].sex,str4)==0)
break;
else
printf("您输入的数据不合法!请重新输入:");
}while(1);
printf("计算机分数[0-100]:");
scanf("%f",&stu[i].computer);
printf("数学分数[0-100]:");
scanf("%f",&stu[i].math);
printf("英语分数[0-100]:");
scanf("%f",&stu[i].english);
printf("总分:");
stu[i].total=stu[i].computer+stu[i].math+stu[i].english;
printf("%.2f\n",stu[i].total);
}
save();
back();
}
void menu()//菜单
{
printf("********************************************************************************");
printf(" 学生成绩管理系统 \n");
printf("********************************************************************************");
printf(" 1.学生信息的录入 2.学生信息的浏览 \n");
printf(" 3.学生信息的查询 4.学生信息的排序 \n");
printf(" 5.学生成绩删除 6学生成绩修改 \n");
printf(" 7.学生成绩添加 8.学生信息的统计 \n");
printf(" 9.退出系统 \n");
printf("********************************************************************************");
}
void select()//选择
{
int a;
scanf("%d",&a);
switch(a)
{
case 1:write();break;
case 2:scan();break;
case 3:numrefer();break;
case 4:sort();break;
case 5:remove();break;
case 6:revamp();break;
case 7:add();break;
case 8:statistics();break;
case 9:exit(0);break;
default:printf("非法操作!\n");back();break;
}
}
void scan()//浏览
{
load();
int i;
if(n==0)
{
printf("没有学生信息!");
printf("是否返回主菜单(yes或no)?");
gets(str);
do
{
scanf("%s",str);
if(strcmp(str1,str)==0)
{
system("cls");
main();
}
else if(strcmp(str2,str)==0)
{
printf("请按任意键退出!\n");
exit(0);
}
else
printf("您输入的数据不正确!请重新输入:");
}while(1);
}
printf("学号\t 姓名 性别\t计算机\t 数学 英语 总分\n");
for(i=0;i<n;i++)
printf("%ld%8s%7s%7.2f%9.2f%8.2f%9.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].computer,stu[i].math,stu[i].english,stu[i].total);
back();
}
void numrefer()//学号查询
{
load();
long ID,i;
printf("请输入您要查询该学生的学号:");
scanf("%ld",&ID);
for(i=0;i<n;i++)
{
if(stu[i].id==ID)
{
printf("学号\t 姓名 性别\t计算机\t 数学 英语 总分\n");
printf("%ld%8s%7s%7.2f%9.2f%8.2f%9.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].computer,stu[i].math,stu[i].english,stu[i].total);
break;
}
if(i==n-1)
printf("没有该同学信息!\n");
}
back();
}
void sort()//排序
{
load();
int i,j,a;
printf("1.按照总分从大到小排序\n");
printf("2.按照计算机分数从大到小排序\n");
printf("请输入您要按照哪种方式排序:");
scanf("%d",&a);
if(a==1)
{
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(stu[j].total<stu[j+1].total)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
printf("学号\t 姓名 性别\t计算机\t 数学 英语 总分\n");
for(i=0;i<n;i++)
printf("%ld%8s%7s%7.2f%9.2f%8.2f%9.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].computer,stu[i].math,stu[i].english,stu[i].total);
}
else if(a==2)
{
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(stu[j].computer<stu[j+1].computer)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
printf("学号\t 姓名 性别\t计算机\t 数学 英语 总分\n");
for(i=0;i<n;i++)
printf("%ld%8s%7s%7.2f%9.2f%8.2f%9.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].computer,stu[i].math,stu[i].english,stu[i].total);
}
}
void remove()//删除
{
load();
long ID,i,j;
printf("请输入您要删除的学生的学号:");
scanf("%ld",&ID);
for(i=0;i<n;i++)
{
if(stu[i].id==ID)
{
printf("学号\t 姓名 性别\t计算机\t 数学 英语 总分\n");
printf("%ld%8s%7s%7.2f%9.2f%8.2f%9.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].computer,stu[i].math,stu[i].english,stu[i].total);
break;
}
if(i==n-1)
{
printf("没有该同学信息!\n");
back();
}
}
printf("您确定要删除该同学的信息(yes或no)???\n");
gets(str);
do
{
scanf("%s",str);
if(strcmp(str1,str)==0)
{
for(j=i;j<n;j++)
stu[j]=stu[j+1];
printf("该同学的信息被删除了!\n");
n--;
save();
break;
}
else if(strcmp(str2,str)==0)
exit(0);
else
printf("您输入的数据不正确!请重新输入:");
}while(1);
back();
}
void revamp()//修改
{
load();
long ID,i,a;
char str3[5]="girl";
char str4[5]="boy";
printf("请输入您要修改的学生的学号:");
scanf("%ld",&ID);
for(i=0;i<n;i++)
{
if(stu[i].id==ID)
{
printf("学号\t 姓名 性别\t计算机\t 数学 英语 总分\n");
printf("%ld%8s%7s%7.2f%9.2f%8.2f%9.2f\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].computer,stu[i].math,stu[i].english,stu[i].total);
break;
}
if(i==n-1)
{
printf("没有该同学信息!\n");
back();
}
}
printf("1.修改姓名\n");
printf("2.修改性别\n");
printf("3.修改计算机分数\n");
printf("4.修改数学分数\n");
printf("5.修改英语分数\n");
do
{
printf("请输入您要修改的位置:");
scanf("%ld",&a);
if(a==1)
{
printf("请重新输入姓名:");
scanf("%s",stu[i].name);
printf("\r");
}
else if(a==2)
{
printf("请重新输入性别(girl或boy):");
sc
展开阅读全文