学生教务管理系统.docx
《学生教务管理系统.docx》由会员分享,可在线阅读,更多相关《学生教务管理系统.docx(36页珍藏版)》请在冰点文库上搜索。
学生教务管理系统
学生教务管理系统
2任务二基于文件的学生/教务管理系统
2.1前言
为了巩固我们C语言知识,并了解其在生活中的应用,由老师为我们带来了这个题目。
通过实训,学会为实际应用涉及的数据选择适当的逻辑结构、存储结构及相应的算法,从而对C语言程序设计这门课能有一个更深刻的理解和认识;再者,实训相对于平时试验课来说,要完成的是一个难度较大的可执行综合性程序,培养需求分析和系统架构等处理复杂问题的能力,从而极大的提高学生的编程能力以及撰写文档的能力;希望能通过实训,实际做到理论和实践紧密结合,同时也为后续课程打下坚实的基础知识。
2.2系统需求分析
2.2.1问题定义
本系统可以应用于教务处,进行对学生,教师,教务处人员的管理(添加,修改,删除,统计),人员查询,成绩查询(可以按照姓名查询,证件号查询)。
本系统主要面对学生,教师,教务处,所以进入该系统时可以选择不同的身份进入,若已存在账号,则可以直接进去选择自己的身份,若不存在账号,则需2
要管理员进入添加,管理员可以进行的功能有成绩管理,学生管理,教师管理,管理员管理,每个模块都有添加,删除,修改,统计,查询五个基本功能。
而教师则可以进行成绩的添加,修改,查询,等功能。
学生只有查询和修改个人信息的功能。
需求分析2.2.学管系
管教学
教学成管成个查修个管管管管管员
信息理
2.3系统设计
2.3.1系统架构
将要实现的模块分级进行架构
3
学生管理系统管理员模块:
管理教师:
教师添加,教师修改,教师删除,教师统计,教师查询
管理学生:
学生添加,学生修改,学生删除,学生统计,学生查
询管理管理员:
管理员添加,管理员修改,管理员删除,管理员统
计,管理员查询成绩管理:
计算个人成绩,计算各科成绩,计算平均成绩,计算
最高最低分,排序学生模块:
查询个人成绩,查询个人信息,修改个人信息,查教师模块:
添加学生成绩,修改学生成绩,删除学生成绩,查询学生信息询个人信息,修改个人信息。
2.3.2数据物理设计学生
列
姓char
char学
是char
出身地
否char
证份身号是char方联系式4
教师为否据类可列名数空型
姓char
char教师char
出身char
charchar
课
管理列
char姓
char证件
是出身地char
char
否份身证号是char系联方式
5
成绩列名数据类可否为
char
学float
float
float语言floatfloatfloat总否float
平均分否2.3.3功能模块管理员可以进行的功能有成绩管理,学生管理,教师管理,管理员管理,每个模块都有添加,删除,修改,统计,查询五个基本功能。
而教师则可以进行成绩的添加,修改,查询,等功能。
学生只有查询和修改个人信息的功能。
6
2.4系统实现
系统硬件环境为计算机,系统软件环境:
VC++6.0,TC3.0
2.4.4系统功能模块设计与实现
2.4.4.1功能实现
下面分别对该模块中的具体功能进行详细描述,并配相应功能的截图
1.添加功能
FILE*fp;
charch2;
inti=0,ch1;
牰湩晴尨欢迎进入防灾科技学院学生管理系统\n);
瀠楲瑮?
添加请输入y,退出请输入n\n);
scanf(%c,&ch2);
if(ch2=='y')
{
do
{
fp=fopen(manager.txt,a+);
/*输入所要添加的内容*/
7
fwrite(&manager[i],sizeof(struct
manager),1,fp);
printf(%s,%s,%s,%s\n,manager[i].name,manager[i].sex,manager[i].mnum,manager[i].zhiwei);
牰湩晴尨是否继续添加,继续添加请输入1,否则输入0\n);
scanf(%d,&ch1);
i++;
fclose(fp);
}while(ch1==1);
}
2.修改功能
首先选择修改的依据,可以依据证件号,姓名两张方式修改。
具体实现代8
码如下:
fp=fopen(manager.txt,
+);
牰湩晴尨请输入需要修改的人员的编号\n);
scanf(%s,str);
for(i=0;fread(&manager[i],sizeof(struct
manager),1,fp)!
=0;i++)
{
if(strcmp(str,manager[i].mnum)==0)
{
printf(%s,%s,%s,%s\n,manager[i].name,manager[i].sex,manager[i].mnum,manager[i].zhiwei);
牰湩晴尨确认修改,确认请输入1,退出则输入0\n);
scanf(%d,&ch1);
if(ch1==1)
{
/*选择修改的类型*/
scanf(%d,&ch2);
9
switch(ch2)
{
case1:
{
牰湩晴尨请输入所要修改的姓名\n);
scanf(%s,manager[i].name);
fwrite(&manager[i],sizeof(struct
manager),1,fp);
}break;
3.删除功能
删除可以依据证件号和姓名查询,删除方法是,先找到需要删除的人,然后10
让排在其后的人员的信息替换这个人的信息。
具体代码如下:
FILE*fp;
charname[20];
inti,flag,n,j,ch;
fp=fopen(manager.txt,
+);
printf(originaldata\n);
for(i=0,flag=1;fread(&teacher[i],sizeof(struct
teacher),1,fp)!
=0;i++)
printf(%s,%s,%s,%s\n,manager[i].name,manager[i].sex,manager[i].mnum,manager[i].zhiwei);
n=i+1;
fclose(fp);
do
{
牰湩晴尨请输入您所要删除的人员的名字\n);
scanf(%s,name);
fp=fopen(manager.txt,
);
11
for(i=0,flag=1;flag&&i{
if(strcmp(name,manager[i].name)==0)
{
for(j=i;j{
/*后一个人的信息覆盖所需删除人的信息*/
}flag=0;
}
}
if(!
flag)
n=n-1;
elseprintf(
otfound\n);
fp=fopen(manager.txt,w);
for(i=0;ifwrite(&manager[i],sizeof(struct
manager),1,fp);
fclose(fp);
fp=fopen(manager.txt,
);
for(i=0,flag=1;fread(&manager[i],sizeof(struct
12
manager),1,fp)!
=0;i++)
printf(%s,%s,%s,%s\n,manager[i].na
me,manager[i].sex,manager[i].mnum,manager[i].zhiwei);
fclose(fp);
牰湩晴尨是否继续删除,继续请输入1,否则请输入0\n);
scanf(%d,&ch);
}while(ch==1);
}
4.查询功能
FILE*fp;
inti;
charname[20];
intch1;
13
do
{
牰湩晴尨请输入姓名);
scanf(%s,name);
fp=fopen(manager.txt,
);
for(i=0;fread(&manager[i],sizeof(struct
manager),1,fp)!
=0;i++)
{
if(strcmp(name,manager[i].name)==0)
printf(%s,%s,%s,%s\n,manager[i].name,manager[i].sex,manager[i].mnum,manager[i].zhiwei);
}
fclose(fp);
牰湩晴尨继续请输入1,否则输入0\n);
scanf(%d,&ch1);
}while(ch1==1);
}
14
统计功能5.FILE*fp;
intn,i;
fp=fopen(manager.txt,
);
for(i=0;fread(&manager[i],sizeof(struct
manager),1,fp)!
=0;i++)
n=i+1;
fclose(fp);
\n,n);
名管理员牰湩晴尨共有%d
权限管理:
6.FILE*fp;
charmnum[10],str[10];
inti,flag,n;
fp=fopen(manager.txt,
+);
15
牰湩晴尨欢迎进入学生管理系统\n);
牰湩晴尨请输入证件号\n);
scanf(%s,mnum);牰湩晴尨请输入密码
\n);
scanf(%s,str);
for(i=0;fread(&manager[i],sizeof(struct
manager),1,fp)!
=0;i++)
{
n=i+1;printf(%d,n);
}
for(i=0,flag=1;i{
if((strcmp(mnum,manager[i].mnum)==0)&&(strcmp(str,manager[i].mima)==0))
{
managermanage();
flag=0;
}
}
fclose(fp);
if(flag)
16
牰湩晴尨警告,密码输入错误\n);
}
7.成绩添加
由教师添加,根据教师所教授课程而添加,具体实现代码:
FILE*fp,*fp1,*fp2;
inti,n,k,j;
chartnum[10],snum[10];
char
瑳?
嵛尽慭桴?
瑳?
嵛尽桰?
瑳?
嵛尽彣慬杮慵敧,str4[]=english,str5[]=practise;
牰湩晴尨请输入您的教师号\n);
scanf(%s,tnum);
fp=fopen(eacher.txt,
);
for(i=0;fread(&teacher[i],sizeof(struct
teacher),1,fp)!
=0;i++)
{
17
if(strcmp(tnum,teacher[i].tnum)==0)
n=i;
}
if(strcmp(teacher[n].course,str1)==0)
{
do{
fp1=fopen(student.txt,
);
fp2=fopen(grade.txt,a+);
牰湩晴尨请输入您所要添加学生的学号\n);
scanf(%s,snum);
j=0;
for(i=0;fread(&student[i],sizeof(struct
student),1,fp1)!
=0;i++)
{
if(strcmp(snum,student[i].snum)==0)
strcpy(grade[j].num,student[i].snum);
}
牰湩晴尨请输入高等数学的成绩18
\n);
scanf(%f,&grade[j].math);
fwrite(&grade[j],sizeof(struct
grade),1,fp2);
j++;
fclose(fp1);
fclose(fp2);
牰湩晴尨是否继续添加,是1,否0\n);
scanf(%d,&k);
}while(k==1);
}
else
if(strcmp(teacher[n].course,str4)==0)
{
继续添加其他课程
else牰湩晴尨不存在这门课,请核实\n);
fclose(fp);
}
19
:
.成绩计算8FILE*fp;
inti;
fp=fopen(grade.txt,a+);
for(i=0;fread(&grade[i],sizeof(struct
grade),1,fp)!
=0;i++)
{
grade[i].sum=grade[i].math+grade[i].ph+g
rade[i].english+grade[i].c_language+grade[i].practise;
grade[i].aver=grade[i].sum/5;
绩总成的学%s号牰湩晴尨学为的生%f\n,grade[i].num,grade[i].sum);
是20
牰湩晴尨学号为%s的学生的平均成绩是%f\n,grade[i].num,grade[i].aver);
fwrite(&grade[i],sizeof(structgrade),1,fp);
}
fclose(fp);
9.成绩排序
主要是运用冒泡排序法。
代码:
FILE*fp,*fp1;
inti,n,j;
floattemp;
fp=fopen(grade.txt,
);
for(i=0;fread(&grade[i],sizeof(struct
grade),1,fp)!
=0;i++);
n=i+1;
21
for(i=0;i{
for(j=0;jif(grade[j].aver{
temp=grade[j].aver;
grade[j].aver=grade[j+1].aver;
grade[j+1].aver=temp;
}
}
for(i=0;i{
牰湩晴尨学号为%s的学生的成绩为%f\n,grade[i].num,grade[i].aver);
}
fp1=fopen(grade1.txt,a+);
fwrite(&grade[i],sizeof(structgrade),1,fp1);
fclose(fp1);
fclose(fp);
10.计算成绩最高最低分,、
采用穷比法,首先设第一个人的成绩是最高或最低,再和其他人员的成绩比较,直到所有人员比较完之后,找出最高分或最低分。
具体实现代码如下:
22
FILE*fp,*fp1;
inti,n,k;
floatmax,min;
fp=fopen(grade.txt,
);
fp1=fopen(count.txt,a+);
for(i=0;fread(&grade[i],sizeof(struct
grade),1,fp)!
=0;i++)
n=i+1;
max=grade[0].aver;
min=grade[0].aver;
for(i=1;i{
if(maxmax=grade[i].aver;
k=i;
}
grade_count.amax=max;
strcpy(grade_count.str1,grade[k].num);
for(i=1;i{
if(min>grade[i].aver)
23
min=grade[i].aver;
k=i;
}
grade_count.amin=min;
strcpy(grade_count.str2,grade[k].num);
fwrite(&grade_count,sizeof(struct
grade_count),1,fp);
fclose(fp);
fclose(fp1);
}
24