void chenji_stu(struct Student stud[], int n, int o) {
int i,j; //用来控制循环次数
struct Student temp; //用于交换 printf(\
printf(\┏━━━━━━┳━━━━━━━━┳━━━┳━━━┳━━━┳━━━┳━━━━━┓\\n\
printf(\┃学号 ┃ 姓名 ┃数据库┃ 算法 ┃ C语言┃总成绩┃ 平均成绩 ┃\\n\
printf(\┣━━━━━━╋━━━━━━━━╋━━━╋━━━╋━━━╋━━━╋━━━━━┫\\n\
for (i = 0; i < n-1; i++) /*冒泡排序*/ {
for(j = i+1; j < n; j++) {
if (stud[j].score[o] > stud[i].score[o]) /*如果j为下标的成绩大于i为下标成绩则交换*/ {
temp = stud[i]; /*交换2个下标对应的所有学员信息*/ stud[i] = stud[j]; stud[j] = temp; } } }
for (i = 0; i < n; i++) /*循环输出学员信息*/ {
int j; //用于控制循环依次输出三门成绩
printf(\┃ %-10s┃%-15s\ for(j = 0; j < 3; j++) /*依次输出三门成绩*/ {
printf(\┃%.1f \ }
printf(\┃%.1f\输出总成绩 printf(\┃ %.1f\输出平均成绩 printf(\┃\\n\
printf(\┣━━━━━━╋━━━━━━━━╋━━━╋━━━╋━━━╋━━━╋━━━━━┫\\n\ }
printf(\┗━━━━━━┻━━━━━━━━┻━━━┻━━━┻━━━┻━━━┻━━━━━┛\\n\输出单个学员信息 }
/*************************************************************************** 功能:对某项成绩进行统计(求平均成绩,优生人数,及格人数,优生率,及格率)并格式化输出 参数:参数*a代表结构体数组首地址,n代表调用部分包含成员个数,o代表该项成绩的下标 返回值:空 */
25
void stat_stu(struct Student stud[], int n, int o) {
int i; //控制循环次数
float stat[5]; //用来存放5个统计数据
printf(\平均成绩\\t及格率\\t\\t优生率\\t\\t及格人数\\t优生人数\\n\
printf(\---------\
stat[0] = class_avr(stud, n, o); //调用求平均函数求出平均成绩
stat[4] = 0; /*求优生人数*/ for (i = 0; i < n; i++) {
if (stud[i].score[o] >= 80) {
stat[4]++; } }
stat[3] = 0; /*求及格人数*/ for (i = 0; i < n; i++) {
if (stud[i].score[o] >= 60) {
stat[3]++; } }
stat[2] = (stat[4]/n)*100; //求优生率 stat[1] = (stat[3]/n)*100; //求及格率
printf(\格式化输出5项成绩*/ stat[0], stat[1], stat[2], int(stat[3]), int(stat[4]));
printf(\---------\}
/*************************************************************************** 功能:接收用户的选择分别按姓名或学号查找用户需要的信息
参数:参数struct Student stud[]代表结构数组首地址,n代表数组调用长度 返回值:返回值不为零则返回的是与查找到的信息对应的下标有数学关系的值 返回值为0则表示查找失败 */
int find_stu(struct Student stud[], int n) {
int i; //用于控制循环次数
int flag = 0; //用于接收用户的选择及判断 int sign = 0; //存放函数的返回值
char you_choice[16]; //接收用户输入的查找信息
fflush(stdin); /*接收用户的选择*/
printf(\请选择您要查询的方式:( 1:按学号 2:按名字; )\ scanf(\
while (flag < 1 || flag > 2) /*判断用户选择是否有误有误则重新输入选择*/ {
printf(\输入有误,请重新输入选择!\
26
fflush(stdin);
scanf(\ }
printf(\请输入该学生信息:\接收用户的查找信息*/ fflush(stdin);
scanf(\
if (flag == 2) /*如果用户选择按姓名查找*/ {
/*根据输入信息查找相关信息并根据查找情况得出不同返回值*/ for (i = 0; i < n; i++) //依次查找 {
if (strcmp(stud[i].name, you_choice) != 0) //如果第i项与查找信息不匹配 {
sign = 0;//令sign为0表示查找失败 }
else //如果第i项与查找信息匹配 {
sign = i+1;//令sign的值在0到n-1之间,并且等于该匹配项下标i加1 break; //查找到则中断查找循环 } } } else {
/*根据输入信息查找相关信息并根据查找情况得出不同返回值*/ for (i = 0; i < n; i++) {
if (strcmp(stud[i].num, you_choice) != 0) //如果第i项与查找信息不匹配 {
sign = 0; //令sign为0表示查找失败 }
else //如果第i项与查找信息匹配 {
sign = -i-1; //令sign的值在-(n-1)到o之间,并且等于该匹配项下标i加1求反
break;//查找到则中断查找循环 } } }
return sign;//返回sign的值以供下步操作判断 }
/*************************************************************************** 功能:根据查找函数的返回值找到对应信息并删除
参数:参数struct Student stud[]代表结构数组首地址
,n代表数组长度,y与要删除的数对应的下标有固定数学关系 返回值:空 */
void delete_stu(struct Student stud[], int n, int y) {
int i; //用于控制循环次数
char sign; //用于接收用户的选择
printf(\确认您要进行删除吗?(y/n)\提醒用户是否确定进行删除操作
27
fflush(stdin);
sign = getchar(); //接受用户的选择
if (sign == 'y' || sign == 'Y') //如果用户确定删除 {
if (y > 0) //若用户是根据姓名查找的该信息 {
/*把该信息后的信息依次前移一位,覆盖该信息*/ for (i = y-1; i < n-1; i++) {
stud[i] = stud[i+1]; } }
else //若用户根据学号查找到该信息 {
/*把该信息后的信息依次前移一位,覆盖该信息*/ for (i = -y-1; i < n-1; i++) {
stud[i] = stud[i+1]; } } } }
/*************************************************************************** 功能:根据查找函数的返回值找到对应信息并进行选择性修改 参数:参数struct Student stud[]代表结构数组首地址
,n代表数组长度,y与要删除的数对应的下标有固定数学关系 返回值:空 */
void amend_stu(struct Student stud[], int n, int y) {
int ch; //用于接收用户对某门成绩修改的选择
int flag_score; //值作为输入有误就重复输入的循环条件 int h; //接收scanf()函数的返回值
char x; //用于判断用户中是否包含不合法输入 float am_score; //用于接收用户输入的成绩
/*接收用户对修改列项的选择*/
printf(\请输入您要对哪一门成绩进行修改?( 0:数据库; 1:算法; 2:C语言)\ fflush(stdin); scanf(\
do /*接收用户输入成绩的同时判断输入是否正确*/ {
/*接收用户输入并产生返回值*/
printf(\请输入该门课的成绩:\ flag_score = 0; h=0;
fflush(stdin);
h = scanf(\
if ((am_score < 0 || am_score > 100) //如果用户信息输入有误 || (h != 2) || (x != '\\n')) {
flag_score = -1;
printf(\输入有误,请重新输入成绩(0-100):\\n\提示重新输入 }
28
}while (flag_score < 0); //如果用户输入错误则继续循环
/*把查找到的信息修改成为用户需要的信息*/ if (y > 0) {
stud[y-1].score[ch] = am_score; printf(\修改成功!\\n\ } else {
stud[-y-1].score[ch] = am_score; printf(\修改成功!\\n\ } }
/*************************************************************************** 功能:从文件中读入学生成绩信息
参数:参数struct Student stud[]代表结构数组首地址,n代表数组长度 返回值:空 */
int add_text(struct Student stud[], int n) {
int i = 0; //用于控制循环 int num;
FILE *fp; //定义文件指针
/* char filename[20];
printf(\请输入您要打开的文件名:\ scanf(\输入文件名 */
if ((fp = fopen(\打开文件 {
printf(\打开失败!\\n\\n\\n\打开失败信息 printf(\ system(\ return(n); }
fscanf(fp, \读入总记录量
while (i fscanf(fp,\ &stud[i].score[1], &stud[i].score[2], &stud[i].score[3], &stud[i].score[4]); i++; } n = num; fclose(fp); /*关闭文件*/ printf(\打开成功!\\n\\n\\n\ printf(\ return(n); } /*************************************************************************** 功能:将学生成绩信息保存到一个文件 参数:参数struct Student stud[]代表结构数组首地址,n代表数组长度 29 返回值:空 */ void write_text(struct Student stud[], int n) //将所有记录写入文件 { int i = 0; FILE *fp; //定义文件指针 /*char filename[20]; //定义文件名 printf(\请输入您要保存的文件名:\输入文件名 scanf(\ if ((fp = fopen(\打开文件 { printf(\无法打开这个文件!\\n\\n\\n\ return; } fprintf(fp, \循环写入数据 while (i < n) { fprintf(fp,\%.1f %.1f %.1f %.1f\\n\stud[i].num, stud[i].name, stud[i].score[0], stud[i].score[1], stud[i].score[2], stud[i].score[3], stud[i].score[4]); i++; } fclose(fp); //关闭文件 printf(\成功记录!\\n\\n\\n\返回成功信息 } 30