1.通过对文件操作可以实现如下基本功能
1)用户登录界面和用户信息管理
2)数据信息的录入
3)学生、课程及成绩全部显示
4)成绩修改及删除
5)查询功能
6)成绩统计
7)退出系统
2.通过链表知识完成功能1~7中的至少一个功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STUDENT 7 //共有7名学生
#define COURSE 6 //共有6门课程
#define SCORE (STUDENT*COURSE)
#define LEN_student sizeof(struct students)
#define LEN_course sizeof(struct courses)
#define LEN_grade sizeof(struct grades)
char all_user[100][10];
char all_passWord[100][10]; //存储管理者用户名和密码
int n=1,t; //n为管理者的人数,t是为了修改密码,记住登录者的序号以便修改密码
int student_number=STUDENT; //删除学生后学生数目发生改变,但是define定义的不可改变
int grade_number=SCORE;
int load() //用户登录界面
{
int i=0,j,flag=0; //flag判断是否登录成功
printf("学生成绩管理系统用户登录\n");
FILE *fp;
fp=fopen("infor.txt","r"); //从存储管理员信息的文件中读入管理员信息
while(fscanf(fp,"%s",all_user[i])!=EOF)//方便接下来输入查找是否存在该管理员
{
fscanf(fp,"%s",all_passWord[i]);
i++;
}
n=i; //文件中共存储了n个管理员信息
fclose(fp);
char user[10],passWord[10]; //用户输入的用户名和密码
for(i=0;i<3;i++) //输入机会有三次
{
printf("请您输入用户名:");
scanf("%s",user);
printf("请您输入密码:");
scanf("%s",passWord);
for(j=0;j<n;j++) //从n个管理员信息中查找是否含有该用户名和密码
{
if(strcmp(user,all_user[j])==0&&strcmp(passWord,all_passWord[j])==0) //输入的用户名和密码属于管理员
{
t=j; //记下该管理员的编号,方便接下来修改该密码
printf("登录成功!\n");
flag=1;
return 1;
}
}
if(flag==0)
{
printf("用户名密码有误!\n"); //输入失败给出提示
printf("提示:密码只有数字,用户名只有小写字母,用户名和密码均不超过10位\n");
}
}
if(i==3) //如果三次输入失败则返回false
{
printf("登录失败!\n");
return 0;
}
}
int main_Menu() //显示主菜单
{
int n;
printf("|----------------------------|\n");
printf("|***学生成绩管理系统主菜单***|\n");
printf("|****************************|\n");
printf("| 请选择主菜单序号 |\n");
printf("|****************************|\n");
printf("| 1-用户信息 |\n");
printf("| 2-信息录入 |\n");
printf("| 3-显示信息 |\n");
printf("| 4-成绩修改及删除 |\n");
printf("| 5-查询功能 |\n");
printf("| 6-成绩统计 |\n");
printf("| 0-退出系统 |\n");
printf("|----------------------------|\n");
printf("请选择主菜单序号:");
scanf("%d",&n); //输入选择返回到menu函数中,由menu函数调用功能函数
return n;
}
void change_password() //用户信息管理:修改密码
{
void menu();
int i,j,len,flag,tag=0; //flag检查密码是否符合规范,tag检查重置后的密码是否与其他管理员密码相同
printf("|------修改密码------|\n");
char pass[10],prepass[10]; //之前的密码和修改后的密码
FILE *fp;
fp=fopen("infor.txt","r"); //从管理员文件中读取管理员的用户名和密码
for(i=0;i<n;i++)
{
fscanf(fp,"%s",all_user[i]);
fscanf(fp,"%s",all_passWord[i]);
}
fclose(fp);
printf("请输入之前密码:\n");
scanf("%s",prepass);
printf("请输入修改后密码:\n");
scanf("%s",pass);
len=strlen(pass); //记下密码的长度,密码长度要求不超过10位
for(j=0;j<n;j++)
{
if(strcmp(pass,all_passWord[j])==0) //修改后的密码和其他管理员密码重复
{
tag=1;
}
}
for(i=0;i<len;i++) //检查密码是否符合规范
{
if(pass[i]>='0'&&pass[i]<='9') //密码是否为0-9的字符
flag=0;
else
{
flag=1; //密码不符合规范则flag置为1
break;
}
}
if(flag==1||len>10) //若不符合规范或者长度错误则给提示并且重新修改
{
printf("密码有误!\n");
printf("提示:密码只有数字且不超过10位\n");
}
else if(tag==1) //符合规范但是与其他管理员密码重复
{
printf("已有相同的密码\n");
}
else //符合规范就将修改后的密码更改到管理者信息密码中
{
strcpy(all_passWord[t],pass);
fp=fopen("infor.txt","w+");//更改后就将管理员用户名和密码重新写入文件中
for(j=0;j<n;j++)
{
fprintf(fp,"%s",all_user[j]);
fprintf(fp," ");
fprintf(fp,"%s",all_passWord[j]);
fprintf(fp,"\n");
}
printf("|----密码修改成功----|\n");
}
fclose(fp);
menu(); //返回菜单
}
void add_information() //添加管理者信息
{
void menu();
int m,i,j,len,a,b,flag,tag=0;
FILE *fp;
fp=fopen("infor.txt","r");//从文件中读管理员信息,主要是为了避免添加的管理员信息与其他管理员重复
for(i=0;i<n;i++)
{
fscanf(fp,"%s",all_user[i]);
fscanf(fp,"%s",all_passWord[i]);
}
fclose(fp);
printf("请输入需要添加其他管理者的人数:\n");//添加其他管理者的人数
scanf("%d",&m);
for(i=0;i<m;i++) //重复m次
{
tag=0; //tag仍然表示是否与之前的信息重复
flag=0; //flag仍然表示是否符合规范
a=0; //a检查用户名是否正确 (符合规范并且不重复)
b=0; //b检查密码是否正确 (符合规范并且不重复)
char add_user[10],add_passWord[10]; //添加的用户名和密码
printf("请您输入添加用户名:");
scanf("%s",add_user); //开始检查用户名
for(j=0;j<n;j++)
{
if(strcmp(add_user,all_user[j])==0) //与之前管理员用户名重复tag=1
{
tag=1;
}
}
len=strlen(add_user); //用户名长度检查
for(j=0;j<len;j++) //用户名规范检查
{
if(add_user[j]>='a'&&add_user[j]<='z') //用户名都为小写字母
flag=0;
else
{
flag=1; //用户名不符合规范则flag=1
break;
}
}
if(flag==1||len>10) //用户名不符合规范或者长度大于10
{
printf("用户名有误!\n");
printf("提示:用户名只有小写字母且不超过10位\n");
}
else if(tag==1) //用户名符合规范但是与其他用户名重复
{
printf("已有相同的用户名\n");
}
else
{
a=1; //a为1,表示用户名符合规范,将该用户名加入 all_user数组中
strcpy(all_user[n],add_user);
}
tag=0; //tag重新置为0,检查密码是否重复
flag=0; //flag重新置为0,检查密码是否规范
printf("请您输入添加密码:");
scanf("%s",add_passWord);//开始检查密码
for(j=0;j<n;j++)
{
if(strcmp(add_passWord,all_passWord[j])==0)//与之前管理员密码重复tag=1
{
tag=1;
}
}
len=strlen(add_passWord);//密码长度检查
for(j=0;j<len;j++)//密码规范检查
{
if(add_passWord[j]>='0'&&add_passWord[j]<='9')//密码都为0-9字符
flag=0;
else
{
flag=1; //密码不符合规范则flag=1
break;
}
}
if(flag==1||len>10) //密码不符合规范或者长度大于10
{
printf("密码有误!\n");
printf("提示:密码只有数字且不超过10位\n");
}
else if(tag==1) //密码符合规范但是与其他管理员密码重复
{
printf("已有相同的密码\n");
}
else
{
b=1; //b为1,表示密码符合规范,将该用户名加入 all_passWord数组中
strcpy(all_passWord[n],add_passWord);
}
if(a==1&&b==1) //a,b都为1表示用户名和密码都符合规范并且不与其他管理员重复
{
n++; //管理员数目加一
printf("|----添加该用户成功----|\n");
}
}
fp=fopen("infor.txt","w");//将 all_user数组,all_passWord数组写入 infor.txt中
for(j=0;j<n;j++) //因为之前的管理员和后添加的管理员信息都在这两个数组中
{
fprintf(fp,"%s",all_user[j]); //写入管理员用户名
fprintf(fp," ");
fprintf(fp,"%s",all_passWord[j]); //写入管理员密码
fprintf(fp,"\n");
}
fclose(fp);
menu(); //返回主菜单
}
void infor_manage() //用户信息管理:修改密码或添加其他用户信息
{
int nn;
void menu();
printf("|-----用户信息管理系统-----|\n");
printf("|**************************|\n");
printf("| 1-修改密码 |\n");
printf("| 2-添加信息 |\n");
printf("| 3-返回主菜单 |\n");
printf("|**************************|\n");
printf("|--------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nn); //选择进行的操作
if(nn==1) change_password(); //修改密码
else if(nn==2) add_information(); //添加信息
else if(nn==3) menu(); //返回主菜单
else printf("请输入1/2/3\n"); //输入其他给予提示
}
struct student
{
char no[10]; //学号
char name[10]; //姓名
char sex[2]; //性别
int age; //年龄
char str[10]; //所在系
}stud[STUDENT];
void stud_infor() //录入学生信息
{
void menu();
int i,j,flag=0; //flag用来检查是否存在学号相同的情况
while(1)
{
flag=0;
FILE *f;
f=fopen("student.txt","w");//打开 student.txt文件写入学生信息
for(i=0;i<STUDENT;i++)
{ //输入学生的学号,姓名,性别,年龄,所在系
scanf("%s %s %s %d %s",stud[i].no,stud[i].name,stud[i].sex,&stud[i].age,stud[i].str);
if(strcmp(stud[i].sex,"男")!=0&&strcmp(stud[i].sex,"女")!=0)
printf("性别输入错误\n");
for(j=0;j<i;j++) //每输入一个学生信息都要与之前的学生比较学号是否相同
{
if(strcmp(stud[i].no,stud[j].no)==0) //学号相同,flag=1
{
flag=1;
}
}
fprintf(f,"%s\t%s\t%s\t%d\t%s\n",stud[i].no,stud[i].name,stud[i].sex,stud[i].age,stud[i].str);
}//若学号不相同则可以将该学生信息写入 student.txt文件中
fclose(f);
if(flag==1) printf("提示:学号相同,不能保存信息,请重新输入学生信息\n");
else break;
}
menu();
}
struct course
{
char cno[10]; //课程号
char cname[15]; //课名
char teacher[10]; //任课老师
}cou[COURSE];
void course_infor()
{
void menu();
FILE *f;
f=fopen("course.txt","w");//打开 course.txt文件写入课程信息
int i;
for(i=0;i<COURSE;i++)
{ //输入课程号,课名,任课老师
scanf("%s %s %s",cou[i].cno,cou[i].cname,cou[i].teacher);
fprintf(f,"%s\t%s\t%s\t\n",cou[i].cno,cou[i].cname,cou[i].teacher);
//将课程号,课名,任课老师写入 course.txt文件中
}
fclose(f);
menu();
}
struct grade
{
char no[10]; //学号
char cno[10]; //课名
int pingshi_score; //平时成绩
int juanmian_score; //卷面成绩
int score; //综合成绩
}grad[SCORE];
void grade_infor() //成绩信息录入
{
void menu();
int i,j,flag,rest,tag,pingshi,juanmian,all_score,no,cno;
while(1)
{
tag=0;
pingshi=0;
juanmian=0;
all_score=0;
no=0;
cno=0;
FILE *f;
f=fopen("score.txt","w");//向 score.txt文件中写入成绩信息
for(i=0;i<SCORE;i++) //共 STUDENT*COURSE个成绩
{
scanf("%s %s ",grad[i].no,grad[i].cno); //输入学号,课名
rest=scanf("%d %d",&grad[i].pingshi_score,&grad[i].juanmian_score);//通过scanf返回值检查是否不完整输入
if(rest!=2)
{
tag=1;
//printf("T\n");
pingshi=1;
juanmian=1;
}
if((int)grad[i].pingshi_score!=grad[i].pingshi_score)
{
tag=1;
pingshi=2;
}
if((int)grad[i].juanmian_score!=grad[i].juanmian_score)
{
tag=1;
juanmian=2;
}
//检查平时成绩输入和卷面成绩输入是否为整数
int len;
flag=0; //检查学号是否符合规范
len=strlen(grad[i].no);//检查学号
for(j=0;j<len;j++)
{
if(grad[i].no[j]<'0'||grad[i].no[j]>'9')//学号应为0-9的字符
{
flag=1; //学号不符合规范flag=1;
}
}
if(flag==1)
{
tag=1;
//printf("T\n");
no=1;
}
flag=0; //检查课名是否符合规范
len=strlen(grad[i].cno); //检查课名
if(grad[i].cno[0]!='S'&&grad[i].cno[0]!='P') flag=1; //课名前应标明是公共课还是专业课
for(j=1;j<len;j++)
{
if(grad[i].cno[j]<'0'||grad[i].cno[j]>'9') //课名除第一个外后面为0-9的字符
{
flag=1; //课名不符合规范flag=1;
}
}
if(flag==1)
{
tag=1;
//printf("T\n");
cno=1;
}
if(grad[i].pingshi_score<0||grad[i].pingshi_score>100)
{
tag=1;
pingshi=3;
}
if(grad[i].juanmian_score<0||grad[i].juanmian_score>100)
{
tag=1;
juanmian=3;
}
//检查平时成绩和卷面成绩输入是否在0-100之间
if(grad[i].cno[0]=='P') //计算公共基础课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.3+grad[i].juanmian_score*0.7+0.5);
}//四舍五入法
else计算专业课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.4+grad[i].juanmian_score*0.6+0.5);
}//四舍五入法
fprintf(f,"%s\t%s\t%d\t%d\t%d\n",grad[i].no,grad[i].cno,grad[i].pingshi_score,grad[i].juanmian_score,grad[i].score);
}//将输入的信息和计算出的信息写入 score.txt文件中
fclose(f);
if(pingshi==1&&juanmian==1) printf("存在不完整输入\n");
if(pingshi==2) printf("平时成绩应为整数\n");
if(pingshi==3) printf("平时成绩应为0-100的整数\n");
if(juanmian==2) printf("卷面成绩应为整数\n");
if(juanmian==3) printf("卷面成绩应为0-100的整数\n");
if(no==1) printf("存在学号输入错误\n");
if(cno==1) printf("存在课程号输入错误\n");
if(tag==1) printf("请重新输入成绩\n");
else break;
}
menu(); //返回主菜单
}
void infor_in() //信息录入系统
{
void stud_infor(); //学生基本信息录入
void course_infor(); //课程基本信息录入
void grade_infor(); //学生成绩信息录入
void menu(); //返回主菜单
int nm;
printf("|-------信息录入系统-------|\n");
printf("|**************************|\n");
printf("| 1-学生基本信息录入 |\n");
printf("| 2-课程基本信息录入 |\n");
printf("| 3-学生成绩信息录入 |\n");
printf("| 4-返回主菜单 |\n");
printf("|**************************|\n");
printf("|--------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nm); //获取进行的操作
if(nm==1) stud_infor(); //学生基本信息录入
else if(nm==2) course_infor();//课程基本信息录入
else if(nm==3) grade_infor();//学生成绩信息录入
else if(nm==4) menu(); //返回主菜单
else printf("请输入1/2/3/4\n"); //其他输入给予提示
}
void infor_show() //显示信息,显示学生信息和成绩信息
{
void menu();
FILE *f;
f=fopen("student.txt","r"); //从文件中读入学生信息,放在学生结构体中
int i=0;
while(fscanf(f,"%s",stud[i].no)!=EOF)
{
fscanf(f,"%s%s%d%s",stud[i].name,stud[i].sex,&stud[i].age,stud[i].str);
i++;
}
printf("学号\t姓名\t性别\t年龄\t所在系\n");
for(i=0;i<student_number;i++) //共有7名学生
printf("%s\t%s\t%s\t%d\t%s\t\n",stud[i].no,stud[i].name,stud[i].sex,stud[i].age,stud[i].str);
fclose(f);//显示课程课号,课程名,任课教师
FILE *r;
r=fopen("course.txt","r"); //从文件中读入课程信息,放在课程结构体中
i=0;
while(fscanf(f,"%s",cou[i].cno)!=EOF)
{
fscanf(f,"%s%s",cou[i].cname,cou[i].teacher);
i++;
}
printf("课号\t课程名\t\t任课教师\n");
for(i=0;i<COURSE;i++) //共有SCOURSE门课程
{
if(strcmp(cou[i].cno,"P02")==0)
{
printf("%s\t%s\t %s\n",cou[i].cno,cou[i].cname,cou[i].teacher);
}
else printf("%s\t%s\t%s\n",cou[i].cno,cou[i].cname,cou[i].teacher);
}
fclose(f);//显示课程课号,课程名,任课教师
FILE *p;
p=fopen("score.txt","r");//读成绩文件
i=0;
while(fscanf(p,"%s",grad[i].no)!=EOF)
{
fscanf(p,"%s%d%d%d",grad[i].cno,&grad[i].pingshi_score,&grad[i].juanmian_score,&grad[i].score);
i++;
}
printf("学号\t课号\t平时成绩\t卷面成绩\t综合成绩\n");
for(i=0;i<grade_number;i++)
printf("%s\t%s\t%d\t\t%d\t\t%d\n",grad[i].no,grad[i].cno,grad[i].pingshi_score,grad[i].juanmian_score,grad[i].score);
fclose(p);//显示学号,课号,平时成绩,卷面成绩,综合成绩
menu();
}
void grade_Statistics() //成绩统计子菜单,输入选择
{
void high_grade(); //显示每门课程成绩最高的学生的基本信息
void aver_grade(); //显示每门课程的平均成绩
void fail_grade(); //显示每门课程不及格的学生信息
void menu(); //返回主菜单
int nm;
printf("|-----------------成绩统计系统----------------|\n");
printf("|*********************************************|\n");
printf("| 1-显示每门课程成绩最高的学生的基本信息 |\n");
printf("| 2-显示每门课程的平均成绩 |\n");
printf("| 3-显示每门课程不及格的学生信息 |\n");
printf("| 4-返回主菜单 |\n");
printf("|*********************************************|\n");
printf("|---------------------------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nm);
if(nm==1) high_grade(); //显示每门课程成绩最高的学生的基本信息
else if(nm==2) aver_grade(); //显示每门课程的平均成绩
else if(nm==3) fail_grade(); //显示每门课程不及格的学生信息
else if(nm==4) menu(); //返回主菜单
else printf("请输入1/2/3/4\n"); //输入其他给予提示
}
void read_course()
{
FILE *fp;
int i;
fp=fopen("course.txt","r");
for(i=0;i<COURSE;i++) //从文件中读课程信息,主要是读课程号
{
fscanf(fp,"%s%s%s",cou[i].cno,cou[i].cname,cou[i].teacher);
}//读入课程号,课程名,代课教师
fclose(fp);
}
void read_grade()
{
FILE *f;
int i;
f=fopen("score.txt","r");
for(i=0;i<grade_number;i++) //从文件中读成绩信息,主要读课程号和综合成绩
{
fscanf(f,"%s%s%d%d%d",grad[i].no,grad[i].cno,&grad[i].pingshi_score,&grad[i].juanmian_score,&grad[i].score);
} //读入成绩学号,课程名,平时成绩,卷面成绩 ,综合成绩
fclose(f);
}
void read_student()
{
FILE *f;
int i;
f=fopen("student.txt","r");
for(i=0;i<student_number;i++) //从文件中读成绩信息,主要读课程号和综合成绩
{
fscanf(f,"%s%s%s%d%s",stud[i].no,stud[i].name,stud[i].sex,&stud[i].age,stud[i].str);
}//读入学号,姓名,性别,年龄,所在系
fclose(f);
}
void high_grade() //显示每门课程成绩最高的学生的基本信息
{
int i,j,max,t;
void menu();
read_course(); //读取课程信息
read_grade(); //读取成绩信息
read_student(); //读取学生信息
printf("课号\t综合成绩\t学号\t姓名\t性别\t年龄\t所在系\n");
for(i=0;i<COURSE;i++) //共有COURSE门课程 ,查看COURSE门课程的最高分
{
max=0;
for(j=0;j<grade_number;j++) //共有STUDENT个学生,一个学生有COURSE门课程,共STUDENT*COURSE个,输入时按学号输入,STUDENT个人中都有该课程,所以要都遍历一遍
{
if(strcmp(cou[i].cno,grad[j].cno)==0) //课程号与成绩结构体中的课号相同,说明是同一节课
{
if(grad[j].score>max) //综合成绩大于最大值
{
max=grad[j].score;//将综合成绩赋给最大值,和下一个比较
t=(atoi)(grad[j].no); //最重要的是记下最大值的序号,循环结束后按学号输出
}
}
}
printf("%s\t%d\t\t%s\t%s\t%s\t%d\t%s\n",cou[i].cno,max,stud[t-1].no,stud[t-1].name,stud[t-1].sex,stud[t-1].age,stud[t-1].str);
}
menu();
}
void aver_grade() //显示每门课程的平均成绩
{
int i,j;
double sum=0,ave;
void menu();
read_course(); //读取课程信息
read_grade(); //读取成绩信息
printf("课号\t课名\t\t任课教师\t平均成绩\n");
for(i=0;i<COURSE;i++) //共有 COURSE个课程
{
sum=0;
for(j=0;j<grade_number;j++) //遍历 STUDENT*COURSE查找该课程
{
if(strcmp(cou[i].cno,grad[j].cno)==0) //找到该课程
{
sum=sum+grad[j].score; //sum记录该课程的成绩总和
}
}
ave=(double)sum/(student_number); //除以学生个数计算平均值
if(strcmp(cou[i].cno,"P02")==0)
{
printf("%s\t%s\t %s\t %.2f\n",cou[i].cno,cou[i].cname,cou[i].teacher,ave);
}
else
{
printf("%s\t%s\t%s\t\t%.2f\n",cou[i].cno,cou[i].cname,cou[i].teacher,ave);
}
}
menu();
}
void fail_grade() 显示每门课程不及格的学生信息
{
int i,j,t,num=0;
void menu();
read_course(); //读取课程信息
read_grade(); //读取成绩信息
read_student(); //读取学生信息
printf("课号\t综合成绩\t学号\t姓名\t性别\t年龄\t所在系\n");
for(i=0;i<COURSE;i++)
{
num=0;
for(j=0;j<grade_number;j++)
{
if(strcmp(cou[i].cno,grad[j].cno)==0) //课程号与成绩结构体中的课号相同,说明是同一节课
{
if(grad[j].score<60)
{
num++;
t=(atoi)(grad[j].no);
printf("%s\t%d\t\t%s\t%s\t%s\t%d\t%s\n",cou[i].cno,grad[j].score,stud[t-1].no,stud[t-1].name,stud[t-1].sex,stud[t-1].age,stud[t-1].str);
}
}
}
printf("%s课程有%d人不及格\n",cou[i].cno,num);
}
menu();
}
void grade_change()
{
void menu(); //返回主菜单
void update_grade();
void delete_student();
int nm;
printf("|-----------------成绩修改系统----------------|\n");
printf("|*********************************************|\n");
printf("| 1-修改成绩 |\n");
printf("| 2-删除 |\n");
printf("| 3-返回主菜单 |\n");
printf("|*********************************************|\n");
printf("|---------------------------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nm);
if(nm==1) update_grade(); //修改成绩
else if(nm==2) delete_student(); //删除
else if(nm==3) menu(); //返回主菜单
else printf("请输入1/2/3\n"); //输入其他给予提示
}
struct students
{
char stu_no[10];
char stu_name[10];
char stu_sex[2];
int stu_age;
char stu_str[10];
struct students *next;
};
struct courses
{
char cou_cno[10];
char cou_cname[15];
char cou_teacher[10];
struct courses *next;
};
struct grades
{
char grad_no[10];
char grad_cno[10];
int grad_pingshi_score;
int grad_juanmian_score;
int grad_score;
struct grades *next;
};
void update_grade()
{
void menu();
read_grade(); //读取成绩信息
printf("请您输入要修改的学生的学号:");
char change_no[10]; //要修改的学生的学号
char change_cno[10]; //要修改的课程号
int i,len,flag=0,j,tag=0; //flag检查学号,tag检查课程号
scanf("%s",change_no);
len=strlen(change_no); //判断学号是否符合规范
for(i=0;i<len;i++)
{
if(change_no[i]<'0'||change_no[i]>'9')
{
flag=1; //输入学号不符合规范
break;
}
}
if(flag==1) printf("学号输入错误\n");
int yes_no=0;
for(i=0;i<grade_number;i++)
{
if(strcmp(change_no,grad[i].no)==0)
yes_no=1;
}
if(yes_no==0) printf("输入学号不存在\n");
printf("请您输入要修改的课程号:");
scanf("%s",change_cno);
len=strlen(change_cno); //检查课程号是否规范
if(change_cno[0]!='P'&&change_cno[0]!='S') tag=1;
for(j=1;j<len;j++)
{
if(change_cno[j]<'0'||change_cno[j]>'9')
{
tag=1; //输入课程号不符合规范
break;
}
}
if(tag==1) printf("课程号输入错误\n");
int yes_cno=0;
for(i=0;i<grade_number;i++)
{
if(strcmp(change_cno,grad[i].cno)==0)
yes_cno=1;
}
if(yes_cno==0) printf("输入课程名不存在\n");
for(i=0;i<grade_number;i++)
{
if((strcmp(change_no,grad[i].no)==0)&&strcmp(change_cno,grad[i].cno)==0)
{
printf("请您选择需要修改平时成绩(1)还是卷面成绩(2)还是平时成绩和卷面成绩(3):");
int r;
scanf("%d",&r);
if(r==1)
{
printf("请您输入修改后的平时成绩:");
int change_pingshi;
scanf("%d",&change_pingshi);
grad[i].pingshi_score=change_pingshi;
if(grad[i].cno[0]=='P') //计算公共基础课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.3+grad[i].juanmian_score*0.7+0.5);
}//四舍五入法
else计算专业课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.4+grad[i].juanmian_score*0.6+0.5);
}//四舍五入法
}
else if(r==2)
{
printf("请您输入修改后的卷面成绩:");
int change_juanmian;
scanf("%d",&change_juanmian);
grad[i].juanmian_score=change_juanmian;
if(grad[i].cno[0]=='P') //计算公共基础课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.3+grad[i].juanmian_score*0.7+0.5);
}//四舍五入法
else计算专业课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.4+grad[i].juanmian_score*0.6+0.5);
}//四舍五入法
}
else if(r==3)
{
int a,b;
printf("请您输入修改后的平时成绩:");
scanf("%d",&a);
grad[i].pingshi_score=a;
printf("请您输入修改后的卷面成绩:");
scanf("%d",&b);
grad[i].juanmian_score=b;
if(grad[i].cno[0]=='P') //计算公共基础课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.3+grad[i].juanmian_score*0.7+0.5);
}//四舍五入法
else计算专业课综合成绩
{
grad[i].score=(int)(grad[i].pingshi_score*0.4+grad[i].juanmian_score*0.6+0.5);
}//四舍五入法
}
else printf("请输入1/2/3\n");
}
}
FILE *f;
f=fopen("score.txt","w");//向 score.txt文件中写入成绩信息
for(i=0;i<grade_number;i++)
fprintf(f,"%s\t%s\t%d\t%d\t%d\n",grad[i].no,grad[i].cno,grad[i].pingshi_score,grad[i].juanmian_score,grad[i].score);
fclose(f);
if(tag==0&&flag==0&&yes_no==1&&yes_cno==1) printf("成绩修改成功\n");
else printf("成绩修改失败\n");
menu();
}
void delete_student()
{
void menu();
struct students *creat();
//struct courses *creat1();
struct grades *creat2();
//struct courses *p1;
struct students *p,*r1=NULL,*r2=NULL,*head;
struct grades *p2,*r3=NULL,*r4=NULL,*t,*head2;
p=(*creat)();
head=p;
// p1=(*creat1)();
p2=(*creat2)();
head2=p2;
printf("请输入要删除的学生学号:");
char del[10];
int a=0,b=0;
scanf("%s",del);
if(p!=NULL)
{
r1=p;
r2=p->next;
if(strcmp(r1->stu_no,del)==0)
{
free(r1);
p=r2;
head=p;
a=1;
}
else
{
while(r2!=NULL)
{
if(strcmp(r2->stu_no,del)==0)
{
r1->next=r2->next;
free(r2);
a=1;
break;
}
r1=r2;
r2=r2->next;
}
}
}
if(a==1)
{
student_number--;
printf("学生信息删除成功\n");
}
else printf("学生信息删除失败\n");
if(p!=NULL)
{
do
{
printf("%s\t%s\t%s\t%d\t%s\n",p->stu_no,p->stu_name,p->stu_sex,p->stu_age,p->stu_str);
p=p->next;
}while(p!=NULL);
}
/* if(p1!=NULL)
{
do
{
printf("%s\t%s\t%s\n",p1->cou_cno,p1->cou_cname,p1->cou_teacher);
p1=p1->next;
}while(p1!=NULL);
}*/
if(p2!=NULL)
{
r3=p2;
r4=p2->next;
if(strcmp(r3->grad_no,del)==0)
{
int i;
for(i=0;i<STUDENT-2;i++)
{
free(r3);
r3=r4;
r4=r4->next;
}
p2=r4;
head2=p2;
b=1;
}
else
{
while(r4!=NULL)
{
if(strcmp(r4->grad_no,del)==0)
{
t=r4->next;
int i;
for(i=0;i<STUDENT-2;i++)
{
free(r4);
r4=t;
t=t->next;
}
r3->next=t;
b=1;
break;
}
r3=r4;
r4=r4->next;
}
}
}
if(b==1)
{
grade_number=grade_number-COURSE;
printf("成绩信息删除成功\n");
}
else printf("成绩信息删除失败\n");
if(p2!=NULL)
{
do
{
printf("%s\t%s\t%d\t%d\t%d\n",p2->grad_no,p2->grad_cno,p2->grad_pingshi_score,p2->grad_juanmian_score,p2->grad_score);
p2=p2->next;
}while(p2!=NULL);
}
//printf("%s\t%s\t%s\t%d\t%s\n",head->stu_no,head->stu_name,head->stu_sex,head->stu_age,head->stu_str);
// printf("%s\t%s\t%d\t%d\t%d\n",head2->grad_no,head2->grad_cno,head2->grad_pingshi_score,head2->grad_juanmian_score,head2->grad_score);
FILE *f;
f=fopen("student.txt","w");//向 student.txt文件中写入学生信息
while(head!=NULL)
{
fprintf(f,"%s\t%s\t%s\t%d\t%s\n",head->stu_no,head->stu_name,head->stu_sex,head->stu_age,head->stu_str);
head=head->next;
}
fclose(f);
FILE *fp;
fp=fopen("score.txt","w");//向 score.txt文件中写入成绩信息
while(head2!=NULL)
{
fprintf(fp,"%s\t%s\t%d\t%d\t%d\n",head2->grad_no,head2->grad_cno,head2->grad_pingshi_score,head2->grad_juanmian_score,head2->grad_score);
head2=head2->next;
}
fclose(fp);
menu();
}
struct students *creat()
{
read_student();
struct students *head,*p1,*p2;
p1=p2=(struct students*)malloc(LEN_student);
strcpy(p1->stu_no,stud[0].no);
strcpy(p1->stu_name,stud[0].name);
strcpy(p1->stu_sex,stud[0].sex);
p1->stu_age=stud[0].age;
strcpy(p1->stu_str,stud[0].str);
head=NULL;
head=p1;
int i;
for(i=1;i<student_number;i++)
{
p2=(struct students*)malloc(LEN_student);
strcpy(p2->stu_no,stud[i].no);
strcpy(p2->stu_name,stud[i].name);
strcpy(p2->stu_sex,stud[i].sex);
p2->stu_age=stud[i].age;
strcpy(p2->stu_str,stud[i].str);
p1->next=p2;
p1=p2;
}
p1->next=NULL;
p2->next=NULL;
return (head);
}
struct courses *creat1()
{
read_course(); //读取课程信息
struct courses *head,*p1,*p2;
p1=p2=(struct courses*)malloc(LEN_course);
strcpy(p1->cou_cno,cou[0].cno);
strcpy(p1->cou_cname,cou[0].cname);
strcpy(p1->cou_teacher,cou[0].teacher);
head=NULL;
head=p1;
int i;
for(i=1;i<COURSE;i++)
{
p2=(struct courses*)malloc(LEN_course);
strcpy(p2->cou_cno,cou[i].cno);
strcpy(p2->cou_cname,cou[i].cname);
strcpy(p2->cou_teacher,cou[i].teacher);
p1->next=p2;
p1=p2;
}
p1->next=NULL;
p2->next=NULL;
return (head);
}
struct grades *creat2()
{
read_grade(); //读取成绩信息
struct grades *head,*p1,*p2;
p1=p2=(struct grades*)malloc(LEN_grade);
strcpy(p1->grad_no,grad[0].no);
strcpy(p1->grad_cno,grad[0].cno);
p1->grad_pingshi_score=grad[0].pingshi_score;
p1->grad_juanmian_score=grad[0].juanmian_score;
p1->grad_score=grad[0].score;
head=NULL;
head=p1;
int i;
for(i=1;i<grade_number;i++)
{
p2=(struct grades*)malloc(LEN_grade);
strcpy(p2->grad_no,grad[i].no);
strcpy(p2->grad_cno,grad[i].cno);
p2->grad_pingshi_score=grad[i].pingshi_score;
p2->grad_juanmian_score=grad[i].juanmian_score;
p2->grad_score=grad[i].score;
p1->next=p2;
p1=p2;
}
p1->next=NULL;
p2->next=NULL;
return (head);
}
void find_no()
{
void menu();
struct students *creat();
struct students *p;
p=(*creat)();
printf("请输入要查询的学生的学号:");
char findno[10];
int flag=0;
scanf("%s",findno);
while(p!=NULL)
{
if(strcmp(p->stu_no,findno)==0)
{
flag=1;
printf("%s\t%s\t%s\t%d\t%s\n",p->stu_no,p->stu_name,p->stu_sex,p->stu_age,p->stu_str);
break;
}
else
p=p->next;
}
if(flag==0) printf("输入学生学号错误,查询失败\n");
else printf("查询成功\n");
menu();
}
void find_name()
{
void menu();
struct students *creat();
struct students *p;
p=(*creat)();
printf("请输入要查询的学生的姓名:");
char findname[10];
int flag=0;
scanf("%s",findname);
while(p!=NULL)
{
if(strcmp(p->stu_name,findname)==0)
{
flag=1;
printf("%s\t%s\t%s\t%d\t%s\n",p->stu_no,p->stu_name,p->stu_sex,p->stu_age,p->stu_str);
p=p->next;
}
else
p=p->next;
}
if(flag==0) printf("输入学生姓名错误,查询失败\n");
else printf("查询成功\n");
menu();
}
void find_sex()
{
void menu();
struct students *creat();
struct students *p;
p=(*creat)();
printf("请输入要查询的学生的性别(男/女):");
char findsex[10];
int flag=0;
scanf("%s",findsex);
if((strcmp(findsex,"男")!=0)&&(strcmp(findsex,"女")!=0))
printf("输入学生性别错误,查询失败\n");
while(p!=NULL)
{
if(strcmp(p->stu_sex,findsex)==0)
{
flag=1;
printf("%s\t%s\t%s\t%d\t%s\n",p->stu_no,p->stu_name,p->stu_sex,p->stu_age,p->stu_str);
p=p->next;
}
else
p=p->next;
}
if(flag==1) printf("查询成功\n");
menu();
}
void find_str()
{
void menu();
struct students *creat();
struct students *p;
p=(*creat)();
printf("请输入要查询的学生所在系:");
char findstr[10];
int flag=0;
scanf("%s",findstr);
while(p!=NULL)
{
if(strcmp(p->stu_str,findstr)==0)
{
flag=1;
printf("%s\t%s\t%s\t%d\t%s\n",p->stu_no,p->stu_name,p->stu_sex,p->stu_age,p->stu_str);
p=p->next;
}
else
p=p->next;
}
if(flag==1) printf("查询成功\n");
else printf("输入学生所在系错误,查询失败\n");
menu();
}
void find_infor()
{
void menu(); //返回主菜单
int nm;
printf("|---------------学生信息查询系统--------------|\n");
printf("|*********************************************|\n");
printf("| 1-按学号查询 |\n");
printf("| 2-按姓名查询 |\n");
printf("| 3-按性别查询 |\n");
printf("| 4-按所在系查询 |\n");
printf("| 5-返回主菜单 |\n");
printf("|*********************************************|\n");
printf("|---------------------------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nm);
if(nm==1) find_no();
else if(nm==2) find_name();
else if(nm==3) find_sex();
else if(nm==4) find_str();
else if(nm==5) menu();
else printf("请输入1/2/3/4/5\n");
}
void find_score_no()
{
void menu();
struct grades *creat2();
struct grades *p;
p=(*creat2)();
printf("请输入要查询的学生成绩的学号:");
char findscore_no[10];
int flag=0;
scanf("%s",findscore_no);
while(p!=NULL)
{
if(strcmp(findscore_no,p->grad_no)==0)
{
flag=1;
printf("%s\t%s\t%d\t%d\t%d\n",p->grad_no,p->grad_cno,p->grad_pingshi_score,p->grad_juanmian_score,p->grad_score);
p=p->next;
}
else
p=p->next;
}
if(flag==0) printf("输入学号错误,查询失败\n");
else printf("查询成功\n");
menu();
}
void find_score_name()
{
void menu();
struct grades *creat2();
struct students *creat();
struct grades *p;
struct students *q;
p=(*creat2)();
q=(*creat)();
printf("请输入要查询的学生成绩的姓名:");
char findscore_name[10];
int flag=0;
scanf("%s",findscore_name);
while(q!=NULL)
{
if(strcmp(findscore_name,q->stu_name)==0)
{
flag=1;
printf("%s\t%s\t%s\t%s\n",q->stu_no,q->stu_name,q->stu_sex,q->stu_str);
while(p!=NULL)
{
if(strcmp(q->stu_no,p->grad_no)==0)
{
printf("%s\t%d\n",p->grad_cno,p->grad_score);
p=p->next;
}
else p=p->next;
}
q=q->next;
}
else
q=q->next;
}
if(flag==0) printf("输入姓名错误,查询失败\n");
else printf("查询成功\n");
menu();
}
void find_score_cname()
{
void menu();
struct courses *creat1(); //通过查询课程文件找到课程号
struct grades *creat2();
struct grades *p;
struct courses *q;
p=(*creat2)();
q=(*creat1)();
printf("请输入要查询的课程名:");
char findscore_cname[15],findscore_cno[10];
int flag=0;
scanf("%s",findscore_cname);
while(q!=NULL)
{
if(strcmp(findscore_cname,q->cou_cname)==0)
{
strcpy(findscore_cno,q->cou_cno); //找到课程号放在 findscore_cno中
break;
}
q=q->next;
}
while(p!=NULL)
{
if(strcmp(p->grad_cno,findscore_cno)==0) //从成绩文件中找到课程号相同的
{
flag=1;
printf("%s\t%s\t%d\t%d\t%d\n",p->grad_no,p->grad_cno,p->grad_pingshi_score,p->grad_juanmian_score,p->grad_score);
}
p=p->next;
}
if(flag==0) printf("输入课程名错误,查询失败\n");
else printf("查询成功\n");
menu();
}
void find_score()
{
void menu(); //返回主菜单
int nm;
printf("|---------------学生成绩查询系统--------------|\n");
printf("|*********************************************|\n");
printf("| 1-按学号查询 |\n");
printf("| 2-按姓名查询 |\n");
printf("| 3-按课程查询 |\n");
printf("| 4-返回主菜单 |\n");
printf("|*********************************************|\n");
printf("|---------------------------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nm);
if(nm==1) find_score_no();
else if(nm==2) find_score_name();
else if(nm==3) find_score_cname();
else if(nm==4) menu();
else printf("请输入1/2/3/4\n");
}
void find()
{
void menu();
int nm;
printf("|-------------------查询系统------------------|\n");
printf("|*********************************************|\n");
printf("| 1-学生信息查询 |\n");
printf("| 2-学生成绩查询 |\n");
printf("| 3-返回主菜单 |\n");
printf("|*********************************************|\n");
printf("|---------------------------------------------|\n");
printf("请选择菜单序号:");
scanf("%d",&nm);
if(nm==1) find_infor();
else if(nm==2) find_score();
else if(nm==3) menu();
else printf("请输入1/2/3\n");
}
void back() //退出系统,返回登录界面
{
void menu();
if(load()) //登录成功,则进入主菜单
menu();
}
void menu()
{
int choose1;
choose1=main_Menu(); //从 main_Menu()中返回进行的操作
switch(choose1)
{
case 1:
{
infor_manage(); //用户信息管理,包括修改密码和添加管理员信息
break;
}
case 2:
{
infor_in(); //将学生信息,课程信息,成绩信息添加到文件中
break;
}
case 3:
{
infor_show(); //显示信息,显示学生及成绩信息
break;
}
case 4:
{
printf("请再次输入密码:");
FILE *fp;
int i;
fp=fopen("infor.txt","r");//从文件中读管理员信息
for(i=0;i<n;i++)//确认密码是否正确
{
fscanf(fp,"%s",all_user[i]);
fscanf(fp,"%s",all_passWord[i]);
}
fclose(fp); //再次输入正确密码确认
char sure_password[10];
scanf("%s",sure_password);
if(strcmp(all_passWord[t],sure_password)==0)
{
grade_change(); //修改成绩
break;
}
else
{
printf("密码输入错误\n");
int len=strlen(sure_password),i,flag=0;
if(len>10) printf("密码应在10位以内\n");
for(i=0;i<len;i++)
{
if(sure_password[i]<'0'||sure_password[i]>'9')
{
flag=1;
break;
}
}
if(flag==1) printf("密码应全为0-9字符\n");
menu();
}
}
case 5:
{
find(); //查询信息
break;
}
case 6:
{
grade_Statistics(); //统计成绩包括显示每门课程成绩最高的学生的基本信息,显示每门课程的平均成绩,显示每门课程不及格(综合成绩小于60分)的学生信息,并统计出人数
break;
}
case 0:
{
back(); //退出系统,返回登录界面
break;
}
default:
{
printf("请按需要输入数字\n");
break;
}
}
}
int main()
{
if(load()) //先登录,登录成功后再进入主菜单,进行其他操作
{
menu(); //登录成功,进入主菜单
}
return 0;
}
用户名