用顺序储存和链式储存两种方式实现班级管理

案例问题描述:
班级是学生生活、学习和成长的重要组织机构。每个班级有很多成员,主要包括课任老师和学生两大类,其中课任老师有分担班级教学工作和管理工作差异;学生除了各科成绩外,也有在班级工作中的分工不同。本实验要求同学们根据自己所在班级成员管理的线性表特性,应用所学的线性表知识设计一个基本的班级管理系统。该系统至少包含新成员入社、老成员退社、成员查询,以及两个班级合并等功能。
具体要求:

  1. 请用结构体描述班级成员;
  2. 分别用顺序储存和链式储存两种方式存储班级成员信息;
顺序表实现:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include<cstring>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10


//登录存储

typedef struct
{
	int storte;           //登录用户结构体,包括用户类别(导员,老师,学生)、登录账号、登录密码
	char user[20];
	char code[20];
}users;

typedef struct {
	users	*us;             //存储登录用户结构体的线性表。
	int length;
	int listsize;
}Uqlist;



//班级存储模块。

enum random { 未出成绩,不及格,及格,良好,优秀, 未选 };			 //枚举类型,表示选修课的成绩。
const int 未出成绩 = 0;
typedef struct sc
{
	random xuanxiu1;
	random xuanxiu2;        //选修课结构体,包括了所有的选修课。
	random xuanxiu3;
}sc;

//老师结构体,存储老师信息
typedef struct teacher
{
	int jibie;			/*导员标记为0,授课老师标记为1*/
	char bianhao[20];	//老师编号
	char name[20];
	char sex[10];
	char kemu[20];			//老师教授科目
	char callnumber[20];		/*电话号码*/
}teachar;

/*定义一个结构体数组存放学生的信息*/
typedef struct student
{
	char number[20];   /*学号*/
	char name[20];     /*名字*/
	char banjizhiwu[20];	/*班级职务*/
	char xueyuan[20];	/*学院*/
	char sex[10];	/*性别*/
	char cla[20];	/*班级*/
	sc xuanxiu;		/*选修课*/
	int gaoshu;		/*必修:高数*/
	int xiandai;	/*必修:线性代数*/
	int yingyu;		/*必修:英语*/
	int sum;	/*总分*/
	int average;	/*平均分*/
}student;

//存储学生结构体的线性表
typedef struct {
	student	*stu;
	int length;
	int listsize;
}Ssqlist;

//存储老师结构体的线性表
typedef struct {
	teacher *tea;
	int length;
	int listsize;
}Tsqlist;

//班级结构体,包括班级名字,学生线性表,老师线性表。
typedef struct clas
{
	char classname[20];
	Ssqlist stuql;
	Tsqlist teaql;
}clas;


/*---------------------------------------------------------------------------------------------------------------*/

//登录用户表的初始构造函数
int InitList_Sq(Uqlist &L)
{
	L.us = (users*)malloc(LIST_INIT_SIZE * sizeof(users));
	if (!L.us)
		exit(0);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return 0;
}

//登录用户表的增加一个新用户的函数(改造自课本24页的算法2.4)-----供 adduser(Uqlist &L)调用。
int listadd(Uqlist &L, users user)
{
	if (L.length >= L.listsize)
	{
		users* newbase;
		newbase = (users*)realloc(L.us, (L.listsize + LISTINCREMENT) * sizeof(users));
		if (!newbase)
			exit(0);
		L.us = newbase;
		L.listsize += LISTINCREMENT;
	}
	users *q = &(L.us[L.length]);
	*q = user;
	++L.length;
	printf("恭喜注册成功!");
	return 0;
}

//真正实现新用户的添加,实现功能:2.直接注册-----函数内调用listadd(Uqlist &L,  users user)
int adduser(Uqlist &L)
{
	users temp;
	printf("\n请输入您的身份,导员call 0,老师call 1,学生call 2: ");
	scanf_s("%d", &temp.storte);
	printf("\n请输入您的账号:");
	scanf_s("%s", &temp.user, 20);
	int label;
	printf("\n请输入您的密码:");
	scanf_s("%s", &temp.code, 20);
	char rcode[20];
	printf("\n请再次确认您的密码:");
	scanf_s("%s", &rcode, 20);
	label = strcmp(temp.code, rcode);
	while (label != 0)
	{
		printf("\n两次密码不相同,请重新输入您的密码:");
		scanf_s("%s", temp.code, 20);
		char rcode[20];
		printf("\n请再次确认您的密码:");
		scanf_s("%s", rcode, 20);
		label = strcmp(temp.code, rcode);
	}
	listadd(L, temp);
	return 0;
}

//用户账户的注销函数 (改造自课本24页算法2.5)。
int listdelete(Uqlist &L)
{
	int  stemp;
	char zhanghu[20];
	printf("\n请输入您的身份(导员:0,老师:1,学生:2): ");
	scanf_s("%d", &stemp);
	printf("\n请输入您要注销的账户: ");
	scanf_s("%s", zhanghu, 20);
	if (L.length == 1) {
		L.us = NULL;
		printf("\n注销成功!");
	}
	else
	{
		users *p = L.us;
		int m = 1;
		for (int i = 0; i <= L.length; i++)
		{
			if (strcmp(p->user, zhanghu) == 0 && p->storte == stemp)
			{
				m++;
				printf("\n您是否确定要注销账户%s,(是的话输入0,否的话输入1): ", &p->user);
				int j;
				scanf_s("%d", &j);
				if (j == 0)
				{
					users *q = L.us + L.length - 1;
					for (++p; p <= q; ++p)
						*(p - 1) = *p;
					--L.length;
					printf("\n%s账户已注销!", &zhanghu);
					break;
				}
			}
			p++;

		}
		if (m = 1) {
			printf("\n未找到账户");
		}
	}
	return 0;
}

//打开用户手册文件,提供 1.阅读用户手册 功能。
int readar()
{
	char txt[500] = { '\0' };
	errno_t err;
	FILE *stream;
	if ((err = fopen_s(&stream, "用户手册.txt", "r")) != 0)
	{
		printf("\n\t\t打开失败");
	}
	fread(txt, 2, 500, stream);
	printf("\n\t\t%s", txt);
	/*txt=fgets(txt,100,fp);
	printf("%s",txt); */
	return 0;
}

void daoyuandenglu(Uqlist &L, clas banjidizhi[20]);
void laoshidenglu(Uqlist &L, clas banjidizhi[20]);    //具体实现在后面。
void xueshengdenglu(Uqlist &L, clas banjidizhi[20]);

//登录模块。实现功能:3.直接登陆
void denglu(Uqlist &L, clas banjidizhi[20])
{
	char zhanghu[20], code[20];
	int temp;      //定义两个数组,存放键盘输入的用户名和密码
	printf("\n\t\t\t\t用户登录");
	printf("\n\t请输入您的身份(导员:0,老师:1,学生:2): ");
	scanf_s("%d", &temp);
	printf("\n\t\t用户名: ");
	/*判断用户名是否存在*/
	scanf_s("%s", zhanghu, 20);
	users *p = L.us;
	char j = '1';
	for (int i = L.length; i >= 0; i--)
	{
		if (strcmp(p->user, zhanghu) == 0 && p->storte == temp)
		{
			j = '2';
			while (j == '2')
			{
				printf("\t\t密码: ");
				scanf_s("%s", &code, 20);
				if (strcmp(p->code, code) != 0)                      //对比输入的密码和读取的密码
				{
					printf("\n\t\t密码错误(选择1.退出 2.重新输入): ");
					j = getchar();
					printf("\n");
					if (j == '1')
						exit(0);
				}
				else
				{
					j = '3';
					printf("\n登陆成功,欢迎您光临教务系统!------技术支持:田,王,肖,江\n");
					switch (temp) /*多重选择实现功能不同的功能*/
					{
					case 0:
						while (1)
						{
							daoyuandenglu(L, banjidizhi);
						}
						break;
					case 1:
						while (1)
						{
							laoshidenglu(L, banjidizhi);
						}
						break;
					case 2:
						while (1)
						{
							xueshengdenglu(L, banjidizhi);
						}
						break;
					default:
						break;
					}/*结束switch*/
				}
			}
			break;
		}
		p++;
	}
	if (j == '1')
		printf("\n对不起未查找到账户");
}



/*界面模块*/
void jiemian(Uqlist &L, clas banjidizhi[20])
{
	int cha;
	printf("\n****************************      登陆界面       *******************************");
	printf("\n**********************        1.阅读用户手册          **************************");
	printf("\n**********************        2.直接注册              **************************");
	printf("\n**********************        3.直接登陆              **************************");
	printf("\n**********************        4.注销账户              **************************");
	printf("\n**********************        5.退出界面              **************************");
	printf("\n请选择您要进行的操作:");
	scanf_s("%d", &cha);
	switch (cha) /*多重选择实现功能不同的功能*/
	{
	case 1:
		readar();
		break;
	case 2:
		adduser(L);
		break;
	case 3:
		denglu(L, banjidizhi);
		break;
	case 4:
		listdelete(L);
		break;
	case 5:
		printf("\n谢谢使用!再见!\n");
		exit(0);
	default:
		printf("\n按键错误!请重新选择!\n");
	}/*结束switch*/

}


//以上实现登录之前的操作
/*---------------------------------------------------------------------------------------------------------------*/
//以下实现三种身份对应的所能选择的操作



//存学生结构体线性表的初始构造。
int initlists(Ssqlist &L)
{
	L.stu = (student *)malloc(LIST_INIT_SIZE * sizeof(student));
	if (!L.stu)
		exit(0);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return 0;
}
//存老师结构体线性表的初始构造。
int initlistt(Tsqlist &L)
{
	L.tea = (teachar *)malloc(LIST_INIT_SIZE * sizeof(teachar));
	if (!L.tea)
		exit(0);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return 0;
}



//实现合并班级
void hebingbanji(clas banjidizhi[20])//传入参数为存有20个班级类型的数组。
{
	int i;
	int j;
	char classtemp1[20];
	char classtemp2[20];
	printf("\n请输入您要操作的第一个班级:");
	scanf_s("%s", classtemp1, 20);
	printf("\n请输入您要操作的第二个班级:");
	scanf_s("%s", classtemp2, 20);
	for (i = 0; i < 20; i++)
	{
		if (strcmp(banjidizhi[i].classname, classtemp1) == 0)
		{
			break;
		}
	}
	for (j = 0; j <= 20; j++)
	{
		if (strcmp(banjidizhi[j].classname, classtemp2) == 0)
		{
			break;
		}
	}

	printf("请输入新合成的班级名字:");
	clas temp;
	scanf_s("%s", temp.classname, 20);
	temp.stuql.listsize = banjidizhi[i].stuql.length + banjidizhi[j].stuql.length;
	temp.stuql.stu = (student *)malloc(temp.stuql.listsize * sizeof(student));
	if (!temp.stuql.stu)
	{
		exit(0);//存储分配失败。
	}
	student * a = banjidizhi[i].stuql.stu;
	student * b = banjidizhi[j].stuql.stu;
	student *m = temp.stuql.stu;
	while (a <= banjidizhi[i].stuql.stu + banjidizhi[i].stuql.length - 1)
	{

		*m = *a;
		*m++;
		*a++;
	}
	while (b <= banjidizhi[j].stuql.stu + banjidizhi[j].stuql.length - 1)
	{
		*m = *b;
		*m++;
		*b++;
	}
	teachar * c = banjidizhi[i].teaql.tea;
	teachar * d = banjidizhi[j].teaql.tea;
	teacher *n = temp.teaql.tea;
	while (c <= banjidizhi[i].teaql.tea + banjidizhi[i].teaql.length - 1)
	{
		*n++ = *c++;
	}
	while (d <= banjidizhi[j].teaql.tea + banjidizhi[j].teaql.length - 1)
	{
		*n++ = *d++;
	}
	for (int i = 0; i <= 20; i++)
	{
		if (strcmp(banjidizhi[i].classname, "") == 0)
		{
			banjidizhi[i] = temp;
			printf("新建班级成功");
			break;
		}
	}
}

//新建班级
void makeclass(clas c[20])
{
	char nam[20];
	printf("请输入您所要添加的班级名字:");
	scanf_s("%s", &nam, 20);

	for (int i = 0; i <= 20; i++)
	{
		//if (strlen(c[i].classname) == 0)    memset(buff, '\0', sizeof(buff));
		if (strcmp(c[i].classname, "") == 0)                                                                            //
		{
			memcpy(c[i].classname, nam, 20);/*内存复制函数,将nam中20个字节完整复制到c[i]->classname*/
			printf("添加班级成功!");
			break;
		}
		else
		{
			c++;
		}

	}

}

//添加学生
void addstudent(clas &c)
{
	if (c.stuql.length >= c.stuql.listsize)
	{
		student* newbase;
		newbase = (student*)realloc(c.stuql.stu, (c.stuql.listsize + LISTINCREMENT) * sizeof(student));
		if (!newbase)
			exit(0);
		c.stuql.stu = newbase;
		c.stuql.listsize += LISTINCREMENT;
	}
	student temp;
	printf("\n请输入学生学号: ");
	scanf_s("%s", temp.number, 20);
	printf("\n请输入学生名字: ");
	scanf_s("%s", temp.name, 20);
	printf("\n请输入学生班级职务: ");
	scanf_s("%s", temp.banjizhiwu, 20);
	printf("\n请输入学生学院: ");
	scanf_s("%s", temp.xueyuan, 20);
	printf("\n请输入学生性别: ");
	scanf_s("%s", temp.sex, 10);
	printf("\n请输入学生班级: ");
	scanf_s("%s", temp.cla, 20);
	temp.gaoshu = -1;
	temp.xiandai = -1;
	temp.yingyu = -1;
	temp.average = -1;
	temp.sum = -1;
	temp.xuanxiu.xuanxiu1 = random(未出成绩);
	temp.xuanxiu.xuanxiu2 = random(未出成绩);
	temp.xuanxiu.xuanxiu3 = random(未出成绩);
	student *q = &(c.stuql.stu[c.stuql.length]);
	*q = temp;
	++c.stuql.length;
	printf("添加学生成功!");
}
//添加老师
void addteacher(clas &c)
{
	if (c.teaql.length >= c.teaql.listsize)
	{
		teacher* newbase;
		newbase = (teacher*)realloc(c.teaql.tea, (c.teaql.listsize + LISTINCREMENT) * sizeof(teacher));
		if (!newbase)
			exit(0);
		c.teaql.tea = newbase;
		c.teaql.listsize += LISTINCREMENT;
	}
	teacher temp;
	printf("\n请输入老师级别: ");
	scanf_s("%d", &temp.jibie);
	printf("\n请输入老师编号: ");
	scanf_s("%s", temp.bianhao, 20);
	printf("\n请输入老师姓名: ");
	scanf_s("%s", temp.name, 20);
	printf("\n请输入老师性别: ");
	scanf_s("%s", temp.sex, 10);
	printf("\n请输入老师教授科目: ");
	scanf_s("%s", temp.kemu, 20);
	printf("\n请输入老师电话号码: ");
	scanf_s("%s", temp.callnumber, 20);

	teacher *q = &(c.teaql.tea[c.teaql.length]);
	*q = temp;
	++c.teaql.length;
	printf("添加老师成功!");
}
//删除学生
void deletestudent(clas &c)
{
	char temp[20];
	int k = 0;
	printf("\n请输入您要注销的学生学号:");
	scanf_s("%s", temp, 20);
	student *p = c.stuql.stu;
	if (c.stuql.length == 0 && strcmp(p->number, temp) == 0) {
		c.stuql.stu = NULL;
		printf("\n账户已注销!");
	}
	for (int i = c.stuql.length; i > 0; i--)
	{
		if (strcmp(p->number, temp) == 0)
		{
			int j;
			k = 1;
			printf("\n您是否确定要注销账户%s,(选择:是输入0,否输入1): ", p->number);
			scanf_s("%d", &j);
			if (j == 0)
			{
				student *q = c.stuql.stu + c.stuql.length - 1;
				for (++p; p <= q; ++p)
					*(p - 1) = *p;
				--c.stuql.length;
				printf("\n账户已注销!");
				break;
			}
			else
				break;
		}
		p++;
	}
	if (k == 0)
	{
		printf("\n未找到账户");
	}
}

//修改学生信息。
void restudent(clas &c)
{
	char temp[20];
	int j = 0;
	printf("\n请输入您要修改的学生学号:");
	scanf_s("%s", temp, 20);
	student *p = c.stuql.stu;
	for (int i = c.stuql.length; i > 0; i--)
	{
		if (strcmp(p->number, temp) == 0)
		{
			j = 1;
			printf("\n请输入学生学号: ");
			scanf_s("%s", c.stuql.stu->number, 20);
			printf("\n请输入学生名字: ");
			scanf_s("%s", c.stuql.stu->name, 20);
			printf("\n请输入学生班级职务: ");
			scanf_s("%s", c.stuql.stu->banjizhiwu, 20);
			printf("\n请输入学生学院: ");
			scanf_s("%s", c.stuql.stu->xueyuan, 20);
			printf("\n请输入学生性别: ");
			scanf_s("%s", c.stuql.stu->sex, 2);
			printf("\n请输入学生班级: ");
			scanf_s("%s", c.stuql.stu->cla, 20);
			printf("修改成功!");
			break;
		}
		p++;
	}
	if (j == 0)
	{
		printf("\n未找到账户");
	}

}

void printff(random a)
{
	switch (a)
	{
	case 0:
		printf("未出成绩");
		break;
	case 1:
		printf("不及格");
		break;
	case 2:
		printf("及格");
		break;
	case 3:
		printf("良好");
		break;
	case 4:
		printf("优秀");
		break;
	case 5:
		printf("未选");
		break;
	case 6:
		printf("未出成绩");
		break;
	}
}
//输出学生的各个信息。供lookstudentxuehao(clas * c),lookstudentname(clas * c)调用。
void printt(student* s)
{
	printf("\n学号: %s", s->number);
	printf("\n姓名: %s", s->name);
	printf("\n班级职务: %s", s->banjizhiwu);
	printf("\n学院: %s", s->xueyuan);
	printf("\n性别: %s", s->sex);
	printf("\n班级: %s", s->cla);
	printf("\n选修1成绩: ");
	printff(s->xuanxiu.xuanxiu1);
	printf("\n选修2成绩: ");
	printff(s->xuanxiu.xuanxiu2);
	printf("\n选修3成绩: ");
	printff(s->xuanxiu.xuanxiu3);
	printf("\n高数成绩: %d", s->gaoshu);
	printf("\n现代成绩: %d", s->xiandai);
	printf("\n英语成绩: %d", s->yingyu);
	s->sum = s->gaoshu + s->xiandai + s->yingyu;
	printf("\n总成绩: %d", s->sum);
	s->average = s->sum / 3;
	printf("\n平均成绩: %d", s->average);
}

//以学号为索引查询学生
void lookstudentxuehao(clas c)
{
	char temp[20];
	int i,m;
	printf("\n请输入您要查找的学生学号:");
	scanf_s("%s", temp, 20);
	student *p = c.stuql.stu;
	for (m=0,i = 0; i <= 20; i++)
	{
		if (strcmp(p->number, temp) == 0)
		{
			m = 1;
			printt(p);
			break;
		}
		p++;
	}
	if (m == 0)
	{
		printf("\n未找到账户\n");
	}
}
//以学生姓名为索引查询学生。
void lookstudentname(clas c)
{
	char temp[20];
	int j = 0;
	printf("\n请输入您要查找的学生姓名:");
	scanf_s("%s", temp, 20);
	student *p = c.stuql.stu;
	for (int i = c.stuql.length; i >= 0; i--)
	{
		if (strcmp(p->name, temp) == 0)
		{
			j = 1;
			printt(p);
			break;
		}
		p++;
	}
	if (j == 0)
	{
		printf("\n未找到账户");
	}
}
//学生查询,调用lookstudentxuehao(clas * c),lookstudentname(clas * c)
void lookstudent(clas c)
{
	printf("请输入您要查询的方式(学号查询请按1,姓名查询请按2):");
	int tem;
	scanf_s("%d", &tem);
	switch (tem) /*多重选择实现功能不同的功能*/
	{
	case 1:
		lookstudentxuehao(c);
		break;
	case 2:
		lookstudentname(c);
		break;
	default:
		printf("\n按键错误!请重新选择!\n");
	}
}

//导员查询班级总体成绩。
void grade(clas p)
{
	int choice;
	printf("\n1.查询全班高数成绩");
	printf("\n2.查询全班高数平均成绩");
	printf("\n3.查询全班现代函数成绩");
	printf("\n4.查询全班现代函数平均成绩");
	printf("\n5.查询全班英语成绩");
	printf("\n6.查询全班英语平均成绩");
	printf("\n7.查询全班选修1成绩");
	printf("\n8.查询全班选修2成绩");
	printf("\n9.查询全班选修3成绩");
	printf("\n0.查询全班总平均分");
	printf("\n请输入您的选择:");
	scanf_s("%d", &choice);
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
	{
		student * q = p.stuql.stu;
		int av, sum = 0;
		for (int i = 0; i < p.stuql.length; i++)
		{
			sum += q->average;
			q++;
		}
		av = sum / p.stuql.length;
		printf("\n全班总平均分: %d", av);
	}
	break;
	case 1:
	{
		student * q = p.stuql.stu;
		printf("\n数学成绩:");
		for (int i = 1; i <= p.stuql.length; i++)
		{
			printf("\n%s", q->name);
			printf("\t\t\t%d", q->gaoshu);
			q++;
		}
	}
	break;
	case 2:
	{
		student * q = p.stuql.stu;
		int av, sum = 0;
		for (int i = 1; i <= p.stuql.length; i++)
		{
			sum += q->gaoshu;
		}
		av = sum / p.stuql.length;
		printf("全班高数平均成绩: %d", av);
	}
	break;
	case 3:
	{
		student * q = p.stuql.stu;
		printf("\n线代成绩:");
		for (int i = 1; i <= p.stuql.length; i++)
		{
			printf("\n%s", q->name);
			printf("\t\t\t%d", q->xiandai);
			q++;
		}
	}
	break;
	case 4:
	{
		student * q = p.stuql.stu;
		int av, sum = 0;
		for (int i = 1; i <= p.stuql.length; i++)
		{
			sum += q->xiandai;
		}
		av = sum / p.stuql.length;
		printf("全班线代平均成绩: %d", av);
	}
	break;
	case 5:
	{
		student * q = p.stuql.stu;
		printf("\n英语成绩:");
		for (int i = 1; i <= p.stuql.length; i++)
		{
			printf("\n%s", q->name);
			printf("\t\t\t%d", q->yingyu);
			q++;
		}
	}
	break;
	case 6:
	{
		student * q = p.stuql.stu;
		int av, sum = 0;
		for (int i = 1; i <= p.stuql.length; i++)
		{
			sum += q->yingyu;
		}
		av = sum / p.stuql.length;
		printf("全班英语平均分: %d", av);
	}
	break;
	case 7:
	{
		student * q = p.stuql.stu;
		printf("\n选修1成绩:");
		for (int i = 1; i <= p.stuql.length; i++)
		{
			printf("\n%s", q->name);
			printf("\t\t\t%d", q->xuanxiu.xuanxiu1);
			q++;
		}
	}
	break;
	case 8:
	{
		student * q = p.stuql.stu;
		printf("\n选修2成绩:");
		for (int i = 1; i <= p.stuql.length; i++)
		{
			printf("\n%s", q->name);
			printf("\t\t\t%d", q->xuanxiu.xuanxiu2);
			q++;
		}
	}
	break;
	case 9:
	{
		student * q = p.stuql.stu;
		printf("\n选修3成绩:");
		for (int i = 1; i <= p.stuql.length; i++)
		{
			printf("\n%s", q->name);
			printf("\t\t\t%d", q->xuanxiu.xuanxiu3);
			q++;
		}
	}
	break;
	default:
		printf("\n按键错误!请重新选择!\n");
	}/*结束switch*/

}

//科任老师录入成绩。
void addgrade(clas &c)
{
	int choice;
	student * s = c.stuql.stu;
	printf("\n请输入您要输入成绩的科目:");
	printf("\n1.高数");
	printf("\n2.现性代数");
	printf("\n3.英语");
	printf("\n4.选修1");
	printf("\n5.选修2");
	printf("\n6.选修3\n");
	scanf_s("%d", &choice);
	switch (choice)
	{
	case 1:
	{
		for (int i = 1; i <= c.stuql.length; i++)
		{
			printf("\n%s\t请输入成绩: ", s->name);
			scanf_s("%d", &s->gaoshu);
			s++;
		}
	}
	break;
	case 2:
	{
		for (int i = 1; i <= c.stuql.length; i++)
		{
			printf("\n%s\t: ", s->name);
			scanf_s("%d", &s->xiandai);
			s++;
		}
	}
	break;
	case 3:
	{
		for (int i = 1; i <= c.stuql.length; i++)
		{
			printf("\n%s\t: ", s->name);
			scanf_s("%d", &s->yingyu);
			s++;
		}
	}
	break;
	case 4:
	{
		for (int i = 1; i <= c.stuql.length; i++)
		{
			printf("\n%s\t: ", s->name);
			scanf_s("%d", &s->xuanxiu.xuanxiu1);
			s++;
		}
	}
	break;
	case 5:
	{
		for (int i = 1; i <= c.stuql.length; i++)
		{
			printf("\n%s\t: ", s->name);
			scanf_s("%d", &s->xuanxiu.xuanxiu2);
			s++;
		}
	}
	break;
	case 6:
	{
		for (int i = 1; i <= c.stuql.length; i++)
		{
			printf("\n%s\t: ", s->name);
			scanf_s("%d", &s->xuanxiu.xuanxiu3);
			s++;
		}
	}
	break;
	default:
		break;
	}
}

//科任老师查询成绩。
void lookgrade(clas c)
{
	grade(c);
}
//学生查询成绩。
void slookgra(clas c)
{
	lookstudent(c);
}

//学生查询老师信息。
void slooktea(clas c)
{
	char temp[20];
	int tt;
	printf("\n*************************************");
	printf("\n请输入您要选择的查询方式(查询老师姓名请按1,查询老师科目请按2):");
	scanf_s("%d", &tt);
	switch (tt)
	{
	case 1:
	{
		printf("\n请输入您要查找的老师姓名:");
		scanf_s("%s", temp, 20);
		teacher *p = c.teaql.tea;
		for (int i = c.teaql.length; i >= 0; i--)
		{
			if (strcmp(p->name, temp) == 0)
			{
				printf("老师的编号: %s", p->bianhao);
				printf("\n老师的级别: %d", p->jibie);
				printf("\n老师的姓名: %s", p->name);
				printf("\n老师的任课科目: %s", p->kemu);
				printf("\n老师的性别: %s", p->sex);
				printf("\n老师的联系方式: %s", p->callnumber);
				break;
			}
			p++;
		}
		printf("\n未找到账户");
	}
	break;
	case 2:
	{
		printf("\n请输入您要查找的老师科目:");
		scanf_s("%s", temp, 20);
		teacher *p = c.teaql.tea;
		for (int i = c.teaql.length; i >= 0; i--)
		{
			if (strcmp(p->kemu, temp) == 0)
			{
				printf("老师的编号: %s", p->bianhao);
				printf("老师的级别: %d", p->jibie);
				printf("\n老师的姓名: %s", p->name);
				printf("\n老师的任课科目: %s", p->kemu);
				printf("\n老师的性别: %s", p->sex);
				printf("\n老师的联系方式: %s", p->callnumber);
				break;
			}
			p++;
		}
		printf("\n未找到账户");
	}
	break;
	default:
		break;
	}
}

//导员登录界面
void daoyuandenglu(Uqlist &L, clas banjidizhi[20])
{
	int i, choice;/*用户选择变量*/
	printf("*******************************************************************************\n");
	printf("*                                亲爱的导员                                   *\n");
	printf("*           welcome to        &学生成绩文件管理&           !!!!!!             *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n\n\n");
	printf("******************************●●欢迎使用●●*********************************\n");
	printf("*************************      请输入所需操作      ****************************\n");/*选择功能菜单*/
	printf("*************************      1.增加学生          ****************************\n");
	printf("*************************      2.删除学生          ****************************\n");
	printf("*************************      3.修改学生信息      ****************************\n");
	printf("*************************      4.查询学生信息      ****************************\n");
	printf("*************************      5.学生成绩统计操作  ****************************\n");
	printf("*************************      6.添加班级          ****************************\n");
	printf("*************************      7.合并班级          ****************************\n");
	printf("*************************      8.添加老师          ****************************\n");
	printf("*************************      0.退出系统          ****************************\n");
	printf("请输入您所需要的操作: ");
	scanf_s("%d", &choice);
	if (choice != 0 && choice != 6 && choice != 7)
	{
		printf("\n请输入您所要操作的班级: ");
		char classtemp[20];
		scanf_s("%s", classtemp, 20);
		int m;
		for (m=0,i = 0; i <= 20; i++)
		{
			if (strcmp(banjidizhi[i].classname, classtemp) == 0)
			{
				m = 1;
				break;
			}

		}
		if (m == 0) {
		printf("\n未查找到班级");
		choice = 9;
		}
	}
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
		while (1) {
			jiemian(L, banjidizhi);
		}
	case 1:
		addstudent(banjidizhi[i]);
		break;
	case 2:
		deletestudent(banjidizhi[i]);
		break;
	case 3:
		restudent(banjidizhi[i]);
		break;
	case 4:
		lookstudent(banjidizhi[i]);
		break;
	case 5:
		grade(banjidizhi[i]);
		break;
	case 6:
		makeclass(banjidizhi);
		break;
	case 7:
		hebingbanji(banjidizhi);
		break;
	case 8:
		addteacher(banjidizhi[i]);
	default:
		printf("\n按键错误!请重新选择!\n");
		daoyuandenglu(L, banjidizhi);
	}/*结束switch*/

}

//老师登录界面。
void laoshidenglu(Uqlist &L, clas banjidizhi[20])
{
	int i, choice;/*用户选择变量*/
	printf("*******************************************************************************\n");
	printf("*                                亲爱的老师                                   *\n");
	printf("*           welcome to       &学生成绩文件管理&        !!!!!!                 *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n\n\n");
	printf("******************************●●欢迎使用●●*********************************\n");
	printf("*************************      请输入所需操作      ****************************\n");/*选择功能菜单*/
	printf("*************************      1.学生成绩写入      ****************************\n");
	printf("*************************      2.查询学生成绩      ****************************\n");
	printf("*************************      0.退出系统          ****************************\n");
	printf("请输入您所需要的操作:");
	scanf_s("%d", &choice);
	if (choice != 0)
	{
		printf("请输入您所要操作的班级: ");
		char classtemp[20];
		scanf_s("%s", &classtemp, 20);
		for (i = 0; i < 20; i++)
		{
			if (strcmp(banjidizhi[i].classname, classtemp) == 0)
			{
				break;
			}
		}
	}
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
		while (1) {
			jiemian(L, banjidizhi);
		}
		break;
	case 1:
		addgrade(banjidizhi[i]);
		break;
	case 2:
		lookgrade(banjidizhi[i]);
		break;
	default:
		printf("\n按键错误!请重新选择!\n");
		laoshidenglu(L, banjidizhi);
	}/*结束switch*/

}

//学生登录界面。
void xueshengdenglu(Uqlist &L, clas banjidizhi[20])
{
	int i, choice;/*用户选择变量*/
	printf("*******************************************************************************\n");
	printf("*                                   Hello,学生!                              *\n");
	printf("*           welcome to           &学生成绩文件管理&        !!!!!!             *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n\n\n");
	printf("******************************●●欢迎使用●●*********************************\n");
	printf("*************************      请输入所需操作      ****************************\n");/*选择功能菜单*/
	printf("*************************      1.查询信息          ****************************\n");
	printf("*************************      2.查询科任老师信息  ****************************\n");
	printf("*************************      0.退出系统          ****************************\n");
	printf("请输入您所需要的操作: ");
	scanf_s("%d", &choice);
	if (choice != 0)
	{
		printf("请输入您所要操作的班级: ");
		char classtemp[20];
		scanf_s("%s", &classtemp, 20);
		for (i = 0; i < 20; i++)
		{
			if (strcmp(banjidizhi[i].classname, classtemp) == 0)
			{
				break;
			}
		}
	}
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
		while (1) {
			jiemian(L, banjidizhi);
		}
		break;
	case 1:
		slookgra(banjidizhi[i]);
		break;
	case 2:
		slooktea(banjidizhi[i]);
		break;
	default:
		printf("\n按键错误!请重新选择!\n");
		xueshengdenglu(L, banjidizhi);
	}/*结束switch*/

}




int main()
{
	Uqlist L;
	InitList_Sq(L);
	clas banjidizhi[20];
	for (int i = 0; i < 20; i++)
	{
		memset(banjidizhi[i].classname, '\0', sizeof(banjidizhi[i].classname));
		initlists(banjidizhi[i].stuql);
		initlistt(banjidizhi[i].teaql);
	}
	while (1)
	{
		jiemian(L, banjidizhi);
	}
	system("pause");
	return 0;
}

链表实现:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include<cstring>
#include<malloc.h>



//登录存储

typedef struct
{
	int storte;           //登录用户结构体,包括用户类别(导员,老师,学生)、登录账号、登录密码
	char user[20];
	char code[20];
}users;

typedef struct  uslnode
{
	users date;
	struct  uslnode *next;
}uslnode, *LinkList;

LinkList L;
void InitList(LinkList L)
{
	L = new uslnode;
	L->next = NULL;
}



//班级存储模块。

enum random { 未出成绩,不及格,及格,良好,优秀, 未选 };			 //枚举类型,表示选修课的成绩。
const int 未出成绩 = 0;
typedef struct sc
{
	random xuanxiu1;
	random xuanxiu2;        //选修课结构体,包括了所有的选修课。
	random xuanxiu3;
}sc;

//老师结构体,存储老师信息
typedef struct teacher
{
	int jibie;			/*导员标记为0,授课老师标记为1*/
	char bianhao[20];	//老师编号
	char name[20];
	char sex[10];
	char kemu[20];			//老师教授科目
	char callnumber[20];		/*电话号码*/
}teachar;

typedef struct telnode
{
	teachar tedate;
	struct telnode *next;
}telnode, *TElinklist;

/*定义一个结构体数组存放学生的信息*/
typedef struct student
{
	char number[20];   /*学号*/
	char name[20];     /*名字*/
	char banjizhiwu[20];	/*班级职务*/
	char xueyuan[20];	/*学院*/
	char sex[10];	/*性别*/
	char cla[20];	/*班级*/
	sc xuanxiu;		/*选修课*/
	int gaoshu;		/*必修:高数*/
	int xiandai;	/*必修:线性代数*/
	int yingyu;		/*必修:英语*/
	int sum;	/*总分*/
	int average;	/*平均分*/
}student;

typedef struct stlnode
{
	student stdate;
	struct stlnode *next;
}stlnode, *STlinklist;
//班级结构体,包括班级名字,学生线性表,老师线性表。
typedef struct clas
{
	char classname[20];
	TElinklist teL;
	STlinklist stL;
}clas;


/*---------------------------------------------------------------------------------------------------------------*/


//实现新用户的添加
int adduser()
{
	uslnode *r;
	r = L;     //r指向最后一个。
	if (r->next != NULL)
	{
		r = r->next;
	}
	uslnode *p;
	p = (uslnode *)malloc(sizeof(uslnode));
	printf("\n请输入您的身份,导员call 0,老师call 1,学生call 2。");
	scanf_s("%d", &p->date.storte);
	printf("\n请输入您的账号:");
	scanf_s("%s", p->date.user, 20);
	printf("\n请输入您的密码:");
	scanf_s("%s", p->date.code, 20);
	char rcode[20];
	printf("\n请再次确认您的密码:");
	scanf_s("%s", rcode, 20);
	while (strcmp(p->date.code, rcode) != 0)
	{
		printf("\n两次密码不相同,请重新输入您的密码:");
		scanf_s("%s", p->date.code, 20);
		printf("\n请再次确认您的密码:");
		scanf_s("%s", rcode, 20);
	}
	r->next = p;
	r = p;
	r->next = NULL;
	printf("注册成功!!╰( ̄▽ ̄)╮\n");
	return 0;
}

//用户账户的注销函数 
int listdelete()
{
	int  stemp;
	char zhanghu[20];
	printf("\n请输入您的身份(导员:0,老师:1,学生:2)");
	scanf_s("%d", &stemp);
	printf("\n请输入您要注销的账户");
	scanf_s("%s", zhanghu, 20);

	uslnode *p;
	p = L;
	while ((strcmp(p->next->date.user, zhanghu) != 0 || p->next->date.storte != stemp) && p->next)
	{
		p = p->next;
	}
	if (p->next != NULL)
	{
		printf("\n您是否确定要注销账户%s,(是的话输入0,否的话输入1)", p->next->date.user);
		int j;
		scanf_s("%d", &j);
		if (j == 0)
		{
			uslnode *s;
			s = p->next;
			p->next = s->next;
			free(s);
			printf("/n注销成功!!╰( ̄▽ ̄)╮\n");
		}
	}
	else
	{
		printf("/n对不起,没找到账户!");
	}
	return 0;
}

//打开用户手册文件,提供 1.阅读用户手册 功能。
int readar()
{
	char txt[500] = { '\0' };
	errno_t err;
	FILE *stream;
	if ((err = fopen_s(&stream, "用户手册.txt", "r")) != 0)
	{
		printf("\n\t\t打开失败");
	}
	fread(txt, 2, 500, stream);
	printf("\n\t\t%s", txt);
	/*txt=fgets(txt,100,fp);
	printf("%s",txt); */
	return 0;
}

void daoyuandenglu(clas banjidizhi[20]);
void laoshidenglu(clas banjidizhi[20]);    //具体实现在后面。
void xueshengdenglu(clas banjidizhi[20]);

//登录模块。实现功能:3.直接登陆
void denglu(clas banjidizhi[20])
{
	char zhanghu[20], code[20];
	int temp;      //定义两个数组,存放键盘输入的用户名和密码
	printf("\n\t\t\t\t用户登录");
	printf("\n\t请输入您的身份(导员:0,老师:1,学生:2)");
	scanf_s("%d", &temp);
	printf("\n\t\t用户名:");
	/*判断用户名是否存在*/
	scanf_s("%s", zhanghu, 20);
	uslnode *p;
	p = L;
	while ((strcmp(p->date.user, zhanghu) != 0 || p->date.storte != temp) && p->next)
	{
		p = p->next;
	}
	if (strcmp(p->date.user, zhanghu) == 0 && p->date.storte == temp)
	{
		printf("\t\t密  码:");
		scanf_s("%s", &code, 20);
		while (strcmp(p->date.code, code) != 0)                      //对比输入的密码和读取的密码
		{
			int j;
			printf("\n\t\t密码错误(1.退出 2.重新输入)");
			scanf_s("%d", &j);
			if (j == 1)
			{
				exit(0);
			}
			else
			{
				printf("\t\t密  码:");
				scanf_s("%s", &code, 20);
				continue;
			}
		}
		printf("\n登陆成功,欢迎您光临教务系统!------技术支持:田,王,肖,江");
		switch (temp) /*多重选择实现功能不同的功能*/
		{
		case 0:
			while (1)
			{
				daoyuandenglu(banjidizhi);
			}
			break;
		case 1:
			while (1)
			{
				laoshidenglu(banjidizhi);
			}
			break;
		case 2:
			while (1)
			{
				xueshengdenglu(banjidizhi);
			}
			break;
		default:
			break;
		}/*结束switch*/
	}
	else
	{
		printf("\n对不起,没找到账户!");
	}
}


/*界面模块*/
void jiemian(clas banjidizhi[20])
{
	int cha;
	printf("\n****************************      登陆界面       *******************************");
	printf("\n**********************        1.阅读用户手册          **************************");
	printf("\n**********************        2.直接注册              **************************");
	printf("\n**********************        3.直接登陆              **************************");
	printf("\n**********************        4.注销账户              **************************");
	printf("\n**********************        5.退出界面              **************************");
	printf("\n请选择您要进行的操作:");
	scanf_s("%d", &cha);
	switch (cha) /*多重选择实现功能不同的功能*/
	{
	case 1:
		readar();
		break;
	case 2:
		adduser();
		break;
	case 3:
		denglu(banjidizhi);
		break;
	case 4:
		listdelete();
		break;
	case 5:
		printf("\n谢谢使用!再见!\n");
		exit(0);
	default:
		printf("\n按键错误!请重新选择!\n");
	}/*结束switch*/

}


//以上实现登录之前的操作
/*---------------------------------------------------------------------------------------------------------------*/
//以下实现三种身份对应的所能选择的操作



//存学生结构体线性表的初始构造。
/*void STInitList(STlinklist L)
{
L = new stlnode;
L->next = NULL;
}

//存老师结构体线性表的初始构造。
void TEInitList(TElinklist L)
{
L = new telnode;
L->next = NULL;
}*/
//班级结构体初始化
void initclass(clas &c)
{
	memset(c.classname, '\0', sizeof(c.classname));
	c.stL = new stlnode;
	c.stL->next = NULL;
	c.teL = new telnode;
	c.teL->next = NULL;
}


void hebingbanji(clas banjidizhi[20])//传入参数为存有20个班级类型的数组。
{
	int i, j, k;
	char classtemp1[20];
	char classtemp2[20];
	printf("\n请输入您要操作的第一个班级:");
	scanf_s("%s", &classtemp1, 20);
	printf("\n请输入您要操作的第二个班级:");
	scanf_s("%s", &classtemp2, 20);
	for (i = 0; i < 20; i++)
	{
		if (strcmp(banjidizhi[i].classname, classtemp1) == 0)
		{
			break;
		}
	}
	for (j = 0; j <= 20; j++)
	{
		if (strcmp(banjidizhi[j].classname, classtemp2) == 0)
		{
			break;
		}
	}
	printf("%d,%d", i, j);
	stlnode *s = banjidizhi[i].stL;
	telnode *t = banjidizhi[i].teL;
	while (s->next != NULL)
	{
		s++;
	}
	while (t->next != NULL)
	{
		t++;
	}
	s->next = banjidizhi[j].stL->next;
	t->next = banjidizhi[j].teL->next;
	printf("\n请输入新合成的班级名字:");
	scanf_s("%s", banjidizhi[i].classname, 20);
	memset(banjidizhi[j].classname, '\0', sizeof(banjidizhi[j].classname));
	banjidizhi[j].stL = NULL;
	banjidizhi[j].teL = NULL;
	printf("合并班级成功!!");

}


//新建班级
void makeclass(clas c[20])
{
	char nam[20];
	printf("请输入您所要添加的班级名字:");
	scanf_s("%s", nam, 20);

	for (int i = 0; i <= 20; i++)
	{
		if (strcmp(c[i].classname, "") == 0)                                                                            //
		{
			memcpy(c[i].classname, nam, 20);/*内存复制函数,将nam中20个字节完整复制到c[i]->classname*/
			printf("添加班级成功!");
			break;
		}
		else
			c++;
	}
}

//添加学生
void addstudent(clas &c)
{
	stlnode *r;
	r = c.stL;     //r指向最后一个。
	while (r->next != NULL)
	{
		r = r->next;
	}
	stlnode *p;
	p = (stlnode *)malloc(sizeof(stlnode));
	printf("\n请输入学生学号:");
	scanf_s("%s", p->stdate.number, 20);
	printf("\n请输入学生名字:");
	scanf_s("%s", p->stdate.name, 20);
	printf("\n请输入学生班级职务:");
	scanf_s("%s", p->stdate.banjizhiwu, 20);
	printf("\n请输入学生学院:");
	scanf_s("%s", p->stdate.xueyuan, 20);
	printf("\n请输入学生性别:");
	scanf_s("%s", p->stdate.sex, 10);
	printf("\n请输入学生班级:");
	scanf_s("%s", p->stdate.cla, 20);
	p->stdate.gaoshu = -1;
	p->stdate.xiandai = -1;
	p->stdate.yingyu = -1;
	p->stdate.average = -1;
	p->stdate.sum = -1;
	p->stdate.xuanxiu.xuanxiu1 = random(未出成绩);
	p->stdate.xuanxiu.xuanxiu2 = random(未出成绩);
	p->stdate.xuanxiu.xuanxiu3 = random(未出成绩);
	r->next = p;
	r = p;
	r->next = NULL;
	printf("添加成功!!╰( ̄▽ ̄)╮\n");
}

//添加老师
void addteacher(clas &c)
{
	telnode *r;
	r = c.teL;
	//r指向最后一个。
	while (r->next != NULL)
	{
		r = r->next;
	}
	telnode *p;
	p = (telnode *)malloc(sizeof(telnode));
	printf("\n请输入老师级别:");
	scanf_s("%d", &p->tedate.jibie);
	printf("\n请输入老师编号:");
	scanf_s("%s", p->tedate.bianhao, 20);
	printf("\n请输入老师姓名:");
	scanf_s("%s", p->tedate.name, 20);
	printf("\n请输入老师性别:");
	scanf_s("%s", p->tedate.sex, 10);
	printf("\n请输入老师教授科目:");
	scanf_s("%s", p->tedate.kemu, 20);
	printf("\n请输入老师电话号码:");
	scanf_s("%s", p->tedate.callnumber, 20);
	r->next = p;
	r = p;
	r->next = NULL;
	printf("添加成功!!╰( ̄▽ ̄)╮\n");
}
//删除学生
void deletestudent(clas &c)
{
	char temp[20];
	printf("\n请输入您要删除的学生学号:");
	scanf_s("%s", temp, 20);
	stlnode *p;
	p = c.stL;
	while (strcmp(p->next->stdate.number, temp) != 0 /*&& p->next*/)
	{
		p = p->next;
	}
	if (strcmp(p->next->stdate.number, temp) == 0)
	{
		printf("\n您是否确定要注销账户%s,(是的话输入0,否的话输入1)", p->next->stdate.number);
		int j;
		scanf_s("%d", &j);
		if (j == 0)
		{
			stlnode *s;
			s = p->next;
			p->next = s->next;
			free(s);
			printf("\n注销成功!!╰( ̄▽ ̄)╮\n");
		}
	}
	else
	{
		printf("\n对不起,没找到账户!");
	}
}


//修改学生信息。
void restudent(clas &c)
{
	char temp[20];
	printf("\n请输入您要修改的学生学号:");
	scanf_s("%s", temp, 20);
	stlnode *p;
	p = c.stL;
	while (strcmp(p->next->stdate.number, temp) != 0 && p->next)
	{
		p = p->next;
	}
	if (strcmp(p->next->stdate.number, temp) == 0)
	{
		printf("\n您是否确定要修改账户%s,(是的话输入0,否的话输入1)", p->next->stdate.number);
		int j;
		scanf_s("%d", &j);
		if (j == 0)
		{
			printf("\n请输入学生学号:");
			scanf_s("%s", p->next->stdate.number, 20);
			printf("\n请输入学生名字:");
			scanf_s("%s", p->next->stdate.name, 20);
			printf("\n请输入学生班级职务:");
			scanf_s("%s", p->next->stdate.banjizhiwu, 20);
			printf("\n请输入学生学院:");
			scanf_s("%s", p->next->stdate.xueyuan, 20);
			printf("\n请输入学生性别:");
			scanf_s("%s",p->next->stdate.sex, 2);
			printf("\n请输入学生班级:");
			scanf_s("%s", p->next->stdate.cla, 20);
			printf("\n修改成功");
		}
	}
	else
	{
		printf("/n对不起,没找到账户!");
	}
}

void printff(random a)
{
	switch (a)
	{
	case 0:
		printf("未出成绩");
		break;
	case 1:
		printf("不及格");
		break;
	case 2:
		printf("及格");
		break;
	case 3:
		printf("良好");
		break;
	case 4:
		printf("优秀");
		break;
	case 5:
		printf("未选");
		break;
	case 6:
		printf("未出成绩");
		break;
	}
}
//输出学生的各个信息。供lookstudentxuehao(clas * c),lookstudentname(clas * c)调用。
void printt(student* s)
{
	printf("\n学号: %s", s->number);
	printf("\n姓名: %s", s->name);
	printf("\n班级职务: %s", s->banjizhiwu);
	printf("\n学院: %s", s->xueyuan);
	printf("\n性别: %s", s->sex);
	printf("\n班级: %s", s->cla);
	printf("\n选修1成绩: ");
	printff(s->xuanxiu.xuanxiu1);
	printf("\n选修2成绩: ");
	printff(s->xuanxiu.xuanxiu2);
	printf("\n选修3成绩: ");
	printff(s->xuanxiu.xuanxiu3);
	printf("\n高数成绩: %d", s->gaoshu);
	printf("\n现代成绩: %d", s->xiandai);
	printf("\n英语成绩: %d", s->yingyu);
	printf("\n总成绩: %d", s->sum);
	printf("\n平均成绩: %d", s->average);
}

//以学号为索引查询学生
void lookstudentxuehao(clas c)
{
	char temp[20];
	printf("\n请输入您要查找的学生学号:");
	scanf_s("%s", &temp, 20);
	stlnode *p;
	p = c.stL;
	while (strcmp(p->stdate.number, temp) != 0 && p->next )
	{
		p = p->next;
	}
	if (strcmp(p->stdate.number, temp) == 0)
		{
			printt(&p ->stdate);
		}
	else
		{
			printf("/n对不起,没找到账户!");
		}
	
}

//以学生姓名为索引查询学生。
void lookstudentname(clas c)
{
	char temp[20];
	printf("\n请输入您要查找的学生姓名:");
	scanf_s("%s", temp, 20);
	stlnode *p;
	p = c.stL;
	while (strcmp(p->stdate.name, temp) != 0 && p->next != NULL && p != NULL)
	{
		p = p->next;
	}
	if (strcmp(p->stdate.name, temp) == 0)
	{
		printt(&p->stdate);
	}
	else
	{
		printf("/n对不起,没找到账户!");
	}
}
//学生查询,调用lookstudentxuehao(clas * c),lookstudentname(clas * c)
void lookstudent(clas c)
{
	printf("****************************");
	printf("请输入您要查询的方式(学号查询请按1,姓名查询请按2):");
	int tem;
	scanf_s("%d", &tem);
	switch (tem) /*多重选择实现功能不同的功能*/
	{
	case 1:
		lookstudentxuehao(c);
		break;
	case 2:
		lookstudentname(c);
		break;
	default:
		printf("\n按键错误!请重新选择!\n");
	}
}

//导员查询班级总体成绩。
void grade(clas c)
{
	int choice;
	printf("\n1.查询全班高数成绩。");
	printf("\n2.查询全班高数平均成绩。");
	printf("\n3.查询全班现代函数成绩。");
	printf("\n4.查询全班现代函数平均成绩。");
	printf("\n5.查询全班英语成绩。");
	printf("\n6.查询全班英语平均成绩。");
	printf("\n7.查询全班选修1成绩。");
	printf("\n8.查询全班选修2成绩。");
	printf("\n9.查询全班选修3成绩。");
	printf("\n0.查询全班总平均分");
	printf("\n请输入您的选择:");
	scanf_s("%d", &choice);
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
	{
		stlnode *p;
		p = c.stL;
		int av, i = 0, sum = 0;
		while (p->next)
		{
			sum += p->next->stdate.average;

			i++;
		}
		av = sum / i;
		printf("\n全班总平均分:%d", av);
	}
	break;
	case 1:
	{
		stlnode *p;
		p = c.stL;
		printf("\n数学成绩:");
		while (p->next)
		{
			printf("\n%s", p->next->stdate.name);
			printf("\t\t\t%d", p->next->stdate.gaoshu);
			p = p->next;
		}
	}
	break;
	case 2:
	{
		stlnode *p;
		p = c.stL;
		int av, i = 0, sum = 0;
		while (p->next)
		{
			sum += p->next->stdate.average;
			i++;
		}
		av = sum / i;
		printf("全班高数平均成绩:%d", av);
	}
	break;
	case 3:
	{
		stlnode *p;
		p = c.stL;
		printf("\n现代成绩:");
		while (p->next)
		{
			printf("\n%s", p->next->stdate.name);
			printf("\t\t\t%d", p->next->stdate.xiandai);
			p = p->next;
		}
	}
	break;
	case 4:
	{
		stlnode *p;
		p = c.stL;
		int av, i = 0, sum = 0;
		while (p->next)
		{
			sum += p->next->stdate.xiandai;

			i++;
		}
		av = sum / i;
		printf("\n全班现代平均成绩:%d", av);
	}
	break;
	case 5:
	{
		stlnode *p;
		p = c.stL;
		printf("\n英语成绩:");
		while (p->next)
		{
			printf("\n%s", p->next->stdate.name);
			printf("\t\t\t%d", p->next->stdate.yingyu);
			p = p->next;
		}
	}
	break;
	case 6:
	{
		stlnode *p;
		p = c.stL;
		int av, i = 0, sum = 0;
		while (p->next)
		{
			sum += p->next->stdate.yingyu;
			i++;
		}
		av = sum / i;
		printf("\n全班英语平均分:%d", av);
	}
	break;
	case 7:
	{
		stlnode *p;
		p = c.stL;
		printf("\n选修1成绩:");
		while (p->next)
		{
			printf("\n%s", p->next->stdate.name);
			printf("\t\t\t%d", p->next->stdate.xuanxiu.xuanxiu1);
			p = p->next;
		}
	}
	break;
	case 8:
	{
		stlnode *p;
		p = c.stL;
		printf("\n选修2成绩:");
		while (p->next)
		{
			printf("\n%s", p->next->stdate.name);
			printf("\t\t\t%d", p->next->stdate.xuanxiu.xuanxiu2);
			p = p->next;
		}
	}
	break;
	case 9:
	{
		stlnode *p;
		p = c.stL;
		printf("\n选修3成绩:");
		while (p->next)
		{
			printf("\n%s", p->next->stdate.name);
			printf("\t\t\t%d", p->next->stdate.xuanxiu.xuanxiu3);
			p = p->next;
		}
	}
	break;
	default:
		printf("\n按键错误!请重新选择!\n");
	}/*结束switch*/

}

//科任老师录入成绩。
void addgrade(clas &c)
{
	int choice;
	stlnode *p;
	p = c.stL;
	printf("\n请输入您要输入成绩的科目:");
	printf("\n1.高数。");
	printf("\n2.现性代数。");
	printf("\n3.英语。");
	printf("\n4.选修1。");
	printf("\n5.选修2。");
	printf("\n6.选修3。\n");
	scanf_s("%d", &choice);

	switch (choice)
	{
	case 1:
	{
		while (p->next)
		{
			printf("\n%s\t请输入成绩: ", p->next->stdate.name);
			scanf_s("%d", &p->next->stdate.gaoshu);
			p = p->next;
		}
	}
	break;
	case 2:
	{
		while (p->next)
		{
			printf("\n%s\t请输入成绩: ", p->next->stdate.name);
			scanf_s("%d", &p->next->stdate.xiandai);
			p = p->next;
		}
	}
	break;
	case 3:
	{
		while (p->next)
		{
			printf("\n%s\t请输入成绩: ", p->next->stdate.name);
			scanf_s("%d", &p->next->stdate.yingyu);
			p = p->next;
		}
	}
	break;
	case 4:
	{
		while (p->next)
		{
			printf("\n%s\t请输入成绩: ", p->next->stdate.name);
			scanf_s("%d", &p->next->stdate.xuanxiu.xuanxiu1);
			p = p->next;
		}
	}
	break;
	case 5:
	{
		while (p->next)
		{
			printf("\n%s\t请输入成绩: ", p->next->stdate.name);
			scanf_s("%d", &p->next->stdate.xuanxiu.xuanxiu2);
			p = p->next;
		}
	}
	break;
	case 6:
	{
		while (p->next)
		{
			printf("\n%s\t请输入成绩: ", p->next->stdate.name);
			scanf_s("%d", &p->next->stdate.xuanxiu.xuanxiu3);
			p = p->next;
		}
	}
	break;
	default:
		break;
	}
}

//科任老师查询成绩。
void lookgrade(clas c)
{
	grade(c);
}
//学生查询成绩。
void slookgra(clas c)
{
	lookstudent(c);
}

//学生查询老师信息。
void slooktea(clas c)
{
	char temp[20];
	int tt;
	printf("\n*************************************");
	printf("\n请输入您要选择的查询方式(查询老师姓名请按1,查询老师科目请按2):");
	scanf_s("%d", &tt);
	switch (tt)
	{
	case 1:
	{
		printf("\n请输入您要查找的老师姓名:");
		scanf_s("%s", temp, 20);
		telnode *p;
		p = c.teL;
		while (strcmp(p->next->tedate.name, temp) != 0 && p->next)
		{
			p = p->next;
		}
		if (p->next != NULL)
		{
			printf("\n老师的级别: %d", p->next ->tedate .jibie );
			printf("\n老师的编号: %s", p->next->tedate.bianhao);
			printf("\n老师的姓名: %s", p->next->tedate.name);
			printf("\n老师的性别:%s", p->next->tedate.sex);
			printf("\n老师的教授科目: %s", p->next->tedate.kemu);
			printf("\n老师的联系方式: %s", p->next->tedate.callnumber);
		}
		else
		{
			printf("\n对不起,该老师不存在!");
		}
		break;
	}
	case 2:
	{
		printf("\n请输入您要查找的老师科目:");
		scanf_s("%s", temp, 20);
		telnode *p;
		p = c.teL;
		while (strcmp(p->next->tedate.kemu, temp) != 0 && p->next)
		{
			p = p->next;
		}
		if (p->next != NULL)
		{
			printf("\n老师的姓名:%s", p->next->tedate.name);
			printf("\n老师的教授科目:%s", p->next->tedate.kemu);
			printf("\n老师的性别:%s", p->next->tedate.sex);
			printf("\n老师的联系方式:%s", p->next->tedate.callnumber);
		}
		else
		{
			printf("\n对不起,该老师不存在!");
		}
	}
	break;
	default:
		break;
	}
}

//导员登录界面
void daoyuandenglu(clas banjidizhi[20])
{
	int i, choice;/*用户选择变量*/
	printf("*******************************************************************************\n");
	printf("*                                亲爱的导员                                   *\n");
	printf("*           welcome to        &学生成绩文件管理&           !!!!!!             *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n\n\n");
	printf("******************************●●欢迎使用●●*********************************\n");
	printf("*************************      请输入所需操作      ****************************\n");/*选择功能菜单*/
	printf("*************************      1.增加学生          ****************************\n");
	printf("*************************      2.删除学生          ****************************\n");
	printf("*************************      3.修改学生信息      ****************************\n");
	printf("*************************      4.查询学生信息      ****************************\n");
	printf("*************************      5.学生成绩统计操作  ****************************\n");
	printf("*************************      6.添加班级          ****************************\n");
	printf("*************************      7.合并班级          ****************************\n");
	printf("*************************      8.添加老师          ****************************\n");
	printf("*************************      0.退出系统          ****************************\n");
	printf("请输入您所需要的操作: ");
	scanf_s("%d", &choice);
	if (choice != 0 && choice != 6 && choice != 7)
	{
		printf("\n请输入你所要操作的班级。");
		char classtemp[20];
		scanf_s("%s", classtemp, 20);
		int m = 0;
		for (i = 0; i <= 20; i++)
		{
			if (strcmp(banjidizhi[i].classname, classtemp) == 0)
			{
				printf("111");
				m = 1;
				break;
			}
		}
		if (m == 0) {
			printf("\n未查找到班级");
			choice = 9;
		}
	}
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
		while (1) {
			jiemian(banjidizhi);
		}
	case 1:
		addstudent(banjidizhi[i]);
		break;
	case 2:
		deletestudent(banjidizhi[i]);
		break;
	case 3:
		restudent(banjidizhi[i]);
		break;
	case 4:
		lookstudent(banjidizhi[i]);
		break;
	case 5:
		grade(banjidizhi[i]);
		break;
	case 6:
		makeclass(banjidizhi);
		break;
	case 7:
		hebingbanji(banjidizhi);
		break;
	case 8:
		addteacher(banjidizhi[i]);
	default:
		printf("\n按键错误!请重新选择!\n");
		daoyuandenglu(banjidizhi);
	}/*结束switch*/

}

//老师登录界面。
void laoshidenglu(clas banjidizhi[20])
{
	int i, choice;/*用户选择变量*/
	printf("*******************************************************************************\n");
	printf("*                                亲爱的老师                                   *\n");
	printf("*           welcome to       &学生成绩文件管理&        !!!!!!                 *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n\n\n");
	printf("******************************●●欢迎使用●●*********************************\n");
	printf("*************************      请输入所需操作      ****************************\n");/*选择功能菜单*/
	printf("*************************      1.学生成绩写入      ****************************\n");
	printf("*************************      2.查询学生成绩      ****************************\n");
	printf("*************************      0.退出系统          ****************************\n");
	printf("请输入您所需要的操作:");
	scanf_s("%d", &choice);
	if (choice != 0)
	{
		printf("\n请输入你所要操作的班级。");
		char classtemp[20];
		scanf_s("%s", &classtemp, 20);
		for (i = 0; i < 20; i++)
		{
			if (strcmp(banjidizhi[i].classname, classtemp) == 0)
			{
				break;
			}
		}
	}
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
		while (1) {
			jiemian(banjidizhi);
		}
		break;
	case 1:
		addgrade(banjidizhi[i]);
		break;
	case 2:
		lookgrade(banjidizhi[i]);
		break;
	default:
		printf("\n按键错误!请重新选择!\n");
		laoshidenglu(banjidizhi);
	}/*结束switch*/

}

//学生登录界面。
void xueshengdenglu(clas banjidizhi[20])
{
	int i, choice;/*用户选择变量*/
	printf("*******************************************************************************\n");
	printf("*                                   Hello,学生!                              *\n");
	printf("*           welcome to           &学生成绩文件管理&        !!!!!!             *\n");
	printf("*                                                                             *\n");
	printf("*******************************************************************************\n\n\n");
	printf("******************************●●欢迎使用●●*********************************\n");
	printf("*************************      请输入所需操作      ****************************\n");/*选择功能菜单*/
	printf("*************************      1.查询信息          ****************************\n");
	printf("*************************      2.查询科任老师信息  ****************************\n");
	printf("*************************      0.退出系统          ****************************\n");
	printf("请输入您所需要的操作: ");
	scanf_s("%d", &choice);
	if (choice != 0)
	{
		printf("\n请输入你所要操作的班级。");
		char classtemp[20];
		scanf_s("%s", classtemp, 20);
		for (i = 0; i < 20; i++)
		{
			if (strcmp(banjidizhi[i].classname, classtemp) == 0)
			{
				break;
			}
		}
	}
	switch (choice) /*多重选择实现功能不同的功能*/
	{
	case 0:
		while (1) {
			jiemian(banjidizhi);
		}
		break;
	case 1:
		slookgra(banjidizhi[i]);
		break;
	case 2:
		slooktea(banjidizhi[i]);
		break;
	default:
		printf("\n按键错误!请重新选择!\n");
		xueshengdenglu(banjidizhi);
	}/*结束switch*/

}




int main()
{
	L = new uslnode;
	L->next = NULL;
	clas banjidizhi[20];
	for (int i = 0; i < 20; i++)
	{
		initclass(banjidizhi[i]);
	}
	while (1)
	{
		jiemian(banjidizhi);
	}
	system("pause");
	return 0;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值