#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
typedef struct score {
int score;
}score;
typedef struct student {
char id[20];
char name[20];
char sex[10];
score sco[5];
char ocu[10]; //职务
int isTeacher;
struct student *next; //指向下一个学生的指针
}student, *List;
#define MAXSIZE 100
typedef struct SCHOOL {
student* s;
char classname[20];
}SCHOOL;
SCHOOL S[MAXSIZE]; //存放所有班级的头结点和班级名
List L = NULL; //一个指向student类型的头指针
List p = NULL, r = NULL; //游动指针
int i, j;
int classnum = 0; //现有班级数量
FILE* fp;
void welcome(); //欢迎界面
void menu(); //功能选择菜单
void login();
void newclass(); //新建班级
void display(); //显示全部班级成员信息
void printC(); //打印现有的班级编号和年龄
List input(); //输入班级成员信息
void numListDelete(char str[20]); //按照学号删除学生信息
void nameListDelete(char str[20]); //按照姓名删除学生信息
void searchnum(); //按照学号查询学生信息
void searchname(); //按照姓名查询学生信息
void mergeList(); //合并班级
List Init_list_L(); //创建一个空表
void DestroyL(); //删除一个班级
void save();
int main() {
welcome();
login();
p = (student*)malloc(sizeof(student));
p->next = NULL;
menu();
return 0;
}
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 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 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.学号(职工号)");
int x;
char str[20];
scanf("%d", &x);
if (x == 1)
{
printf("输入姓名:");
scanf("%s", str);
nameListDelete(str);
break;
}
else if (x == 2) {
printf("输入学号(职工号):");
scanf("%s", str);
numListDelete(str);
break;
}
else printf("输入错误!请重新输入");
break;
case 3: system("cls");
printf("输入按什么查询 \n1.姓名 2.学号(职工号)\n");
int d;
scanf("%d", &d);
if (d == 1)
{
searchname(); break;
}
else if (d == 2) {
searchnum(); break;
}
else printf("出错!请重新输入");
break;
case 4:
system("cls");
mergeList();
break;
case 5:
system("cls");
input();
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);
}
List Init_list_L()
{
L = (student*)malloc(sizeof(student));
if (!L) {
printf("创建空表失败!");
exit(0);
}
L->next = NULL;
return L;
}
void DestroyL() {
if (classnum == 0) {
printf("当前无可删除的班级!\n");
return;
}
printC();
printf("请选择你要销毁的班级编号\n");
int k;
scanf("%d", &k);
L = S[k].s;
for (i = k; i < classnum; i++)
S[i] = S[i + 1];
classnum--;
printf("删除成功!\n");
}
void newclass() {
S[classnum].s = Init_list_L();
printf("\t\t\t请输入班级名\n");
scanf("%s", S[classnum].classname);
classnum++;
printf("%s班级创建成功!\n\n\n\n\n", S[classnum].classname);
}
List input() {
if (classnum == 0) {
printf("\t\t\t当前无可插入的班级,返回主菜单新建一个吧!\n");
return;
}
printC();
printf("请选择你要插入的班级编号\n");
scanf("%d", &i);
L = S[i].s;
while (1) {
int a;
p = (student*)malloc(sizeof(student));
p->next = NULL;
printf("1 录入成员信息\n2 退出功能\n");
scanf("%d", &a); if (a == 1) {
printf("请输入学生(老师)信息:\n\n");
printf("是否是老师?是为1,不是为0(只能输入1或0)\n");
scanf("%d", &p->isTeacher);
printf("学号(职工号):\n");
scanf("%s", p->id);
printf("姓名:\n");
scanf("%s", p->name);
printf("性别(‘男’或‘女’):\n");
scanf("%s", p->sex);
if (p->isTeacher == 0)
{
for (i = 0; i < 5; i++) {
printf("成绩%d:\n", i + 1);
scanf("%d", &p->sco[i].score);
}
}
else {
for (i = 0; i < 5; i++)
p->sco[i].score = 0;
}
printf("职务:\n");
scanf("%s", p->ocu);
p->next = L->next;
L->next = p;
}
else break;
}
printf("请按任意键继续....\n");
getchar();
system("cls");
return L;
}
void display() {
if (classnum == 0) {
printf("当前无可显示的班级,返回主菜单新建一个吧!\n");
return;
}
printC();
printf("选择你要查看的班级编号:\n");
scanf("%d", &i);
p = S[i].s->next;
if (p == NULL)
{
printf("error!");
return;
}
printf("\t\t\t%s班级学生信息列表\n\n", S[i].classname);
printf("\t\t学号\t\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\n\n");
while (p != NULL) {
printf("\t\t%s\t\t%s\t%s\t", p->id, p->name, p->sex);
if (p->isTeacher == 0)
{
for (int j = 0; j < 5; j++)
printf(" %d\t", p->sco[j].score);
}
else
{
for (int h = 0; h < 5; h++)
printf("\t");
}
printf("%s\t%d\t", p->ocu, p->isTeacher);
printf("\n");
p = p->next;
}
}
void printC() {
printf("现有的班级:\n");
for (i = 0; i < classnum; i++) {
printf("%d--%s\n", i, S[i].classname);
}
}
void numListDelete(char str[20]) {
if (classnum == 0) {
printf("\t\t\t当前无可删除的班级,返回主菜单新建一个吧!\n");
return;
}
printC();
printf("请选择你要删除哪个班级的学生(老师),请选择编号\n");
scanf("%d", &i);
L = S[i].s;
List q, p = L;
if (L->next == NULL) {
printf("班级内无学生\n");
return;
}
int j = 0;
while ((p->next) && strcmp(p->next->id, str) != 0)
{
p = p->next;
}
if (p->next == NULL) {
printf("删除失败!此人不存在!\n");
return;
}
else
{
q = p->next;
p->next = q->next;
free(q);
printf("删除成功\n");
}
return;
}
void nameListDelete(char str[20]) {
if (classnum == 0) {
printf("\t\t\t当前无可删除的班级,返回主菜单新建一个吧!\n");
return;
}
printC();
printf("请选择你要删除哪个班级的学生(老师),请选择编号\n");
scanf("%d", &i);
L = S[i].s;
List q, p = L;
if (L->next == NULL)
printf("班级内无学生\n");
int j = 0;
while (p->next &&strcmp(p->next->name, str) != 0)
{
p = p->next;
}
if (p == NULL)
{
printf("删除失败!此人不存在!\n");
return;
}
else {
q = p->next;
p->next = q->next;
free(q);
printf("删除成功!\n");
}
return;
}
void searchnum()
{
char str[20];
if (classnum == 0) {
printf("\t\t\t当前无可查询的班级,返回主菜单新建一个吧!\n");
return;
}
printC();
printf("请选择你要查询哪个班级的学生(老师),请选择编号\n");
scanf("%d", &i);
L = S[i].s;
printf("输入你要查询的学生(老师)学号(职工号):\n");
scanf("%s", str);
List p, q = NULL;
p = (student*)malloc(sizeof(student));
p = L->next;
int i = 0;
while (p != NULL)
{
if (strcmp(p->id, str) == 0)
{
q = p;
}
p = p->next;
i++;
}
if (q == NULL) {
printf("查无此人!\n");
}
else {
printf("\t\t学号\t\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t班级号\n\n");
printf("\t\t%s\t\t%s\t%s\t", q->id, q->name, q->sex);
if (q->isTeacher == 0)
{
for (int j = 0; j < 5; j++)
printf(" %d\t", q->sco[j].score);
}
else {
printf("\t\t\t\t\t");
}
printf("\t\t%s\t%d\t", q->ocu, q->isTeacher);
printf("\n\n");
}
return;
}
void searchname()
{
char str[20];
if (classnum == 0)
{
printf("\t\t\t当前无可查询的班级,返回主菜单新建一个吧!\n");
return;
}
printC();
printf("请选择你要查询哪个班级的学生(老师),请选择编号\n");
scanf("%d", &i);
L = S[i].s;
printf("输入你要查询的学生(老师)姓名:\n");
scanf("%s", str);
List p, q = NULL;
q = (student*)malloc(sizeof(student));
p = L->next;
int i = 0;
while (p != NULL)
{
if (strcmp(p->name, str) == 0)
{
q = p;
}
p = p->next;
i++;
}
if (q == NULL) {
printf("查无此人!");
}
else
{
printf("\t\t学号\t\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t班级号\n\n");
printf("\t\t%s\t\t%s\t%s\t", q->id, q->name, q->sex);
if (q->isTeacher == 0)
{
for (int j = 0; j < 5; j++)
printf("%d\t", q->sco[j].score);
}
else {
printf(" \t\t\t\t\t");
}
printf("\t\t%s\t%d\t", q->ocu, q->isTeacher);
printf("\n\n");
}
return;
}
void mergeList() {
if (classnum < 2) {
printf("当前班级数目少于两个,无法合并\n");
printf("按任意键返回上级目录\n");
getchar();
return;
}
int a;
printf("1 选择合并班级\n2 退出功能\n");
scanf("%d", &a);
if (a == 1) {
printC();
int t1, t2;
printf("请输入你要合并的班级a,b(效果为将b合并到a班级)\n");
scanf("%d %d", &t1, &t2);
if (t1 >= 0 && t1 < classnum && t2 >= 0 && t2 < classnum) {
List pa, pb;
pa = S[t1].s;
pb = S[t2].s;
while (pa->next)
pa = pa->next;
pa->next = pb->next;
for (i = t2; i < classnum; i++)
S[i] = S[i + 1];
classnum--;
free(S[t2].s);
printf("班级合并成功\n");
}
else
printf("输入错误\n");
}
else return;
}
void save() {
List p;
int k;
fp = fopen("studata.txt", "wb");
fprintf(fp, "%d\n\n", classnum);
for (i = 0; i < classnum; i++)
{
p = S[i].s->next;
while (p != NULL) {
fprintf(fp, "%s\t%s\t%s\t", p->id, p->name, p->sex);
for (k = 0; k < 5; k++)
fprintf(fp, "%d\t", p->sco[k].score);
fprintf(fp, "%s\t%d\t\n\n", p->ocu, p->isTeacher);
p = p->next;
}
}
fclose(fp);
printf("\n保存成功!\n");
getchar();
}