学生管理系统-888行代码-链表-结构体-文件操作-背景音乐

C语言学生管理系统

还是要通过链表和文件操作才能拿分,所以熬夜2天写出1000+行代码,头都大了,删除注释后刚好888行。
以下代码,部分函数来自网络,或者其他博主分享,若有不便我会删除,然后自己写,嘻嘻。

以下是具体代码:
先保存一下,过会发

因为是在上一个博客的基础上写的,代码注释有些没删

/*********************************************************************
        文件名称:
        文件描述:
        编写时间:2020年6月1日
        创建工程:韩法旭
***********************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include <mmsystem.h>       /*/*/
#pragma comment(lib, "WINMM.LIB")/*/*/


typedef struct stu {
    int  ID;		//学号
    char name[15];	//名字
    char sex[10];	//性别
    int grade;		//成绩
    //int num;		//代号

    struct stu* pnext; //***
}student;

//增加功能*
student* pStu = NULL; //定义链表的头节点
FILE* fp = NULL;		//定义文件指针
char fileName[20]; //文件名

//int sort = 0;//记录当前有多少个结点,排序用   增加节点原因:读取文件时,添加学生时

//创建链表*
void CreateList() {
    pStu = (student*)malloc(sizeof(student)); //开辟一个student结构体大小的内存
    pStu->pnext = NULL;
}

//打开文件*
//有文件	打开	文件里面的数据保存到链表里面
//没有文件	就	新建一个文件
void OpenStuFile() {

    while (1) {
        printf("请输入文件名\n");
        scanf("%s", fileName);
        fp = fopen(fileName, "r");
        if (fp == NULL) {//只读的方式打开了一个不存在的文件
            printf("没有这个班级的数据,是否需要创建(y/n)\n");
            char ch='y';
            scanf("%s", &ch);
            if (ch == 'y' || ch == 'Y') {//Y
                fp = fopen(fileName, "a+");
                if (fp == NULL) {//创建失败
                    printf("创建失败!!!\n");
                    exit(0);
                }
                else {			//创建成功
                    printf("创建成功\n");
                    system("pause");
                    break;
                }
            }//Y
            else { //N 不想创建
                continue;
            }//N
        }
        else {//文件存在
            printf("文件打开成功\n");
            system("pause");
            break;
        }

    }

    student* pnew = NULL;//结构体类型的指针
    student* ptemp = NULL;


    CreateList(); //先创建链表

    ptemp = pStu;

    //这里已经打开了文件  或者是创建了文件 后,执行以下操作 读入数据到程序
    //还要判断有两种情况   有没有数据
    //读入数据  放入 链表中
    while (1) {

        //开辟了内存
        pnew = (student*)malloc(sizeof(student));

        if (fscanf(fp, "%s\t%d\t%s\t%d", pnew->name, &pnew->ID, pnew->sex, &pnew->grade) == EOF) {//文件结束
            free(pnew);//没有读出来数据
            break;
        }
        pnew->pnext = NULL;
        ptemp->pnext = pnew; //第一行
        ptemp = ptemp->pnext; //尾插
        //sort++;
    }
    fclose(fp);
}

void PrintfFileAll() {
    system("cls");
    system("color 6");
    student* ptemp = pStu->pnext;//

    if (ptemp == NULL) {//文件,或者链表没有数据
        printf("没有数据!\n");
        system("pause");
        return;
    }

    printf("    名字------------学号-------------性别-------------成绩\n");
    while (ptemp != NULL) {
        printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
        printf("\n");
        ptemp = ptemp->pnext;
    }
    system("pause");
    system("cls");
    system("color 2");
}

//保存文件
void saveStu() {
    student* ptemp = pStu->pnext;
    if ((fp = fopen(fileName, "w")) == NULL) {

        printf("打开文件失败!!!\n");
    }
    else {
        while (ptemp != NULL) {
            fprintf(fp, "%s\t%d\t%s\t%d\n", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            ptemp = ptemp->pnext;
        }
    }
    fclose(fp);
}


void playMusic() {//背景音乐/*/*/
    PlaySound(TEXT("a.wav"), 0, SND_FILENAME | SND_ASYNC);
}

void addStu() {//添加几个
    int number;//个数
    student* pnew = NULL;
    student* ptemp = pStu->pnext;//检查学号重复
    printf("请输入本次要添加几个学员\n");//当前时间6.3日 0:09

    scanf("%d", &number);
   // sort = sort + number;
    for (int i = 1; i <= number; i++) {

        pnew = (student*)malloc(sizeof(student));

        printf("请输入第%d个学员的数据\n", i);
        printf("请输入学号\n");
        scanf("%d", &pnew->ID);

        while (ptemp != NULL) {
            if (pnew->ID == ptemp->ID) {
                printf("学号重复!!请重新输入\n");
                scanf("%d", &pnew->ID);
                ptemp = pStu->pnext;
                continue;
            }
            else {
                ptemp = ptemp->pnext;
            }
        }

        printf("请输入名字\n");
        scanf("%s", pnew->name);
        printf("请输入性别\n");
        scanf("%s", pnew->sex);		//当前时间 6.3  0:31
        printf("请输入成绩\n");
        scanf("%d", &pnew->grade);


        if (pStu->pnext == NULL) {
            pnew->pnext = NULL;
            pStu->pnext = pnew;
        }
        else {//有
            ptemp = pStu;
            while (ptemp != NULL) {
                if (ptemp->pnext != NULL) {
                    //比前一个大 比后一个小
                    if (pnew->ID > ptemp->ID && pnew->ID < ptemp->pnext->ID) {
                        pnew->pnext = ptemp->pnext;
                        ptemp->pnext = pnew;
                        break;
                    }
                }
                else {
                    pnew->pnext = NULL;
                    ptemp->pnext = pnew;
                    break;
                }
                ptemp = ptemp->pnext;
                //当前时间0:57/
            }
        }

    }

}
//===========↑↑↑↑↑↑↑↑↑========输入函数======↑↑↑↑↑↑↑================


//============↓↓↓↓↓↓↓=========查询函数============↓↓↓↓↓↓===========


void inqID(student* ptemp) {//根据 学号 查询

    //使用链表
    printf("请输入学号\n");
    int inID;
    scanf("%d", &inID);
    ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (ptemp->ID == inID) //循环匹配
        {
            printf("    名字------------学号-------------性别-------------成绩\n");
            printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            printf("\n");
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }
    printf("没有这个学生\n");
    system("pause");
    system("cls");
}

void inqName(student* ptemp) {//根据 名字 查询
    int n = 0;//找到几个
    //使用链表
    printf("请输入学生名字\n");
    char inName[15];
    scanf("%s", inName);
    ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (strcmp(ptemp->name, inName) == 0) //循环匹配
        {
            if (n == 0) {
                printf("    名字------------学号-------------性别-------------成绩\n");
            }
            printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            printf("\n");
            n++;
        }
        ptemp = ptemp->pnext;
    }
    if (n == 0) {
        printf("没有这个学生\n");
    }
    system("pause");
    system("cls");
}

void inquMain() {


    int c=0;
    while (c != 4) {
        system("cls");
        system("color 2");
        printf("++++++++++查询学生成绩++++++++++++\n");
        printf("==================================\n");
        printf("--------1.输入学号查询------------\n");
        printf("--------2.输入名字查询------------\n");
        printf("--------3.查看全部学生------------\n");
        printf("--------4.返回主菜单表------------\n");
        printf("==================================\n");
        scanf("%d", &c);
        switch (c) {
        case 1:
            inqID(pStu); 	//通过 学号 查询
            break;
        case 2:
            inqName(pStu);
            break;
        case 3:
            PrintfFileAll();
            break;
        case 4:
            break;
        }
    }
    system("color 9");

}




//===========↑↑↑↑↑↑↑↑↑========查询函数======↑↑↑↑↑↑↑================

void restuID(student* ptempx) {//修改学号
    printf("请输入要修改的学号:\n");
    int reID;
    scanf("%d", &reID);
    ptempx->ID = reID;
}
void restuName(student* ptempx) {//修改名字
    printf("请输入要修改的名字:\n");
    char reName[15];
    scanf("%s", reName);
    strcpy(ptempx->name, reName);
}
void restuSex(student* ptempx) {//修改性别
    printf("请输入要修改的性别:\n");
    char reSex[10];
    scanf("%s", reSex);
    strcpy(ptempx->sex, reSex);
}
void restugrade(student* ptempx) {//修改成绩
    printf("请输入要修改的成绩:\n");
    int regrade;
    scanf("%d", &regrade);
    ptempx->grade = regrade;
}
void reID(student* ptemp) {//根据 学号 修改

    //使用链表
    printf("请输入修改学生的学号\n");
    int inID;
    scanf("%d", &inID);
    ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (ptemp->ID == inID) //循环匹配
        {
            printf("你要修改的学生是:\n");
            printf("    名字------------学号-------------性别-------------成绩\n");
            printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            int i1=5;
            while (i1 != 0) {
                printf("\n");
                printf("1.修改学号 2.修改名字 3.修改性别 4.修改成绩 0.停止修改\n");
                scanf("%d", &i1);
                switch (i1) {
                case 1:
                    restuID(ptemp);
                    break;
                case 2:
                    restuName(ptemp);
                    break;
                case 3:
                    restuSex(ptemp);
                    break;
                case 4:
                    restugrade(ptemp);
                    break;
                case 0:
                    break;

                }
                /*	int i1;
                    scanf("%d",&i1);
                    ptemp->grade=i1;*///只修改成绩代码
                printf("修改结果为:\n");
                printf("    名字------------学号-------------性别-------------成绩\n");
                printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
                printf("\n");
            }
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }
    printf("没有这个学生\n");
    system("pause");
    system("cls");

}
void reName(student* ptemp) {//根据 名字 修改

    //使用链表
    printf("请输入要修改学生的名字\n");
    char inName[15];
    scanf("%s", inName);
    ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (strcmp(ptemp->name, inName) == 0) //循环匹配
        {
            printf("你要修改的学生是:\n");
            printf("    名字------------学号-------------性别-------------成绩\n");
            printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            int i1=5;
            while (i1 != 0) {
                printf("\n");
                printf("1.修改学号 2.修改名字 3.修改性别 4.修改成绩 0.停止修改\n");
                scanf("%d", &i1);
                switch (i1) {
                case 1:
                    restuID(ptemp);
                    break;
                case 2:
                    restuName(ptemp);
                    break;
                case 3:
                    restuSex(ptemp);
                    break;
                case 4:
                    restugrade(ptemp);
                    break;
                case 0:
                    break;

                }
                /*	int i1;
                    scanf("%d",&i1);
                    ptemp->grade=i1;*///只修改成绩代码
                printf("修改结果为:\n");
                printf("    名字------------学号-------------性别-------------成绩\n");
                printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
                printf("\n");
            }
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }
    printf("没有这个学生\n");
    system("pause");
    system("cls");

}

void reMain() {


    int c=0;
    while (c != 4) {
        system("cls");
        system("color 2");
        printf("++++++++++修改学生成绩++++++++++++\n");
        printf("==================================\n");
        printf("--------1.输入学号查询------------\n");
        printf("--------2.输入名字查询------------\n");
        printf("--------3.查看全部学生------------\n");
        printf("--------4.返回主菜单表------------\n");
        printf("==================================\n");
        scanf("%d", &c);
        switch (c) {
        case 1:
            reID(pStu); 	//通过 学号 查询
            break;
        case 2:
            reName(pStu);
            break;
        case 3:
            PrintfFileAll();
            break;
        case 4:
            break;
        }
    }
    system("color 9");

}




void delID(student* ptemp) {//根据 学号 删除

    //使用链表
    printf("请输入学号\n");
    int inID;
    scanf("%d", &inID);
    ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (ptemp->ID == inID) //循环匹配
        {
            ptemp->grade = -1;
            printf("删除成绩后\n");
            printf("    名字------------学号-------------性别-------------成绩\n");
            printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            printf("\n");
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }
    printf("没有这个学生\n");
    system("pause");
    system("cls");

}
void delName(student* ptemp) {//根据 学号 删除

    //使用链表
    printf("请输入名字\n");
    char inName[15];
    scanf("%s", inName);
    ptemp = ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (strcmp(ptemp->name, inName) == 0) //循环匹配
        {
            ptemp->grade = -1;
            printf("删除成绩后\n");
            printf("    名字------------学号-------------性别-------------成绩\n");
            printf("   %6s        %6d           %6s           %6d", ptemp->name, ptemp->ID, ptemp->sex, ptemp->grade);
            printf("\n");
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }
    printf("没有这个学生\n");
    system("pause");
    system("cls");

}

void delMain() {
    int x=0;
    while (x != 4) {
        system("cls");
        system("color 2");
        printf("++++++++++删除学生成绩++++++++++++\n");
        printf("==================================\n");
        printf("--------1.输入学号删除------------\n");
        printf("--------2.输入名字删除------------\n");
        printf("--------3.列出所有学生------------\n");
        printf("--------4.返回主菜单表------------\n");
        printf("==================================\n");
        scanf("%d", &x);
        switch (x) {
        case 1:
            delID(pStu); 	//通过 学号 删除
            break;
        case 2:
            delName(pStu);
            break;
        case 3:
            PrintfFileAll();
            break;   
        case 4:
            break;
        }
    }

}


void delIDAll(student* ptemp) {//根据 学号 删除
    //使用链表
    printf("请输入学号\n");
    int inID;
    scanf("%d", &inID);
    //    ptemp=ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    int i = 0;
    while (ptemp != NULL) {
        i++;
        if (ptemp->pnext->ID == inID) //循环匹配			//删除函数耗时3小时!!!!!!!!废了//6.3 晕
        {
            student* del = ptemp->pnext;
            if (ptemp->pnext->pnext != NULL) {
                ptemp->pnext = ptemp->pnext->pnext;
            }
            else {
                ptemp->pnext->pnext = NULL;
                ptemp->pnext = ptemp->pnext->pnext;
            }
            free(del);
            printf("删除成功,该学生已从世界消失,不留痕迹\n");
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }

    printf("没有这个学生\n");
    system("pause");
    system("cls");

}
//

void delNameAll(student* ptemp) {//根据 学号 删除
    //使用链表
    printf("请输入名字\n");
    char inName[15];
    scanf("%s", inName);
    //    ptemp=ptemp->pnext;//ptemp头节点 后移 到有数据的结点
    while (ptemp != NULL) {
        if (strcmp(ptemp->pnext->name, inName) == 0) //循环匹配			//删除函数耗时3小时!!!!!!!!废了//6.3 晕
        {
            student* del = ptemp->pnext;
            if (ptemp->pnext->pnext != NULL) {
                ptemp->pnext = ptemp->pnext->pnext;
            }
            else {
                ptemp->pnext->pnext = NULL;
                ptemp->pnext = ptemp->pnext->pnext;
            }
            free(del);
            printf("删除成功,该学生已从世界消失,不留痕迹\n");
            system("pause");
            system("cls");
            return;
        }
        ptemp = ptemp->pnext;
    }

    printf("没有这个学生\n");
    system("pause");
    system("cls");

}


void delMainAll() {
    int x=0;
    while (x != 4) {
        system("cls");
        system("color 2");
        printf("++++++++++删除学生信息++++++++++++\n");
        printf("++++++++++清空这个学生++++++++++++\n");
        printf("==================================\n");
        printf("--------1.输入学号删除------------\n");
        printf("--------2.输入名字删除------------\n");
        printf("--------3.列出所有学生------------\n");
        printf("--------4.返回主菜单表------------\n");
        printf("==================================\n");
        scanf("%d", &x);
        switch (x) {
        case 1:
            delIDAll(pStu); 	//通过 学号 删除
            break;
        case 2:
            delNameAll(pStu);
            break;
        case 3:
            PrintfFileAll();
            break;
        case 4:
            break;
        }
    }

}


void swapIDgrade(int& a, int& b)
{
    int tmp = b;
    b = a;
    a = tmp;
}
void sortIDj(student* node) {	//根据学号降序排序
    if (NULL == node) {
        return;
    }

    student* startP = node;
    student* nextP = node;

    while (startP->pnext != NULL) {
        nextP = startP->pnext;

        while (nextP->pnext != NULL) {
            if (startP->pnext->ID < nextP->pnext->ID) {
                ///
                swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
                swapIDgrade(startP->pnext->grade, nextP->pnext->grade);

                char c[15];
                strcpy(c, startP->pnext->name);
                strcpy(startP->pnext->name, nextP->pnext->name);
                strcpy(nextP->pnext->name, c);

                char c1[10];
                strcpy(c1, startP->pnext->sex);
                strcpy(startP->pnext->sex, nextP->pnext->sex);
                strcpy(nextP->pnext->sex, c1);
            }
            nextP = nextP->pnext;
        }

        startP = startP->pnext;
    }
}
void sortIDs(student* node) {	//根据学号升序排序
    if (NULL == node) {
        return;
    }

    student* startP = node;
    student* nextP = node;

    while (startP->pnext != NULL) {
        nextP = startP->pnext;

        while (nextP->pnext != NULL) {
            if (startP->pnext->ID > nextP->pnext->ID) {
                ///
                swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
                swapIDgrade(startP->pnext->grade, nextP->pnext->grade);

                char c[15];
                strcpy(c, startP->pnext->name);
                strcpy(startP->pnext->name, nextP->pnext->name);
                strcpy(nextP->pnext->name, c);

                char c1[10];
                strcpy(c1, startP->pnext->sex);
                strcpy(startP->pnext->sex, nextP->pnext->sex);
                strcpy(nextP->pnext->sex, c1);
            }
            nextP = nextP->pnext;
        }

        startP = startP->pnext;
    }
}

void sortGradej(student* node) {			//根据成绩降序排序
    if (NULL == node) {
        return;
    }

    student* startP = node;
    student* nextP = node;

    while (startP->pnext != NULL) {
        nextP = startP->pnext;

        while (nextP->pnext != NULL) {
            if (startP->pnext->grade < nextP->pnext->grade) {
                ///
                swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
                swapIDgrade(startP->pnext->grade, nextP->pnext->grade);

                char c[15];
                strcpy(c, startP->pnext->name);
                strcpy(startP->pnext->name, nextP->pnext->name);
                strcpy(nextP->pnext->name, c);

                char c1[10];
                strcpy(c1, startP->pnext->sex);
                strcpy(startP->pnext->sex, nextP->pnext->sex);
                strcpy(nextP->pnext->sex, c1);
            }
            nextP = nextP->pnext;
        }

        startP = startP->pnext;
    }
}

void sortGrades(student* node) {			//根据成绩升序排序
    if (NULL == node) {
        return;
    }

    student* startP = node;
    student* nextP = node;

    while (startP->pnext != NULL) {
        nextP = startP->pnext;

        while (nextP->pnext != NULL) {
            if (startP->pnext->grade > nextP->pnext->grade) {
                ///
                swapIDgrade(startP->pnext->ID, nextP->pnext->ID);
                swapIDgrade(startP->pnext->grade, nextP->pnext->grade);

                char c[15];
                strcpy(c, startP->pnext->name);
                strcpy(startP->pnext->name, nextP->pnext->name);
                strcpy(nextP->pnext->name, c);

                char c1[10];
                strcpy(c1, startP->pnext->sex);
                strcpy(startP->pnext->sex, nextP->pnext->sex);
                strcpy(nextP->pnext->sex, c1);
            }
            nextP = nextP->pnext;
        }

        startP = startP->pnext;
    }
}

void menu() {
    int i=0;
    while (i != 8) {
        system("color 9");
        system("cls"); //每次打印菜单前清屏
        printf("\t\t》》》学生管理系统《《《\n");
        printf("=========================================================\n");
        printf("*\t1.输入学生成绩\t\t2.删除学生成绩\t\t*\n");
        printf("*\t3.查询学生成绩\t\t4.修改学生成绩\t\t*\n");
        printf("*\t5.排序学生成绩\t\t6.列出所有学生\t\t*\n");
        printf("*\t7.保存学生数据\t\t8.退出管理系统\t\t*\n");
        printf("=========================================================\n");
        scanf("%d", &i);
        switch (i) {
        case 1:								/已实现
            addStu();
            break;
        case 2:								//已实现
            printf("请选择删除目标\n");
            printf("1.删除这个学生全部信息 2.删除这个学生的成绩");
            int x1;
            scanf("%x1", &x1);
            if (x1 == 1) {
                delMainAll();
            }
            else {
                delMain();
            }
            break;
        case 3:								/已实现
            inquMain();
            break;
        case 4:
            reMain();
            break;
        case 5:
            printf("\t++++++++++排序++++++++++++\n");
            printf("1.根据学号降序排序  2.根据成绩降序排序\n");
            printf("3.根据学号升序排序  4.根据成绩升序排序\n");
            int s;
            scanf("%d", &s);
            switch (s) {
            case 1:
                sortIDj(pStu);
                break;
            case 2:
                sortGradej(pStu);
                break;
            case 3:
                sortIDs(pStu);
                break;
            case 4:
                sortGrades(pStu);
                break;
            }
            printf("\n");
            break;
        case 6:
            PrintfFileAll();//当前时间 6.3  9:05
            break;
        case 7:
            saveStu();
            break;
        case 8:
            printf("您已安全退出\n");
            break;
        }
        if (i != 3 && i != 6 && i != 4) {
            printf("操作成功!\n");
            system("pause");
        }

    }
}


int main() {
    printf("请打开一个班级文件\n");
    OpenStuFile();
    playMusic();
    menu();
    return 0;
}


//增加功能:》》》》》》》》》》》》》》》》》
//输入清屏==  //已完成 //每次输入清屏
//背景图片==  //未完成 改为更换字体颜色
//背景音乐==	//已完成	//当前时间6月2日 18:27
//动态链表==  //正在学习	//当前时间6月2日 20:29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值