为了巩固我们C语言知识,并了解其在生活中的应用,由老师为我们带来了这个题目。通过实训,学会为实际应用涉及的数据选择适当的逻辑结构、存储结构及相应的算法,从而对C语言程序设计这门课能有一个更深刻的理解和认识;再者,实训相对于平时试验课来说,要完成的是一个难度较大的可执行综合性程序,培养需求分析和系统架构等处理复杂问题的能力,从而极大的提高学生的编程能力以及撰写文档的能力;希望能通过实训,实际做到理论和实践紧密结合,同时也为后续课程打下坚实的基础知识。
2.2 系统需求分析
2.2.1 问题定义
本系统可以应用于教务处,进行对学生,教师,教务处人员的管理(添加,修改,删除,统计),人员查询,成绩查询(可以按照姓名查询,证件号查询)。
本系统主要面对学生,教师,教务处,所以进入该系统时可以选择不同的身份进入,若已存在账号,则可以直接进去选择自己的身份,若不存在账号,则需要管理员进入添加,管理员可以进行的功能有成绩管理,学生管理,教师管理,管理员管理,每个模块都有添加,删除,修改,统计,查询五个基本功能。而教师则可以进行成绩的添加,修改,查询,等功能。学生只有查询和修改个人信息的功能。
2.2.2需求分析
学生管理系统 管理员 教师 学生 教师管理 学生管理 成绩管理 管理员管理 成绩管理 个人管理 查询 修改个人信息 2.3 系统设计
2.3.1系统架构
将要实现的模块分级进行架构 学生管理系统 管理员模块:
管理教师:教师添加,教师修改,教师删除,教师统计,教师查询
管理学生:学生添加,学生修改,学生删除,学生统计,学生查询 管理管理员:管理员添加,管理员修改,管理员删除,管理员统计,管理
员查询
成绩管理:计算个人成绩,计算各科成绩,计算平均成绩,计算最高最低
分,排序
学生模块:查询个人成绩,查询个人信息,修改个人信息
教师模块:添加学生成绩,修改学生成绩,删除学生成绩,查询学生信息,查询个人信
息,修改个人信息。
2.3.2数据物理设计
学生
列名 姓名 学号 出身地 身份证号 联系方式 教师
列名 姓名 教师号 出身地 身份证号 联系方式 课程 管理员
列名 姓名 证件号 出身地 身份证号 联系方式 成绩
列名 学号 数学成绩 体育成绩 英语成绩 C语言成绩 社会实践 数据类型 char float float float float float 可否为空 否 否 否 否 否 否 数据类型 char char char char char 可否为空 否 否 是 否 是 数据类型 char char char char char char 可否为空 否 否 是 否 是 否 数据类型 char char char char char 可否为空 否 否 是 否 是 总分 平均分 float float 否 否 2.3.3功能模块
管理员可以进行的功能有成绩管理,学生管理,教师管理,管理员管理,每个模块都有添加,删除,修改,统计,查询五个基本功能。而教师则可以进行成绩的添加,修改,查询,等功能。学生只有查询和修改个人信息的功能。
2.4 系统实现
系统硬件环境为计算机,系统软件环境:VC++6.0,TC3.0
2.4.4 系统功能模块设计与实现 2.4.4.1功能实现
下面分别对该模块中的具体功能进行详细描述,并配相应功能的截图 1. 添加功能
FILE *fp; char ch2; int i=0,ch1;
printf(\"欢迎进入防灾科技学院学生管理系统\\n\"); printf(\"添加请输入y,退出请输入n\\n\"); scanf(\"%c\ if(ch2=='y') { do { fp=fopen(\"manager.txt\ /*输入所要添加的内容*/ fwrite(&manager[i],sizeof(struct manager),1,fp); printf(\"%s,%s,%s,%s\\n\ printf(\"是否继续添加,继续添加请输入1,否则输入0\\n\"); scanf(\"%d\ i++; fclose(fp); }while(ch1==1); }
2. 修改功能
首先选择修改的依据,可以依据证件号,姓名两张方式修改。具体实现代码如下:
fp=fopen(\"manager.txt\ printf(\"请输入需要修改的人员的编号\\n\"); scanf(\"%s\ 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\ zhiwei); printf(\"确认修改,确认请输入1,退出则输入0\\n\"); scanf(\"%d\ if(ch1==1) { /*选择修改的类型*/ scanf(\"%d\ switch(ch2) { case 1:{ printf(\"请输入所要修改的姓名\\n\"); scanf(\"%s\ fwrite(&manager[i],sizeof(struct manager),1,fp); }break;
3. 删除功能
删除可以依据证件号和姓名查询,删除方法是,先找到需要删除的人,然后让排在其后的人员的信息替换这个人的信息。具体代码如下:
FILE *fp;
char name[20]; int i,flag,n,j,ch;
fp=fopen(\"manager.txt\ printf(\"original data\\n\");
for(i=0,flag=1;fread(&teacher[i],sizeof(struct teacher),1,fp)!=0;i++)
printf(\"%s,%s,%s,%s\\n\ n=i+1; fclose(fp); do {
printf(\"请输入您所要删除的人员的名字\\n\"); scanf(\"%s\
fp=fopen(\"manager.txt\ for(i=0,flag=1;flag&&i if(strcmp(name,manager[i].name)==0) { for(j=i;j else printf(\"not found\\n\"); fp=fopen(\"manager.txt\ for(i=0;i fp=fopen(\"manager.txt\ for(i=0,flag=1;fread(&manager[i],sizeof(struct manager),1,fp)!=0;i++) printf(\"%s,%s,%s,%s\\n\ ei); fclose(fp); printf(\"是否继续删除,继续请输入1,否则请输入0 \\n\"); scanf(\"%d\ }while(ch==1); } 4. 查询功能 FILE *fp; int i; char name[20]; int ch1; do { printf(\"请输入姓名\"); scanf(\"%s\ 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\ } fclose(fp); printf(\"继续请输入1,否则输入0\\n\"); scanf(\"%d\ }while(ch1==1); } 5. 统计功能 FILE *fp; int n,i; fp=fopen(\"manager.txt\ for(i=0;fread(&manager[i],sizeof(struct manager),1,fp)!=0;i++) n=i+1; fclose(fp); printf(\"共有%d名管理员\\n\ 6. 权限管理: FILE *fp; char mnum[10],str[10]; int i,flag,n; fp=fopen(\"manager.txt\ printf(\"欢迎进入学生管理系统\\n\"); printf(\"请输入证件号\\n\"); scanf(\"%s\请输入密码\\n\"); scanf(\"%s\ for(i=0;fread(&manager[i],sizeof(struct manager),1,fp)!=0;i++) { n=i+1;printf(\"%d\ } for(i=0,flag=1;i 7.成绩添加 由教师添加,根据教师所教授课程而添加,具体实现代码: FILE *fp,*fp1,*fp2; int i,n,k,j; char tnum[10],snum[10]; char str1[]=\"math\ printf(\"请输入您的教师号\\n\"); scanf(\"%s\ fp=fopen(\"teacher.txt\ for(i=0;fread(&teacher[i],sizeof(struct teacher),1,fp)!=0;i++) { 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\ printf(\"请输入您所要添加学生的学号\\n\"); scanf(\"%s\ 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); } printf(\"请输入高等数学的成绩\\n\"); scanf(\"%f\ fwrite(&grade[j],sizeof(struct grade),1,fp2); j++; fclose(fp1); fclose(fp2); printf(\"是否继续添加,是1,否0\\n\"); scanf(\"%d\ }while(k==1); } else if(strcmp(teacher[n].course,str4)==0) { 继续添加其他课程 else printf(\"不存在这门课,请核实\\n\"); fclose(fp); } 8.成绩计算: FILE *fp; int i; fp=fopen(\"grade.txt\ for(i=0;fread(&grade[i],sizeof(struct grade),1,fp)!=0;i++) { grade[i].sum=grade[i].math+grade[i].ph+grade[i].english+grade[i].c_language+grade[i].practise; grade[i].aver=grade[i].sum/5; printf(\"学号为%s的学生的总成绩是%f\\n\ printf(\"学号为%s的学生的平均成绩是%f\\n\ fwrite(&grade[i],sizeof(struct grade),1,fp); } fclose(fp); 9.成绩排序 主要是运用冒泡排序法。 代码: FILE *fp,*fp1; int i,n,j; float temp; fp=fopen(\"grade.txt\ for(i=0;fread(&grade[i],sizeof(struct grade),1,fp)!=0;i++); n=i+1; for(i=0;i fwrite(&grade[i],sizeof(struct grade),1,fp1); fclose(fp1); fclose(fp); 10.计算成绩最高最低分,、 采用穷比法,首先设第一个人的成绩是最高或最低,再和其他人员的成绩比较,直到所有人员比较完之后,找出最高分或最低分。具体实现代码如下: FILE *fp,*fp1; int i,n,k; float max,min; fp=fopen(\"grade.txt\ fp1=fopen(\"count.txt\ 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 strcpy(grade_count.str1,grade[k].num); for(i=1;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); } 因篇幅问题不能全部显示,请点此查看更多更全内容