#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<conio.h> //清屏
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OVERFLOW -2
#define MAXSIZE 100
typedef struct score {
int score;
}score;
typedef struct student { //定义一个学生结点
char id[20];
char name[10];
char sex[10];
score sco[5];
char ocu[10]; //职务
int isTeacher; //是否是老师
}student;
typedef struct class { //定义一个表示班级的顺序表
student *stu; //班级成员--学生
int length; //班级人数
int listsize;
char classname[20];
}class;
typedef struct school {
class *clas; //成员
int classnum; //班级数
int listsize;
}school;
student e;
class L;
school S;
FILE *fp;
int i, j;
void login();
void save();
//构造一个空的顺序表
void Initlist_S(school S, int LISTINITSIZE);//建立一个放班级的表
class Initlist_sq(class L, int LISTINITSIZE);//建立一个班级
void InsertList();
void newclass();
void numListDelete();
void nameListDelete();
void searchnumElem();
void searchnameElem();
void display();
void menu();
void fuzhiS();
void destroyL(class L);
void mergeList();
void DestroyL();
void welcome();
void printC();
int main() {
welcome();
login();
Initlist_S(S, LIST_INIT_SIZE);//建一个学校的空顺序表,存放所有班级
menu();
return 0;
}
void menu() {
start:printf("********************\n");
system("cls");
//以下为功能选择部分
do {
printf("\t\t\t********请选择你要进行的操作:***********\n");
printf("\t\t\t* 1、新建班级 *\n");
printf("\t\t\t* 2、删除成员信息 *\n");
printf("\t\t\t* 3、查询成员信息 *\n");
printf("\t\t\t* 4、合并两个班级 *\n");
printf("\t\t\t* 5、新建成员信息 *\n");
printf("\t\t\t* 6、查看班级成员信息 *\n");
printf("\t\t\t* 7、保存所有班级信息 *\n");
printf("\t\t\t* 8、销毁班级 *\n");
printf("\t\t\t* 9、退出 *\n");
printf("\t\t\t*****************************************\n");
int n;
scanf("%d", &n);
switch (n) {
case 1:
system("cls");
newclass();
break;
case 2:
system("cls");
printf("按什么方式删除:1.姓名 2.学号\n");
int x;
scanf("%d", &x);
if (x == 1)
{
nameListDelete(S);
}
else if (x == 2) {
numListDelete(S);
}
else printf("输入错误!请重新输入\n");
break;
case 3: system("cls");
printf("输入按什么查询 1.姓名 2.学号\n");
int d;
scanf("%d", &d);
if (d == 1)
{
searchnameElem();
}
else if (d == 2) {
searchnumElem();
}
else printf("出错!请重新输入\n");
break;
case 4:
system("cls");
mergeList();
break;
case 5:
system("cls");
InsertList();
break;
case 6:
system("cls");
display();
break;
case 7:
system("cls");
save();
break;
case 8:
system("cls");
DestroyL();
break;
case 9:
system("exit");
exit(0);
default:
system("cls");
printf("您输入的信息有误\n");
goto start;
}
getchar();
} while (1);
}
void welcome() {
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 欢迎使用班级信息管理系统 *\n");
printf(" * *\n");
printf(" * * * *\n");
printf(" * * * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("Loading....\n");
getchar();
system("cls");
}
void destroyL(class L) {
L.length = 0;
}
void DestroyL() {
printC();
int k;
printf("请输入你要销毁的班级\n");
scanf("%d", &k);
for (int j = k; j <= S.classnum - 1; j++)
{
S.clas[j] = S.clas[j + 1];
}
--S.classnum;
}
void newclass() { //新建一个班级
destroyL(L);
Initlist_sq(L, LIST_INIT_SIZE);
class* newbase;
if (S.classnum >= S.listsize) {
newbase = (class*)realloc(S.clas, (S.classnum + LISTINCREMENT) * sizeof(class));
if (!newbase)
printf("\n存储分配失败\n");
S.clas = newbase;
S.listsize += LISTINCREMENT;
}
printf("请输入班级名称:\n");
scanf("%s", L.classname);
fuzhiS();
printf("创建班级成功!\n");
printf("按任意键继续....\n");
getchar();
}
void fuzhiS() {
int t = S.classnum;
strcpy(S.clas[t].classname, L.classname);
S.clas[t].stu = L.stu;
S.clas[t].length = L.length;
S.clas[t].listsize = L.listsize;
S.classnum++;
}
void printC() {
printf("现有的班级:\n");
for (i = 0; i < S.classnum; i++) {
printf("%d--%s\n", i, S.clas[i].classname);
}
}
void login() {
printf("\t\t\t*****************登陆******************\n\n"); //显示欢迎界面
char psword[20] = "0000"; //设置原始密码为0000
char inpsw[20];
int q = 0;
printf("\t\t\t*************请输入登录密码************\n");
scanf("%s", inpsw);
if (strcmp(psword, inpsw) != 0) { //验证密码是否正确
q = 1;
printf("密码错误,请重新输入\n");
while (q = 1) {
scanf("%s", inpsw);
if (strcmp(psword, inpsw) == 0)break;
else printf("密码错误,请重新输入\n");
}
}
printf("密码正确,进入班级信息管理系统\n");//若密码正确则进入学生信息系统
printf("请按任意键继续...\n");
getchar();
system("cls");
}
void searchnumElem() {
printC();
if (S.classnum == 0) {
printf("当前无可查询的班级,返回主菜单新建一个吧!\n");
return;
}
printf("选择你要查询的学生所在的的班级:\n");
int k, p = -1;
char str[20];
scanf("%d", &k);
int r = S.clas[k].length;
printf("输入查询的学号:\n");
scanf("%s", str);
for (int i = 0; i < r; ++i)
if (strcmp(S.clas[k].stu[i].id, str) == 0) {
p = i;
printf("\t\t学号\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t班级号\n\n");
printf("\t\t%s\t%s\t%s\t", S.clas[k].stu[p].id, S.clas[k].stu[p].name, S.clas[k].stu[p].sex);
if (S.clas[k].stu[p].isTeacher == 0) {
for (int j = 0; j < 5; j++)
printf(" %d\t", S.clas[k].stu[p].sco[j].score);
}
else
{
for (int j = 0; j < 5; j++)
printf(" \t");
}
printf("\t\t%s\t%d\t", S.clas[k].stu[p].ocu, S.clas[k].stu[p].isTeacher);
printf("\n\n"); return;
}
if (p < 0) {
printf("查无此人!\n");
}
return;
}//学号查询
void searchnameElem() {
printC();
if (S.classnum == 0) {
printf("当前无可查询的班级,返回主菜单新建一个吧!\n");
return;
}
printf("选择你要查询的学生所在的的班级:\n");
int k, p = -1;
char str[20];
scanf("%d", &k);
int r = S.clas[k].length;
printf("输入查询的姓名:\n");
scanf("%s", str);
for (int i = 0; i < r; ++i)
if (strcmp(S.clas[k].stu[i].name, str) == 0)
{
p = i;
printf("\t\t学号\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t班级号\n\n");
printf("\t\t%s\t%s\t%s\t", S.clas[k].stu[p].id, S.clas[k].stu[p].name, S.clas[k].stu[p].sex);
if (S.clas[k].stu[p].isTeacher == 0)
{
for (int j = 0; j < 5; j++)
printf(" %d\t", S.clas[k].stu[p].sco[j].score);
}
else
{
for (int j = 0; j<5; j++)
printf(" \t");
}
printf("\t\t%s\t%d\t", S.clas[k].stu[p].ocu, S.clas[k].stu[p].isTeacher);
printf("\n\n"); return;
}
if (p < 0) {
printf("查无此人!\n");
}
return;
}//按姓名查询
void nameListDelete() // 在顺序表中删除学生信息
{
char str[20];
int p;
printC();
if (S.classnum == 0) {
printf("当前无可删除的班级,返回主菜单新建一个吧!\n");
return;
}
printf("选择你要删除学生信息所在的的班级:\n");
int k;
scanf("%d", &k);
int r = S.clas[k].length;
printf("输入删除的的学生姓名:\n");
scanf("%s", str);
for (int i = 0; i < r; ++i)
if (strcmp(S.clas[k].stu[i].name, str) == 0)
{
p = i;
}
if (p >= r) {
printf("要删除的学生不存在!\n"); return;
}
else
{
if ((p < 0) || (p > r)) {
printf("错误!删除失败!\n"); return;
}
for (int j = p; j <= r - 1; j++)
{
S.clas[k].stu[j] = S.clas[k].stu[j + 1];
}
printf("删除成功\n");
}
--S.clas[k].length;
return;
}
void numListDelete() // 在顺序表中删除学生信息
{
char str[20];
int p;
printC();
if (S.classnum == 0) {
printf("当前无可删除的班级,返回主菜单新建一个吧!\n");
return;
}
printf("选择你要删除学生信息所在的的班级:\n");
int k;
scanf("%d", &k);
int r = S.clas[k].length;
printf("输入删除的的学生学号:\n");
scanf("%s", str);
for (int i = 0; i < r; ++i)
if (strcmp(S.clas[k].stu[i].id, str) == 0)
{
p = i;
}
if (p >= r) {
printf("要删除的学生不存在!\n"); return;
}
else
{
if ((p < 0) || (p > r)) {
printf("错误!删除失败!\n"); return;
}
for (int j = p; j <= r - 1; j++)
{
S.clas[k].stu[j] = S.clas[k].stu[j + 1];
}
printf("删除成功\n");
}
--S.clas[k].length;
return;
}
//构造一个空的班级信息顺序表
class Initlist_sq(class L, int LISTINITSIZE) {
L.stu = (student *)malloc(LIST_INIT_SIZE * sizeof(student));
if (!L.stu)exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return L;
}
//构造一个空的学校班级信息表
void Initlist_S(school S, int LISTINITSIZE) {
S.clas = (class *)malloc(LIST_INIT_SIZE * sizeof(class));
if (!S.clas)exit(OVERFLOW);
S.classnum = 0;
S.listsize = LIST_INIT_SIZE;
}
void InsertList() {
printC();
if (S.classnum == 0) {
printf("当前无可插入的班级,返回主菜单新建一个吧!\n");
return;
}
printf("选择你要插入的班级:\n");
int k;
scanf("%d", &k);
student* newbase;
while (1) {
int a;
printf("1 录入学生信息\n2 退出功能\n");
scanf("%d", &a);
if (a == 1) {
if (S.clas[k].length >= S.clas[k].listsize) {
newbase = (student*)realloc(S.clas[k].stu, (S.clas[k].length + LISTINCREMENT) * sizeof(student));
if (!newbase)
printf("\n存储分配失败\n");
S.clas[k].stu = newbase;
S.clas[k].listsize += LISTINCREMENT;
}
printf("是否是老师?是为1,不是为0\n");
scanf("%d", &S.clas[k].stu[S.clas[k].length].isTeacher);
printf("请输入学生(老师)信息:\n\n");
printf("姓名:\n");
scanf("%s", S.clas[k].stu[S.clas[k].length].name);
printf("学号(职工号):\n");
scanf("%s", S.clas[k].stu[S.clas[k].length].id);
printf("性别(‘男’或‘女’):\n");
scanf("%s", S.clas[k].stu[S.clas[k].length].sex);
if (S.clas[k].stu[S.clas[k].length].isTeacher == 0) {
for (i = 0; i < 5; i++) {
printf("成绩%d:\n", i + 1);
scanf("%d", &S.clas[k].stu[S.clas[k].length].sco[i].score);
}
}
else {
for (i = 0; i < 5; i++)
S.clas[k].stu[S.clas[k].length].sco[i].score = 0;
}
printf("职务:\n");
scanf("%s", S.clas[k].stu[S.clas[k].length].ocu);
S.clas[k].length++;
}
else break;
}
}
void display() {
printC();
printf("选择班级:\n");
int k;
scanf("%d", &k);
printf("\t\t\t%s班级学生信息列表\n\n", S.clas[k].classname);
printf("\t\t学号\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t\n\n");
for (i = 0; i < S.clas[k].length; i++) {
printf("\t\t%s\t%s\t%s\t", S.clas[k].stu[i].id, S.clas[k].stu[i].name, S.clas[k].stu[i].sex);
if (S.clas[k].stu[i].isTeacher == 0) {
for (j = 0; j < 5; j++)
printf(" %d\t", S.clas[k].stu[i].sco[j].score);
}
else
{
for (j = 0; j < 5; j++)
printf(" \t");
}
printf("%s\t\t%d\t", S.clas[k].stu[i].ocu, S.clas[k].stu[i].isTeacher);
printf("\n");
}
}
//合并两个班级
void mergeList() {
if (S.classnum < 2) {
printf("当前班级数目少于两个,无法合并\n");
printf("按任意键返回上级目录\n");
getchar();
return;
}
for (i = 0; i < S.classnum; i++) {
printf("%d--%s\n", i, S.clas[i].classname);
}
int t1, t2;
printf("请输入你要合并的班级a,b(效果为将b合并到a班级)\n");
scanf("%d%d", &t1, &t2);
i = j = 0;
student* newbase;
if (S.clas[t1].length + S.clas[t2].length >= S.clas[t1].listsize) {
newbase = (student*)realloc(L.stu, (L.length + LISTINCREMENT) * sizeof(student));
if (!newbase)
printf("\n存储分配失败");
L.stu = newbase;
L.listsize += LIST_INIT_SIZE;
}
for (j = 0; j < S.clas[t2].length; j++) {
strcpy(S.clas[t1].stu[S.clas[t1].length + j].id, S.clas[t2].stu[j].id);
strcpy(S.clas[t1].stu[S.clas[t1].length + j].name, S.clas[t2].stu[j].name);
strcpy(S.clas[t1].stu[S.clas[t1].length + j].sex, S.clas[t2].stu[j].sex);
for (i = 0; i<5; i++)
S.clas[t1].stu[S.clas[t1].length + j].sco[i].score = S.clas[t2].stu[j].sco[i].score;
strcpy(S.clas[t1].stu[S.clas[t1].length + j].ocu, S.clas[t2].stu[j].ocu);
S.clas[t1].stu[S.clas[t1].length + j].isTeacher = S.clas[t2].stu[j].isTeacher;
}
S.clas[t1].length += S.clas[t2].length;
S.clas[t2].length = 0;
for (int j = t2; j <= S.classnum - 1; j++)
{
S.clas[j] = S.clas[j + 1];
}
--S.classnum;
}
void save() {
fp = fopen("studata.txt", "wb");
fprintf(fp, "%d\n\n", S.classnum);
for (i = 0; i < S.classnum; i++)
{
fprintf(fp, "%d\n", S.clas[i].length);
for (j = 0; j < S.clas[i].length; j++) {
fprintf(fp, "%s\t%s\t%s\t", S.clas[i].stu[j].id, S.clas[i].stu[j].name, S.clas[i].stu[j].sex);
int k;
for (k = 0; k < 5; k++)
fprintf(fp, "%d\t", S.clas[i].stu[j].sco[k].score);
fprintf(fp, "%s\t%d\t\n", S.clas[i].stu[j].ocu, S.clas[i].stu[j].isTeacher);
}
}
fclose(fp);
printf("\n保存成功!\n");
getchar();
}