课程信息管理系统

一、主要内容

【数据文件】

1.课程信息数据文件。每门课程的信息包含:课程编号,课程名称,理论课时、实验课时、学分、开课学期(8个学期)、课程性质(分为必修、选修、限选等类别)、课程介绍等信息;

2.学生数据文件。该文件中包括学生的信息,每个学生信息包含:学号、姓名、年级(如2024届),密码,权限级别(区别系统管理员和普通学生)等信息;

3.设计的扩展功能对应的其他数据文件。

【系统实现功能】要求系统能够实现“管理员”和“学生”两类人员的登录以及完成对应的操作。

1.管理员

(1)实现课程信息管理:如①初始化该专业的所有课程信息,可保存到文件中;②相关信息各种查询。如支持以下几种查询方式:(a)按课程名或者课程号查询(精确查找,或模糊查找) (b)按学期进行查询,(c)按课程性质查询(d)。③课程信息添加、删除、修改等。

(2)实现学生信息管理:如①逐个或者批量创建普通用户账号(用户名为学生学号,密码可统一初始化,并将相应的信息存储到文件“userinfo.dat”中),②逐个或批量删除学生账号,③可重置单个学生密码等操作。

2.学生

(1)学生信息管理:学生登录可更改自己账号的密码。

(2)查询专业中各个课程的信息。支持的查询方式同管理员模式下的查询功能。

二、需求分析

软件工程专业课程信息管理系统主要可以分为两大部分,一是管理员操作部分,二是学生操作部分。

管理员需要实现的功能有:

  1. 增加课程信息
  2. 删除课程信息
  3. 查找课程信息(按名称、编号、性质、学期查找)
  4. 修改课程信息
  5. 浏览课程信息
  6. 增加学生信息
  7. 删除学生信息
  8. 重置学生密码

学生需要实现的功能有:

  1. 查询课程信息(同管理员)
  2. 修改密码

三、概要设计 

1、系统功能层次结构图 

2、数据类型的定义

  1. 课程数据类型的定义

需要储存的数据有:课程编号、课程名称、理论课时、实践课时、学分、学期、课程性质。

struct course 

{
    char name[30];    //课程名称
    char num[30];     //课程编号
    int period_li;    //理论课时
    int period_shi;   //实际课时
    int credit;       //学分
    int term;         //学期
    char nature[20];  //性质(必修or选修)
};

      2.学生数据类型的定义

需要储存的数据有:学生的姓名、学号和密码。

struct student  //学生结构体

{
    char s_name[30];     //学生姓名  
    char s_num[30];      //学生学号
    char s_key[30];      //学生密码
};

3、函数设计

 为了实现上述功能,本系统设计了多个函数,函数和功能具体阐述如下:

void printList(struct Node* headNode);  //打印课程信息
void insertData(struct Node* headNode,struct course data)   //插入课程信息
void insertData2(struct Node2* headNode2,struct student data2)   //插入学生信息
void deleteDatabyname(struct Node* headNode, const char*name)  //通过名称删除课程
void deleteDatabynum(struct Node* headNode, const char*num)  //通过编号删除课程
void deleteDatabys_num(struct Node2* headNode2, const char*s_num)  //通过学号删除学生
struct Node* searchDatabyname(struct Node* headNode, const char*name)  //通过学生查询课程
struct Node* searchDatabynum(struct Node* headNode, const char*num)  //通过编号查询课程
struct Node* searchDatabynature(struct Node* headNode, const char*nature)  //通过性质查询课程
struct Node* searchDatabyterm(struct Node* headNode, const int*term)  //通过学期查询课程
struct Node* searchDatabys_num(struct Node2* headNode2, const char*s_num)  //通过学号查询课程
void saveToFile(struct Node* headNode,const char* fileName)  //保存课程文件
void saveToFile2(struct Node2* headNode2,const char* fileName)  //保存学生文件
void readFromFile(struct Node* headNode,const char* fileName)  //读取课程文件
void readFromFile2(struct Node2* headNode2,const char* fileName)  //读取学生文件
void HandleCourse()  //管理课程信息
void HandleStudent()  //管理学生信息
void choice_teacher()  //管理员选择
void choice_student()  //学生选择
void enter()  //用户登录
int main()  //主函数

四、运行环境

硬件环境:PC机-内存 16GB。

软件环境:操作系统-windows11。

开发环境:CodeBlocks 20.03

编程语言:C语言。

五、详细设计

1、系统登录

  身份选择功能如图5-1所示,需要用户输入自己的身份,如果输入1,那么就读取管理员信息的文件;如果输入2,那么就读取学生信息的文件。然后需要用户输入管理员或学生的账号和密码,如果和文件中的数据一致,那么则登录成功,跳转到管理端或学生端。实现这一功能需要使用fscanf函数遍历管理员信息文件或是学生信息文件中的数据,然后与用户键入的数据进行比较。

 void enter()
{
int shenfen;
    char enter_hao[20]={' '};
    char enter_key[20]={' '};
    char file_hao[20]={' '};
    char file_key[20]={' '};
    struct student a;
    FILE* fp;
        menu();
        scanf ("%d",&shenfen);
        switch(shenfen)
{
  case 1:
        fp=fopen("管理员信息.txt","r");
        printf ("请输入账号:\n");
        scanf ("%s",enter_hao);
        printf ("请输入密码:\n");
        scanf ("%s",enter_key);
        while(1)
    {
            fscanf (fp,"%s %s",file_hao,file_key);
        if (strcmp(enter_hao,file_hao)==0&&strcmp(enter_key,file_key)==0)
        {       printf ("登录成功!");
                choice_teacher();
                break;
         }              //登陆成功
       else if (strcmp(enter_hao,file_hao)==0&&strcmp(enter_key,file_key)!=0)
        {
            printf ("密码错误!\n");
            break;
        }
      else if (strcmp(enter_hao,file_hao)!=0)
        {
            continue;
        }
        else
        {
            printf ("输入错误!");
            break;
        }
        fclose(fp);
    }
  break;
  default:
      printf ("输入错误\n");
}
图5-1
图5-1

 2、录入课程信息

   录入课程信息功能如图5-2所示,需要用户输入课程编号、名称、理论学时、实践学时、学分、学期、性质,然后储存到名为“course.txt”的文件。

void insertData(struct Node* headNode,struct course data)    //插入函数
 {
     struct Node* newNode = createNode(data);
     newNode->next = headNode->next;
     headNode->next = newNode;
 }

case 1:       //主函数的录入操作
        printf ("请输入:\n");
        printf ("课程编号 名称 理论学时 实践学时 学分 学期 性质:\n");     scanf("%s %s %d %d %d %d %s",temp.num,temp.name,&temp.period_li,&temp.period_shi,&temp.credit,&temp.term,temp.nature);
        insertData(list,temp);
        printf ("录入成功!\n");
        saveToFile(list,"course.txt");
        break;
图5-2
图5-2

​​​​3、删除课程信息

  删除课程信息功能如图5-3所示,可以通过按名称和按编号两种方式执行删除操作。下面仅展示通过编号删除的代码。

void deleteDatabynum(struct Node* headNode, const char*num)
 {
    struct Node* preNode = headNode;          //前一个结点
    struct Node* curNode = headNode->next;    //这一个结点
    while (curNode!=NULL&&strcmp(curNode->data.num,num)!=0)
{
preNode=curNode;
        curNode=preNode->next;
}
    if (curNode==NULL)
    {printf ("删除失败!没有找到指定课程!\n");}
    else
    {
        preNode->next = curNode->next;
        free(curNode);
        printf ("删除成功!");
    }
 }
图5-3

4、修改课程信息

  修改课程信息功能如图5-4所示,可以通过按编号和按名称两种方式执行修改操作。这里仅以按编号修改为例子。在键入编号后,还需输入该课程新的信息。下面仅展示通过编号修改的代码。

case 4:  //修改
        printf ("请选择修改方式\n");
        printf ("1:按名称修改\n");
        printf ("2:按编号修改\n");
        scanf ("%d",&choice_xiugai);
        if (choice_xiugai==1)
        {
        printf ("请输入要修改的学生姓名:\n");
        scanf ("%s",temp.name);
        result=searchDatabyname(list,temp.name);
        if (result==NULL)
        {
            printf ("未找到该课程\n");
        }
        else
        {
            printf ("请输入该课程新的信息\n");
            printf ("编号 名称 理论学时  实践学时 学分 学期 性质\n");
            scanf("%s %s %d %d %d %s",
                 result->data.num,
                 result->data.name,
                 &result->data.period_li,
                 &result->data.period_shi,
                 &result->data.credit,
                 &result->data.term,
                 result->data.nature);
            printf ("修改成功!\n");
        }
        }
        if (choice_xiugai==2)
        {
        printf ("请输入要修改的课程编号:\n");
        scanf ("%s",temp.num);
        result=searchDatabynum(list,temp.num);
        if (result==NULL)
        {
            printf ("未找到该课程\n");
        }
        else
        {
            printf ("请输入该课程新的信息\n");
             printf ("编号 名称 理论学时 实践学时 学分 学期 性质\n");
            scanf("%s %s %d %d %d %s",
                 result->data.num,
                 result->data.name,
                 &result->data.period_li,
                 &result->data.period_shi,
                 &result->data.credit,
                 &result->data.term,
                 result->data.nature);
            printf ("修改成功!\n");
        }
        }
        saveToFile(list,"course.txt");
        break;
图5-4

5、查找课程信息

  查找课程信息功能如图5-5-1和5-5-2所示,可以通过名称、编号、性质、学期来进行查找。查找需要遍历整个链表,直到找到与键入信息相同的节点数据。可以通过pmove指针来实现。通过性质或学期查找,则需要再加一个循环。下面仅以按编号查找和按性质查找为例子。

struct Node* searchDatabynum(struct Node* headNode, const char*num)  //按编号查找函数
 {
     struct Node* pmove = headNode->next;
    while(pmove!=NULL&&strcmp(pmove->data.num,num))
    {
        pmove=pmove->next;
    }
    return pmove;
 } 

 if (choice_chaxun==2)   //主函数中的查找操作
    {
        printf ("请输入要查找的课程编号\n");
        scanf("%s",temp.num);
        result=searchDatabynum(list,temp.num);
        if (result==NULL)
        {
            printf ("未找到该课程\n");
        }
        else
        {
            printf ("编号\t名称\t\t\t理论学时\t实践学时\t学分\t学期\t性质\n");
            printf ("%s\t%s\t\t%d\t\t%d\t\t%d\t%d\t%s\n",
                 result->data.num,
                 result->data.name,
                 result->data.period_li,
                 result->data.period_shi,
                 result->data.credit,
                 result->data.term,
                 result->data.nature);
        }
        break;
}
图5-5

6、浏览课程信息

  浏览课程信息功能如图5-6所示,本系统先定义一个打印函数,通过调用打印函数,可以实现把文件中的全部课程信息打印到屏幕上。

void printList(struct Node* headNode)  //打印函数
 {
     struct Node* pmove = headNode->next;
     printf ("编号\t名称\t\t\t理论学时\t实践学时\t学分\t学期\t性质\n");
     while (pmove!=NULL)
     {printf ("%s\t%s\t\t%d\t\t%d\t\t%d\t%d\t%s\n",
                 pmove->data.num,
                 pmove->data.name,
                 pmove->data.period_li,
                 pmove->data.period_shi,
                 pmove->data.credit,
                 pmove->data.term,
                 pmove->data.nature);
         pmove = pmove->next;
     }
 }
图5-6

7、录入学生信息

  录入学生信息功能如图5-7所示。本系统先定义了一个插入学生函数,使用时需要管理员键入学生的姓名、学号、密码,再调用插入学生函数,完成操作,将学生信息储存到名为“学生信息.txt”的文件

void insertData2(struct Node2* headNode2,struct student data2)  //插入学生函数
 {struct Node2* newNode2 = createNode2(data2);
     newNode2->next2 = headNode2->next2;
     headNode2->next2 = newNode2;}

case 1:    //主函数中的录入学生信息操作
        printf ("请输入:\n");
        printf ("姓名 学号 密码\n");
        scanf(" %s %s %s",temp2.s_name,temp2.s_num,temp2.s_key);
        insertData2(list2,temp2);
        printf ("录入成功!\n");
        saveToFile2(list2,"学生信息.txt");
        break;
图5-7

​​​​​​​8、删除学生信息

  删除学生信息功能如图5-8所示,需要管理员输入要删除学生的学号。通过学号找到该学生节点,然后删去。

void deleteDatabys_num(struct Node2* headNode2, const char*s_num)   //删除学生函数
 {
    struct Node2* preNode2 = headNode2;          //前一个结点
    struct Node2* curNode2 = headNode2->next2;    //这一个结点
    while (curNode2!=NULL&&strcmp(curNode2->data2.s_num,s_num)!=0)
    {preNode2=curNode2;
        curNode2=preNode2->next2;}
    if (curNode2==NULL)
{
printf ("删除失败!没有找到指定学生!\n");
}
    else
{
preNode2->next2 = curNode2->next2;
        free(curNode2);
        printf ("删除成功!");}
 }

case 2:     //主函数中的删除学生操作
        printf ("请输入你要删除学生的学号\n");
        scanf ("%s",temp2.s_num);
        deleteDatabys_num(list2,temp2.s_num);
        saveToFile2(list2,"学生信息.txt");
        break;
图5-8

​​​​​​​9、重置学生密码

重置学生密码功能如图5-9所示,需要管理员输入要重置密码学生的学号,然后输入新的密码。实现这一过程需要调用通过学号查询函数找到该学生节点,然后修改节点中的密码。

case 3:
        printf ("请输入要重置密码学生的学号:\n");
        scanf ("%s",temp2.s_num);
        result2=searchDatabys_num(list2,temp2.s_num);
        if (result2==NULL)
        {printf ("未找到该学生\n");}
        else
        {printf ("请输入该学生新的密码\n");
            scanf("%s",result2->data2.s_key);
            printf ("修改成功!\n");}
         saveToFile2(list2,"学生信息.txt");
         break;
图5-9

​​​​​​​六、尾声

  希望大家能给个赞赞支持一下![doge]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值