c语言学生成绩管理系统.docx
《c语言学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《c语言学生成绩管理系统.docx(29页珍藏版)》请在冰豆网上搜索。
c语言学生成绩管理系统
青岛农业大学
本科生课程论文
论文题目学生成绩管理系统
学生专业班级通信工程1001
学生姓名(学号)李庆坤(20101794)
指导教师于爱华
完成时间2011-09-06
2011年9月14日
学生成绩管理系统
摘要
21世纪以来,人类经济高速发展,人们发生了日新月异的变化,特别是计算机的应用及普及到经济和社会生活的各个领域。
为了适应现代社会人们高度强烈的时间观念,学校信息管理系统软件为学校的办公带来了极大的方便,而学生成绩管理系统更是这些软件中的佼佼者。
本文详细给出了学习成绩管理系统的设计、功能、程序以及调试运行与显示情况。
一、任务与分析
学习成绩管理系统功能要求:
输入记录模块、查询记录模块、更新记录模块、统计记录模块、输出记录模块。
程序中涉及结构体、单链表、文件等方面的知识。
本系统由结构体、数组、函数、文件、指针等组成,通过调用各种函数,利用菜单实现了各项功能。
程序将数据储存在.txt文件中,可以方便的读取与写入。
本程序增设密码功能防止被人窃取数据,此外由信息维护菜模块、信息查询模块、成绩统计模块、成绩排序模块共同组成,分为教师和学生用户共同完成对学习成绩的管理。
其详细流程图如下:
返回主菜单
个人成绩查询
用户名及密码修改
返回主菜单
成绩排序
成绩查询
信息查询
信息维护
用户名及密码修改
学生
教师
选择用户菜单
信息维护菜单下设子菜单:
添加学生信息、修改学生信息、删除学生信息、复制账单信息、清空信息记录。
信息查询菜单下设子菜单:
查询文件总数、查询所有信息、按姓名查询信息、按学号查询信息。
二、程序设计
1.程序介绍
此学习成绩管理系统分为两个用户,即教师用户和学生用户,教师用户可以用此程序完成学生成绩的维护、查询、统计等各项功能,而学生用户可以完成对学生本人信息的查询。
程序自动将教师用户信息自动保存在f1.txt文件中,将学生用户信息自动保存在f2.txt文件中,将学生成绩信息自动保存在list.txt文件中,数据不随程序的关闭而消失。
2.函数调用
◎inputchoice()教师用主菜单
◎inputchoice_stu()学生用主菜单
◎inputchoice1()教师用信息维护菜单
◎inputchoice2()教师用信息查询菜单
◎Enter()用户登录
◎Modify()密码及用户名修改
◎getlogcount()获取文件记录总数
◎ListAllLog()读取所有信息(教师使用)
◎read_name()按姓名查询信息(教师使用)
◎read_num()按学号查询信息(教师使用)
◎find_stu()个人信息查询(学生使用)
◎Addnewlog()添加学生信息(教师使用)
◎change()修改信息
◎del()删除信息(教师使用)
◎copy()复制账单(教师使用)
◎delet()清空账单信息(教师使用)
◎order()账单信息排序(教师使用)
◎sort()排序关键字选择(教师使用)
◎census1()学生信息统计(教师使用)
◎census()学生信息统计选择菜单(教师使用)
◎choice_user()用户类型选择
◎choice1()信息维护菜单选择操作(教师使用)
◎choice2()信息查询菜单选择操作(教师使用)
◎choice()主菜单选择操作
3.功能模块分析
(1)头文件、结构体定义
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"windows.h"
#defineM20//学生人数
longsize,Size;//结构体长度
charch[15];//保存登陆的学生学号
typedefstructLogData
{charlogid[10];//记录学号
charname[10];//姓名
doubleXinhao;//信号
doubleModian;//模电
doubleEnglish;//英语
}ListNode;
typedefstructnode
{charpass[10];//密码
charname[10];//用户名
}Node;
(2)菜单选择模块
以信息维护菜单(教师使用)为例:
通过调用函数inputchoice1(),在屏幕上显示
voidinputchoice1()
{
printf("#####################信息维护菜单##################\n"
"#0:
退出信息维护#\n"
"#1:
返回信息维护菜单#\n"
"#2:
添加学生信息#\n"
"#3:
修改学生信息#\n"
"#4:
删除学生信息#\n"
"#5:
复制账单信息#\n"
"#6:
清空信息记录#\n"
"#####################################################\n\n");
}
用switch选择菜单选项,再调用函数
voidchoice2(FILE*fp)
{
intchoice;
while(choice!
=0)
{
printf("请选择信息查询所需功能:
");
scanf("%d",&choice);
switch(choice)
{
case1:
//返回信息查询菜单
inputchoice2();break;
case2:
//查询文件记录总数
getlogcount(fp);break;
case3:
//查询所有信息
ListAllLog(fp);break;
case4:
//按姓名查询信息
read_name(fp);break;
case5:
//按学号查询信息
read_num(fp);break;
default:
printf("输入序号错误或则你选择了退出查询功能,程序将自动返回主菜单选择功能!
\n");inputchoice();break;
}
}
}
(3)用户名及密码模块
此模块有力的保证了系统用户数据的安全性。
用户登录时,密码验证:
printf("请输入用户名:
");
scanf("%s",a);
getchar();
printf("请输入密码:
");
scanf("%s",b);
for(intt=0;t<10;t++)
ch[t]=a[t];//将登录成功的用户名保存在全局变量中
while(success==1||j{
m=strcmp(log[j].name,a);
n=strcmp(log[j].pass,b);
j++;
if(m==0&&n==0)
{
success=1;break;
}
}
*s=j;//保存用户名的位置
if(success==1)
printf("********** 登录成功,进入学生成绩管理系统!
*********\n");
else
printf("*******用户名不存在或密码错误!
请重新登录!
********\n");
密码即用户名修改:
intModify(FILE*fp1,FILE*fp2,intk)
{//密码及用户名修改
inti=0,j=0,success=0;Nodelog[M];
ints=0;
charname[10];
charpassword[10],password1[10];
charname1[10],password2[10];
if(k==1)//获取教师密码文件信息
{
if((fp1=fopen("f1.txt","r"))==NULL)
{printf("cannotopenfilef1.txt!
\n");
exit(0);
}
fseek(fp1,Size+4,SEEK_SET);
while(!
feof(fp1))
{
fscanf(fp1,"%s%s",log[i].name,log[i].pass);
i++;
}
}
if(k==2)//获取学生密码文件信息
{
if((fp2=fopen("f2.txt","r"))==NULL)
{printf("cannotopenfilef2.txt!
\n");
exit(0);
}
fseek(fp2,Size+4,SEEK_SET);
while(!
feof(fp2))
{
fscanf(fp2,"%s%s",log[i].name,log[i].pass);
i++;
}
}
printf("*********** 正在进入密码修改界面!
****************\n");
printf("********请先输入原用户名及密码再进行修改!
********\n");
if(Enter(fp1,fp2,k,&s)!
=0)
{
if(k==1)
{
if((fp1=fopen("f1.txt","w"))==NULL)
{printf("error\n");
exit(0);
}
}
if(k==2)
{
if((fp2=fopen("f2.txt","w"))==NULL)
{printf("error\n");
exit(0);
}
}
if(k==1)
printf("请输入新的用户名(不超过十个字符,汉字按两个字符计算):
\n");
scanf("%s",name);
if(k==2)//学生用户只能更改密码
printf("学生用户名只能使用学号,不允许修改!
\n");
printf("请输入新的密码(不超过十个字符,汉字按两个字符计算):
\n");
scanf("%s",password);
printf("请再次输入密码确认:
");
scanf("%s",password1);
if(strcmp(password,password1)==0)//修改成功,写入新用户名及密码
{printf("*****************密码输入正确!
****************\n");
for(intt=0;t<10;t++)
{
if(k==1)
log[s-1].name[t]=name[t];
log[s-1].pass[t]=password[t];
}
fseek(fp1,0,SEEK_SET);
if(k==1)fprintf(fp1,"用户名密码\n");
if(k==2)fprintf(fp2,"用户名密码\n");
for(t=0;t{if(k==1)
fprintf(fp1,"%10s%10s\n",log[t].name,log[t].pass);
if(k==2)
fprintf(fp2,"%10s%10s\n",log[t].name,log[t].pass);
}
printf("*****************修改成功!
*******************\n");success=1;
}
else//修改失败,写入原用户名及密码
{
printf("***********修改失败:
两次密码输入不相同!
**********\n");
fputs(name1,fp1);
fputc('\n',fp1);
fputs(password2,fp1);
}
if(k==1)
if(fclose(fp1))
{
printf("cannotclosef2.txt!
\n");
exit(0);
}
if(k==2)
if(fclose(fp2))
{
printf("cannotclosef2.txt!
\n");
exit(0);
}
}
returnsuccess;
}
(4)信息维护模块
此模块可以添加学生信息、修改学生信息、删除学生信息、复制账单信息以及清空信息记录,是此系统的主要功能模块。
添加的新信息将自动保存在list.txt文件中,复制的信息将自动保存在list1.txt文件中。
添加学生信息:
voidAddnewlog(FILE*cfptr)
{
ListNodelog;
longlogcount=0;
if((cfptr=fopen("list.txt","a"))==NULL)
{
printf("cannotopenfilelist.dat!
\n");
exit(0);
}
logcount=getlogcount(cfptr);
printf("--请依次输入姓名学号信号模电英语--\n");
scanf("%s%s%lf%lf%lf",log.name,&log.logid,&log.Xinhao,&log.Modian,&log.English);
fseek(cfptr,0L,SEEK_END);
fprintf(cfptr,"%10s%8s%3.1lf%3.1lf%3.1lf\n",log.name,log.logid,log.Xinhao,log.Modian,log.English);
fclose(cfptr);
printf("*********************信息添加成功*********************\n");
}
修改学生信息:
voidchange(FILE*cfptr)
{
ListNodelog;intsuccess=0;
chara[20];intchoice;intb;
if((cfptr=fopen("list.txt","r+"))==NULL)
{
printf("cannotopenfilelist.dat!
\n");
exit(0);
}
printf("################欢迎进入修改信息界面###############\n"
"#0:
退出信息修改#\n"
"#1:
按姓名修改信息#\n"
"#2:
按学号修改信息#\n"
"#####################################################\n\n"
"请按上述提示选择您所需的操作;");
scanf("%d",&choice);
if(choice==0)
{
printf("您选择了退出信息修改功能,程序自动返回信息维护界面!
\n");
return;
}
elseif(choice==1)
{
printf("请输入姓名:
");
scanf("%s",a);
}
elseif(choice==2)
{
printf("请输入学号:
");
scanf("%s",a);
}
else
{
printf("您输入的指令符错误,程序自动返回信息维护界面!
\n");
return;
}
longcount=getlogcount(cfptr);fseek(cfptr,size,SEEK_SET);
while(count>0&&success==0)
{
count--;
fscanf(cfptr,"%s%s%lf%lf%lf",log.name,&log.logid,&log.Xinhao,&log.Modian,&log.English);
if((strcmp(log.name,a)==0&&choice==1)||(strcmp(log.logid,a)==0&&choice==2))
{
printf("******************修改前的信息****************\n");
printf("姓名学号信号模电英语\n");
printf("%10s%10s%3.1lf%3.1lf%3.1lf\n",log.name,log.logid,log.Xinhao,log.Modian,log.English);
printf("0.修改所有关键字,,修改语文,修改数学,修改英语");
scanf("%d",&b);
if(b==1)
{
printf("请输入修改后的信号成绩:
");
scanf("%lf",&log.Xinhao);
}
elseif(b==2)
{
printf("请输入修改后的模电成绩:
");
scanf("%lf",&log.Modian);
}
elseif(b==3)
{
printf("请输入修改后的英语成绩:
");
scanf("%lf",&log.English);
}
elseif(b==0)
{
printf("请输入修改后的信息\n");
printf("--请依次输入姓名学号信号模电英语--\n");
scanf("%s%s%lf%lf%lf",log.name,&log.logid,&log.Xinhao,&log.Modian,&log.English);
}
else
{
printf("您输入的指令符错误,程序自动返回信息维护界面!
\n");
return;
}
fseek(cfptr,-size+1,SEEK_CUR);
fprintf(cfptr,"%10s%8s%3.1lf%3.1lf%3.1lf\n",log.name,log.logid,log.Xinhao,log.Modian,log.English);
success=1;
printf("*********************信息修改成功********************\n");
}
}
fclose(cfptr);
if(success=0)
printf("*********************信息修改失败********************\n");
}
删除学生信息:
voiddel(FILE*fp)
{
FILE*fp1;longcount,n;inti=0,j=0;chara[20],b[100]={"姓名学号信号模电英语\n"};
ListNodelog[M];
charc;intm=0;
if((fp=fopen("list.txt","r"))==NULL)
{printf("cannotopenfilelist.txt!
\n");
exit(0);
}
if((fp1=fopen("copy.txt","w"))==NULL)
{printf("cannotopenfilelist.txt!
\n");
exit(0);
}
while(!
feof(fp))
{
c=fgetc(fp);
fputc(c,fp1);
}
fclose(fp);fclose(fp1);
if((fp=fopen("list.txt","w"))==NULL)
{printf("cannotopenfilelist.txt!
\n");
exit(0);
}
if((fp1=fopen("copy.txt","r"))==NULL)
{printf("cannotopenfilelist.txt!
\n");
exit(0);
}
count=getlogcount(fp1);
n=count;
fseek(fp1,size,SEEK_SET);
while(count>0&&i{count--;
fscanf(fp1,"%s%s%lf%lf%lf",log[i].name,&log[i].logid,&log[i].Xinhao,&log[i].Modian,&log[i].English);
i++;
}
printf("请输入要删除的姓名或学号:
\n");
scanf("%s",&a);
while(b[j]!
='\0')
{
c=b[j];
fputc(c,fp);
j++;
}
for(i=0;i{
if(strcmp(log[i].name,a)!
=0&&strcmp(log[i].logid,a)!
=0)
fprintf(fp,"%10s%8s%3.1lf%3.1lf%3.1lf\n",log[i].name,log[i].logid,log[i].Xinhao,log[i].Modian,log[i].English);m++;
}
if(mprintf("******************%s信息删除成功*****************\n",a);
else
printf("删除失败,文件中不存在%s的信息!
\n",a);
if(fclose(fp))
{
printf("cannotclosethefile!
\n");
exit(0);
}
if(fclose(fp1))
{
printf("cannotclosethefile!
\n");
exit(0);
}
fp1=fopen("copy.txt","w");
fclose(fp1);//清空辅助文件copy.txt
}
(5)信息查询模块
此模块可以获取文件记录总数、查询所有信息、按姓名查询信息、按学号查询信息,可以方便教师迅速的查到学生的各科成绩。
查询全部信息:
voidListAllLog(FILE*cfptr)
{
ListNodelog;longcount;
printf("------------------所有学生信息-----------------------\n");
printf("姓名学号信号模电英语\n");
count=getlogcount(cfptr);fs