C语言学生管理系统课程设计

2023-11-03

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAX_SIZE 100     //定义符号常量

struct student     //学生信息结构体
{
    int ID;               //自动序号
    char studentNumber[MAX_SIZE];    //学号
    char name[MAX_SIZE];  //姓名
    char sex[MAX_SIZE];   //性别
    int age;              //年龄
    char address[MAX_SIZE];  //地址
    struct student * pre;    //学生结构体指针,指向前节点指针
    struct student * next;   //学生结构体指针,指向后节点指针
};

void mainMenu(void);   //mainMenu()函数原型,软件片头
void caoZuoTiShi1(void);//caoZuoTiShi()函数,软件的命令选择与功能描述
void caoZuoTiShi2(void);
void commandSelect(void); //commandSelect()函数,实现各个功能
void delay(void); //延迟器
void delayTime(int n); //延迟时间与显示符号
struct student *creatDoubleLianBiao(void); //创建双向链表
void LianBiaoID(struct student *head); //为链表自动加上ID号
void printDoubleLianBiao(struct student *head); //显示链表
void saveToPc(struct student *head); //保存数据库到文件
struct student *readFromPc(void); //调入数据库文件到内存
struct student *shenQingOneNode(void); //创建一个节点
struct student *insertDoubleLast(struct student *head); //添加尾条
struct student *insertDoubleTop(struct student *head); //添加头条
int countNodeNum(struct student *head); //统计链表的节点数
struct student *searByIndex(struct student *head,int index);//按索引查找节点,索引从1开始
struct student *inseryBeforByIndex(struct student *head,int index);//匹配添加ID号前
struct student *inseryAfterByIndex(struct student *head,int index);//匹配添加ID号后
struct student *deleteTopNode(struct student *head);//删除头条
struct student *deleteLastNode(struct student *head);//删除尾条
struct student *deleteByIndex(struct student *head,int index);//匹配ID删除
struct student *deleteByID1ToID2(struct student *head,int index1,int index2);//匹配ID1至ID2删除
void changeNodeByID(struct student *head, int index);//匹配ID号修改记录
void printOneNode(struct student *oneNode);//显示一条记录
int selectOneOrZero(void); //选1或选0
void searchNodesByID(struct student *head);//ID查询
void searchNodesBySn(struct student *head);//学号查询
void searchNodesByName(struct student *head);//姓名查询
void searchNodesBySex(struct student *head);//性别查询
void searchNodesByAge(struct student *head);//年龄查询
void searchNodesByAddress(struct student *head);//地址查询
void backUpFromPc(void);  //备份数据库
void jiaohuanNodeDat(struct student *p,struct student *q); //节点数据交换(不交换指针)
void upsortsn(struct student *head); //排序,按学号升序
void dropsortsn(struct student *head); //排序,按学号降序
void upsortage(struct student *head); //排序,按年龄升序
void dropsortage(struct student *head); //排序,按年龄降序
void upsortsex(struct student *head); //排序,按性别
void upsortaddress(struct student *head); //排序,按地址
void upsortname(struct student *head); //排序,按姓名

int main()
{
    mainMenu();
    caoZuoTiShi1();
    commandSelect();
    return 0;

}

void mainMenu(void)   //mainMenu()函数,软件片头
{
    printf("\n");
    printf("\t\t***********************************\t\t\n");
    printf("\t\t* 学  生  信  息  管  理  系  统  *\t\t\n");
    printf("\t\t***********************************\t\t\n");
    printf("\t\t* 作者:                          *\t\t\n");
    printf("\t\t* 公司:balance of love           *\t\t\n");
    printf("\t\t* 日期:2015-6                    *\t\t\n");
    printf("\t\t***********************************\t\t\n");
    printf("\n");
}

void caoZuoTiShi1(void) //caoZuoTiShi()函数,操作提示,软件的命令与功能
{
    printf("\n");
    printf("\t\t    ~~~操    作    提    示~~~     \t\t\n");
    printf("\t\t-----------------------------------\t\t\n");
    printf("\t\t|    数字命令  |   功能描述       |\t\t\n");
    printf("\t\t-----------------------------------\t\t\n");
    printf("\t\t|       -1    >>>  退出系统       |\t\t\n");
    printf("\t\t|        0    >>>  显示命令       |\t\t\n");
    printf("\t\t|        1    >>>  创建数据库     |\t\t\n");
    printf("\t\t|        2    >>>  加载数据库     |\t\t\n");
    printf("\t\t|        3    >>>  增加记录       |\t\t\n");
    printf("\t\t|        4    >>>  删除记录       |\t\t\n");
    printf("\t\t|        5    >>>  修改记录       |\t\t\n");
    printf("\t\t|        6    >>>  查询记录       |\t\t\n");
    printf("\t\t|        7    >>>  显示记录       |\t\t\n");
    printf("\t\t|        8    >>>  排序记录       |\t\t\n");
    printf("\t\t|        9    >>>  保存数据库     |\t\t\n");
    printf("\t\t|       10    >>>  备份数据库     |\t\t\n");
    printf("\t\t-----------------------------------\t\t\n");
    printf("\n");
}
void caoZuoTiShi2(void)
{
    printf("\t\t-----------------------------------------------------------\t\n");
    printf("\t|库 操 作| -1.退出,0.命令,1.创建,2.加载,9.保存,10.另存 |\t\n");
    printf("\t|记录操作| 3. 增加,4.删除,5.修改,6.查询,7.显示,8. 排序 |\t\n");
    printf("\t\t-----------------------------------------------------------\t\n");
}

void commandSelect(void)  //commandSelect()函数,实现各个功能
{
    int number,number3,number4,number6,number8;
    int flag3=1,flag4=1,flag6=1,flag8=1;
    int id,id1,id2;
    struct student *DoubleLianBiaoTou=NULL;
    printf("\n输入数字命令[0:调出数字命令菜单]->");
    scanf("%d",&number);
    while (1)
    {
        switch(number)
        {
        case 0:
        {
            printf("\n~显示命令菜单~\n");
            caoZuoTiShi2();
            break;
        }
        case 1:
        {
            printf("\n~创建数据库~\n");
            DoubleLianBiaoTou=creatDoubleLianBiao();
            break;
        }
        case 2:
        {
            printf("\n~加载数据库~\n");
            DoubleLianBiaoTou=readFromPc();
            break;
        }
        case 3:
        {
            flag3=1;
            if (NULL==DoubleLianBiaoTou)
            {
                printf("\n");
                printf("数据库不存在\n");
                printf("@请先创建数据库或加载数据库@\n");
                break;
            }
            printf("\n~添加记录~\n");
            printf("\n选择添加记录模式:\n");
            printf("30:退出,31:添加头条,32:添加尾条,33:匹配添加ID号前,34:匹配添加ID号后,37:显示记录\n");
            scanf("%d",&number3);
            while (1==flag3)
            {
                switch(number3)
                {
                case 31:
                {
                    printf("\n");
                    printf("~添加头条~\n");
                    DoubleLianBiaoTou=insertDoubleTop(DoubleLianBiaoTou);
                    break;
                }
                case 32:
                {
                    printf("\n");
                    printf("~添加尾条~\n");
                    DoubleLianBiaoTou=insertDoubleLast(DoubleLianBiaoTou);
                    break;
                }
                case 33:
                {
                    printf("\n");
                    printf("~匹配添加ID号前~\n");
                    printf("\n");
                    printf("输入ID号->");
                    scanf("%d",&id);
                    DoubleLianBiaoTou=inseryBeforByIndex(DoubleLianBiaoTou,id);
                    break;
                }
                case 34:
                {
                    printf("\n");
                    printf("~匹配添加ID号后~\n");
                    printf("\n");
                    printf("输入ID号->");
                    scanf("%d",&id);
                    DoubleLianBiaoTou=inseryAfterByIndex(DoubleLianBiaoTou,id);
                    break;
                }
                case 37:
                {
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 30:
                {
                    printf("\n");
                    printf("~退出添加记录,返回主菜单~\n");
                    caoZuoTiShi1();
                    flag3=0;
                    break;
                }
                default:
                {
                    printf("无效命令,请重新选择\n");
                    break;
                }
                }
                if (1==flag3)
                {
                    printf("\n选择添加记录模式:\n");
                    printf("30:退出,31:添加头条,32:添加尾条,33:匹配添加ID号前,34:匹配添加ID号后,37:显示记录\n");
                    scanf("%d",&number3);
                }
            }
            break;
        }
        case 4:
        {
            flag4=1;
            if (NULL==DoubleLianBiaoTou)
            {
                printf("\n");
                printf("数据库不存在\n");
                printf("@请先创建数据库或加载数据库@\n");
                break;
            }
            printf("\n~删除记录~\n");
            printf("\n选择删除记录模式:\n");
            printf("40:退出,41:删除头条,42:删除尾条,43:匹配ID删除,44:匹配ID1至ID2删除,47:显示记录\n");
            scanf("%d",&number4);
            while (1==flag4)
            {
                switch(number4)
                {
                case 41:
                {
                    printf("\n");
                    printf("~删除头条~\n");
                    if (NULL!=DoubleLianBiaoTou)
                    {
                        DoubleLianBiaoTou=deleteTopNode(DoubleLianBiaoTou);
                    }
                    else
                    {
                        printf("@数据库已删空@\n");
                        break;
                    }
                    break;
                }
                case 42:
                {
                    printf("\n");
                    printf("~删除尾条~\n");
                    if (NULL!=DoubleLianBiaoTou)
                    {
                        DoubleLianBiaoTou=deleteLastNode(DoubleLianBiaoTou);
                    }
                    else
                    {
                        printf("@数据库已删空@\n");
                        break;
                    }
                    break;
                }
                case 43:
                {
                    printf("\n");
                    printf("~匹配ID删除~\n");
                    printf("\n");
                    printf("输入ID号->");
                    scanf("%d",&id);
                    if (NULL!=DoubleLianBiaoTou)
                    {
                        DoubleLianBiaoTou=deleteByIndex(DoubleLianBiaoTou,id);
                    }
                    else
                    {
                        printf("@数据库已删空@\n");
                        break;
                    }
                    break;
                }
                case 44:
                {
                    printf("\n");
                    printf("~匹配ID1至ID2删除~\n");
                    printf("\n");
                    printf("输入ID1号->");
                    scanf("%d",&id1);
                    printf("输入ID2号->");
                    scanf("%d",&id2);
                    if (NULL!=DoubleLianBiaoTou)
                    {
                        DoubleLianBiaoTou=deleteByID1ToID2(DoubleLianBiaoTou,id1,id2);
                    }
                    else
                    {
                        printf("@数据库已删空@\n");
                        break;
                    }
                    break;
                }
                case 47:
                {
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 40:
                {
                    printf("\n");
                    printf("~退出删除记录,返回主菜单~\n");
                    caoZuoTiShi1();
                    flag4=0;
                    break;
                }
                default:
                {
                    printf("无效命令,请重新选择\n");
                    break;
                }
                }
                if (1==flag4)
                {
                    printf("\n选择删除记录模式:\n");
                    printf("40:退出,41:删除头条,42:删除尾条,43:匹配ID删除,44:匹配ID1至ID2删除,47:显示记录\n");
                    scanf("%d",&number4);
                }
            }
            break;
        }
        case 5:
        {
            if (NULL==DoubleLianBiaoTou)
            {
                printf("\n");
                printf("数据库不存在\n");
                printf("@请先创建数据库或加载数据库@\n");
                break;
            }
            printf("\n");
            printf("~修改记录~\n");
            printf("~~匹配ID修改记录~~\n");
            printf("\n");
            printf("输入ID号->");
            scanf("%d",&id);
            printf("\n");
            changeNodeByID(DoubleLianBiaoTou,id);
            break;
        }
        case 6:
        {
            flag6=1;
            if (NULL==DoubleLianBiaoTou)
            {
                printf("\n");
                printf("数据库不存在\n");
                printf("@请先创建数据库或加载数据库@\n");
                break;
            }
            printf("\n~查询记录~\n");
            printf("\n选择查询记录模式:\n");
            printf("60:退出,61:ID查询,62:学号查询,63:姓名查询,");
            printf("64:性别查询,65:年龄查询,66:地址查询\n");
            scanf("%d",&number6);
            while (1==flag6)
            {
                switch(number6)
                {
                case 61:
                {
                    printf("\n");
                    printf("~ID查询~\n");
                    printf("\n");
                    searchNodesByID(DoubleLianBiaoTou);
                    break;
                }
                case 62:
                {
                    printf("\n");
                    printf("~学号查询~\n");
                    printf("\n");
                    searchNodesBySn(DoubleLianBiaoTou);
                    break;
                }
                case 63:
                {
                    printf("\n");
                    printf("~姓名查询~\n");
                    printf("\n");
                    searchNodesByName(DoubleLianBiaoTou);
                    break;
                }
                case 64:
                {
                    printf("\n");
                    printf("~性别查询~\n");
                    printf("\n");
                    searchNodesBySex(DoubleLianBiaoTou);
                    break;
                }
                case 65:
                {
                    printf("\n");
                    printf("~年龄查询~\n");
                    printf("\n");
                    searchNodesByAge(DoubleLianBiaoTou);
                    break;
                }
                case 66:
                {
                    printf("\n");
                    printf("~地址查询~\n");
                    printf("\n");
                    searchNodesByAddress(DoubleLianBiaoTou);
                    break;
                }
                case 60:
                {
                    printf("\n");
                    printf("~退出查询记录,返回主菜单~\n");
                    caoZuoTiShi1();
                    flag6=0;
                    break;
                }
                default:
                {
                    printf("无效命令,请重新选择\n");
                    break;
                }
                }
                if (1==flag6)
                {
                    printf("\n选择查询记录模式:\n");
                    printf("60:退出,61:ID查询,62:学号查询,63:姓名查询,");
                    printf("64:性别查询,65:年龄查询,66:地址查询\n");

                    scanf("%d",&number6);

                }
            }
            break;
        }
        case 7:
        {
            printf("\n~显示记录~\n");
            printDoubleLianBiao(DoubleLianBiaoTou);
            break;
        }
        case 8:
        {
            flag8=1;
            if (NULL==DoubleLianBiaoTou)
            {
                printf("\n");
                printf("数据库不存在\n");
                printf("@请先创建数据库或加载数据库@\n");
                break;
            }
            printf("\n~排序记录~\n");
            printf("\n选择排序记录模式:\n");
            printf("80:退出,81:学号升序,82:学号降序,83:年龄升序,84:年龄降序\n");
            printf("        85:姓名排序,86:性别排序,87:地址排序\n");
            scanf("%d",&number8);
            while (1==flag8)
            {
                switch(number8)
                {
                case 81:
                {
                    printf("\n");
                    printf("~学号升序~\n");
                    printf("\n");
                    upsortsn(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 82:
                {
                    printf("\n");
                    printf("~学号降序~\n");
                    printf("\n");
                    dropsortsn(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 83:
                {
                    printf("\n");
                    printf("~年龄升序~\n");
                    printf("\n");
                    upsortage(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 84:
                {
                    printf("\n");
                    printf("~年龄降序~\n");
                    printf("\n");
                    dropsortage(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 85:
                {
                    printf("\n");
                    printf("~姓名排序~\n");
                    printf("\n");
                    upsortname(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 86:
                {
                    printf("\n");
                    printf("~性别排序~\n");
                    printf("\n");
                    upsortsex(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 87:
                {
                    printf("\n");
                    printf("~地址排序~\n");
                    printf("\n");
                    upsortaddress(DoubleLianBiaoTou);
                    printDoubleLianBiao(DoubleLianBiaoTou);
                    break;
                }
                case 80:
                {
                    printf("\n");
                    printf("~退出排序记录,返回主菜单~\n");
                    caoZuoTiShi1();
                    flag8=0;
                    break;
                }
                default:
                {
                    printf("无效命令,请重新选择\n");
                    break;
                }
                }
                if (1==flag8)
                {
                    printf("\n选择排序记录模式:\n");
                    printf("80:退出,81:学号升序,82:学号降序,83:年龄升序,84:年龄降序\n");
                    printf("        85:姓名排序,86:性别排序,87:地址排序\n");
                    scanf("%d",&number8);
                }
            }
            break;
        }
        case 9:
        {
            printf("\n~保存数据库~\n");
            saveToPc(DoubleLianBiaoTou);
            break;
        }
        case 10:
        {
            printf("\n~备份数据库~\n");
            backUpFromPc();
            break;
        }
        case -1:
        {
            printf("\a"); //报警声,蜂鸣器,一声
            printf("欢迎再次使用本系统");
            delayTime(8); //延迟6个延迟时段
            exit(0);   //exit(0)正常退出,exit(-1)不正常退出
        }
        default:
        {
            printf("\a\a\a"); //报警声,三声
            printf("无效命令,请重新选择\n");
            break;
        }
        }
        printf("\n输入数字命令[0:调出数字命令菜单]->");
        scanf("%d",&number);
    }
}
void upsortage(struct student *head) //排序,按年龄升序
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (p->age>q->age)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void dropsortage(struct student *head) //排序,按年龄降序
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (p->age<q->age)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void dropsortsn(struct student *head) //排序,按学号降序
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (strcmp(p->studentNumber,q->studentNumber)<0)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void upsortaddress(struct student *head) //排序,按地址
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (strcmp(p->address,q->address)>0)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void upsortsex(struct student *head) //排序,按性别
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (strcmp(p->sex,q->sex)>0)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void upsortname(struct student *head) //排序,按姓名
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (strcmp(p->name,q->name)>0)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void upsortsn(struct student *head) //排序,按学号升序
{
    struct student *p;
    struct student *q;
    for (p=head; p!=NULL; p=p->next)
    {
        for (q=p->next; q!=NULL; q=q->next)
        {
            if (strcmp(p->studentNumber,q->studentNumber)>0)
            {
                jiaohuanNodeDat(p,q);
            }
        }
    }
    return ;
}
void jiaohuanNodeDat(struct student *p,struct student *q) //节点数据交换(不交换指针)
{
    char sn[MAX_SIZE],name[MAX_SIZE],sex[MAX_SIZE],address[MAX_SIZE];
    int age;

    strcpy(sn,p->studentNumber);
    strcpy(p->studentNumber,q->studentNumber);
    strcpy(q->studentNumber,sn);


    strcpy(name,p->name);
    strcpy(p->name,q->name);
    strcpy(q->name,name);


    strcpy(sex,p->sex);
    strcpy(p->sex,q->sex);
    strcpy(q->sex,sex);


    strcpy(address,p->address);
    strcpy(p->address,q->address);
    strcpy(q->address,address);


    age=p->age;
    p->age=q->age;
    q->age=age;

    return ;
}
void searchNodesByAddress(struct student *head)//地址查询
{
    struct student *p=NULL;
    int i=0;
    char address[MAX_SIZE];
    p=head;
    if (NULL==p)
    {
        return;
    }
    printf("输入地址->");
    scanf("%s",address);
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (NULL!=p)
    {
        if (NULL!=strstr(p->address,address))
        {
            i++;
            printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address);
        }
        p=p->next;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}
void searchNodesByAge(struct student *head)//年龄查询
{
    struct student *p=NULL;
    int i=0;
    int age;
    p=head;
    if (NULL==p)
    {
        return;
    }
    printf("输入年龄->");
    scanf("%d",&age);
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (NULL!=p)
    {
        if (p->age==age)
        {
            i++;
            printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address);
        }
        p=p->next;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}
void searchNodesBySex(struct student *head)//性别查询
{
    struct student *p=NULL;
    char sex[MAX_SIZE];
    int i=0;
    int sexnum;
    p=head;
    if (NULL==p)
    {
        return;
    }
    printf("输入性别->");
    printf("1:男,2:女\n");
    scanf("%d",&sexnum);
    while(!(1==sexnum||2==sexnum))
    {
        printf("选择无效,请再次选择\n");
        printf("性别->");
        printf("1:男,2:女\n");
        scanf("%d",&sexnum);
    }
    if(1==sexnum)
    {
        strcpy(sex,"男");
    }
    else
    {
        strcpy(sex,"女");
    }
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (NULL!=p)
    {
        if (NULL!=strstr(p->sex,sex))
        {
            i++;
            printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address);
        }
        p=p->next;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}
void searchNodesByName(struct student *head)//姓名查询
{
    struct student *p=NULL;
    int i=0;
    char name[MAX_SIZE];
    p=head;
    if (NULL==p)
    {
        return;
    }
    printf("输入姓名->");
    scanf("%s",name);
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (NULL!=p)
    {
        if (NULL!=strstr(p->name,name))
        {
            i++;
            printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address);
        }
        p=p->next;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}
void searchNodesBySn(struct student *head)//学号查询
{
    struct student *p=NULL;
    int i=0;
    char sn[MAX_SIZE];
    p=head;
    if (NULL==p)
    {
        return;
    }
    printf("输入学号->");
    scanf("%s",sn);
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (NULL!=p)
    {
        if (NULL!=strstr(p->studentNumber,sn))
        {
            i++;
            printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address);
        }
        p=p->next;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}

void searchNodesByID(struct student *head)//ID查询
{
    struct student *p=NULL;
    int i=0;
    int index;
    p=head;
    if (NULL==p)
    {
        return;
    }
    printf("输入ID->");
    scanf("%d",&index);
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (NULL!=p)
    {

        if (p->ID==index)
        {
            i++;
            printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address);
        }
        p=p->next;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}

void changeNodeByID(struct student *head, int index)//匹配ID号修改记录
{
    struct student *p=NULL;
    int sexnum;
    p=searByIndex(head,index);
    if (NULL==p)
    {
        return ;
    }
    else
    {
        printOneNode(p);
        printf("请输入新的对应信息:\n\n");
        printf("修改学号?");
        if(1==selectOneOrZero())
        {
            printf("学号->");
            scanf("%s",p->studentNumber);
        }
        printf("修改姓名?");
        if(1==selectOneOrZero())
        {
            printf("姓名->");
            scanf("%s",p->name);
        }
        printf("修改性别?");
        if(1==selectOneOrZero())
        {
            printf("性别->");
            printf("1:男,2:女\n");
            scanf("%d",&sexnum);
            while(!(1==sexnum||2==sexnum))
            {
                printf("选择无效,请再次选择\n");
                printf("性别->");
                printf("1:男,2:女\n");

                scanf("%d",&sexnum);

            }

            if(1==sexnum)

            {

                strcpy(p->sex,"男");

            }

            else

            {

                strcpy(p->sex,"女");
            }
        }
        printf("修改年龄?");
        if(1==selectOneOrZero())
        {
            printf("年龄->");
            scanf("%d",&(p->age));
        }
        printf("修改地址?");
        if(1==selectOneOrZero())
        {
            printf("地址->");
            scanf("%s",p->address);
        }
        printf("\n");
        printOneNode(p);
        printf("^-^修改成功^-^\n");
    }
}
int selectOneOrZero(void) //选1或选0
{
    int sexnum;
    printf("\n0:略过,1:修改->");
    scanf("%d",&sexnum);
    while(!(1==sexnum||0==sexnum))
    {
        printf("选择无效,请再次选择\n");
        printf("0:略过,1:修改->");
        scanf("%d",&sexnum);
    }
    return sexnum;
}
void printOneNode(struct student *oneNode)//显示一条记录
{
    struct student *p=NULL;
    p=oneNode;
    if (NULL==p)
    {
        return;
    }
    printf("\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    printf("%-8d%-16s%-8s%-8s%-8d%s\n",p->ID,p->studentNumber,p->name,p->sex,p->age,p->address);
    printf("----------------------------------------------------------------------\n");
    printf("\n");
    return;
}
struct student *deleteByID1ToID2(struct student *head,int index1,int index2)//匹配ID1至ID2删除
{
    struct student *p1=NULL;
    struct student *p2=NULL;
    struct student *p=NULL;
    p1=searByIndex(head,index1);
    p2=searByIndex(head,index2);
    if (NULL==p1)
    {
        free(p1);
        free(p2);
        free(p);
        printf("ID %d 超标\n",index1);
        return head;
    }
    if (NULL==p2)
    {
        free(p1);
        free(p2);
        free(p);
        printf("ID %d 超标\n",index2);
        return head;
    }
    if (index1>index2)
    {
        p=p1;
        p1=p2;
        p2=p;
    }
    if (NULL==(p1->pre)&&NULL==(p2->next))
    {
        free(p1);
        free(p2);
        free(p);
        printf("数据库全部删除!!!\n");
        return NULL;
    }
    if (NULL==(p1->pre)&&NULL!=(p2->next))
    {
        head=p2->next;
        (p2->next)->pre=NULL;
        free(p1);
        free(p2);
        free(p);
        LianBiaoID(head);
        return head;
    }
    if (NULL!=(p1->pre)&&NULL==(p2->next))
    {
        (p1->pre)->next=NULL;
        free(p1);
        free(p2);
        free(p);
        LianBiaoID(head);
        return head;
    }
    (p1->pre)->next=p2->next;
    (p2->next)->pre=p1->pre;
    free(p1);
    free(p2);
    free(p);
    LianBiaoID(head);
    return head;
}
struct student *deleteByIndex(struct student *head,int index)//匹配ID删除
{
    struct student *p=NULL;
    p=searByIndex(head,index);
    if (NULL==p)
    {
        return head;
    }
    if (p->pre==NULL)
    {

        head=deleteTopNode(head);
        LianBiaoID(head);
        return head;
    }
    if (p->next==NULL)
    {
        head=deleteLastNode(head);
        LianBiaoID(head);
        return head;
    }
    (p->pre)->next=p->next;
    (p->next)->pre=p->pre;
    free(p);
    LianBiaoID(head);
    return head;
}
struct student *deleteLastNode(struct student *head)//删除尾条
{
    struct student *p=NULL;
    p=head;
    if (head->next==NULL)
    {
        printf("数据库已删空\n");
        free(head);
        return NULL;
    }
    while (p->next!=NULL)
    {
        p=p->next;
    }
    (p->pre)->next=NULL;
    free(p);
    LianBiaoID(head);
    return head;
}
struct student *deleteTopNode(struct student *head)//删除头条
{
    struct student *p=NULL;
    p=head;
    if (head->next==NULL)
    {
        printf("@数据库已删空@\n");
        free(head);
        return NULL;
    }
    head=p->next;
    (p->next)->pre=NULL;
    free(p);
    LianBiaoID(head);
    return head;
}
struct student *inseryAfterByIndex(struct student *head,int index)//匹配添加ID号后
{
    struct student *p=NULL;
    struct student *m=NULL;
    p=searByIndex(head,index);
    if (NULL==p) return head;
    m=shenQingOneNode();
    if (p->next != NULL)
    {
        m->next=p->next;
        p->next=m;
        m->pre=p;
        (m->next)->pre=m;
        LianBiaoID(head);
        return head;
    }
    else
    {
        p->next=m;
        m->pre=p;
        LianBiaoID(head);
        return head;
    }
}
struct student *inseryBeforByIndex(struct student *head,int index)//匹配添加ID号前
{
    struct student *p=NULL;
    struct student *q=NULL;
    struct student *m=NULL;
    p=searByIndex(head,index);
    if (NULL==p) return head;
    m=shenQingOneNode();
    if (head==p)
    {
        m->next=head;
        head->pre=m;
        head=m;
        LianBiaoID(head);
        return  head;
    }
    else
    {
        q=p->pre;
        m->next=p;
        q->next=m;
        p->pre=m;
        m->pre=q;
        LianBiaoID(head);
        return head;
    }
}
struct student *searByIndex(struct student *head,int index)//按索引查找节点,索引从1开始
{
    int count=countNodeNum(head);
    int i=1;
    struct student *p=NULL;
    if (index>count||index<=0)
    {
        printf("@索引超标@\n");
        return NULL;
    }
    p=head;
    while (i<index)
    {
        p=p->next;
        i++;
    }
    return p;
}
int countNodeNum(struct student *head) //统计链表的节点数
{
    struct student *p=NULL;
    int count=0;
    p=head;
    if (NULL==p) return count;
    while (p!=NULL)
    {
        count++;
        p=p->next;
    }
    return count;
}
struct student *insertDoubleTop(struct student *head) //添加头条,插入首记录
{
    struct student *p=NULL;
    p=shenQingOneNode();
    p->next=head;
    head->pre=p;
    head=p;
    LianBiaoID(head);
    return  head;
}
struct student *insertDoubleLast(struct student *head) //添加尾条,插入尾记录
{
    struct student *q=NULL;
    struct student *p=NULL;
    q=head;
    p=shenQingOneNode();
    printf("\n");
    while (q->next!=NULL)
    {
        q=q->next;
    }
    q->next=p;
    p->pre=q;
    LianBiaoID(head);
    return  head;
}
struct student *readFromPc(void) //从文件调入数据库到内存
{
    FILE *sourceFile=NULL;
    char source[MAX_SIZE];
    struct student *head=NULL;
    struct student *p=NULL;
    struct student *tail=NULL;
    int flag=1;
    int panduan;
    printf("\n");
    printf("输入调入的数据库路径及文件名【形如:d:/hqg/huqig1.dat】->");
    scanf("%s",source);
    sourceFile=fopen(source,"r");
    while (NULL==sourceFile)
    {
        printf("打开文件 %s 失败,请重新输入->",source);
        scanf("%s",source);
        sourceFile=fopen(source,"r");
    }
    p=(struct student *)malloc(sizeof(struct student));
    if (NULL==p)
    {
        printf("申请内存空间失败!!!\n");
        exit(-1);  //exzit(0);
    }
    panduan=fscanf(sourceFile,"%d",&(p->ID));
    if (1==panduan)
    {
        fscanf(sourceFile,"%s",p->studentNumber);
        fscanf(sourceFile,"%s",p->name);
        fscanf(sourceFile,"%s",p->sex);
        fscanf(sourceFile,"%d",&(p->age));
        fscanf(sourceFile,"%s",p->address);
        p->pre=NULL;
        p->next=NULL;
    }
    head=p;
    tail=p;
    while (1==flag)
    {
        p=(struct student *)malloc(sizeof(struct student));
        if (NULL==p)
        {
            printf("申请内存空间失败!!!\n");
            exit(-1);  //exzit(0);
        }
        panduan=fscanf(sourceFile,"%d",&(p->ID));
        if (1==panduan)
        {
            fscanf(sourceFile,"%s",p->studentNumber);
            fscanf(sourceFile,"%s",p->name);
            fscanf(sourceFile,"%s",p->sex);
            fscanf(sourceFile,"%d",&(p->age));
            fscanf(sourceFile,"%s",p->address);
            p->pre=NULL;
            p->next=NULL;
            tail->next=p;
            p->pre=tail;
            tail=p;
        }
        else
        {
            flag=0;
        }
    }
    printf("数据库文件加载成功...\n");
    fclose(sourceFile);
    return head;
}
void backUpFromPc(void)  //备份数据库
{
    FILE * sourceFile=NULL, * endFile=NULL;
    char source[MAX_SIZE],end[MAX_SIZE];
    char ch;
    int i=1,j=1;
    printf("\n");
    printf("请输入源文件名【包含路径与文件名】->");
    scanf("%s",source);
    sourceFile=fopen(source,"r");
    while (sourceFile==NULL)
    {
        if (3==i)
        {
            printf("\n备份数据库失败!!!\n");
            exit(-1);
        }
        printf("打开文件失败v_v\n");
        printf("请重新输入->");
        scanf("%s",source);
        sourceFile=fopen(source,"r");
        i++;
    }
    printf("请输入目标文件名【包含路径与文件名】->");
    scanf("%s",end);
    endFile=fopen(end,"w");
    while (endFile==NULL)
    {
        if (3==j)
        {
            printf("\n备份数据库失败!!!\n");
            exit(-1);
        }
        printf("打开文件失败v_v\n");
        printf("请重新输入->");
        scanf("%s",end);
        endFile=fopen(end,"w");
        j++;
    }
    for ( ch=fgetc(sourceFile); ch != EOF; ch=fgetc(sourceFile) )
    {
        fputc(ch,endFile);
    }
    fclose(sourceFile);
    fclose(endFile);
    printf("文件备份成功^_^,从 %s 到 %s \n",source,end);
}
void saveToPc(struct student *head) //输出链表内容到文件
{
    struct student * p=NULL;
    FILE * outFilePointer=NULL;   //文件指针
    char outName[MAX_SIZE];        //保存文件名
    int i=1;
    if (head==NULL)
    {
        printf("\n~数据不存在,不能保存~\n");
        return;
    }
    printf("输入保存的路径及文件名【形如:d:/hqg/huqig1.dat】->");
    scanf("%s",outName);
    outFilePointer=fopen(outName,"w");  //  w  'w' "w"
    while (NULL==outFilePointer) //while (outFilePointer=NULL)  while (NULL=outFilePointer)
    {
        if (3==i)
        {
            printf("\n保存数据库失败!!!\n");
            exit(-1);
        }
        printf("保存 %s 文件失败,请重新输入->",outName);
        scanf("%s",outName);
        outFilePointer=fopen(outName,"w");
        i++;
    }
    p=head;
    while (p!=NULL)
    {
        fprintf(outFilePointer,"%-8d%-16s%-8s%-8s%-8d%s\n",p->ID,p->studentNumber,p->name,p->sex,p->age,p->address);
        p=p->next;
    }
    fprintf(outFilePointer,"END!!!\n");
    fclose(outFilePointer);         //关闭文件
    printf("文件保存成功^_^\n");
}
void delay(void) //延迟器
{
    int n=200000000;
    while (n>0) n--;
    return;
}
void delayTime(int n) //
{
    int i;
    for (i=0; i<n; i++)
    {
        delay();
        printf(".");
    }
    return;
}
struct student *shenQingOneNode(void) //        创建一个节点
{
    struct student *p=NULL;
    int sexnum;
    p=(struct student *)malloc(sizeof(struct student));
    if (NULL==p)
    {
        printf("创建节点失败\n");
        exit(-1);
    }
    printf("\n");
    printf("输入节点的内容:\n");
    printf("学号->");
    scanf("%s",p->studentNumber);
    printf("姓名->");
    scanf("%s",p->name);
    printf("性别->");
    printf("1:男,2:女\n");
    scanf("%d",&sexnum);
    while(!(1==sexnum||2==sexnum))
    {
        printf("选择无效,请再次选择\n");
        printf("性别->");
        printf("1:男,2:女\n");
        scanf("%d",&sexnum);
    }
    if(1==sexnum)
    {
        strcpy(p->sex,"男");
    }
    else
    {
        strcpy(p->sex,"女");
    }
    printf("年龄->");
    scanf("%d",&(p->age));
    printf("地址->");
    scanf("%s",p->address);
    p->pre=NULL;
    p->next=NULL;
    return p;
}
struct student *creatDoubleLianBiao(void) //创建双向链表
{
    struct student *head=NULL;
    struct student *tail=NULL;
    struct student *p=NULL;
    int i;
    p=shenQingOneNode();
    head=p;
    tail=p;
    printf("1:继续创建, 2:退出创建\n");
    scanf("%d",&i);
    while(!(1==i||2==i))
    {
        printf("选择无效,请再次选择\n");
        printf("1:继续创建, 2:退出创建\n");
        scanf("%d",&i);
    }
    while (1==i)
    {
        p=shenQingOneNode();
        tail->next=p;
        p->pre=tail;
        tail=p;
        printf("1:继续创建, 2:退出创建\n");
        scanf("%d",&i);
        while(!(1==i||2==i))
        {
            printf("选择无效,请再次选择\n");
            printf("1:继续创建, 2:退出创建\n");
            scanf("%d",&i);
        }
        if (2==i) break;
    }
    LianBiaoID(head);
    return head;
}
void LianBiaoID(struct student *head) //为链表自动加上ID号
{
    struct student *p=NULL;
    int ID=0;
    p=head;
    if (NULL==p) return;
    while (p!=NULL)
    {
        ID++;
        p->ID=ID;
        p=p->next;
    }
    return ;
}
void printDoubleLianBiao(struct student *head) //显示链表
{
    struct student *p=NULL;
    int i=0;
    p=head;
    if (NULL==p)
    {
        printf("\n链表不存在\n");
        printf("----------------------------------------------------------------------\n");
        printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
        printf("----------------------------------------------------------------------\n");
        return;
    }
    printf("\n");
    printf("\t\t\t档  案  信  息  表\n");
    printf("----------------------------------------------------------------------\n");
    printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n");
    printf("----------------------------------------------------------------------\n");
    while (p!=NULL)
    {
        printf("%-8d%-16s%-8s%-8s%-8d%s\n",p->ID,p->studentNumber,p->name,p->sex,p->age,p->address);
        p=p->next;
        i++;
    }
    printf("----------------------------------------------------------------------\n");
    printf("\n");
    printf("\t\t\t共有 %d 条记录\n",i);
    printf("\n");
    return;
}

功能模块图


流程图


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言学生管理系统课程设计 的相关文章

  • 10g r2 RAC Dataguard 3 nodes

    最近在深圳实施windows 2003 上的oracle RAC项目 原来计划是两个节点 结果客户要求三个节点 因为是他们认为购买的服务器只有二个cpu 原来计划是四个cpu 然后还要在做dataguard 一开始安装很顺利 两个节点测试也
  • HTTP状态 405 - 方法不允许

    错误描述 HTTP状态 405 方法不允许 类型 状态报告 消息 Request method GET not supported 描述 请求行中接收的方法由源服务器知道 但目标资源不支持 此时的原因是请求类型错误 网页是get请求 但是实
  • springMVC项目如何配置tomcat

    先打开项目然后按图片所示操作 最后点击ok就可以启动项目啦
  • 【机器学习教程】四、随机森林:从论文到实践

    引言 随机森林 Random Forest 是机器学习领域中一种强大的集成学习算法 它的优秀性能和广泛应用使得它成为了机器学习领域的一个重要里程碑 本文将从算法的发展历程 重要论文 原理以及实际应用等方面详细介绍随机森林 并提供一个复杂的实
  • 时间段随机 java_java生成指定范围的随机日期

    有这样一个需求 构造一个方法 随机生成1990 12 31 00 00 00到 2013 12 31 00 00 00之间任意一个时间点 思路是这样 在javaAPI中 Date类型和long类型很好转化 所以我们可以把问题转化为 求两个l

随机推荐

  • Selinux

    1 Selinux的影响 对于文件的影响 当selinux开启时 内核会对每个文件及每个开启的程序进行标签加载 标签内记录程序和文件的安全上下文 context 对于程序功能的影响 当selinux开启会对程序的功能加载开关 并设定此开关的
  • HBuilder 打包 H5 APP 进行认证登录

    H5 Mui App 统一身份认证登录过程的记录 在 h5 app 开发的过程中 用到到统一认证登录的功能 统一身份认证登接口 来进行登录验证 在开发 h5 app 的时候 一般会提供 app 网页版的 这时候会发现 网页版和打包的APP几
  • Perl知识点滴

    函数多返回值 v1 abc v2 bcd v3 v4 upcase v1 v2 sub upcase my parms for parms tr a z A Z return wantarray parms parms 0 print v3
  • 【数据结构】6.4 AVL树(C++)

    数据结构 6 4 AVL树 没有学过二叉搜索树 也叫二叉排序树或二叉查找树 的小伙伴们建议先学习一下 这样阅读会更轻松哦 点我学习二叉搜索树 目录 一 AVL树的概念 1 二叉搜索树的问题 2 AVL树的性质 二 AVL树实现平衡的方法 1
  • 为啥要用三层结构

    开发人员可以只关注整个结构中的其中某一层 可以很容易的用新的实现来替换原有层次的实现 可以降低层与层之间的依赖 有利于标准化 利于各层逻辑的复用 结构更加的明确 在后期维护的时候 极大地降低了维护成本和维护时间 体现了高内聚 低耦合的思想
  • DocuCentre SC2020 打印机连接

    驱动下载地址 https support fb fujifilm com setupDriverForm do ctry code CN lang code zh CN d lang zh CN pid DCSC2020 anchor0 安
  • 《再也不怕elasticsearch》es环境搭建、集群搭建

    Elasticsearch环境搭建 大家好我是迷途 一个在互联网行业 摸爬滚打的学子 热爱学习 热爱代码 热爱技术 热爱互联网的一切 再也不怕elasticsearch系列 帅途会慢慢由浅入深 为大家剖析一遍 各位大佬请放心 虽然这个系列帅
  • 90、基于STM32单片机数字频率计频率检测配NE555脉冲发生器设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

    单片机主芯片选择方案 方案一 AT89C51是美国ATMEL公司生产的低电压 高性能CMOS型8位单片机 器件采用ATMEL公司的高密度 非易失性存储技术生产 兼容标准MCS 51指令系统 片内置通用8位中央处理器 CPU 和Flash存储
  • 几个效率高的排序算法

    实用排序算法 复杂度小于等于O n 2 中效率最低但实现并不是最简单的的两个 C C 教材却总喜欢拿来大讲特讲 非常不利于初学者养成 程序效率 的思维 实际上 各种排序算法里 除了堆排序实现较为复杂外 从代码量的角度 大多数算法都不比冒泡
  • matlab标准数据,Matlab数据标准化实现

    在多属性综合评价问题中 为了消除量纲差异带来指标不可公度性问题 往往需要对原始评价矩阵进行标准化处理 通过将不同量纲进行变换 变为无量纲的标准化指标 考虑到原始评价矩阵可能同时有多种类型的指标 比如 某个评价问题中可能同时有正向指标 越大越
  • 五分钟让你彻底了解TDD、ATDD、BDD&RBE

    在目前比较流行的敏捷开发模式 如极限编程 Scrum方法等 中 推崇 测试驱动开发 Test Driven Development TDD 测试在先 编码在后的开发实践 TDD有别于以往的 先编码 后测试 的开发过程 而是在编程之前 先写测
  • PostgreSQL用户登录失败自动锁定的解决办法

    墨墨导读 PostgreSQL使用session exec插件实现用户密码验证失败几次后自动锁定 本文介绍一种处理方案 一 插件session exec安装配置篇 下载插件并编译安装 https github com okbob sessi
  • RPA机器人的两种类型与未来发展

    眼下 RPA 机器人流程自动化 日渐成为业务流程优化重要解决方案和企业关注的重点 RPA不仅可以改善企业的工作方式 带来效率的提升和超高的投资回报率 ROI 其潜在的其他好处也是其他工具所无法比拟的 如改善客户体验 提高员工满意度 提高人才
  • 机器学习(一)svm运用实例

    机器学习 一 svm运用实例 这里我使用sklearn svm SVC函数 首先介绍一下函数参数 sklearn svm SVC C 1 0 kernel rbf degree 3 gamma auto coef0 0 0 shrinkin
  • TCPIP四层协议

    TCP IP四层协议 在说TCP IP四层协议之前 就不得不说OSI七层模型 OSI七层模型 自底向上依次是物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 TCP IP体系结构的优点 1 简化了计算机网络的结构 从原来的七层模型
  • UITabBarItem

    UITabBarController UITabBar UIBarItem UITabBarItem UITabBarItem就是UITabBar上显示的小按钮 我们也可以定制系统UITabBarItem按钮 只需通过UITabBarIte
  • C/C++的64位整型 zz

    为了和DSP兼容 TSint64和TUint64设置成TSint40和TUint40一样的数 结果VC中还是认为是32位的 显然不合适 typedef signed long int TSint64 typedef unsigned lon
  • 初始化 Repo错误 错误信息:fatal: error [Errno 111] Connection refused

    错误信息 fatal error Errno 111 Connection refused 解决方法 修改home 目录下的 bashrc文件 gedit bashrc 在文件的末尾添加如下命令 export PATH bin PATH e
  • QT5.6静态编译添加ODBC数据库

    qt5 6已经编译好 现在添加ODBC数据库的支持 1 进入qt everywhere opensource src 5 6 3 qtbase src plugins sqldrivers odbc目录 运行qmake exe 然后再运行n
  • C语言学生管理系统课程设计

    include