基于C语言的学生选课系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XiaoCaiDaYong/article/details/68486910

鉴于C语言实现的通讯录,为了巩固C语言的基础知识,试着写一个简单的学生选课系统
思路比较简单:
1.回滚显示各种提示信息或操作信息
2.链表操作。
代码中有管理员部分功能没有实现,学生和老师的功能基本实现,但有待加固,如果初学者可是试着去完善一下。
还可以将老师,学生的信息输出到文件文本中,本代码中没有实现,但并不是很难。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 总链表——存放所有信息 */
typedef struct Sum_Node
{
    /* 学生信息 */
    char stuNo[20][20];
    char stuName[20][20];
    char stuSex[20][20];
    /* 课程信息 */
    char CourseNum[20];
    char CourseName[20];
    char CourseTeacher[20];
    struct Sum_Node *next;
}TotalNode;

/* 链表管理员——暂时不需要 */
/*typedef struct Node
{
    char Num[20];
    char Name[20];
    char Sex[10];
    struct Node *next;
}Manager_Node;*/

char studentAccount[20];
char studentPassword[20];
char teacherAccount[20];
char teacherPassword[20];
char managerAccount[20];
char managerPassword[20];

/* 定义结构体指针 */
TotalNode *pTeacher;
TotalNode *pStudent;


/* 函数的声明 */
void checkPerson_Msg(TotalNode *phead,int n);
void CreateTeacherNode(TotalNode *head);

/* 学生信息的输出-链表 */
void OutStudentNode(TotalNode *head,char *Account)
{
    TotalNode *p;
    int num=0;
    int i,j;
    int flag=0;
    char Account_random[20]="";
    pStudent=pTeacher;  // 学生和老师用的链表是同一个
    p=pStudent;

    puts("******所选课程信息******");
    puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    if(pStudent==NULL)
    {
        puts("没有数据!");
        puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        return;
    }
    printf("请输入所要查询人的姓名:");
    gets(Account_random);   //  获取所要查询的学生姓名
    if(0 == Account_random[0])
    {   
        gets(Account_random);
    }
    while(p!=NULL)
    {
        for(j=0;j<20;j++)
        {
            if(0 == strcmp(p->stuName[j],Account_random))
            {
                printf("课程代码:%s\t",p->CourseNum);
                printf("课程名称:%s\t",p->CourseName);
                printf("课程老师:%s\t",p->CourseTeacher);
                for(i=0;i<20;i++)
                {
                    if(p->stuNo[i][0]!='\0')
                    {
                        num++;
                    }
                }
                printf("选课学生:%d\t",num);
                num=0;  //  清0操作
                putchar('\n');
                flag=1;
            }
        }
        p=p->next;
    }
    if(0 == flag)
    {
        puts("没有该学生选课信息!!!!");
    }
    puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    putchar('\n');  
}

/* 学生信息的插入-链表 */
void InsertStudentNode(TotalNode *head,char *Account)
{
    TotalNode *p;
    int i;
    char courseCode[20]="";
    pStudent=pTeacher;  // 学生和老师用的链表是同一个,都是链表头
    p=pStudent;
    if(p==NULL)
    {
        puts("等待教师录入选课信息,请下次再进行选择!!");
        return;
    }
    printf("【请输入正确的课程代码】");
    gets(courseCode);
    if(0 == courseCode[0])
    {
        gets(courseCode);
    }
    while(p!=NULL)
    {
        if(0 == strcmp(p->CourseNum, courseCode))
        {
            for(i=0;i<20;i++)
            {   
                if(p->stuNo[i][0] == '\0')
                {
                    printf("请输入学号:");
                    gets(p->stuNo[i]);
                    printf("请输入姓名:");
                    gets(p->stuName[i]);
                    printf("请输入性别:");
                    gets(p->stuSex[i]);
                    puts("选课成功!!!!");
                    return;
                }
            }
        }
        p=p->next;
    }
    puts("$$$$$$选课失败,请重新选择$$$$$$");

}

/* 删除所选课程 */
void DeleteStudentNode(TotalNode *head,char *Account)
{
    char coursNo[20]="";    //  课程代码
    char student[20]="";    //  学生姓名
    TotalNode *p;
    int i;
    int flag=0;
    pStudent=pTeacher;  // 学生和老师用的链表是同一个,都是链表头
    p=pStudent;
    if(pStudent==NULL)
    {
        puts("没选该课程,删除失败!!!!");
        return;
    }

    printf("【输入学生姓名】");
    gets(student);
    if(0 == student[0])
    {
        gets(student);
    }

    printf("【请输入删除的课程代码】");
    gets(coursNo);
    if(0 == coursNo[0])
    {
        gets(coursNo);
    }
    while(p!=NULL)
    {
        if(0==strcmp(p->CourseNum,coursNo)) //  查询所要删除的课程代码
        {
            for(i=0;i<20;i++)
            {
                if(0==strcmp(p->stuName[i],student))
                {
                    /* 初始化清0操作 */
                    p->stuNo[i][0]='\0';
                    p->stuName[i][0]='\0';
                    p->stuSex[i][0]='\0';
                    puts("删除成功!!!!");
                    flag=1;     //  删除标志位
                }
            }   
        }
        p=p->next;
    }
    if(0 == flag)   //  如果删除成功标志位置1
    {
        puts("删除失败!!!!");
    }

}


/* 教师信息的输出-链表 */
void OutTeacherNode(TotalNode *head)
{
    TotalNode *p;
    int num=0;
    int i;
    p=pTeacher;
    puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    if(pTeacher==NULL)
    {
        puts("没有数据!");
        puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        return;
    }
    while(p!=NULL)
    {
        printf("课程代码:%s\t",p->CourseNum);
        printf("课程名称:%s\t",p->CourseName);
        printf("课程老师:%s\t",p->CourseTeacher);
        for(i=0;i<20;i++)
        {
            if(p->stuNo[i][0]!='\0')
            {
                num++;
            }
        }
        printf("选课学生:%d\t",num);
        num=0;  //  清0操作
        putchar('\n');
        p=p->next;
    }
    puts("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    putchar('\n');  
}

/* 教师信息的插入-链表 */
void InsertTeacherNode(TotalNode *head)
{
    TotalNode *p;
    TotalNode *q;
    int i;
    p=pTeacher;  // 教师链表的头
    if(pTeacher==NULL)
    {
        CreateTeacherNode(head);
        puts("添加成功!");
        return;
    }
    while(p!=NULL)
    {
        if(p->next == NULL)
        {
            q=(TotalNode *)malloc(sizeof(TotalNode));
            p->next=q;
            q->next=NULL;
            for(i=0;i<20;i++)
            {
                q->stuNo[i][0]='\0';
            }
            printf("请输入课程代码:");
            gets(q->CourseNum);
            if(0 == *q->CourseNum)
            {
                gets(q->CourseNum);
            }
            printf("请输入课程名称:");
            gets(q->CourseName);
            printf("请输入课程教师:");
            gets(q->CourseTeacher);
            puts("添加成功!");
            break;
        }
        p=p->next;
    }
    //pTeacher=head;
}

/* 教师信息的插入-链表 */
void CreateTeacherNode(TotalNode *head)
{
    int i;
    pTeacher=(TotalNode *)malloc(sizeof(TotalNode));
    pTeacher->next=NULL;
    for(i=0;i<20;i++)
    {
        pTeacher->stuNo[i][0]='\0';
    }
    printf("请输入课程代码:");
    gets(pTeacher->CourseNum);
    if(0 == *pTeacher->CourseNum)
    {
        gets(pTeacher->CourseNum);
    }
    printf("请输入课程名称:");
    gets(pTeacher->CourseName);
    printf("请输入课程教师:");
    gets(pTeacher->CourseTeacher);
    //pTeacher=head;
}

/* 删除指定数据 */
void DeleteTeacherNode(TotalNode *phead)
{
    char coursNo[20]="";    //  课程代码
    TotalNode *p;
    TotalNode *s;
    p=pTeacher; // 教师链表的头
    s=pTeacher;
    if(NULL==pTeacher)
    {
        puts("没有课程信息!!!!");
        return;
    }
    printf("【请输入删除的课程代码】");
    gets(coursNo);
    if(0 == coursNo[0])
    {
        gets(coursNo);
    }
    if(0 == strcmp(p->CourseNum,coursNo))
    {
        pTeacher=p->next;
        puts("删除成功!!");
        return;
    }
    while(p != NULL)
    {
        if(0 == strcmp(p->CourseNum,coursNo))
        {
            s->next=p->next;
            puts("删除成功!!");
            return;
        }
        s=p;
        p=p->next;
    }
}

/* 功能显示 */
void display(TotalNode *phead)
{
    int n;
    while(1)
    {
        puts("=========请选择登录页面=========");
        puts("[1]学生登录");
        puts("[2]教师登录");
        puts("[3]管理员登录");
        puts("[4]退出系统");
        while(1)    //  循环检查输入的值是否正确
        {
            printf("【请选择】");
            scanf("%d",&n);
            if(n>4 || n<1)
            {
                puts("输入有误,请选择正确的选项:");
                continue;       //  输入不正确,重新输入
            }
            else
            {
                break;  //  输入正确,退出循环
            }
        }
        if( 1 == n )  //    学生登录系统
        {
            puts("=========欢迎登录学生系统=========");
            printf("请输入账号和密码\n");
            checkPerson_Msg(phead,1);


        }
        if( 2 == n )  //    老师登录系统
        {
            puts("=========欢迎登录教师系统=========");
            printf("请输入账号和密码\n");
            checkPerson_Msg(phead,2);

        }
        if( 3 == n )  //    管理员登录系统
        {
            puts("=========欢迎登录管理员系统=========");
            printf("请输入账号和密码\n");
            checkPerson_Msg(phead,3);

        }
        if( 4 == n )  //    退出系统
        {
            puts("@@@@@@@@@欢迎下次登录,再见!!!@@@@@@@@@");
            exit(0);        
        }
    }
}

/* 学生登录后的操作,查询、修改 */
void Student_Mng(TotalNode *phead, char *Account,int n)
{
    switch(n)
    {
    case 1:     //  查询
        OutStudentNode(phead,Account);
        break;
    case 2:     //  添加
        InsertStudentNode(phead,Account);
        break;
    case 3:     //  删除
        DeleteStudentNode(phead,Account);
        break;
    case 4: ;   //  返回主页面,上层已经实现,此处不需要考虑
        break;
    default:
        puts("异常!");
        break;
    }
}

/* 教师登录后的操作,查询、修改 */
void Teacher_Mng(TotalNode *phead, char *Account,int n)
{

    switch(n)
    {
    case 1: //  查询学生选课情况
        OutTeacherNode(phead);
        break;
    case 2: //  添加和删除课程信息
        InsertTeacherNode(phead);
        break;
    case 3:     
        DeleteTeacherNode(phead);
        break;
    case 4:
        break;  //  上层实现其功能
    default:
        puts("异常!");
        break;
    }
}

/* 管理员登录后的操作,查询、修改 */
void Manager_Mng(char *Account, int n)
{
    switch(n)
    {
    case 1:
        break;
    case 2:
        break;
    case 3:
        break;
    default:
        puts("异常!");
        break;
    }
}
/* 显示各功能登录后的信息 */
void display_Detailed(TotalNode *phead ,char *Account,int n)
{
    int in;
    switch(n)
    {
    case 1:
        while(1)
        {
            printf("=========欢迎%s同学=========\n",Account);
            puts("[1]查询已选课程");  //  查询自己所选的所有课程包括:课程代码、课程名称、任课老师
            puts("[2]添加课程");        //  增加所选课程
            puts("[3]删除所选课程");  //  删除所选课程
            puts("[4]返回主页面");
            printf("【请选择】");
            scanf("%d",&in);
            if(4 == in)
            {
                return; //  返回上层登录页面
            }
            Student_Mng(pStudent,Account, in);
            //puts("[4]");
        }
        break;
    case 2:
        while(1)
        {
            printf("=========欢迎%s老师=========\n",Account);
            puts("[1]查询学生选课信息");    //  
            puts("[2]添加老师课程信息");    //  
            puts("[3]删除老师课程信息");    //
            puts("[4]返回主页面");
            printf("【请选择】");
            scanf("%d",&in);
            if(4 == in)
            {
                return; //  返回上层登录页面
            }
            Teacher_Mng(pTeacher,Account, in);
        }
        //puts("[4]");
        break;
    case 3:
        printf("=========欢迎%s同志=========\n",Account);
        puts("[1]查询学生所选课程信息");
        puts("[2]修改选课信息");
        puts("[3]返回主页面");
        scanf("%d",&in);
        Manager_Mng(Account, in);
        //puts("[4]");
        break;
    default:
        puts("异常!");
        break;
    }

}

/* 验证账号密码 */
void checkAccountandPassword(TotalNode *phead ,char *Account, char *Password,int n)
{
    while(1)
    {
        gets(Account);
        /**/
        if(0 == strcmp(Account,"wantin"))
        {
            while(1)
            {
                printf("请输入密码:");
                gets(Password);
                if(0 == strcmp(Password,"123456"))
                {
                    display_Detailed(phead,Account, n);
                    return;
                }
            }
        }
        else
        {
            printf("请输入账号:");
        }
    }
}

/* 校验学生、教师、管理员的账号 密码 */
void checkPerson_Msg(TotalNode *phead , int n)
{
    switch(n)
    {
        case 1: //  学生登录    char studentAccount[20]; char studentPassword[20];  
            checkAccountandPassword(phead, studentAccount,studentPassword,n);
            break;
        case 2: //  教师登录    char teacherAccount[20]; char teacherPassword[20];      
            checkAccountandPassword(phead, teacherAccount,teacherPassword,n);
            break;
        case 3: //  管理员登录  char managerAccount[20]; char managerPassword[20];       
            checkAccountandPassword(phead, managerAccount,managerPassword,n);
            break;
        default:
            puts("异常!");
            break;
    }
}

/*  */

void main()
{
    TotalNode *phead=NULL;
    display(phead);
}

大家可以根据下面的操作来帮助读懂这段代码。
操作结果如下:

=========请选择登录页面=========
[1]学生登录
[2]教师登录
[3]管理员登录
[4]退出系统
【请选择】2
=========欢迎登录教师系统=========
请输入账号和密码
请输入账号:wantin
请输入密码:123456
=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】2
请输入课程代码:123
请输入课程名称:C语言
请输入课程教师:王艇
添加成功!
=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】2
请输入课程代码:456
请输入课程名称:Java
请输入课程教师:王艇
添加成功!
=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】2
请输入课程代码:789
请输入课程名称:PHP
请输入课程教师:王艇
添加成功!
=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:0
课程代码:456    课程名称:Java   课程老师:王艇   选课学生:0
课程代码:789    课程名称:PHP    课程老师:王艇   选课学生:0
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】4
=========请选择登录页面=========
[1]学生登录
[2]教师登录
[3]管理员登录
[4]退出系统
【请选择】1
=========欢迎登录学生系统=========
请输入账号和密码
请输入账号:wantin
请输入密码:123456
=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】1
******所选课程信息******
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入所要查询人的姓名:王艇
没有该学生选课信息!!!!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】3
【输入学生姓名】王艇
【请输入删除的课程代码】123
删除失败!!!!
=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】2
【请输入正确的课程代码】123
请输入学号:110
请输入姓名:王艇
请输入性别:男
选课成功!!!!
=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】1
******所选课程信息******
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入所要查询人的姓名:王艇
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】4
=========请选择登录页面=========
[1]学生登录
[2]教师登录
[3]管理员登录
[4]退出系统
【请选择】2
=========欢迎登录教师系统=========
请输入账号和密码
请输入账号:wantin
请输入密码:123456
=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:1
课程代码:456    课程名称:Java   课程老师:王艇   选课学生:0
课程代码:789    课程名称:PHP    课程老师:王艇   选课学生:0
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】4
=========请选择登录页面=========
[1]学生登录
[2]教师登录
[3]管理员登录
[4]退出系统
【请选择】1
=========欢迎登录学生系统=========
请输入账号和密码
请输入账号:wantin
请输入密码:123456
=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】2
【请输入正确的课程代码】456
请输入学号:110
请输入姓名:王艇
请输入性别:男
选课成功!!!!
=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】1
******所选课程信息******
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入所要查询人的姓名:王艇
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:1
课程代码:456    课程名称:Java   课程老师:王艇   选课学生:1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】2
【请输入正确的课程代码】123
请输入学号:112
请输入姓名:王五
请输入性别:男
选课成功!!!!
=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】1
******所选课程信息******
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入所要查询人的姓名:王艇
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:2
课程代码:456    课程名称:Java   课程老师:王艇   选课学生:1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】1
******所选课程信息******
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
请输入所要查询人的姓名:王五
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin同学=========
[1]查询已选课程
[2]添加课程
[3]删除所选课程
[4]返回主页面
【请选择】4
=========请选择登录页面=========
[1]学生登录
[2]教师登录
[3]管理员登录
[4]退出系统
【请选择】2
=========欢迎登录教师系统=========
请输入账号和密码
请输入账号:wantin
请输入密码:123456
=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
课程代码:123    课程名称:C语言  课程老师:王艇   选课学生:2
课程代码:456    课程名称:Java   课程老师:王艇   选课学生:1
课程代码:789    课程名称:PHP    课程老师:王艇   选课学生:0
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

=========欢迎wantin老师=========
[1]查询学生选课信息
[2]添加老师课程信息
[3]删除老师课程信息
[4]返回主页面
【请选择】

猜你喜欢

转载自blog.csdn.net/XiaoCaiDaYong/article/details/68486910