学生成绩管理系统C++

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;
}

用户名
在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值