学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
![学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2022-11/28/2e7815f2-e87e-4818-8d7d-60e841c0b441/2e7815f2-e87e-4818-8d7d-60e841c0b4411.gif)
学生成绩管理系统
目录
5.1题目
5.2课程设计
5.3需求分析
5.4设计要求
5.4.1功能设计要求
5.4.2总体设计
5.4.3函数设计
5.5源程序
5.6总结
5.7参考资料
学生成绩管理系统
2.1题目
学生成绩管理系统
2.2课程设计目的
1要求学生达到熟练掌握C语言的基本知识和技能
2掌握利用工具软件开发系统的基本思路和方法
3强化上机动手能力,闯过编码关,把理论与实际应用相结合
2.3需求分析
本课程设计是一个简单的学生成绩管理系统,该系统用以实现学生基本信息的编辑,课程信息的编辑,成绩信息的编辑,学生成绩统计等等。
2.4设计要求
2.4.1功能设计和要求
设计要求实现的功能很多,主要分为几个板快进行分析。
1系统功能
①学生基本信息的编辑:
包括学生信息的录入、修改、删除和查询等功能。
②课程信息的编辑:
包括课程信息的录入、修改、删除和查询等功能。
③成绩信息的编辑:
包括学生成绩的录入、修改、删除和查询等的功能。
④学生成绩统计,包括:
按学号、按课程号求平均分、各分数段的人数与百分比。
按学号求不及格的门数。
按课程号求不及格的人数。
⑤通过菜单选择退出系统,并有退出系统的提示或确认。
2系统要求
①使用菜单操作。
②学生信息用文件保存。
③进入系统的时候,要验证用户身份(用户名和密码)。
3应用程序的总体设计图:
(1)程序加密
在开始进入系统的时候,首先要进行密码核对,以便对程序进行保护,核对正确后,才能进入系统。
(2)主页面
从键盘录入学生成绩的基本信息。
1按照一定的顺序依次输入学生的“学号”、“姓名”、“语文”、“数学”、“英语”等基本内容。
2学生姓名要和学生成绩相匹配。
3输入完毕后要保存学生信息。
(3)增加学生成绩界面
输入学生的基本信息。
(4)删除学生成绩界面
删除学生的基本信息。
(5)修改学生成绩界面
按学号选择需要修改的学生信息。
(6)查找学生成绩界面
①查找已经保存了的学生信息。
②按照学号查找。
(7)统计学生成绩界面
①按学号、按课程号求平均分、各分数段的人数与百分比。
②按学号求不及格的门数。
③按课程号求不及格的人数。
2.4.2总体设计
最初的规划只是说明它的可行性,不要求制定函数的具体实现,甚至不需要考虑数原型。
完成规划后,按照各个模块的功能连接描述。
1要求使用多个文件方式实现设计;
2要求在个各文件内实现结构化设计;
3每个文件作为单独的C文件,分别说明每个函数的功能和实现方法。
2.4.3函数设计
下面分别描述一些函数,建立它们的原型。
1保存函数
函数原型:
structstudent_type*saveDate(structstudent_type*head)
功能:
保存学生信息
参数:
struct
工作方式:
保存输入的学生信息
要求:
保存在文件里
2查找函数
函数原型:
structstudent_type*find(structstudent_type*head,longnum)
功能:
查找学生信息
参数:
struct
工作方式:
查找输入的学生信息
要求:
只对储存内容进行查找
3增加函数
函数原型:
structstudent_type*add(structstudent_type*head)
功能:
增加学生信息
参数:
struct
工作方式:
输入学生的信息
要求:
按顺序输入
4浏览函数
函数原型:
voidbrowse
功能:
浏览保存的学生信息
参数:
void
工作方式:
浏览学生的信息
要求:
只能浏览保存的学生信息
5修改函数
函数原型:
voidchangeDate(structstudent_type*head)
功能:
修改保存的学生信息
参数:
void
工作方式:
浏览学生的信息
要求:
只能修改保存的学生信息
6统计函数
函数原型:
structstudent_type*stat(structstudent_type*head)
功能:
按学号、按课程号求平均分、各分数段的人数与百分比;
按学号求不及格的门数。
按课程号求不及格的人数
参数:
struct
工作方式:
统计学生的信息
要求:
只能统计输入的学生信息
7删除函数
函数原型:
structstudent_type*delDate(structstudent_type*head)
功能:
删除学生的信息
参数:
void
工作方式:
删除学生的信息
要求:
只能删除保存的学生信息
工作方式:
删除学生的信息
要求:
只能删除保存的学生信息
8身份验证系统
函数原型:
voidmain()
功能:
验证用户的身份
参数:
void
工作方式:
验证身份
要求:
只能验证设置好的用户身份
9主函数
函数原型:
voidmain()
功能:
控制程序
参数:
void
要求:
管理菜单命令
10头函数
函数原型:
stdio.h
功能:
声明函数原型、包含文件、自定义及数据结构
要求:
报告是否能正常打开文件执行存入操作及存入记录的条数
2.5源程序
//sixStuMakeAdmin.cpp:
Definestheentrypointfortheconsoleapplication.
/*
学生成绩管理系统
a)用结构体形式实现对学生成绩的描述,结构体成员包括:
学号,姓名,语文,数学,英语;
b)能够进行数据记录的增加、查询、修改、统计、删除、保存;
c)能够将学生的基本信息存放在文件中,系统可以再次从文件中读出保存的数据;
d)定义一个操作命令集,例如
H----帮助
A----增加
R----浏览
M----修改
B----统计
D----删除
S----保存
F----查找
Q----退出
C----清除所有记录
*/
#include"stdio.h"
#include"malloc.h"
#include
#include
#include
#include
#defineNULL0
#defineLENsizeof(structstudent_type)
#defineLEN_Ssizeof(structstudent)
#defineNAME_LEN10
#defineFILENAME"score.dat"
#defineTEST0//0表示不输出测试信息,1表示输出
voidhomepage();
voidquit();//退出界面
voidmain()
{
inti,k=0,j;
charusername[15],pwd[6];
system("color3f");
printf("\n\n");
printf("\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t┃**********************************************************┃\n");
printf("\t┃***┏━━━━━━━━━━━━━━━━━━━━━━━━┓***┃\n");
printf("\t┃***┃************************************************┃***┃\n");
printf("\t┃***┃*******┃***┃\n");
printf("\t┃***┃***欢迎使用学生成绩管理系统****┃***┃\n");
printf("\t┃***┃*******┃***┃\n");
printf("\t┃***┃*******┃***┃\n");
printf("\t┃***┃***电信七班刘萍****┃***┃\n");
printf("\t┃***┃*******┃***┃\n");
printf("\t┃***┃***2008.6.23****┃***┃\n");
printf("\t┃***┃*******┃***┃\n");
printf("\t┃***┃************************************************┃***┃\n");
printf("\t┃***┗━━━━━━━━━━━━━━━━━━━━━━━━┛***┃\n");
printf("\t┃**********************************************************┃\n");
printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
for(i=0;i<3;i++)
{
printf("\n请输入用户名:
");
gets(username);
printf("\n请输入6位密码:
");
for(j=0;(pwd[j]=getch())!
=13;j++)
{
printf("*");
if(j>20)
break;
}
pwd[j]=0;if((strcmp(username,"0605020703")==0)&&(strcmp(pwd,"123456")==0))
{
printf("\n您已经成功登录\n");
k=1;
for(i=0;i<20;i++)
{
printf(".");
Sleep(100);
}
system("cls");
homepage();
break;
}
else
printf("\n用户名或密码无效请重新输入:
\n");
continue;
}
if(k==0)
printf("\n连续输入错误3次将退出程序\n");
Sleep(2000);
//quit();
}
structstudent{
longnum;//学号
charname[NAME_LEN];//姓名
floatchinese;//语文成绩
floatmath;//数学成绩
floatenglish;//英语成绩
};
structstudent_type{
structstudentstu;
structstudent_type*next;
};
intn;//学生个数
intnum_change=0;//改动的记录还没有保存的个数
//输出测试信息
voidtestprint(char*message){
if(TEST)
printf("%s\n",message);
}
//将文件中的数据读入到链表中,返回指向链表的头指针
structstudent_type*readDate(){
FILE*fp;
if((fp=fopen(FILENAME,"rb"))==NULL){
printf("can'topenfile\n");
}
structstudentstud;
structstudent_type*head;
structstudent_type*p1,*p2;
n=0;
//p1=p2=(structstudent_type*)malloc(LEN);
head=NULL;
while(fread(&stud,LEN_S,1,fp)==1){
n++;
//p1负责开辟新空间
p1=(structstudent_type*)malloc(LEN);
p1->stu.num=stud.num;
for(inti=0;ip1->stu.name[i]=stud.name[i];
p1->stu.chinese=stud.chinese;
p1->stu.math=stud.math;
p1->stu.english=stud.english;
p1->next=NULL;
if(n==1){
p2=p1;
head=p2;
}
else{
//p2保存p1之前的数据
p2->next=p1;
p2=p1;
}
}
fclose(fp);
return(head);
}
//S----保存
structstudent_type*saveDate(structstudent_type*head){
if(num_change==0){
printf("****当前没有改动需要保存!
****\n");
return(head);
}
FILE*fp;
structstudent_type*p;
p=head;
if((fp=fopen(FILENAME,"wb"))==NULL){
printf("can'topenfile\n");
return(head);
}
n=0;//重新对记录条数记数
if(TEST)
printf("saveDate(head)>%d\n",p);
if(head!
=NULL)
do{
if(fwrite(p,LEN_S,1,fp)!
=1){
printf("filewriteerror\n");
}
else
n++;
p=p->next;
}while(p!
=NULL);
fclose(fp);
num_change=0;//保存了所有的记录,未保存数归零
printf("保存成功!
共记%d条记录\n",n);
return(head);
}
//R----浏览
voidbrowse(){
FILE*fp;
structstudentstud;
if((fp=fopen(FILENAME,"rb"))==NULL){
printf("\ncan'topenfile\n");
}
if(n==0)
printf("****没有记录****\n");
else{
printf("\n学生成绩表\n");
printf("==================================================\n");
printf("学号姓名语文数学英语\n");
while(fread(&stud,LEN_S,1,fp)==1){
printf("--------------------------------------------------\n");
printf("%8ld%-10s%-8.1f%-8.1f%-8.1f\n",stud.num,stud.name,stud.chinese,
stud.math,stud.english);
}
printf("==================================================\n");
}
printf("共记%d条记录\n",n);
}
//F----查找(查找学号为num的记录,返回指向那条记录的指针)
structstudent_type*find(structstudent_type*head,longnum){
if(head==NULL)//没有记录或学号为负了,学号应不小于为0
returnNULL;
structstudent_type*p1;
p1=head;
while(num!
=p1->stu.num&&p1->next!
=NULL){
//如果没找到所要的结点,并且没有到最后一下结点,p1后移一个结点
p1=p1->next;
}
if(num==p1->stu.num){//找到了
return(p1);
}
returnNULL;
}
//A----增加
structstudent_type*add(structstudent_type*head){
structstudent_type*newstudent;
structstudent_type*p;
chart;
longnumstu;//输入的学号
printf("你将增加1条记录\n");
//不允许输入相同的学号
printf("学号:
");
scanf("%ld",&numstu);
if(numstu<0){
printf("输入错误!
学号应该不小于零!
\n增加记录失败!
\n");
return(head);
}
intboolean=0;//0-false,1-true(有重复学号出现)
if(n==0)
boolean=0;//文件中没有记录,即没有重复学号
else{
structstudent_type*f=find(head,numstu);
if(f!
=NULL)
boolean=1;
else
boolean=0;
}
if(boolean){
printf("输入错误!
学号不能与库文件中的记录的学号相同!
\n可删除或修改已有记录。
\n增加记录失败!
\n");
return(head);
}
newstudent=(structstudent_type*)malloc(LEN);
newstudent->stu.num=numstu;
printf("姓名:
");
scanf("%s",newstudent->stu.name);
scanf("%c",&t);//接收回车
printf("语文:
");
scanf("%f",&newstudent->stu.chinese);
printf("数学:
");
scanf("%f",&newstudent->stu.math);
printf("英语:
");
scanf("%f",&newstudent->stu.english);
p=head;
head=newstudent;
newstudent->next=p;
num_change++;//增加没有保存的记录条数
printf("增加了1条记录\n");
printf("请输入S命令立即保存,否则会造成数据丢失!
\n");
return(head);
}
//B----统计
#defineM4
#defineN3
structstudent_type*stat(structstudent_type*head)
{
floatstudent[M][N];
floataverage[M]={0};
inti,j;
for(i=0;i{
printf("请输入学号为%d学生3门课的成绩",i+1);
for(j=0;j{
scanf("%f",&student[i][j]);
average[i]+=student[i][j];
}
}
for(i=0;iprintf("学号为%d个学生的平均成绩为%.2f\n",i+1,average[i]/N);
return0;
}
//D----删除
structstudent_type*delDate(structstudent_type*head){
//删除可能删掉头指针,所以要返回头指针
if(head==NULL){
printf("没有数据记录\n");return(head);
}
printf("你将删除1条记录\n");
structstudent_type*p1,*p2;
longnum_s;
printf("要删除的学生的学号:
");
scanf("%ld",&num_s);
if(num_s<0){
printf("输入错误!
学号应该不小于零!
\n删除记录失败!
\n");
return(head);
}
p1=head;
while(num_s!
=p1->stu.num&&p1->next!
=NULL){
p2=p1;
p1=p1->next;
}
if(num_s==p1->stu.num){
//显示查到的要删除的学生的信息
printf("****将要删除的学生的信息****\n");
printf("学号姓名语文数学英语\n");
printf("%8ld%-10s%-8.1f%-8.1f%-8.1f\n",p1->stu.num,p1->stu.name,p1->stu.chinese,p1->stu.math,p1->stu.english);
if(p1==head){
head=p1->next;
}
else
p2->next=p1->next;
num_change++;//增加没有保存的记录条数
printf("删除了1条记录\n");
printf("请输入S命令立即保存,否则会造成数据丢失!
\n");
}
else
printf("查无此人!
\n");
return(head);
}
//M----修改
voidchangeDate(structstudent_type*head){
if(head==NULL){
printf("****没有数据!
****\n");return;
}
printf("你将修改1条记录\n");
structstudent_type*p;
longnum_s,numstu;//修改前的学号 , 修改后的学号
printf("要作修改的学生的学号:
");
scanf("%ld",&num_s);
if(num_s<0){
printf("输入错误!
学号应该不小于零!
\n修改记录失败!
\n");
return;
}
if(n!
=0)
p=find(head,num_s);//查找要修改的记录
if(n==0||p==NULL){
printf("查无此人!
\n");
}
else{
//显示查到的学生的信息
printf("学号姓名语文数学英语\n");
printf("%8ld%-10s%-8.1f%-8.1f%-8.1f\n",p->stu.num,p->stu.name,p->stu.chinese,p->stu.math,p->stu.english);
printf("*****修改:
*