1系统分析
1.1功能需求
软件工程(移动互联网方向)专业学生的班主任管家系统分别涵盖2015~2016、2016~2017、2017~2018、2018~2019四个学年,八个学期。
1.1.1功能划分
每个学期可进行的操作功能有录入、修改、查询三项。
1.1.2功能描述
<1>录入功能:
课程信息可录入的仅选修课。
学生信息内容包括学生的学号、姓名、宿舍号、性别、年龄。
课程信息包括学号、课程编号、课程名称、必/选修课程、课程所在学期、课程学分。
成绩信息包括学号、学期、课程成绩、业务课成绩、是否挂科(计算得出)、挂科数目(计算得出)、总测评信息(由品行表现信息和业务课信息计算得出)。
奖惩信息(奖学金自动评定、自动添加)内容包括获奖类别、获奖时间、奖励学分、惩处类别、惩处时间、惩处学分。
品行表现成绩内容包括辅导员评议、班主任评议、班级评议、品行表现总成绩(计算得出)。
<2>修改功能:
修改的对象就是录入的内容。
<3>查询功能:
1) 对整个班级的查询可分别按业务课总成绩、不及格门次、奖励、惩罚、对全体学生由高到低排序,按业务课平均成绩对全体宿舍由高到低排序。
2) 对课程的查询可按不及格学生数对课程由高到低排序,显示对指定课程各分数段的统计。
3) 对学生的查询可实现显示指定学生过往学期业务课总成绩班级排名、挂科次数,显示指定学生本学期业务课总成绩班级排名、指定课程班级排名。
课程信息以《青岛科技大学人才培养方案》为准,奖惩细则以《青岛科技大学学生手册》为准。
1.2性能需求
1.系统有功能导航,操作灵活。
2.录入无非法数据,保证进入系统内的数据均为合法数据。
3.输入输出数据格式规范。输入数据有提示,输出的数据含义醒目。
4.运算结果准确。
1.3数据要求
1.3.1数据流图
1.3.2数据词典
<1>数据流词条描述
数据流名:操作信息
来源:使用人员
去向:系统
组成:操作指令、班级、学期、学生及关联的全部信息
流通量:每进行一次操作流通一次
数据流名:OK
来源:录入功能、修改功能
去向:查询功能
组成: 标志符
流通量:每进行一次录入、修改操作流通一次
数据流名:结果
来源:系统
去向:使用人员
组成:操作成功/失败的提示、显示查询内容
流通量:每进行一次操作流通一次
<2>数据文件词条描述
数据文件名:学生综合信息记录
简述:以学号为枢纽的一系列学生信息
数据文件组成:课程信息、奖惩信息、品行表现信息、学生基本信息
1.3.3实体关系图
学生与课程的关系描述
学生与处分之间的关系描述
学生与宿舍之间的关系描述
2系统设计
2.1系统流程图设计
2.2系统功能模块图设计
2.3数据结构设计
数据结构采用的的逻辑结构为线性表,采用的物理结构为顺序存储结构即数组。
学生信息内容包括学生的学号、姓名、宿舍号、性别、年龄。
课程信息包括学号、课程编号、课程名称、必/选修课程、课程所在学期、课程学分。
成绩信息包括学号、学期、课程成绩、业务课成绩、是否挂科、挂科数目、总测评信息(由品行表现信息和业务课信息计算得)。
奖惩信息(奖学金自动评定、自动添加)内容包括获奖类别、获奖时间、奖励学分、惩处类别、惩处时间、惩处学分、总奖惩学分
品行表现成绩内容包括辅导员评议、班主任评议、班级评议、品行表现总成绩。
2.4菜单结构设计
一级菜单:1.录入信息 2.修改信息 3.查询信息 0.退出程序
二级菜单:1.学生信息 2.课程信息3.品行表现信息 4.奖惩信息 5.成绩信息 6.返回主菜单 0.退出程序
三级菜单:1.第一学期 2.第二学期3.第三学期 4.第四学期 5.第五学期 6.第六学期7.第七学期 8.第八学期 9.返回主菜单 0.退出程序
四级菜单:1.按业务课成绩加权平均分对学生由高到低排序 2..按业务课成绩加权平均分对宿舍由高到低排序 3.按不及格门次对学生由高到低排序 4.按不及格学生数对课程由高到低排序 5.按奖励对学生由高到低排序 6.按惩罚对学生由高到低排序 7.某门课各分数段成绩统计 8.某同学各课程班级排名,业务课总成绩班级排名9.某同学过往学期业务课班级排名,挂科次数 10.返回主菜单 0.退出程序
2.5输入输出格式设计
学生信息
学生信息 | 学号 | 姓名 | 宿舍号 | 性别 | 年龄 |
格式 | %d | %s | %s | %s | %d |
类型 | Int | Char[9] | Char[8] | Char[3] | int |
示例 | 1508100234 | 某某某某 | 北7#707 | 男 | 19 |
课程信息
课程信息 | 学号 | 课程学分 | 课程编号 | 课程名称 | 必/选修课 | 课程所在学期 |
格式 | %d | %d | %s | %s | %s | %d |
类型 | Int | int | Char[10] | Char[15] | Char[3] | int |
示例 | 1508100234 | 1 | B06020100 | 离散数学 | 必 | 1 |
奖惩信息
奖惩信息 | 学号 | 获奖类别 | 获奖时间 | 奖励学分 | 惩处类别 | 惩处时间 | 惩处学分 |
格式 | %d | %s | %s | %d | %s | %s | %d |
类型 | int | Char[15] | Char[11] | int | Char[15] | Char[11] | Int |
示例 | 1508100234 | 省二等 | 2015.12.12 | 5 | 校级警告 | 2015.21.12 | -2 |
品行表现信息
品行表现信息 | 学号 | 辅导员评议 | 班主任评议 | 班级评议 | 品行表现成绩总成绩 | 总成绩 |
格式 | %d | %f | %f | %f | %f | %f |
类型 | int | float | float | float | float | float |
示例 | 1508100234 | 66.6 | 66.6 | 66.6 | 66.6 | 66.6 |
成绩信息
成绩信息 | 学号 | 学期 | 课程成绩 | 是否挂科 | 挂科数目 | 业务课总成绩 | 总测评成绩 |
格式 | %d | %d | %f | %s | %d | %f | %f |
类型 | Int | Int | Float[14] | Char[14] | Int | Float | float |
示例 | 150810033 | 1 | 66 | 否 | 0 | 66 | 77 |
2.6文件结构设计
总共五个文件用来储存基础信息:学生信息文件、课程信息文件、奖惩信息文件、品行表现信息文件、成绩信息。
录入(修改)功能:创建(打开)文件—>录入(修改)基础数据—>关闭文件
查询功能:打开文件—>对数据进行相应统计排序—>输出结果—>关闭文件
2.7代码规范化设计
<1>代码编写规范
1) 删除所有无用代码
2) 必须给代码添加注释,一个类的注释字数不得小于代码的百分之20%
3) 建议遵循30秒原则。如果另一个程序员无法在三十秒内无法知道你的函数在做什么,如何做以及为什么要这样做,那么说明你的代码是难于维护的,需要得到提高。
4) 一个函数的代码长度不允许超过100行,超过一百行的函数建议在不破坏原子性的基础上进行拆分。
5) 变量都应在方法或者类的头部集中定义
6) 保证一行代码只做一件事
7) 使用括号来控制操作符的运算顺序,以免使用C默认的操作符优先级顺序。
8) 代码格式化:对代码进行格式化,再进行提交。
9) 接口不允许没有方法或者变量的声明
<2> 命名规范
1) 各种标识符的命名要使用有实际意义的英文单词或者英文单词缩写,缩写词及英文单词要收录在项目的简写词汇表中。切忌使用阿拉伯数字和拼音进行命名。
2) 方法名:首字母小写,其余单词首字母都需大写。
3) 全局变量,和常量名称要求全部字母大写。
4) 参数名称与局部变量基本相同,区别在于参数名称需要加上冠词a ,an 或者在单词结尾以s结束。
<3> 注释规范
1) 注释需要注意的事项:
★注释应该用中文清晰表达意思,应该是程序看起来更清晰,更容易理解
★注释要尽量简明,避免装饰性的注释。
★注释不但要说明做什么,还应当说明为什么要这样做。最好先写注释表明要做什么,再进行编码。
2) 接口注释:
★接口的注释风格基本与类的注释风格相同;
★在别人使用接口之前,必须了解接口所包含的概念。检验一个接口是否应该定义的简单方法是:你是否能★够容易的描述接口的用途;
★接口如何应当和不应当被使用。开发者需要知道该接口如何被使用,也希望知道该接口不能被怎样使用。
3) 函数的注释
★函数头注释必须包括:函数执行了什么功能,为什么要这样处理;函数处理过程中对对象的哪些属性
★可能进行更改;函数执行前后,对象的状态;
★比较、循环等控制结构加注释(可选);
★在代码的功能并非一目了然的情况下,应当说明为什么要这样做;
★局部变量必须加注释;
★复杂难写的代码必须加注释;
3.测试
3.1测试目的
发现问题,改正问题。
3.2测试数据
3.3测试结果
经过几次调试、改进,排序结果、统计结果与手工计算结果一致。
4.总结
本次实训的班主任管家系统相对于以往的程序,进步之处在于杜绝了全局变量的使用。基于由文件得出大小、申请动态空间、读出信息、处理信息、释放空间的思想,降低了各函数间的耦合性,提高了函数的独立性。
同时水平有限,仍有几处遗憾。
首先是一些地方按统一的格式循环输出,难以照顾到极端情况,会出现格式不匹配的问题。
然后深感本程序无论是在逻辑上还是代码量上都存在很大的精简空间。
其次,未重视重复操作的可能性,重复录入时应有文件已存在的提示,同时存在每查看一次排名就会在奖惩信息库里追加一次获奖信息的问题,以后的开发中应遵循高内聚低耦合的原则,提高函数功能的独立性。
再有,为提高输入效率,数据成批输入,导致非法提醒的程序功能形同虚设。
最后,由于经验不足,导致早期设计的模型并不符合实际,后期又不断修改,为防止出入过大,本文档也在代码完工后根据代码重新修改了一遍。总体上基本功能均能实现,但尚有缺陷,经不起严格的测试。
参考文献
[1]李向阳,方娇莉.C语言程序设计(基于CDIO思想).北京:清华大学出版社,2012.
[2]青岛科技大学教务处.人才培养方案.2015.
[3]青岛科技大学学生工作处.学生手册.2015.
致谢
感谢指导教师的指导,感谢参与交流的同学。
附录
1.程序部分截图
主菜单
录入或修改信息菜单
学期菜单
源码
/**
*FileName: 软件152-1508100201-丁兆元.cpp
*Author: 丁兆元
*Version : 1.0
*Date: 2016.12
*Description: 班主任管家系统(codeblocks编译环境)请按菜单上的相应顺序进行操作,
*录入学生基本信息只有一次机会,选修课的录入每学期只有一次机会,重复进行可能会造成文件信息丢失。
*File List: student.txt,course.txt,score.txt,rAndP.txt,conduct.txt
*Function List:
*1. 各菜单函数:menu1,menu2,menu3,menu4,menu401,menu402,menu403,menu404,
* menu405,menu406,menu407,menu408,menu409,menu4010,menu4011
*2. 与各菜单相对应的选择函数:choose1,choose2,choose3,choose4011.
*3. 各功能函数:sort1,sort2,sort3,sort4,sort5,sort6,sort7,sort8,statistic9
*4. 主函数:main
*/
/********常量定义(#define)和系统函数原型定义(#include)声明***********/
#include"cstdio"
#include"windows.h"
using namespace std;
/************************数据结构的定义******************************/
/*变量命名采用驼峰命名法*/
typedef struct /*品行表现信息*/
{
int stuNo;
int term;
float counsellor;
float classTeacher;
float classmates;
float conSum; /*!计算得出!*/
} conduct;
typedef struct /*奖惩信息*/
{
int stuNo;
int term;
char rewards[17];
char rTime[11];
float rCredit;
char punishment[17];
char pTime[11];
float pCredit;
} rAndP;
typedef struct /*课程信息*/
{
int stuNo;
int term;
char couNo[14][10];
char couName[14][20];
char couSort[14][3];
float couCredit[14];
} course;
typedef struct /*成绩信息*/
{
int stuNo;
int term;
float couScore[14];
char again[14][3]; /*!计算得出!*/
int againNum; /*!计算得出!*/ /*挂科次数*/
float couSumScore; /*!计算得出!*/ /*业务课总成绩*/
float sumScore; /*!计算得出!*/ /* 由业务课总成绩与品行表现总成绩共同计算出总测评成绩*/
} score;
typedef struct /*个人信息*/
{
int stuNo;
char stuName[9];
char dormitory[7];
char sex[3];
int age;
} student;
/*****************各种函数**********************/
/**
*Function: sort1
*Description: 某同学某课程班级排名
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt
*Files Updated: 无
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort1(int choice3)
{
int len;
int a=0;
int stuNo;
char couNo[10];
FILE* fp;
FILE* fp1;
typedef struct
{
int stuNo;
float score;
} s;
s temp;
int term[8]= {6,8,9,10,9,7,2,1};
if((fp=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
if((fp1=fopen("course.txt","rb"))==0)
{
printf("Can't open the file of course!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(score);
s s1[len/8];
rewind(fp);
score *scores=NULL;
scores=(score*)malloc(sizeof(score)*len);
fread(scores,sizeof(score),len,fp);
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*len);
fread(courses,sizeof(course),len,fp1);
printf("请输入学生学号:");
scanf("%d",&stuNo);
printf("\t必修课课程信息\n");
printf("=========================================================\n");
printf("课程编号\t课程名称\t课程学分\t必/选修课\n");
for(int i=0; i<8; i++)
if(courses[i].term==choice3)
{
for(int j=0; j<term[choice3-1] ; j++)
printf("%s\t%s\t%.2f\t\t%s\t\n",courses[i].couNo[j],
courses[i].couName[j],courses[i].couCredit[j],courses[i].couSort[j]);
}
printf("=========================================================\n");
printf("请输入课程编号:");
scanf("%s",couNo);
for(int i=choice3-1; i<len; i+=8)
if(courses[i].term==choice3)
{
for(int j=0; j<term[choice3-1] ; j++)
{
if(strcmp(courses[i].couNo[j],couNo)==0)
{
s1[a].score=scores[i].couScore[j];
s1[a].stuNo=scores[i].stuNo;
a++;
}
}
}
for(int i=0; i<len/8-1; i++)
for(int j=0; j<len/8-1-i; j++)
if(s1[j].score<s1[j+1].score)
{
temp=s1[j];
s1[j]=s1[j+1];
s1[j+1]=temp;
}
for(int i=0; i<len/8; i++)
if(stuNo==s1[i].stuNo)
{
printf("该生该课程班级排名为:%d\n",i+1);
}
fclose(fp1);
fclose(fp);
free(courses);
free(scores);
system("pause");
}
/**
*Function: sort2
*Description: 某同学过往学期业务课班级排名,挂科次数
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt
*Files Updated: 无
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort2(int choice3)
{
score temp;
int len;
int no;
int a=0;
printf("请输入要查询的学生的学号:");
scanf("%d",&no);
FILE* fp;
if((fp=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(score);
score* scores;
scores=(score*)malloc(sizeof(score)*len);
rewind(fp);
fread(scores,sizeof(score),len,fp);
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(scores[j].couSumScore<scores[j+1].couSumScore)
{
temp=scores[j];
scores[j]=scores[j+1];
scores[j+1]=temp;
}
printf("\t您要查询的信息\n");
printf("学期\t成绩排名\t挂科次数\n");
printf("================================\n");
for(int i=1; i<=choice3; i++)
{
a=0;
for(int j=0; j<len; j++)
{
if(scores[j].term==i)
{
a++;
if(scores[j].stuNo==no)
{
printf("%d\t%d\t\t%d\n",i,a,scores[j].againNum);
}
}
}
}
printf("================================\n");
free(scores);
fclose(fp);
system("pause");
}
/**
*Function: sort3
*Description: 按业务课平均分成绩对宿舍由高到低排序
*Calls: 无
*Called By: choose4011
*Files Accessed:student.txt,score.txt
*Files Updated: 无
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort3(int choice3)
{
typedef struct
{
char dormitory[7];
float couSumScore;
} dorScore;
dorScore temp;
FILE* fp1;
FILE* fp2;
int len;
int a=0;
int b=1;
if((fp1=fopen("student.txt","rb"))==0)
{
printf("Can't open the file of student!");
exit(0);
}
if((fp2=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp1,0L,2);
len=ftell(fp1)/sizeof(student);
rewind(fp1);
rewind(fp2);
dorScore d[len];
student* students=NULL;
students=(student*)malloc(sizeof(student)*len);
score* scores=NULL;
scores=(score*)malloc(sizeof(score)*len*8);
fread(students,sizeof(student),len,fp1);
fread(scores,sizeof(score),len*8,fp2);
for(int i=0; i<len; i++)
{
for(int j=0; j<len; j++)
if(i!=j&&strcmp(students[i].dormitory,students[j].dormitory)==0&&strcmp(students[i].dormitory,"0")!=0)
{
strcpy(students[j].dormitory,"0");
scores[i*8+choice3-1].couSumScore+=scores[j*8+choice3-1].couSumScore;
b++;
}
strcpy(d[i].dormitory,students[i].dormitory);
d[i].couSumScore=scores[i*8+choice3-1].couSumScore/b;
b=1;
}
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(d[j].couSumScore<d[j+1].couSumScore)
{
temp=d[j];
d[j]=d[j+1];
d[j+1]=temp;
}
printf("\t宿舍业务课平均分排名\n");
printf("=================================\n");
printf("名次\t宿舍\t业务课平均分\n");
for(int i=0; i<len; i++)
if(strcmp(d[i].dormitory,"0")!=0)
{
printf("%d\t%s\t%.2f\n",a+1,d[i].dormitory,d[i].couSumScore);
a++;
}
printf("=================================\n");
fclose(fp1);
fclose(fp2);
free(students);
free(scores);
system("pause");
}
/**
*Function: sort4
*Description: 按业务课平均分成绩对学生由高到低排序,并在奖惩库里追加奖学金信息
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt,rAndP.txt
*Files Updated: rAndP.txt
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort4(int choice3)
{
int len;
int a=0;
int n[3];
FILE *fp;
FILE *fp1;
if((fp1=fopen("rAndP.txt","ab+"))==0)
{
printf("Can't open the file of rAndP!");
exit(0);
}
if((fp=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(score);
rewind(fp);
score* scores=NULL;
score temp;
scores=(score*)malloc(sizeof(score)*len);
rAndP* rAndPs=NULL;
rAndPs=(rAndP*)malloc(sizeof(score)*1);
fread(scores,sizeof(score),len,fp);
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(scores[j].couSumScore<scores[j+1].couSumScore)
{
temp=scores[j];
scores[j]=scores[j+1];
scores[j+1]=temp;
}
n[0]=len/8*0.03+1;
n[1]=len/8*0.07+1;
n[2]=len/8*0.15+1;
printf("\t业务课平均分学生排名\n");
printf("====================================\n");
printf("名次\t学号\t\t业务课平均分\n");
for(int i=0; i<len; i++)
if(scores[i].term==choice3)
{
a++;
printf("%d\t%d\t%.2f\n",a,scores[i].stuNo,scores[i].couSumScore);
if(a<=n[0])
{
rAndPs[0].term=choice3;
strcpy(rAndPs[0].rewards,"一等奖");
strcpy(rAndPs[0].rTime,"期末");
rAndPs[0].rCredit=4;
rAndPs[0].stuNo=scores[i].stuNo;
fwrite(rAndPs,sizeof(rAndP),1,fp1);
}
else if(a<=n[1])
{
rAndPs[0].term=choice3;
strcpy(rAndPs[0].rewards,"二等奖");
strcpy(rAndPs[0].rTime,"期末");
rAndPs[0].rCredit=3;
rAndPs[0].stuNo=scores[i].stuNo;
fwrite(rAndPs,sizeof(rAndP),1,fp1);
}
else if(a<=n[2])
{
rAndPs[0].term=choice3;
strcpy(rAndPs[0].rewards,"三等奖");
strcpy(rAndPs[0].rTime,"期末");
rAndPs[0].rCredit=2;
rAndPs[0].stuNo=scores[i].stuNo;
fwrite(rAndPs,sizeof(rAndP),1,fp1);
}
}
printf("====================================\n");
fclose(fp1);
fclose(fp);
free(scores);
free(rAndPs);
system("pause");
}
/**
*Function: sort5
*Description: 按不及格学生数对课程由高到低排序
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt,course.txt
*Files Updated: 无
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort5(int choice3)
{
int len;
FILE* fp1;
FILE* fp2;
int term[8]= {6,8,9,10,9,7,2,1};
typedef struct
{
char couName[20];
int a;
} s;
s s1[term[choice3-1]];
s temp;
if((fp1=fopen("course.txt","rb"))==0)
{
printf("Can't open the file of course!");
exit(0);
}
if((fp2=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp1,0L,2);
len=ftell(fp1)/sizeof(course);
rewind(fp1);
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*len);
fread(courses,sizeof(course),len,fp1);
score *scores=NULL;
scores=(score*)malloc(sizeof(score)*len);
fread(scores,sizeof(score),len,fp2);
for(int j=0; j<term[choice3-1] ; j++)
{
strcpy(s1[j].couName,courses[choice3-1].couName[j]);
s1[j].a=0;
}
for(int i=0; i<len; i++)
if(courses[i].term==choice3)
{
for(int j=0; j<term[choice3-1] ; j++)
{
if(strcmp(scores[i].again[j],"是")==0)
s1[j].a++;
}
}
for(int i=0; i<term[choice3-1]-1; i++)
for(int j=0; j<term[choice3-1]-1; j++)
{
if(s1[j].a<s1[j+1].a)
{
temp=s1[j];
s1[j]=s1[j+1];
s1[j+1]=temp;
}
}
printf("\t课程不及格人数排名\n");
printf("=================================\n");
printf("名次\t课程名\t\t挂科人数\n");
for(int i=0; i<term[choice3-1]; i++)
{
printf("%d\t%s\t%d\n",i+1,s1[i].couName,s1[i].a);
}
printf("=================================\n");
fclose(fp1);
fclose(fp2);
free(courses);
free(scores);
system("pause");
}
/**
*Function: sort6
*Description: 按不及格门次对学生由高到低排序
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt,rAndP.txt
*Files Updated: rAndP.txt
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort6(int choice3)
{
int len;
int a=0;
FILE *fp;
if((fp=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(score);
rewind(fp);
score* scores=NULL;
score temp;
scores=(score*)malloc(sizeof(score)*len);
fread(scores,sizeof(score),len,fp);
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(scores[j].againNum<scores[j+1].againNum)
{
temp=scores[j];
scores[j]=scores[j+1];
scores[j+1]=temp;
}
printf("\t不及格门次学生排名\n");
printf("==================================\n");
printf("名次\t学号\t\t不及格门次\n");
for(int i=0; i<len; i++)
if(scores[i].term==choice3)
{
a++;
printf("%d\t%d\t%d \n",a,scores[i].stuNo,scores[i].againNum);
}
printf("==================================\n");
fclose(fp);
free(scores);
system("pause");
}
/**
*Function: sort7
*Description: 按惩罚对学生由高到低排序
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt,rAndP.txt
*Files Updated: rAndP.txt
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort7(int choice3)
{
int len;
FILE *fp;
rAndP temp;
int a=0;
if((fp=fopen("rAndP.txt","rb+"))==0)
{
printf("Can't open the file of rAndP!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(rAndP);
rewind(fp);
rAndP* rAndPs=NULL;
rAndPs=(rAndP*)malloc(sizeof(rAndP)*len);
fread(rAndPs,sizeof(rAndP),len,fp);
for(int i=0; i<len-1; i++)
for(int j=1; j<len-1-i; j++)
{
if(rAndPs[i].stuNo=rAndPs[j].stuNo&&rAndPs[i].stuNo!=0)
{
rAndPs[i].pCredit+=rAndPs[j].pCredit;
rAndPs[j].stuNo=0;
}
}
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(rAndPs[j].pCredit>rAndPs[j+1].pCredit)
{
temp=rAndPs[j];
rAndPs[j]=rAndPs[j+1];
rAndPs[j+1]=temp;
}
printf("以下为奖惩库里记录的学生总奖励学分排名,未收录的学生奖惩学分默认为零。\n");
printf("\t总惩罚学分排名\n");
printf("================================\n");
printf("名次\t学号\t\t惩罚学分\n");
for(int i=0; i<len; i++)
if(rAndPs[i].stuNo!=0)
{
a++;
printf("%d\t%d\t%.2f\n",a,rAndPs[i].stuNo,rAndPs[i].pCredit);
}
printf("================================\n");
fclose(fp);
free(rAndPs);
system("pause");
}
/**
*Function: sort8
*Description: 按奖励对学生由高到低排序
*Calls: 无
*Called By: choose4011
*Files Accessed:rAndP.txt
*Files Updated: 无
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void sort8(int choice3)
{
int len;
FILE *fp;
rAndP temp;
int a=0;
if((fp=fopen("rAndP.txt","rb+"))==0)
{
printf("Can't open the file of rAndP!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(rAndP);
rewind(fp);
rAndP* rAndPs=NULL;
rAndPs=(rAndP*)malloc(sizeof(rAndP)*len);
fread(rAndPs,sizeof(rAndP),len,fp);
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1; j++)
{
if(rAndPs[i].stuNo==rAndPs[j].stuNo&&rAndPs[i].stuNo!=0&&i!=j)
{
rAndPs[i].rCredit+=rAndPs[j].rCredit;
rAndPs[j].stuNo=0;
}
}
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(rAndPs[j].rCredit<rAndPs[j+1].rCredit)
{
temp=rAndPs[j];
rAndPs[j]=rAndPs[j+1];
rAndPs[j+1]=temp;
}
printf("以下为奖惩库里记录的学生总奖励学分排名,未收录的学生奖惩学分默认为零。\n");
printf("\t总奖励学分排名\n");
printf("================================\n");
printf("名次\t学号\t\t奖励学分\n");
for(int i=0; i<len; i++)
if(rAndPs[i].stuNo!=0)
{
a++;
printf("%d\t%d\t%.2f\n",a,rAndPs[i].stuNo,rAndPs[i].rCredit);
}
printf("================================\n");
fclose(fp);
free(rAndPs);
system("pause");
}
/**
*Function: statistic9
*Description: 某门课各分数段人数统计
*Calls: 无
*Called By: choose4011
*Files Accessed:score.txt
*Files Updated: 无
*Input: choice3,
*Output: 排序结果
*Return: 无
*/
void statistic9(int choice3)
{
int n;
int len;
char couNo[10];
FILE* fp1;
FILE* fp2;
int term[8]= {6,8,9,10,9,7,2,1};
int a[10]= {0};
if((fp1=fopen("course.txt","rb"))==0)
{
printf("Can't open the file of course!");
exit(0);
}
if((fp2=fopen("score.txt","rb"))==0)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp1,0L,2);
len=ftell(fp1)/sizeof(course);
rewind(fp1);
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*len);
fread(courses,sizeof(course),len,fp1);
score *scores=NULL;
scores=(score*)malloc(sizeof(score)*len);
fread(scores,sizeof(score),len,fp2);
printf("\t必修课课程信息\n");
printf("=========================================================\n");
printf("课程编号\t课程名称\t课程学分\t必/选修课\n");
for(int i=0; i<8; i++)
if(courses[i].term==choice3)
{
for(int j=0; j<term[choice3-1] ; j++)
printf("%s\t%s\t%.2f\t\t%s\t\n",courses[i].couNo[j],
courses[i].couName[j],courses[i].couCredit[j],courses[i].couSort[j]);
}
printf("=========================================================\n");
printf("请输入要统计的课程编号:");
scanf("%s",couNo);
for(int i=0; i<len; i++)
if(courses[i].term==choice3)
{
for(int j=0; j<term[choice3-1] ; j++)
{
if(strcmp(courses[i].couNo[j],couNo)==0)
{
if(scores[i].couScore[j]>=90&&scores[i].couScore[j]<=100)
a[9]++;
if(scores[i].couScore[j]>=80&&scores[i].couScore[j]<90)
a[8]++;
if(scores[i].couScore[j]>=70&&scores[i].couScore[j]<80)
a[7]++;
if(scores[i].couScore[j]>=60&&scores[i].couScore[j]<70)
a[6]++;
if(scores[i].couScore[j]>=50&&scores[i].couScore[j]<60)
a[5]++;
if(scores[i].couScore[j]>=40&&scores[i].couScore[j]<50)
a[4]++;
if(scores[i].couScore[j]>=30&&scores[i].couScore[j]<40)
a[3]++;
if(scores[i].couScore[j]>=20&&scores[i].couScore[j]<30)
a[2]++;
if(scores[i].couScore[j]>=10&&scores[i].couScore[j]<20)
a[1]++;
if(scores[i].couScore[j]>=0&&scores[i].couScore[j]<10)
a[0]++;
}
}
}
printf(" 分数段人数统计\n");
printf("=============\n");
printf("分数段\t人数\n");
for(int i=9; i>=0; i--)
{
printf("%d-%d\t%d\n",i*10,(i+1)*10,a[i]);
}
printf("=============\n");
fclose(fp1);
fclose(fp2);
free(courses);
free(scores);
system("pause");
}
/**
*Function: choose4011
*Description: 对四级菜单下的选择进行处理
*Calls: 各功能函数
*Called By: menu4011
*Files Accessed:student.txt,course.txt,conduct.txt,rAndP.txt,score.txt
*Files Updated: rAndP.txt
*Input: choice4011
*Output: 无
*Return: 无
*/
void choose4011(int choice3,int choice4011)
{
switch(choice4011)
{
/*对应menu409选项*/
case 1:
sort1(choice3);
break;
case 2:
sort2(choice3);
break;
case 3:
sort3(choice3);
break;
case 4:
sort4(choice3);
break;
case 5:
sort5(choice3);
break;
case 6:
sort6(choice3);
break;
case 7:
sort7(choice3);
break;
case 8:
sort8(choice3);
break ;
case 9:
statistic9(choice3);
break;
case 10:
break;
case 0:
exit(0);
default:
printf("输入有误!\n");
system("pause");
system("cls");
break;
}
}
/**
*Function: menu401
*Description: 录入个人信息(只允许进行一次操作),并在此基础上对每位同学完成8个学期必修课的初始化
*Calls: 无
*Called By: choose4
*Files Accessed:student.txt,course.txt
*Files Updated: student.txt,course.txt
*Input: 无
*Output: 个人信息格式提醒,操作提示
*Return: 0
*/
int menu401()
{
int n;
FILE* fp1;
if((fp1=fopen("student.txt","wb+"))==NULL)
{
printf("Can't open the file of student!");
exit(0);
}
printf("请输入要录入个人信息的人数:\n");
scanf("%d",&n);
student *students=NULL;
students=(student*)malloc(sizeof(student)*n);
printf("请按约定的格式输入个人信息:\n");
printf("学号(int) 姓名(char[9]) 宿舍号(char[7]) 性别(char[3]) 年龄(int)\n");
for(int i=0; i<n; i++)
{
scanf("%d %s %s %s %d",&students[i].stuNo,&students[i].stuName,
&students[i].dormitory,&students[i].sex,&students[i].age);
}
fwrite(students,sizeof(student),n,fp1);
rewind(fp1);
fread(students,sizeof(student),n,fp1);
printf("您成功输入了以下信息:\n");
printf("=======================================================\n");
printf("学号\t\t姓名\t宿舍号\t性别\t 年龄\t\n");
for(int i=0; i<n; i++)
printf("%d\t%s\t%s\t%s\t%d\n",students[i].stuNo,students[i].stuName,
students[i].dormitory,students[i].sex,students[i].age);
printf("=======================================================\n");
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*n*8);
for(int i=0; i<n; i++)
{
/*第一学期必修课的初始化*/
courses[i*8+0].stuNo=students[i].stuNo;
strcpy(courses[i*8+0].couName[0],"近代史纲要");
strcpy(courses[i*8+0].couName[1],"大学英语A1");
strcpy(courses[i*8+0].couName[2],"大学体育1");
strcpy(courses[i*8+0].couName[3],"高等数学A1");
strcpy(courses[i*8+0].couName[4],"软件导论");
strcpy(courses[i*8+0].couName[5],"c语言设计");
strcpy(courses[i*8+0].couNo[0],"B27020100");
strcpy(courses[i*8+0].couNo[1],"B10060111");
strcpy(courses[i*8+0].couNo[2],"B14010101");
strcpy(courses[i*8+0].couNo[3],"B06010111");
strcpy(courses[i*8+0].couNo[4],"B08050101");
strcpy(courses[i*8+0].couNo[5],"B08010100");
for(int j=0; j<6; j++)
strcpy(courses[i*8+0].couSort[j],"必");
courses[i*8+0].couCredit[0]=2;
courses[i*8+0].couCredit[1]=4;
courses[i*8+0].couCredit[2]=1;
courses[i*8+0].couCredit[3]=5;
courses[i*8+0].couCredit[4]=2;
courses[i*8+0].couCredit[5]=3.5;
courses[i*8+0].term=1;
/*第二学期必修课的初始化*/
courses[i*8+1].stuNo=students[i].stuNo;
strcpy(courses[i*8+1].couName[0],"思修与法律");
strcpy(courses[i*8+1].couName[1],"大学英语A2");
strcpy(courses[i*8+1].couName[2],"大学体育2");
strcpy(courses[i*8+1].couName[3],"高等数学A2");
strcpy(courses[i*8+1].couName[4],"大学物理C1");
strcpy(courses[i*8+1].couName[5],"离散数学");
strcpy(courses[i*8+1].couName[6],"数字逻辑");
strcpy(courses[i*8+1].couName[7],"C语言实训1");
strcpy(courses[i*8+1].couNo[0],"B27010100");
strcpy(courses[i*8+1].couNo[1],"B10060112");
strcpy(courses[i*8+1].couNo[2],"B14010102");
strcpy(courses[i*8+1].couNo[3],"B06010112");
strcpy(courses[i*8+1].couNo[4],"B06050131");
strcpy(courses[i*8+1].couNo[5],"B06020100");
strcpy(courses[i*8+1].couNo[6],"B08052200");
strcpy(courses[i*8+1].couNo[7],"B08010201");
for(int j=0; j<8; j++)
strcpy(courses[i*8+1].couSort[j],"必");
courses[i*8+1].couCredit[0]=3;
courses[i*8+1].couCredit[1]=4;
courses[i*8+1].couCredit[2]=1;
courses[i*8+1].couCredit[3]=6;
courses[i*8+1].couCredit[4]=2.5;
courses[i*8+1].couCredit[5]=4;
courses[i*8+1].couCredit[6]=3.5;
courses[i*8+1].couCredit[7]=1;
courses[i*8+1].term=2;
/*第三学期必修课的初始化*/
courses[i*8+2].stuNo=students[i].stuNo;
strcpy(courses[i*8+2].couName[0],"毛泽东思想");
strcpy(courses[i*8+2].couName[1],"大学体育3");
strcpy(courses[i*8+2].couName[2],"线性代数");
strcpy(courses[i*8+2].couName[3],"大学物理C2");
strcpy(courses[i*8+2].couName[4],"计算机组成B");
strcpy(courses[i*8+2].couName[5],"面向对象D");
strcpy(courses[i*8+2].couName[6],"数据结构1");
strcpy(courses[i*8+2].couName[7],"C语言实训2");
strcpy(courses[i*8+2].couName[8],"基础日语1");
strcpy(courses[i*8+2].couNo[0],"B27040100");
strcpy(courses[i*8+2].couNo[1],"B14010103");
strcpy(courses[i*8+2].couNo[2],"B06010200");
strcpy(courses[i*8+2].couNo[3],"B06050232");
strcpy(courses[i*8+2].couNo[4],"B08040220");
strcpy(courses[i*8+2].couNo[5],"B08010601");
strcpy(courses[i*8+2].couNo[6],"B08050960");
strcpy(courses[i*8+2].couNo[7],"B08010202");
strcpy(courses[i*8+2].couNo[8],"B08052001");
for(int j=0; j<9; j++)
strcpy(courses[i*8+2].couSort[j],"必");
courses[i*8+2].couCredit[0]=4;
courses[i*8+2].couCredit[1]=1;
courses[i*8+2].couCredit[2]=2;
courses[i*8+2].couCredit[3]=2.5;
courses[i*8+2].couCredit[4]=3.5;
courses[i*8+2].couCredit[5]=3.5;
courses[i*8+2].couCredit[6]=3;
courses[i*8+2].couCredit[7]=1;
courses[i*8+2].couCredit[8]=4;
courses[i*8+2].term=3;
/*第四学期必修课的初始化*/
courses[i*8+3].stuNo=students[i].stuNo;
strcpy(courses[i*8+3].couName[0],"马克思主义");
strcpy(courses[i*8+3].couName[1],"大学体育4");
strcpy(courses[i*8+3].couName[2],"概率论");
strcpy(courses[i*8+3].couName[3],"数据库原理");
strcpy(courses[i*8+3].couName[4],"操作系统原理A");
strcpy(courses[i*8+3].couName[5],"软件导论c");
strcpy(courses[i*8+3].couName[6],"Java高级设计");
strcpy(courses[i*8+3].couName[7],"Web开发基础");
strcpy(courses[i*8+3].couName[8],"软件英语沟通方法");
strcpy(courses[i*8+3].couName[9],"基础日语2");
strcpy(courses[i*8+3].couNo[0],"B27030100");
strcpy(courses[i*8+3].couNo[1],"B14010104");
strcpy(courses[i*8+3].couNo[2],"B06010300");
strcpy(courses[i*8+3].couNo[3],"B08052500");
strcpy(courses[i*8+3].couNo[4],"B08011410");
strcpy(courses[i*8+3].couNo[5],"B08052600");
strcpy(courses[i*8+3].couNo[6],"B08050600");
strcpy(courses[i*8+3].couNo[7],"B08055600");
strcpy(courses[i*8+3].couNo[8],"B08051020");
strcpy(courses[i*8+3].couNo[9],"B08052002");
for(int j=0; j<10; j++)
strcpy(courses[i*8+3].couSort[j],"必");
courses[i*8+3].couCredit[0]=3;
courses[i*8+3].couCredit[1]=1;
courses[i*8+3].couCredit[2]=3;
courses[i*8+3].couCredit[3]=3.5;
courses[i*8+3].couCredit[4]=3.5;
courses[i*8+3].couCredit[5]=2;
courses[i*8+3].couCredit[6]=2.5;
courses[i*8+3].couCredit[7]=2.5;
courses[i*8+3].couCredit[8]=2;
courses[i*8+3].couCredit[9]=4;
courses[i*8+3].term=4;
/*第五学期必修课的初始化*/
courses[i*8+4].stuNo=students[i].stuNo;
strcpy(courses[i*8+4].couName[0],"网络技术");
strcpy(courses[i*8+4].couName[1],"软件需求分析");
strcpy(courses[i*8+4].couName[2],"Web高级开发");
strcpy(courses[i*8+4].couName[3],"人机交互设计");
strcpy(courses[i*8+4].couName[4],"信息安全A");
strcpy(courses[i*8+4].couName[5],"移动通信B");
strcpy(courses[i*8+4].couName[6],"数据库编程");
strcpy(courses[i*8+4].couName[7],"物联网导论B");
strcpy(courses[i*8+4].couName[8],"高级日语1");
strcpy(courses[i*8+4].couNo[0],"B08011500");
strcpy(courses[i*8+4].couNo[1],"B08054400");
strcpy(courses[i*8+4].couNo[2],"B08056100");
strcpy(courses[i*8+4].couNo[3],"B08050510");
strcpy(courses[i*8+4].couNo[4],"B08041310");
strcpy(courses[i*8+4].couNo[5],"B08031120");
strcpy(courses[i*8+4].couNo[6],"B08055800");
strcpy(courses[i*8+4].couNo[7],"B08071420");
strcpy(courses[i*8+4].couNo[8],"B08052003");
for(int j=0; j<9; j++)
strcpy(courses[i*8+4].couSort[j],"必");
courses[i*8+4].couCredit[0]=3.5;
courses[i*8+4].couCredit[1]=3;
courses[i*8+4].couCredit[2]=3.5;
courses[i*8+4].couCredit[3]=3;
courses[i*8+4].couCredit[4]=2.5;
courses[i*8+4].couCredit[5]=2;
courses[i*8+4].couCredit[6]=2.5;
courses[i*8+4].couCredit[7]=2;
courses[i*8+4].couCredit[8]=4;
courses[i*8+4].term=5;
/*第六学期必修课的初始化*/
courses[i*8+5].stuNo=students[i].stuNo;
strcpy(courses[i*8+5].couName[0],"移动应用高级开发");
strcpy(courses[i*8+5].couName[1],"软件测试A");
strcpy(courses[i*8+5].couName[2],"软件项目管理");
strcpy(courses[i*8+5].couName[3],"移动应用开发基础");
strcpy(courses[i*8+5].couName[4],"数字图像处理");
strcpy(courses[i*8+5].couName[5],"前沿技术讲座");
strcpy(courses[i*8+5].couName[6],"高级日语2");
strcpy(courses[i*8+5].couNo[0],"B08051012");
strcpy(courses[i*8+5].couNo[1],"B08054300");
strcpy(courses[i*8+5].couNo[2],"B08054200");
strcpy(courses[i*8+5].couNo[3],"B08051010");
strcpy(courses[i*8+5].couNo[4],"B08020800");
strcpy(courses[i*8+5].couNo[5],"B08050920");
strcpy(courses[i*8+5].couNo[6],"B08052100");
for(int j=0; j<7; j++)
strcpy(courses[i*8+5].couSort[j],"必");
courses[i*8+5].couCredit[0]=2.5;
courses[i*8+5].couCredit[1]=2.5;
courses[i*8+5].couCredit[2]=2;
courses[i*8+5].couCredit[3]=2.5;
courses[i*8+5].couCredit[4]=2.5;
courses[i*8+5].couCredit[5]=2;
courses[i*8+5].couCredit[6]=4;
courses[i*8+5].term=6;
/*第七学期必修课的初始化*/
courses[i*8+6].stuNo=students[i].stuNo;
strcpy(courses[i*8+6].couName[0],"企业开发实战");
strcpy(courses[i*8+6].couName[1],"毕业实习");
strcpy(courses[i*8+6].couNo[0],"B08995001");
strcpy(courses[i*8+6].couNo[1],"B08990710");
for(int j=0; j<2; j++)
strcpy(courses[i*8+6].couSort[j],"必");
courses[i*8+6].couCredit[0]=15;
courses[i*8+6].couCredit[1]=4;
courses[i*8+6].term=7;
/*第八学期必修课的初始化*/
courses[i*8+7].stuNo=students[i].stuNo;
strcpy(courses[i*8+7].couName[0],"毕业设计");
strcpy(courses[i*8+7].couNo[0],"B08990811");
strcpy(courses[i*8+7].couSort[0],"必");
courses[i*8+7].couCredit[0]=15;
courses[i*8+7].term=8;
}
FILE* fp;
if((fp=fopen("course.txt","wb+"))==NULL)
{
printf("Can't open the file of course!");
exit(0);
}
fwrite(courses,sizeof(course),n*8,fp);
fclose(fp);
fclose(fp1);
system("pause");
free(courses);
free(students);
return 0;
}
/**
*Function: menu402
*Description: 录入选修课程信息,由student.txt文件长度得出学生数,从course.txt读出相应长度信息,
* 添加选修信息并重新写入。
*Calls: 无
*Called By: choose4
*Files Accessed:student.txt,course.txt
*Files Updated: course.txt
*Input: choice3
*Output: 课程信息格式提醒,操作提示
*Return: 0
*/
int menu402(int choice3)
{
if(choice3==1||choice3==2)
{
printf("必修课已为基本信息内每位学生选好,只需输入学生自己选的课程信息即可。\n");
printf("大一无法选课!\n");
system("pause");
}
else
{
int stuNum;
char couNum[10];
char couName[20];
float couCredit;
int len;
int n;
int term[8]= {6,8,9,10,9,7,2,1};
FILE *fp1;
if((fp1=fopen("student.txt","rb"))==NULL)
{
printf("Can't open the file of stuent!\n");
printf("请先输入学生基本信息\n");
exit(0);
}
fseek(fp1,0L,2);
len=ftell(fp1)/sizeof(student);
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*len*8);
FILE* fp;
if((fp=fopen("course.txt","rb+"))==NULL)
{
printf("Can't open the file of course!");
exit(0);
}
fread(courses,sizeof(course),len*8,fp);
printf("必修课已为基本信息内每位学生选好,只需输入学生自己选的课程信息即可。\n");
printf("请输入要输入的选修课程信息的条数:\n");
scanf("%d",&n);
printf("请按约定的格式输入学生及课程信息:\n");
for(int j=0; j<n; j++)
{
printf("学号(int) 课程编号(char[10]) 课程名称(char[20]) 课程学分(float)\n");
scanf("%d %s %s %f",&stuNum,&couNum,&couName,&couCredit);
for(int i=0; i<len*8; i++)
if(courses[i].stuNo==stuNum&&courses[i].term==choice3)
{
strcpy(courses[i].couNo[term[choice3-1]],couNum);
strcpy(courses[i].couName[term[choice3-1]],couName);
courses[i].couCredit[term[choice3-1]]=couCredit;
strcpy(courses[i].couSort[term[choice3-1]],"选");
printf("已成功保存以下信息:\n");
printf("==================================================================\n");
printf("学号\t\t学期\t课程编号\t课程名称\t课程学分\t必/选修课\n");
printf("%d\t%d\t%s\t%s\t%.2f\t\t%s\t\n",courses[i].stuNo,courses[i].term,courses[i].couNo[term[choice3-1]],
courses[i].couName[term[choice3-1]],courses[i].couCredit[term[choice3-1]],courses[i].couSort[term[choice3-1]]);
printf("==================================================================\n");
term[choice3-1]++;
}
}
fwrite(courses,sizeof(course),len*8,fp);
fclose(fp1);
fclose(fp);
system("pause");
free(courses);
}
return 0;
}
/**
*Function: menu403
*Description: 录入成绩信息,由student.txt得出学生人数并按此顺序输入成绩信息,部分信息由计算得出,
* 总测评成绩由业务课总成绩与品行表现成绩计算得出
*Calls: 无
*Called By: choose4
*Files Accessed:student.txt,conduct.txt,score.txt,course.txt
*Files Updated: score.txt
*Input: choice3
*Output: 成绩信息格式提醒,操作提示
*Return: 0
*/
int menu403(int choice3)
{
int len;
FILE *fp1;
int a=0;
float b=0;
if((fp1=fopen("student.txt","rb+"))==NULL)
{
printf("Can't open the file of stuent!\n");
printf("请先输入学生基本信息\n");
exit(0);
}
fseek(fp1,0L,2);
len=ftell(fp1)/sizeof(student);
student *students=NULL;
students=(student*)malloc(sizeof(student)*len);
rewind(fp1);
fread(students,sizeof(student),len,fp1);
FILE *fp2;
if((fp2=fopen("conduct.txt","rb+"))==NULL)
{
printf("Can't open the file of conduct!\n");
exit(0);
}
conduct* conducts=NULL;
conducts=(conduct*)malloc(sizeof(conduct)*len*8);
fread(conducts,sizeof(conduct),len*8,fp2);
score *scores=NULL;
scores=(score*)malloc(sizeof(score)*len*8);
FILE* fp3;
if((fp3=fopen("course.txt","rb"))==NULL)
{
printf("Can't open the file of course!");
exit(0);
}
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*len*8);
fread(courses,sizeof(course),len*8,fp3);
FILE* fp;
if((fp=fopen("score.txt","rb+"))==NULL)
{
if((fp=fopen("score.txt","wb+"))==NULL)
{
printf("Can't open the file of score!");
exit(0);
}
for(int i=0; i<len; i++)
{
scores[i*8+0].stuNo=students[i].stuNo;
scores[i*8+0].term=1;
scores[i*8+0].againNum=0;
scores[i*8+0].couSumScore=0;
scores[i*8+0].sumScore=0;
scores[i*8+1].stuNo=students[i].stuNo;
scores[i*8+1].term=2;
scores[i*8+1].againNum=0;
scores[i*8+1].couSumScore=0;
scores[i*8+1].sumScore=0;
scores[i*8+2].stuNo=students[i].stuNo;
scores[i*8+2].term=3;
scores[i*8+2].againNum=0;
scores[i*8+2].couSumScore=0;
scores[i*8+2].sumScore=0;
scores[i*8+3].stuNo=students[i].stuNo;
scores[i*8+3].term=4;
scores[i*8+3].againNum=0;
scores[i*8+3].couSumScore=0;
scores[i*8+3].sumScore=0;
scores[i*8+4].stuNo=students[i].stuNo;
scores[i*8+4].term=5;
scores[i*8+4].againNum=0;
scores[i*8+4].couSumScore=0;
scores[i*8+4].sumScore=0;
scores[i*8+5].stuNo=students[i].stuNo;
scores[i*8+5].term=6;
scores[i*8+5].againNum=0;
scores[i*8+5].couSumScore=0;
scores[i*8+5].sumScore=0;
scores[i*8+6].stuNo=students[i].stuNo;
scores[i*8+6].term=7;
scores[i*8+6].againNum=0;
scores[i*8+6].couSumScore=0;
scores[i*8+6].sumScore=0;
scores[i*8+7].stuNo=students[i].stuNo;
scores[i*8+7].term=8;
scores[i*8+7].againNum=0;
scores[i*8+7].couSumScore=0;
scores[i*8+7].sumScore=0;
}
}
else
{
fread(scores,sizeof(score),len*8,fp);
}
printf("请按以下学生顺序依次录入:\n");
printf("==============================================================\n");
for(int i=0; i<len; i++)
printf("%d ",scores[i*8+0].stuNo);
printf("\n");
printf("==============================================================\n");
printf("请按约定的格式输入如下成绩信息:(没有选修课的在对应地方标记为-1)\n");
switch(choice3)
{
case 1:
printf("近代史纲要 大学英语A1 大学体育1 高等数学A1 软件导论 c语言设计 \n");
for(int i=0; i<len*8; i=i+8)
{
if(scores[i].term==1)
{
b=0;
for(int j=0; j<6; j++)
{
scanf("%f",&scores[i].couScore[j]);
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
b+=courses[i].couCredit[j];
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
{
strcpy(scores[i].again[j],"是");
scores[i].againNum++;
}
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 2:
printf("思修与法律 大学英语A2 大学体育2 高等数学A2 大物C1 离散数学 数字逻辑 C实训1\n");
for(int i=1; i<len*8; i=i+8)
{
if(scores[i].term==2)
{
b=0;
for(int j=0; j<8; j++)
{
scanf("%f",&scores[i].couScore[j]);
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
b+=courses[i].couCredit[j];
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 3:
printf(" 毛概 大学体育3 线性代数 大学物理C2 计算机组成B 面向对象D 数据结构1 C语言实训2 基础日语1 选修1 选修2 选修3\n");
for(int i=2; i<len*8; i=i+8)
{
if(scores[i].term==3)
{
a=0;
b=0;
for(int j=0; j<12; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
{
a++;
b+=courses[i].couCredit[j];
}
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 4:
printf("马原 大学体育4 概率论 数据库原理 操作系统原理A 软件导论c Java高级设计 Web开发基础 软件英语沟通方法 基础日语2 选修1 选修2 选修3 \n");
for(int i=3; i<len*8; i=i+8)
{
if(scores[i].term==4)
{
a=0;
b=0;
for(int j=0; j<13; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
{
a++;
b+=courses[i].couCredit[j];
}
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 5:
printf("网络技术 软件需求分析 Web高级开发 人机交互设计 信息安全A 移动通信B 数据库编程 物联网导论B 高级日语1 选修1 选修2 选修3\n");
for(int i=4; i<len*8; i=i+8)
{
if(scores[i].term==5)
{
a=0;
b=0;
for(int j=0; j<12; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
{
a++;
b+=courses[i].couCredit[j];
}
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 6:
printf("移动应用高级开发 软件测试A 软件项目管理 移动应用开发基础 数字图像处理 前沿技术讲座 高级日语2 选修1 选修2 选修3 \n");
for(int i=5; i<len*8; i=i+8)
{
if(scores[i].term==6)
{
a=0;
b=0;
for(int j=0; j<10; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
{
a++;
b+=courses[i].couCredit[j];
}
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 7:
printf("企业开发实战 毕业实习 选修1 选修2 选修3\n");
for(int i=6; i<len*8; i=i+8)
{
if(scores[i].term==7)
{
a=0;
b=0;
for(int j=0; j<5; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
{
a++;
b+=courses[i].couCredit[j];
}
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
case 8:
printf("毕业设计 选修1 选修2 选修3\n");
for(int i=7; i<len*8; i=i+8)
{
if(scores[i].term==8)
{
a=0;
b=0;
for(int j=0; j<4; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j]*courses[i].couCredit[j];
if(scores[i].couScore[j]!=-1)
{
a++;
b+=courses[i].couCredit[j];
}
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
scores[i].couSumScore/=b;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
}
}
break;
}
}
rewind(fp);
fwrite(scores,sizeof(score),len*8,fp);
printf("操作成功!");
fclose(fp);
fclose(fp1);
fclose(fp2);
fclose(fp3);
system("pause");
free(scores);
free(students);
free(conducts);
free(courses);
return 0;
}
/**
*Function: menu404
*Description: 录入奖惩信息
*Calls: 无
*Called By: choose4
*Files Accessed:rAndP.txt
*Files Updated: rAndP.txt
*Input: choice3
*Output: 奖惩信息格式提醒,操作提示
*Return: 0
*/
int menu404 (int choice3)
{
int n;
printf("请输入要录入奖惩信息的奖惩数:\n");
scanf("%d",&n);
rAndP* rAndPs=NULL;
rAndPs=(rAndP*)malloc(sizeof(rAndP)*n);
FILE* fp;
if((fp=fopen("rAndP.txt","wb+"))==NULL)
{
printf("Can't open the file of rAndP!");
exit(0);
}
printf("无信息处以‘0’标记,惩处学分前要带‘-’。\n");
printf("请按约定的格式输入奖惩信息:\n");
printf("学号(int) 获奖类别(char[17]) 获奖时间(char[11]) 奖励学分(float) 惩处类别(char[17]) 惩处时间(char[11]) 惩处学分(float)\n");
for(int i=0; i<n; i++)
{
scanf("%d %s %s %f %s %s %f",&rAndPs[i].stuNo,&rAndPs[i].rewards,
&rAndPs[i].rTime,&rAndPs[i].rCredit,&rAndPs[i].punishment,
&rAndPs[i].pTime,&rAndPs[i].pCredit);
rAndPs[i].term=choice3;
}
fwrite(rAndPs,sizeof(rAndP),n,fp);
fseek(fp,0L,2);
int len=ftell(fp)/sizeof(rAndP);
rewind(fp);
fread(rAndPs,sizeof(rAndP),len,fp);
printf("已成功保存以下所有信息:\n");
printf("=====================================================================================================================\n");
printf("学号\t\t学期\t获奖类别\t获奖时间\t奖励学分\t惩处类别\t惩处时间\t惩处学分\t\n");
for(int i=0; i<len; i++)
printf("%d\t%d\t%s\t\t%s\t%.2f\t\t%s\t%s\t%.2f\t%.2f\n",rAndPs[i].stuNo,rAndPs[i].term,rAndPs[i].rewards,
rAndPs[i].rTime,rAndPs[i].rCredit,rAndPs[i].punishment,
rAndPs[i].pTime,rAndPs[i].pCredit);
printf("=====================================================================================================================\n");
fclose(fp);
system("pause");
free(rAndPs);
return 0;
}
/**
*Function: menu405
*Description: 录入品行表现信息,基于学生基本信息学号与顺序录入品行表现信息
*Calls: 无
*Called By: choose4
*Files Accessed:student.txt,conduct.txt
*Files Updated: course.txt
*Input: choice3
*Output: 品行表现信息格式提醒,操作提示
*Return: 0
*/
int menu405(int choice3)
{
int len;
FILE *fp1;
if((fp1=fopen("student.txt","rb+"))==NULL)
{
printf("Can't open the file of stuent!\n");
printf("请先输入学生基本信息\n");
exit(0);
}
fseek(fp1,0L,2);
len=ftell(fp1)/sizeof(student);
student *students=NULL;
students=(student*)malloc(sizeof(student)*len);
conduct* conducts=NULL;
conducts=(conduct*)malloc(sizeof(conduct)*len*8);
FILE* fp2;
if((fp2=fopen("conduct.txt","rb+"))==NULL)
{
if((fp2=fopen("conduct.txt","wb+"))==NULL)
{
printf("Can't open the file of conduct!\n");
exit(0);
}
}
else fread(conducts,sizeof(conduct),len*8,fp2);
rewind(fp2);
rewind(fp1);
fread(students,sizeof(student),len,fp1);
for(int i=0; i<len; i++)
{
conducts[i*8+0].stuNo=students[i].stuNo;
conducts[i*8+0].term=1;
conducts[i*8+1].stuNo=students[i].stuNo;
conducts[i*8+1].term=2;
conducts[i*8+2].stuNo=students[i].stuNo;
conducts[i*8+2].term=3;
conducts[i*8+3].stuNo=students[i].stuNo;
conducts[i*8+3].term=4;
conducts[i*8+4].stuNo=students[i].stuNo;
conducts[i*8+4].term=5;
conducts[i*8+5].stuNo=students[i].stuNo;
conducts[i*8+5].term=6;
conducts[i*8+6].stuNo=students[i].stuNo;
conducts[i*8+6].term=7;
conducts[i*8+7].stuNo=students[i].stuNo;
conducts[i*8+7].term=8;
}
printf("请按以下学生顺序依次录入:\n");
printf("==============================================================\n");
for(int i=0; i<len; i++)
printf("%d ",conducts[i*8+0].stuNo);
printf("\n");
printf("==============================================================\n");
printf("请按约定的格式输入品行表现信息:\n");
printf("辅导员评议(float) 班主任评议(float) 班级评议(float)\n");
for(int i=0; i<len*8; i++)
{
if(conducts[i].term==choice3)
{
scanf("%f %f %f",&conducts[i].counsellor,&conducts[i].classTeacher,&conducts[i].classmates);
conducts[i].conSum=(conducts[i].counsellor+conducts[i].classTeacher+conducts[i].classmates)/3.0;
}
}
fwrite(conducts,sizeof(conduct),len*8,fp2);
rewind(fp2);
fread(conducts,sizeof(conduct),len*8,fp2);
printf("您成功输入了以下信息:\n");
printf("==========================================================================================\n");
printf("学号\t\t学期\t辅导员评议\t班主任评议\t班级评议\t品行表现成绩总成绩\t\n");
for(int i=choice3-1; i<len*8; i+=8)
if(conducts[i].term==choice3)
printf("%d\t%d\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n",conducts[i].stuNo,conducts[i].term,conducts[i].counsellor,
conducts[i].classTeacher,conducts[i].classmates,conducts[i].conSum);
printf("==========================================================================================\n");
fclose(fp2);
fclose(fp1);
free(students);
system("pause");
free(conducts);
return 0;
}
/**
*Function: menu406
*Description: 修改个人信息
*Calls: 无
*Called By: choose4
*Files Accessed:student.txt
*Files Updated: student.txt
*Input: choice3
*Output: 个人信息格式提醒,操作提示
*Return: 无
*/
void menu406(int choice3)
{
int num;
int len;
int flag=0;
FILE *fp;
if((fp=fopen("student.txt","rb+"))==NULL)
{
printf("Can't open the file of stuent!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(student);
rewind(fp);
student *students=NULL;
students=(student*)malloc(sizeof(student)*len);
fread(students,sizeof(student),len,fp);
rewind(fp);
printf("===========================================\n");
printf("学号\t\t姓名\t宿舍号\t性别\t 年龄\t\n");
for(int i=0; i<len; i++)
printf("%d\t%s\t%s\t%s\t%d\n",students[i].stuNo,students[i].stuName,
students[i].dormitory,students[i].sex,students[i].age);
printf("===========================================\n");
printf("请输入要修改的个人信息的学号:\n");
scanf("%d",&num);
for(int i=0; i<len; i++)
if(students[i].stuNo==num)
{
printf("您要修改的学生名是:%s\n",students[i].stuName);
printf("请按约定的格式重新输入个人信息:\n");
printf("学号(int) 姓名(char[9]) 宿舍号(char[7]) 性别(char[3]) 年龄(int)\n");
scanf("%d %s %s %s %d",&students[i].stuNo,&students[i].stuName,
&students[i].dormitory,&students[i].sex,&students[i].age);
flag=1;
}
fwrite(students,sizeof(student),len,fp);
if(flag==0)
printf("未找到!");
free(students);
fclose(fp);
printf("操作成功!");
system("pause");
}
/**
*Function: menu407
*Description: 修改课程信息
*Calls: 无
*Called By: choose4
*Files Accessed:course.txt
*Files Updated: course.txt
*Input: choice3
*Output: 课程信息格式提醒,操作提示
*Return: 无
*/
void menu407(int choice3)
{
int stunum;
char cournum[10];
int len;
int flag=0;
printf("请输入要修改的课程信息的所属人学号、课程号:\n");
scanf("%d %s",&stunum,&cournum);
FILE* fp;
if((fp=fopen("course.txt","rb+"))==NULL)
{
printf("Can't open the file of course!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(course);
rewind(fp);
course *courses=NULL;
courses=(course*)malloc(sizeof(course)*len);
fread(courses,sizeof(course),len,fp);
rewind(fp);
for(int i=0; i<len; i++)
for(int j=0; j<14; j++)
if(courses[i].stuNo==stunum&&strcmp(courses[i].couNo[j],cournum)==0&&courses[i].term==choice3)
{
printf("这是原来课程的信息:\n");
printf("==========================================================================================\n");
printf("学号(int)\t课程编号(char[10])\t课程名称(char[20])\t课程学分(float)\t必/选修课(char[3])\n");
printf("%d\t%s\t%s\t%.2f\t%s",courses[i].stuNo,courses[i].couNo[j],
courses[i].couName[j],courses[i].couCredit[j],courses[i].couSort[j]);
printf("\n==========================================================================================\n");
printf("\n请按约定的格式重新输入课程信息:\n");
printf("学号(int) 课程编号(char[10]) 课程名称(char[20]) 课程学分(float) 必/选修课(char[3])\n");
scanf("%d %s %s %f %s",&courses[i].stuNo,&courses[i].couNo[j],
&courses[i].couName[j],&courses[i].couCredit[j],&courses[i].couSort[j]);
printf("请稍候");
courses[i].term=choice3;
flag=1;
}
fwrite(courses,sizeof(course),len,fp);
if(flag==0)
printf("\n未找到!\n");
fclose(fp);
free(courses);
printf("\n操作完成!\n");
system("pause");
}
/**
*Function: menu408
*Description: 修改成绩信息
*Calls: 无
*Called By: choose4
*Files Accessed:score.txt
*Files Updated: score.txt
*Input: choice3
*Output: 成绩信息格式提醒,操作提示
*Return: 无
*/
void menu408(int choice3)
{
int stunum;
char cournum[10];
int len;
int flag=0;
int a=0;
printf("请输入要修改的成绩信息的所属人学号\n");
scanf("%d",&stunum);
FILE* fp;
if((fp=fopen("score.txt","rb+"))==NULL)
{
printf("Can't open the file of score!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(score);
rewind(fp);
score *scores=NULL;
scores=(score*)malloc(sizeof(score)*len);
fread(scores,sizeof(score),len,fp);
rewind(fp);
FILE *fp2;
if((fp2=fopen("conduct.txt","rb+"))==NULL)
{
printf("Can't open the file of conduct!\n");
exit(0);
}
conduct* conducts=NULL;
conducts=(conduct*)malloc(sizeof(conduct)*len);
fread(conducts,sizeof(conduct),len,fp2);
for(int i=0; i<len; i++)
if(scores[i].stuNo==stunum&&scores[i].term==choice3)
{
printf("您要修改的成绩所属人学号为:%d,学期为%d\n",scores[i].stuNo,scores[i].term);
switch(choice3)
{
case 1:
printf("==============================================================\n");
printf("近代史纲要\t大学英语A1\t大学体育1\t高等数学A1\t软件导论\tc语言设计 \n");
for(int j=0; j<6; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("近代史纲要 大学英语A1 大学体育1 高等数学A1 软件导论 c语言设计 \n");
for(int j=0; j<6; j++)
{
scanf("%f",&scores[i].couScore[j]);
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
{
strcpy(scores[i].again[j],"是");
scores[i].againNum++;
}
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=6.0;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 2:
printf("==============================================================\n");
printf("思修与法律\t大学英语A2\t大学体育2\t高等数学A2\t大物C1\t离散数学\t数字逻辑\tC实训1\n");
for(int j=0; j<8; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("思修与法律 大学英语A2 大学体育2 高等数学A2 大物C1 离散数学 数字逻辑 C实训1\n");
for(int j=0; j<8; j++)
{
scanf("%f",&scores[i].couScore[j]);
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=8.0;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 3 :
printf("==============================================================\n");
printf(" 毛概\t大学体育3\t线性代数\t大学物理C2\t计算机组成B\t面向对象D\t数据结构1\tC语言实训2\t基础日语1\t选修1\t选修2\t选修3\n");
for(int j=0; j<12; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf(" 毛概 大学体育3 线性代数 大学物理C2 计算机组成B 面向对象D 数据结构1 C语言实训2 基础日语1 选修1 选修2 选修3\n");
a=0;
for(int j=0; j<12; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]!=-1)
a++;
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=a;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 4:
printf("==============================================================\n");
printf("马原\t大学体育4\t概率论\t数据库原理\t操作系统原理A\t软件导论c\tJava高级设计\tWeb开发基础\t软件英语沟通方法\t基础日语2\t选修1\t选修2\t选修3 \n");
for(int j=0; j<13; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("马原 大学体育4 概率论 数据库原理 操作系统原理A 软件导论c Java高级设计 Web开发基础 软件英语沟通方法 基础日语2 选修1 选修2 选修3 \n");
a=0;
for(int j=0; j<13; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]!=-1)
a++;
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=a;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 5:
printf("==============================================================\n");
printf("网络技术\t软件需求分析\tWeb高级开发\t人机交互设计\t信息安全A\t移动通信B\t数据库编程\t物联网导论B\t高级日语1\t选修1\t选修2\t选修3\n");
for(int j=0; j<12; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("网络技术 软件需求分析 Web高级开发 人机交互设计 信息安全A 移动通信B 数据库编程 物联网导论B 高级日语1 选修1 选修2 选修3\n");
a=0;
for(int j=0; j<12; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]!=-1)
a++;
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=a;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 6:
printf("==============================================================\n");
printf("移动应用高级开发\t软件测试A\t软件项目管理\t移动应用开发基础\t数字图像处理\t前沿技术讲座\t高级日语2\t选修1\t选修2\t选修3 \n");
for(int j=0; j<10; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("移动应用高级开发 软件测试A 软件项目管理 移动应用开发基础 数字图像处理 前沿技术讲座 高级日语2 选修1 选修2 选修3 \n");
a=0;
for(int j=0; j<10; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]!=-1)
a++;
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=a;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 7:
printf("==============================================================\n");
printf("企业开发实战\t毕业实习\t选修1\t选修2\t选修3\n");
for(int j=0; j<5; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("企业开发实战 毕业实习 选修1 选修2 选修3\n");
a=0;
for(int j=0; j<5; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]!=-1)
a++;
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=a;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
case 8:
printf("==============================================================\n");
printf("毕业设计\t选修1\t选修2\t选修3\n");
for(int j=0; j<4; j++)
printf("%.2f\t\t",scores[i].couScore[j]);
printf("\n==============================================================\n");
printf("\n请按约定的格式重新输入成绩信息:\n");
printf("毕业设计 选修1 选修2 选修3\n");
a=0;
for(int j=0; j<4; j++)
{
scanf("%f",&scores[i].couScore[j] );
if(scores[i].couScore[j]>100||(scores[i].couScore[j]<0&&scores[i].couScore[j]!=-1))
{
printf("输入成绩有误,请重新输入:\t");
j--;
}
else
scores[i].couSumScore+=scores[i].couScore[j];
if(scores[i].couScore[j]!=-1)
a++;
if(scores[i].couScore[j]>-1&&scores[i].couScore[j]<60)
strcpy(scores[i].again[j],"是");
else
strcpy(scores[i].again[j],"否");
}
scores[i].couSumScore/=a;
scores[i].sumScore=0.8*scores[i].couSumScore+0.2*conducts[i].conSum;
break;
flag=1;
}
fwrite(scores,sizeof(score),len,fp);
if(flag==0)
printf("未找到!");
fclose(fp);
fclose(fp2);
free(scores);
free(conducts);
printf("操作完成!");
system("pause");
}
}
/**
*Function: menu409
*Description: 修改奖惩信息
*Calls: 无
*Called By: choose4
*Files Accessed:rAndP.txt
*Files Updated: rAndP.txt
*Input: choice3
*Output: 奖惩信息格式提醒,操作提示
*Return: 0
*/
void menu409(int choice3)
{
int num;
int len;
int flag=0;
printf("请输入要修改的奖惩信息的所属人学号:\n");
scanf("%d",&num);
FILE* fp;
if((fp=fopen("rAndP.txt","rb+"))==NULL)
{
printf("Can't open the file of rAndP!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(rAndP);
rewind(fp);
rAndP* rAndPs=NULL;
rAndPs=(rAndP*)malloc(sizeof(rAndP)*len);
fread(rAndPs,sizeof(rAndP),len,fp);
rewind(fp);
for(int i=0; i<len; i++)
{
if(num==rAndPs[i].stuNo)
{
printf("无信息处以‘0’标记,惩处学分前要带‘-’。\n");
printf("您要修改的奖惩信息的所属人学号为:%d\n",rAndPs[i].stuNo);
printf("请按约定的格式重新输入奖惩信息:\n");
printf("学号(int) 获奖类别(char[17]) 获奖时间(char[11]) 奖励学分(float) 惩处类别(char[17]) 惩处时间(char[11]) 惩处学分(float)\n");
scanf("%d %s %s %f %s %s %f",&rAndPs[i].stuNo,&rAndPs[i].rewards,
&rAndPs[i].rTime,&rAndPs[i].rCredit,&rAndPs[i].punishment,
&rAndPs[i].pTime,&rAndPs[i].pCredit);
rAndPs[i].term=choice3;
flag=1;
}
}
fwrite(rAndPs,sizeof(rAndP),len,fp);
if(flag==0)
printf("未找到!");
free(rAndPs);
fclose(fp);
printf("操作成功!");
system("pause");
}
/**
*Function: menu4010
*Description: 修改品行表现信息
*Calls: 无
*Called By: choose4
*Files Accessed:conduct.txt
*Files Updated: conduct.txt
*Input: choice3
*Output: 品行表现信息格式提醒,操作提示
*Return: 无
*/
void menu4010(int choice3)
{
int num;
int len;
int flag=0;
printf("请输入要修改的品行表现信息的所属人学号:\n");
scanf("%d",&num);
FILE* fp;
if((fp=fopen("conduct.txt","rb+"))==NULL)
{
printf("Can't open the file of conduct!");
exit(0);
}
fseek(fp,0L,2);
len=ftell(fp)/sizeof(conduct);
rewind(fp);
conduct *conducts=NULL;
conducts=(conduct*)malloc(sizeof(conduct)*len*8);
fread(conducts,sizeof(conduct),len*8,fp);
rewind(fp);
for(int i=0; i<len*8; i++)
if(conducts[i].stuNo==num&&conducts[i].term==choice3)
{
printf("您要修改的品行表现信息的所属人学号为:%d\n",conducts[i].stuNo);
printf("请按约定的格式重新输入品行表现信息:\n");
printf("学号(int) 辅导员评议(float) 班主任评议(float) 班级评议(float)\n");
scanf("%d %f %f %f",&conducts[i].stuNo,&conducts[i].counsellor,
&conducts[i].classTeacher,&conducts[i].classmates);
conducts[i].conSum=(conducts[i].counsellor+conducts[i].classTeacher+conducts[i].classmates)/3;
flag=1;
}
fwrite(conducts,sizeof(conduct),len*8,fp);
if(flag==0)
printf("未找到!");
fclose(fp);
free(conducts);
printf("操作成功!");
system("pause");
}
/**
*Function: menu4011
*Description: 显示要查询的某学期的具体内容
*Calls: 各功能函数
*Called By: menu4
*Input: choice4011,choice3
*Output: 显示要查询的某学期的具体内容
*Return: 无
*/
void menu4011(int choice3)
{
int choice4011;
while(1)
{
printf("\n");
printf("\t┌───────────────────────────┐\n");
printf("\t│\t\t\t\t\t\t\t│\n");
printf("\t│\t\t 查询第%d学期信息\t\t\t│\n",choice3);
printf("\t│\t\t**********************\t\t\t│\n");
printf("\t│\t\t 1.某同学各课程班级排名\t\t│\n");
printf("\t│\t 2.某同学过往学期业务课班级排名、挂科次数\t│\n");
printf("\t│\t 3.按业务课成绩平均分对宿舍由高到低排序 \t│\n");
printf("\t│\t 4.按业务课成绩平均分对学生由高到低排序 \t│\n");
printf("\t│\t 5.按不及格学生数对课程由高到低排序\t\t│\n");
printf("\t│\t 6.按不及格门次对学生由高到低排序\t\t│\n");
printf("\t│\t 7.按惩罚对学生由高到低排序\t\t\t│\n");
printf("\t│\t 8.按奖励对学生由高到低排序\t\t\t│\n");
printf("\t│\t \t 9.某门课各分数段成绩统计\t\t│\n");
printf("\t│\t \t 10.返回主菜单\t\t\t\t│\n");
printf("\t│\t \t 0.退出程序\t\t\t\t│\n");
printf("\t│\t\t***********************\t\t\t│\n");
printf("\t│\t\t请选择: \t\t\t\t│\n");
printf("\t│\t\t\t\t \t\t\t│\n");
printf("\t└───────────────────────────┘\n");
scanf("%d",&choice4011);
system ("cls");
choose4011(choice3,choice4011);
break;
}
}
/**
*Function: menu4
*Description: 按照choice1与choice2存储的信息显示相应的菜单
*Calls: menu401~menu4011
*Called By: choose2,choose3
*Input: choice1,choice2,choice3
*Output: 引出不同的菜单
*Return: 无
*/
void menu4(int choice1,int choice2,int choice3)
{
if(choice1==2)
choice2+=5;
switch(choice2)
{
case 1:
menu401();
break;
case 2:
menu402(choice3);
break;
case 3:
menu405(choice3);
break;
case 4:
menu404(choice3);
break;
case 5:
menu403(choice3);
break;
case 6:
menu406(choice3);
break;
case 7:
menu407(choice3);
break;
case 8:
menu4010(choice3);
break;
case 9:
menu409(choice3);
break;
case 10:
menu408(choice3);
break;
case 11:
menu4011(choice3);
break;
default:
printf("输入有误!\n");
system("pause");
system("cls");
break;
}
}
/**
*Function: choose3
*Description: 对三级菜单下的选择进行处理
*Calls: menu4
*Called By: menu3
*Input: choice1,choice2,choice3
*Output: 输入不规范时有错误提示
*Return: 无
*/
void choose3(int choice1,int choice2,int choice3)
{
switch(choice3)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
menu4(choice1,choice2,choice3);
break ;
case 9:
break;
case 0:
exit(0);
break;
default:
printf("输入有误!\n");
system("pause");
system("cls");
break;
}
}
/**
*Function: menu3
*Description: 显示三级操作菜单,保留操作对象的学期信息在choice3中
*Calls: choose3
*Called By: choose1,choose2
*Input: choice3
*Output: 输出一级菜单
*Return: 无
*/
void menu3(int choice1,int choice2)
{
int choice3; /*choice3存储学期*/
char a[3][5]= {{"录入"},{"修改"},{"查询"}};
char b[11][9]= {{""},{"课程"},{"品行表现"},{"奖惩"},{"成绩"},{""},{""},{""},{""},{""},{""}};
while(1)
{
printf("\n");
printf("\t┌───────────────────────────┐\n");
printf("\t│\t\t\t\t\t\t\t│\n");
printf("\t│\t\t\t %s%s信息\t\t\t│\n",a[choice1-1],b[choice2-1]);
printf("\t│\t\t \t **************\t\t\t│\n");
printf("\t│\t\t \t 1.第一学期\t\t\t│\n");
printf("\t│\t\t \t 2.第二学期 \t\t\t│\n");
printf("\t│\t\t \t 3.第三学期\t\t\t│\n");
printf("\t│\t\t \t 4.第四学期\t\t\t│\n");
printf("\t│\t\t \t 5.第五学期\t\t\t│\n");
printf("\t│\t\t \t 6.第六学期\t\t\t│\n");
printf("\t│\t\t \t 7.第七学期\t\t\t│\n");
printf("\t│\t\t \t 8.第八学期\t\t\t│\n");
printf("\t│\t\t \t 9.返回主菜单\t\t\t│\n");
printf("\t│\t\t \t 0.退出程序\t\t\t│\n");
printf("\t│\t\t \t************** \t\t\t│\n");
printf("\t│\t\t\t请选择: \t\t\t│\n");
printf("\t│\t\t\t\t \t\t\t│\n");
printf("\t└───────────────────────────┘\n");
scanf("%d",&choice3);
system("cls");
choose3(choice1,choice2,choice3);
break;
}
}
/**
*Function: choose2
*Description: 对二级菜单下的选择进行处理
*Calls: menu3;menu4;
*Called By: menu2
*Input: choice1,choice2
*Output: 输入不规范时有错误提示
*Return: 无
*/
void choose2(int choice1,int choice2)
{
switch(choice2)
{
case 1:
menu4(choice1,choice2,1);
break;
case 2:
case 3:
case 4:
case 5:
menu3(choice1,choice2);
break;
case 6:
break;
case 0:
exit(0);
break;
default:
printf("输入有误!\n");
system("pause");
system("cls");
break;
}
}
/**
*Function: menu2
*Description: 显示二级操作菜单,保留操作对象信息在choice2中
*Calls: choose2
*Called By: choose1
*Input: choice1
*Output: 输出二级菜单
*Return: 无
*/
void menu2(int choice1)
{
int choice2; //choice2存储操作对象
while(1)
{
char a[2][5]= {{"录入"},{"修改"}};
printf("\n");
printf("\t┌───────────────────────────┐\n");
printf("\t│\t\t\t\t\t\t\t│\n");
printf("\t│\t\t\t %s信息\t\t\t│\n",a[choice1-1]);
printf("\t│\t\t\t**************\t\t\t│\n");
printf("\t│\t\t \t 1.个人信息\t\t\t│\n");
printf("\t│\t\t \t 2.课程信息 \t\t\t│\n");
printf("\t│\t\t \t 3.品行表现信息 \t\t│\n");
printf("\t│\t\t \t 4.奖惩信息\t\t\t│\n");
printf("\t│\t\t \t 5.成绩信息\t\t\t│\n");
printf("\t│\t\t \t 6.返回主菜单\t\t\t│\n");
printf("\t│\t\t \t 0.退出程序\t\t\t│\n");
printf("\t│\t\t \t************** \t\t\t│\n");
printf("\t│\t\t\t请选择: \t\t\t│\n");
printf("\t│\t\t\t\t \t\t\t│\n");
printf("\t└───────────────────────────┘\n");
scanf("%d",&choice2);
system ("cls");
choose2(choice1,choice2);
break;
}
}
/**
*Function: conduct choose1
*Description: 对一级菜单下的选择进行处理
*Calls: menu2;menu3;
*Called By: menu1
*Input: choice1
*Output: 输入不规范时有错误提示
*Return: 无
*/
void choose1(int choice1)
{
switch(choice1)
{
case 1:
;
case 2:
menu2(choice1);
break;
case 3:
menu3(choice1,11);
break;
case 4:
break;
case 0:
exit(0);
default:
printf("输入有误!\n");
system("pause");
system("cls");
break;
}
}
/**
*Function: menu1
*Description: 显示一级操作菜单,保留操作信息在choice1中
*Calls: choose1
*Called By: main
*Input: choice1
*Output: 输出一级菜单
*Return: 无
*/
void menu1() //choice1存储功能
{
int choice1;
while(1)
{
printf("\n");
printf("\t┌───────────────────────────┐\n");
printf("\t│\t\t\t\t\t\t\t│\n");
printf("\t│\t\t 欢迎使用班主任管家系统\t\t│\n");
printf("\t│\t\t \t**************\t\t\t│\n");
printf("\t│\t\t \t 1.录入信息\t\t\t│\n");
printf("\t│\t\t \t 2.修改信息 \t\t\t│\n");
printf("\t│\t\t \t 3.查询信息\t\t\t│\n");
printf("\t│\t\t \t 0.退出程序\t\t\t│\n");
printf("\t│\t\t \t************** \t\t\t│\n");
printf("\t│\t\t\t请选择: \t\t\t│\n");
printf("\t│\t\t\t\t \t\t\t│\n");
printf("\t└───────────────────────────┘\n");
scanf("%d",&choice1);
system("cls");
choose1(choice1);
system("cls");
}
}
/*******************main函数***************************/
/**
*Function: main
*Description: 调用menu1函数,通过menu1函数与其他函数的交互实现系统的功能
*Calls: menu1
*Input: 对应导航的序号或相应信息
*Output: 显示导航与提示
*Return: 0
*/
int main()
{
menu1();
return 0;
}