班级管理系统 顺序表实现

#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();
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值