学生选课系统

本文探讨了如何设计和实现一个高效稳定的学生选课系统,包括需求分析、系统架构、数据库设计、并发处理及用户体验优化等方面,旨在为教育信息化提供可靠的技术支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

typedef  struct  Cou_num //课程编号以及成绩
{
    int number;
    int achieve;
}Cou_num;

typedef  struct  Student
{
    bool  sex;//1代表男生,0代表女生
    signed  int   grade;//年级,比如2017年入学的就是2017级。
    char   name[20];
    long  Stu_number;
    Cou_num nelenum[100];//已选课程编号以及成绩,-1代表此课程还未结课。number = 0代表未选课。
    int nelen;//已选课程总数
    Student * pnext;
}Student;

typedef  struct  Couse//课程信息结构体
{
    int num1;
    char name1[20];
    int  credit;
    int  class_hours;
    int nelepeo;//课程已选人数
    int Melepeo;//课程人数上限
    Couse * next;
}Couse;

 struct Couse *cou_headnode = (Couse *)calloc(1,sizeof(Couse));
 struct Student  *stu_headnode = (Student *)calloc(1,sizeof(Student));
 int  couse_count=0;//课程总数
 int  stu_count=0;//学生总数

void  Keyboardc()//录入课程子函数(从键盘录入)
{
    Couse *p = (Couse *)malloc(sizeof(Couse));
    if(p == NULL)
    {
        printf("Keyboardc is  error——malloc");
    }
    printf("\n课程编号\t课程名称\t学分\t学时\t课程人数上限\n");
    scanf("%d%s%d%d%d",&p->num1,&p->name1,&p->credit,&p->class_hours,&p->Melepeo);
    p->nelepeo = 0;
    p->next = cou_headnode->next;
    cou_headnode->next = p;
    couse_count++;
}

void delc(int num)//课程管理子函数(删除课程)
{
    Couse *pago = cou_headnode;
    Couse *pcur = pago->next; 
    if(!pcur)
    {
        printf("\n没有课程,无法删除!\n");
        return;
    }
    while(pcur)
    {
        if(pcur->num1 == num)
        {
            pago->next = pcur->next;
            free(pcur);
            pcur = NULL;
            printf("已删除该编号课程!\n");
            couse_count--;
            return;
        }
        pago = pcur;
        pcur= pago->next;
    }
    printf("课程未找到\n");
}

void  InputC()
{
    int i;
    start:
    printf("\t\t\t录入课程信息\n");
    printf("\n\n1.从键盘录入\n");
    printf("\n2.返回主菜单\n");
    scanf("%d",&i);
    if(i<1||i>2)
    {
        printf("输入错误,请重新输入:\n");
        goto  start;
    }
    switch(i)
    {
        case(1):Keyboardc();break;
        case(2):break;
    }
}

void managementc()//课程管理主函数
{
    int  i = 0;
    start:
    printf("\t\t\t课程管理\n");
    printf("1.新增课程\n");
    printf("2.删除课程\n");
    printf("3.返回主菜单\n");
    printf("请选择(1~3):\n");
    scanf("%d",&i);
    if(i<1||i>3)
    {
        printf("输入错误,请重新输入:\n");
        goto  start;
    }
    switch(i)
    {
        case(1):Keyboardc();break;
        case(2):
            {
                int num;
                printf("请输入要删除课程的编号:\n");
                scanf("%d",&num);
                delc(num);
                break;
            }
        case(3):break;
    }
}

void Keyboards()
{
    Student *p =  (Student *)calloc(1,sizeof(Student));
    if(p == NULL)
    {
        printf("Keyboards is  error——malloc");
    }
    printf("\n姓名\t性别\t学号\t年级\n");
    scanf("%s%d%d%d",&p->name,&p->sex,&p->Stu_number,&p->grade);
    p->pnext = stu_headnode ->pnext;
    stu_headnode ->pnext = p;
    stu_count++;
}

void  InputS()
{
    int i = 0;
    start:
    printf("\t\t\t录入学生信息\n");
    printf("\n\n1.从键盘录入\n");
    printf("\n2.返回主菜单\n");
    scanf("%d",&i);
    if(i<1||i>2)
    {
        printf("输入错误,请重新输入:\n");
        goto  start;
    }
    switch(i)
    {
        case(1):Keyboards();break;
        case(2):break;
    }
}
void elect(Student * s)//选课
{
    Couse * c;
    int num;
    int i = 0;
    printf("请输入要选课的编号:\n");
    scanf("%d",&num);
    for(i = 0;s->nelenum[i].number != 0;i++);
    s->nelenum[i].number = num;
    s->nelenum[i].achieve = -1;
    c = cou_headnode -> next;
    while(c->num1 != num) c = c->next;
    (c->nelepeo)++;
}

void  dels(int num)
{
    Student *pago = stu_headnode;
    Student *pcur = pago->pnext; 
    if(!pcur)
    {
        printf("\n没有任何学生信息,无法删除!\n");
        return;
    }
    while(pcur)
    {
        if(pcur->Stu_number == num)
        {
            pago->pnext = pcur->pnext;
            free(pcur);
            pcur = NULL;
            printf("已删除该学生信息!\n");
            stu_count--;
            return;
        }
        pago = pcur;
        pcur= pago->pnext;
    }
    printf("该学生信息未找到\n");
}

void managements()//学生管理主函数
{
    int  i = 0;
    start:
    printf("\t\t\t学生信息管理\n");
    printf("1.新增学生信息\n");
    printf("2.删除学生信息\n");
    printf("3.返回主菜单\n");
    printf("请选择(1~3):\n");
    scanf("%d",&i);
    if(i<1||i>3)
    {
        printf("输入错误,请重新输入:\n");
        goto  start;
    }
    switch(i)
    {
        case(1):Keyboards();break;
        case(2):
            {
                int num;
                printf("请输入要删除课程的编号:\n");
                scanf("%d",&num);
                dels(num);
                break;
            }
        case(3):break;
    }
}

void  cheak()
{
    char e;
    Couse * c;
    Student * s;
    int num;
    int i = 0;
    int j = 0;
    bool  IScheak = 0;
    printf("请输入你的学号:");
    scanf("%d",&num);
    s = stu_headnode;
    while(s->Stu_number != num && s->pnext != NULL) s = s->pnext;
    if(s->Stu_number != num)
    {
        printf("不存在你的信息,请进入主菜单录入你的信息!\n");
        goto end;
    }

    c = cou_headnode->next;
    printf("你的可选课程编号:\n");
    while(c != NULL)
    {
        for(i = 0,IScheak = 0;s->nelenum[i].number != 0;i++)
        {
            if(c->num1 == s->nelenum[i].number)
            {
                 IScheak = 1;
                 break;
            }
        }
        if(IScheak == 0 && (c->nelepeo != c->Melepeo))
        {
            printf("课程号\t,课程名\t\n");
            printf("%d\t,%s\t\n",c->num1,c->name1);
            j++;
        }
        c = c->next;
    }
    if(j==0)
    {
        printf("你已选完所有课程,无法再多选!\n");
        goto end;
    }
    printf("选课(y/n)?\n");
    getchar();
    e = getchar();
    while(e == 'y' || e == 'Y')
    {
        elect(s);
        printf("继续选课(y/n)?\n");
        getchar();
        e = getchar();
        (s->nelen)++;
    }
    end:;
}

void back(Student * s)//退课
{
    start:
    Couse * c;
    int num,i,j = 0;
    bool tmp = 0;
    printf("请输入你要退掉的课程编号:\n");
    scanf("%d",&num);
    c = cou_headnode;
    for(i = 0;s->nelenum[i].number != 0;i++)
    {
        if(s->nelenum[i].number == num)
        {
            tmp = 1;
            break;
        }
    }
    if(!tmp)
    {
        printf("输入课程号有误,请重新输入:\n");
        goto start;
    }
    while(c->num1 != num)c = c->next;
    (c->nelepeo)--;
    for(i = 0;s->nelenum[i].number != num;i++)
    for(j = i;s->nelenum[j].number != 0;j++)
    {
        s->nelenum[j].number =  s->nelenum[j+1].number;
        s->nelenum[j].achieve =  s->nelenum[j+1].achieve;
    }
    s->nelenum[j-1].number = 0;
    s->nelenum[j-1].achieve = 0;
    printf("退课成功!\n");
}

void  hcheak()
{
    char e;
    Couse * c;
    Student * s;
    int num,i,f=0;
    printf("请输入学号:\n");
    scanf("%d",&num);
    s = stu_headnode;
    while(s->Stu_number != num && s->pnext != NULL) s = s->pnext;
    if(s->Stu_number != num)
    {
        printf("不存在你的信息,请进入主菜单录入你的信息!\n");
        goto end;
    }           
    if(s->nelenum[0].number==0)
    {
        printf("你还没选课!\n");
        goto end;
    }
    printf("已选课程编号:\n");
    for(i=0;s->nelenum[i].number!=0;i++)
    {
        printf("%d\n",s->nelenum[i].number);
        c=cou_headnode->next;
        while(c->num1 != s->nelenum[i].number) c = c->next;
        f += c->credit;
    }
    printf("所选课程总学分:%d\n",f);
    printf("是否进行退课(y/n)?");
    getchar();
    e=getchar();
    while(e == 'y' || e == 'Y')
    {
        back(s);
        printf("继续选课(y/n)?\n");
        getchar();
        e = getchar();
        (s->nelen)--;
    }
    end:;
}

void   elective()//学生选课主函数
{
    int i;
    printf("\t\t\t学生选课\n");
    printf("1.查询可选课程\n");
    printf("2.管理已选课程\n");
    printf("3.返回主菜单\n");
    printf("请输入(1~3):\n");
    scanf("%d",&i);
    switch(i)
    {
    case(1):cheak();break;
    case(2):hcheak();break;
    case(3):break;
    }
}

void  Show_listc()
{
    Couse * p;
    p = cou_headnode->next;
    printf("课程编号  课程名称  学分  学时 课程已选人数  课程人数上限\n");
    while(p!=NULL)
    {
        printf("%-8d%10s%6d%6d%8d%12d\n",p->num1,p->name1,p->credit,p->class_hours,p->nelepeo,p->Melepeo);
        p=p->next;
    }
}

void  Show_lists()
{
    Student * p;
    p=stu_headnode->pnext;
    printf("学生学号  学生姓名  已选课程数量\n");
    while(p!=NULL)
    {
        printf("%-4d %10s %6d\n",p->Stu_number,p->name,p->nelen);
        p=p->pnext;
    }
}


void  into()
{
    int i;
    printf("1.存储课程信息\n");
    printf("2.存储学生信息\n");
    printf("3.返回主菜单\n");
    printf("请输入(1~3)\n");
    scanf("%d",&i);
    switch(i)
    {
    case(1):intoc();break;
    case(2):intos();break;
    case(3):break;
    }    
}

void  store()//信息主函数
{
    int i;
    printf("\t\t系统信息查看及存储\n");
    printf("1.查看课程信息\n");
    printf("2.查看学生信息\n");
    printf("3.存储信息\n");
    printf("4.返回主菜单\n");
    printf("请输入(1~4):\n");
    start:
    scanf("%d",&i);
    if(i<1||i>7)
    {
        printf("输入错误,请重新输入:\n");
        goto  start;
    }
    switch(i)
    {
    case(1):Show_listc();break;
    case(2):Show_lists();break;
    case(3):into();break;
    case(4):break;
    }
}

int main()
{
    int i = 0;
    start:
    printf("\n\t\t\t学生选课系统\n");
    printf("菜单:\n");
    printf("1.录入课程信息\n");
    printf("2.课程管理\n");
    printf("3.录入学生信息\n");
    printf("4.学生信息管理\n");
    printf("5.学生选课\n");
    printf("6.信息查看以及存储\n");
    printf("7.退出系统\n");
    printf("\n请输入菜单选项(1~7):\n");
    scanf("%d",&i);
    if(i<1||i>7)
    {
        printf("输入错误,请重新输入:\n");
        goto  start;
    }
    switch(i)
    {
        case(1):
            {
                system("cls");
                InputC();
                goto start;
                break;
            }
        case(2):
             {
                system("cls");
                managementc();
                goto start;
                break;
             }
        case(3):
            {
                system("cls");
                InputS();
                goto start;
                break;
            }
        case(4):
            {
                system("cls");
                managements();
                goto start;
                break;
            }
        case(5):
            {
                system("cls");
                elective();
                goto start;
                break;
            }
        case(6):
            {
                system("cls");
                store();
                goto start;
                break;
            }
        case(7):
            {
                printf("感谢使用本系统!\n\n再见!\n");
            }
    }
}

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值