(C语言课程设计)学生选修课程系统设计

1、需求分析

系统以菜单方式工作,因而要提供键盘式选择菜单以实现功能选择;由于课程信息要用文件保存,因而要提供文件的输入输出操作;由于要浏览信息,所以要提供显示功能;要实现查询功能,故要提供查找操作。

2、总体设计

整个系统可以设计为信息输入模块、信息查询模块以及信息浏览模块。

3、详细设计

数据结构采用结构体,这里采用课程信息结构体和学生选课信息结构体。
Struct
{
Char courseCode[10]; //课程编号
Char courseName[20]; //课程名称
Char courseType[10]; //课程类别
Int totalPeriod; //总学时
Int classPeriod; //授课学时
Int experiPeriod; //上机学时
Float creditHour; //学分
Int term; //开课学期
}CourseInfo[N]; //课程信息结构体
Struct
{
Int stuNo; //学号;
Char courseCode[10]; //课程编号
}StuCourInfo[N]; //学生选课信息结构体
(1) 信息输入模块
从键盘输入课程信息和学生选课信息,写入文件。(fwrite, fprintf)
(2)信息浏览模块
分屏显示课程信息,每屏10条课程记录,按任意键继续。从文件中读数据(fread,fscanf),然后再显示。
(3)信息查询模块
通过菜单选择查询字段,可以按照课程编号、课程名称、课程性质、开课学期、学分对课程信息文件进行查找,查找算法可以选择基本查找、二分查找等算法。
可以通过菜单选择课程编号,在学生选课信息文件中查询该课程学生选修情况。

4、编程实现

开发环境:Code::Blocks 13.12
说明:为了简化,本程序约定程序运行后,首先就必须先把所有数据输入,之后就不能再输入数据了。输入的数据会以文件的形式出现在和本程序文件同目录的文件夹内。

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

/*
    约定程序运行后,首先就必须先把所有数据输入,之后就不能再输入数据了。
*/

struct CourseInfo {
    char courseCode[10];    //课程编号
    char courseName[20];    //课程名称
    char courseType[10];    //课程类别
    int  totalPeriod;       //总学时
    int  classPeriod;       //授课学时
    int  experiPeriod;      //上机学时
    float creditHour;      //学分
    int  term;              //开课学期
};

struct StuCourInfo {
    int stuNo;              //学号;
    char courseCode[10];    //课程编号
};

struct CourseInfo courses[100];
struct StuCourInfo stus[100];

int courseCnt = 0; // 录入的课程数目
int stuCnt = 0;    // 录入的学生选课数目

// 程序入口
void go();

// 打印菜单
void menu();

// 录入数据
void input();

// 浏览课程数据
void browseCourses();

// 查询选课
void getSelectedCourses();

// 查询课程信息
void getCourseInfo();

int main(){
    go();
    return 0;
}

void go(){
    while(true){
        menu();
        printf("请按照菜单提示输入您的操作编号:\n");
        int choice = 0;
        scanf("%d", &choice);
        if(choice == 0){
            printf("您已经退出系统!\n");
            return;
        }else if(choice == 1){
            input();
        }else if(choice == 2){
            browseCourses();
        }else if(choice == 3){
            getCourseInfo();
        }else if(choice == 4){
            getSelectedCourses();
        }else{
            printf("输入错误!\n");
        }
    }
}

void menu(){
    printf("***选课系统***\n");
    printf("1-->录入数据\n");
    printf("2-->浏览课程\n");
    printf("3-->查询课程\n");
    printf("4-->查询选课\n");
    printf("0-->退出\n");
}

void input(){
    printf("11-->录入课程数据\n");
    printf("12-->录入选课数据\n");
    printf("请输入录入您的选择(11/22):\n");
    int choice = 0;
    scanf("%d", &choice);
    int cnt = 0;
    printf("请输入录入数据条数:\n");
    scanf("%d", &cnt);
    if(choice == 11){
        courseCnt = cnt;
        printf("请录入课程信息(格式示例:1 C语言 编程语言 30 20 10 1 1):\n");
        for(int i = 0; i < cnt; i++){
            scanf("%s", &courses[i].courseCode);
            scanf("%s", &courses[i].courseName);
            scanf("%s", &courses[i].courseType);
            scanf("%d", &courses[i].totalPeriod);
            scanf("%d", &courses[i].classPeriod);
            scanf("%d", &courses[i].experiPeriod);
            scanf("%f", &courses[i].creditHour);
            scanf("%d", &courses[i].term);
        }

        FILE * fp=fopen ("course.txt", "w") ; //打开文件
        if(NULL==fp)
        {
            printf ("Failed to open the file !\n");
            exit(0);
        }

        for(int i = 0; i < cnt; i++){
            fputs(courses[i].courseCode, fp);
            fputs(" ", fp);
            fputs(courses[i].courseName, fp);
            fputs(" ", fp);
            fputs(courses[i].courseType, fp);
            fputs(" ", fp);

            char strTotalPeriod[10];
            itoa(courses[i].totalPeriod, strTotalPeriod, 10);
            fputs(strTotalPeriod, fp);
            fputs(" ", fp);

            char strClassPeriod[10];
            itoa(courses[i].classPeriod, strClassPeriod, 10);
            fputs(strClassPeriod, fp);
            fputs(" ", fp);

            char strExperiPeriod[10];
            itoa(courses[i].experiPeriod, strExperiPeriod, 10);
            fputs(strExperiPeriod, fp);
            fputs(" ", fp);

            char strCreditHour[10];
            sprintf(strCreditHour, "%.1f", courses[i].creditHour);
            fputs(strCreditHour, fp);
            fputs(" ", fp);

            char strTerm[10];
            itoa(courses[i].term, strTerm, 10);
            fputs(strTerm, fp);
            fputs("\n", fp);
        }
        fclose(fp); //关闭文件
        printf("数据已经录入完毕!\n");
    }else if(choice == 12){
        stuCnt = cnt;
        printf("请录入选课信息(格式示例:201901 1):\n");
        for(int i = 0; i < cnt; i++){
            scanf("%d", &stus[i].stuNo);
            scanf("%s", &stus[i].courseCode);

        }

        FILE * fp=fopen ("student.txt", "w") ; //打开文件
        if(NULL==fp)
        {
            printf ("Failed to open the file !\n");
            exit(0);
        }

        for(int i = 0; i < cnt; i++){
            char strStuNo[10];
            itoa(stus[i].stuNo, strStuNo, 10);
            fputs(strStuNo, fp);
            fputs(" ", fp);

            fputs(stus[i].courseCode, fp);
            fputs(" ", fp);

            fputs("\n", fp);
        }
        fclose(fp); //关闭文件
        printf("数据已经录入完毕!\n");
    }else{
        printf("输入错误!\n");
    }
    printf("\n");
}

void browseCourses(){
    printf("课程信息如下(每次显示10个,按任意键继续显示):");
    FILE * fp=fopen ("course.txt", "r") ; //打开文件
    if(NULL==fp)
    {
        printf ("Failed to open the file !\n");
        exit(0);
    }

    for(int i = 0; i < courseCnt; i++){
        fscanf(fp, "%s %s %s %d %d %d %f %d\n",
               &courses[i].courseCode,
               &courses[i].courseName,
               &courses[i].courseType,
               &courses[i].totalPeriod,
               &courses[i].classPeriod,
               &courses[i].experiPeriod,
               &courses[i].creditHour,
               &courses[i].term);
    }
    fclose(fp); //关闭文件

    for(int i = 0; i < courseCnt; i++){
        if(i != 0 && (i%10 == 0)){
            printf("请输入任意键,继续显示...\n");
            getchar();
            getchar();
        }
        printf("%s %s %s %d %d %d %f %d\n",
               courses[i].courseCode,
               courses[i].courseName,
               courses[i].courseType,
               courses[i].totalPeriod,
               courses[i].classPeriod,
               courses[i].experiPeriod,
               courses[i].creditHour,
               courses[i].term);
    }
    printf("数据已经全部显示!\n\n");
}

void getSelectedCourses(){
    printf("请输入课程号:\n");
    char classCode[10];
    scanf("%s", classCode);
    printf("选修课程号为%s的学生如下:\n", classCode);
    FILE * fp=fopen ("student.txt", "r") ; //打开文件
    if(NULL==fp)
    {
        printf ("Failed to open the file !\n");
        exit(0);
    }
    for(int i = 0; i < stuCnt; i++){
        fscanf(fp, "%d %s\n", &stus[i].stuNo, &stus[i].courseCode);
    }
    fclose(fp); //关闭文件
    for(int i = 0; i < stuCnt; i++){
        if(strcmp(classCode, stus[i].courseCode) == 0){
            printf("%d\n", stus[i].stuNo);
        }
    }
    printf("数据已经全部显示!\n\n");
}

void getCourseInfo(){
    printf("31-->根据课程编号查询课程\n");
    printf("32-->根据课程名称查询课程\n");
    printf("33-->根据课程类别查询课程\n");
    printf("34-->根据开课学期查询课程\n");
    printf("35-->根据课程学分查询课程\n");

    FILE * fp=fopen ("course.txt", "r") ; //打开文件
    if(NULL==fp)
    {
        printf ("Failed to open the file !\n");
        exit(0);
    }

    for(int i = 0; i < courseCnt; i++){
        fscanf(fp, "%s %s %s %d %d %d %f %d\n",
               &courses[i].courseCode,
               &courses[i].courseName,
               &courses[i].courseType,
               &courses[i].totalPeriod,
               &courses[i].classPeriod,
               &courses[i].experiPeriod,
               &courses[i].creditHour,
               &courses[i].term);
    }
    fclose(fp); //关闭文件

    printf("请输入您的查询条件编号:\n");
    int choice = 0;
    scanf("%d", &choice);
    if(choice == 31){
        printf("请输入课程编号:\n");
        char courseCode[10];
        scanf("%s", courseCode);
        for(int i = 0; i < courseCnt; i++){
            if(strcmp(courseCode, courses[i].courseCode) == 0){
                printf("%s %s %s %d %d %d %f %d\n",
                   courses[i].courseCode,
                   courses[i].courseName,
                   courses[i].courseType,
                   courses[i].totalPeriod,
                   courses[i].classPeriod,
                   courses[i].experiPeriod,
                   courses[i].creditHour,
                   courses[i].term);
            }
        }
        printf("数据已经全部显示!\n");
    }else if(choice == 32){
        printf("请输入课程名称:\n");
        char courseName[10];
        scanf("%s", courseName);
        for(int i = 0; i < courseCnt; i++){
            if(strcmp(courseName, courses[i].courseName) == 0){
                printf("%s %s %s %d %d %d %f %d\n",
                   courses[i].courseCode,
                   courses[i].courseName,
                   courses[i].courseType,
                   courses[i].totalPeriod,
                   courses[i].classPeriod,
                   courses[i].experiPeriod,
                   courses[i].creditHour,
                   courses[i].term);
            }
        }
        printf("数据已经全部显示!\n");
    }else if(choice == 33){
        printf("请输入课程类别:\n");
        char courseType[10];
        scanf("%s", courseType);
        for(int i = 0; i < courseCnt; i++){
            if(strcmp(courseType, courses[i].courseType) == 0){
                printf("%s %s %s %d %d %d %f %d\n",
                   courses[i].courseCode,
                   courses[i].courseName,
                   courses[i].courseType,
                   courses[i].totalPeriod,
                   courses[i].classPeriod,
                   courses[i].experiPeriod,
                   courses[i].creditHour,
                   courses[i].term);
            }
        }
        printf("数据已经全部显示!\n");
    }else if(choice == 34){
        printf("请输入开课学期:\n");
        int term = 0;
        scanf("%d", &term);
        for(int i = 0; i < courseCnt; i++){
            if(term == courses[i].term){
                printf("%s %s %s %d %d %d %f %d\n",
                   courses[i].courseCode,
                   courses[i].courseName,
                   courses[i].courseType,
                   courses[i].totalPeriod,
                   courses[i].classPeriod,
                   courses[i].experiPeriod,
                   courses[i].creditHour,
                   courses[i].term);
            }
        }
        printf("数据已经全部显示!\n");
    }else if(choice == 35){
        printf("请输入学分:\n");
        float creditHour = 0.0;
        scanf("%f", &creditHour);
        for(int i = 0; i < courseCnt; i++){
            if(creditHour == courses[i].creditHour){
                printf("%s %s %s %d %d %d %f %d\n",
                   courses[i].courseCode,
                   courses[i].courseName,
                   courses[i].courseType,
                   courses[i].totalPeriod,
                   courses[i].classPeriod,
                   courses[i].experiPeriod,
                   courses[i].creditHour,
                   courses[i].term);
            }
        }
        printf("数据已经全部显示!\n");
    }else{
        printf("输入错误!\n");
    }
    printf("\n");
}

5、演示

为了演示方便,可以先构造一些数据放入data.txt文件内,后续录入数据的时候可以直接复制粘贴到控制台。

1 C语言 编程语言  30 20 10 1.0 1
2 C语言 编程语言  30 20 10 1.0 1
3 C语言 编程语言  30 20 10 1.0 1
4 C语言 编程语言 30 20 10 1.0 1
5 C语言 编程语言 30 20 10 1.0 1
6 C语言 编程语言 30 20 10 1.0 1
7 C语言 编程语言 30 20 10 1.0 1
8 C语言 编程语言 30 20 10 1.0 1
9 C语言 编程语言 30 20 10 1.0 1
10 C语言 编程语言 30 20 10 1.0 1
11 C语言 编程语言 30 20 10 1.0 1
12 C语言 编程语言 30 20 10 1.0 1
13 C语言 编程语言 30 20 10 1.0 1
14 C语言 编程语言 30 20 10 1.0 1
15 C语言 编程语言 30 20 10 1.0 1
16 C语言 编程语言 30 20 10 1.0 1
17 C语言 编程语言 30 20 10 1.0 1
18 C语言 编程语言 30 20 10 1.0 1
19 C语言 编程语言 30 20 10 1.0 1
20 C语言 编程语言 30 20 10 1.0 1
21 C语言 编程语言 30 20 10 1.0 1
22 C语言 编程语言 30 20 10 1.0 1
23 C语言 编程语言 30 20 10 1.0 1
24 C语言 编程语言 30 20 10 1.0 1
201901 1 
201902 1 
201903 1 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了323 篇原创文章 · 获赞 193 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/103760831
今日推荐