c语言课表管理系统设计

img


用C语言编写管理本班课 表的软件,每天所上课程信息至少包括课程名、时间和教室。如:周一1,2节高数C314。具体要求如下:(1)表格化的显示课表信息:
(2)课表的录入,将课表信息存档保存到文本文件中
(3)课表的修改,每次修改也要存档

课表,结构体数组的基本操作,运行结果:

img

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXNMB 100

typedef struct _kc
{
    char name[10]; //课程名
    int wk; //时间,用1-7表示周一到周日
    int js[4]; //节,比如3、4节课,同一门课程一天最多上4节,如果需要更多,可增大这个数字,
    char rome[10]; //教室
}CourseInfo;


/** 录入课表
  * c 保存所有课程
  * n 课程数量
  */
void input(CourseInfo c[], int* n)
{
    int flag = 1;
    char ch;
    int i = 0;
    while (flag)
    {
        printf("请输入课程名:");
        scanf("%s", c[*n].name);
        printf("请输入课程时间(1-7):");
        scanf("%d", &c[*n].wk);
        printf("请输入课程所在的节号(如3 4,表示该课程在当天的第3、4节上,以回车结束):");
        for (i = 0; i < 4; i++)
            c[*n].js[i] = 0; //初始化为0
        i = 0;
        while (1)
        {
            if (i >= 4) break; //防止越界
            scanf("%d", &c[*n].js[i]);
            ch = getchar();
            i++;
            if (ch == '\n')
                break;
        }
        
        printf("请输入教室:");
        scanf("%s", c[*n].rome);

        *n = (*n) + 1; //数量+1
        printf("是否继续录入(1.是  0.否):");
        scanf("%d", &flag);
    }
    printf("录入完成!\n");
}

/** 写入文件
  * c 保存所有课程
  * n 课程数量
  */
void write2file(CourseInfo c[], int n)
{
    int i;
    FILE* fp = fopen("course.txt", "wb");
    for (i = 0; i < n; i++)
    {
        fwrite(&c[i], sizeof(CourseInfo), 1, fp);
    }
    fclose(fp);
}

/** 按照上课日期排序
  * c 保存所有课程
  * n 课程数量
  */
void sortkc(CourseInfo c[], int n)
{
    int i, j;
    CourseInfo t;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (c[j].wk > c[j + 1].wk)
            {
                t = c[j];
                c[j] = c[j + 1];
                c[j + 1] = t;
            }
        }
    }
}

int Mod(CourseInfo c[], int n)
{
    int i;
    char name[10]={0};
    int flag = 0;
    char ch;
    printf("请输入要修改的课程名称:");
    for (i = 0; i < n; i++)
    {
        if (strcmp(name, c[i].name) == 0)
        {
            flag = 1;
            printf("请输入课程时间(1-7):");
            scanf("%d", &c[i].wk);
            printf("请输入课程所在的节号(如3 4,表示该课程在当天的第3、4节上,以回车结束):");
            for (i = 0; i < 4; i++)
                c[i].js[i] = 0; //初始化为0
            i = 0;
            while (1)
            {
                if (i >= 4) break; //防止越界
                scanf("%d", &c[i].js[i]);
                ch = getchar();
                i++;
                if (ch == '\n')
                    break;
            }

            printf("请输入教室:");
            scanf("%s", c[i].rome);
            printf("修改成功!\n");
            break;
        }
    }
    if (flag == 0)
        printf("未找到该课程\n");
    return flag;
}


void ReadFile(CourseInfo c[], int* n)
{
    int i = 0;
    FILE* fp = fopen("course.txt", "rb");
    if (fp == 0)
        return;
    while (!feof(fp))
    {
        if (fread(&c[i], sizeof(CourseInfo), 1, fp) == 1)
            i++;
    }
    fclose(fp);
    *n = i;
}


/** 表格化显示课表
  * c 保存所有课程
  * n 课程数量
  */
void showCourse(CourseInfo c[], int n)
{
    int i, j, k;
    int flag = 0;
    char tmp[15] = { 0 };
    sortkc(c, n); //按照上课时间排序,方便显示
    printf("---------------------------------------------------------------------------------------------------------------\n");
    printf("    %-15s %-15s %-15s %-15s %-15s %-15s %-15s\n", "周一", "周二", "周三", "周四", "周五", "周六", "周日");
    printf("---------------------------------------------------------------------------------------------------------------\n");
    for (i = 0; i < 8; i++) //一天做多8节课程
    {
        printf("%d   ", i+1); //输出节号
        
        for (j = 0; j < n; j++)
        {
            flag = 0;
            for (k = 0; k < 4; k++)
            {
                if (c[j].js[k] == (i + 1))
                {
                    flag = 1;
                    strcpy(tmp, c[j].name);
                    strcat(tmp, "/");
                    strcat(tmp, c[j].rome);
                    break;
                    //printf("%-8s ", c[j].name);
                }
                    
            }
            if (flag == 0)
                printf("%-15s ", " ");
            else
                printf("%-15s ", tmp);
        }
        printf("\n");
        printf("---------------------------------------------------------------------------------------------------------------\n");
    }
}


int main()
{
    CourseInfo c[MAXNMB];
    int n = 0;
    int op;

    ReadFile(c, &n);

    while (1)
    {
        system("cls");//清屏
        printf("---------课表管理系统--------\n");
        printf("1.录入数据\n");
        printf("2.显示课表\n");
        printf("3.修改课表\n");
        printf("0.退出\n");
        printf("请选择:");
        scanf("%d", &op);
        switch (op)
        {
        case 0: return 0;
        case 1:
            input(c, &n);
            write2file(c, n);
            break;
        case 2:
            showCourse(c, n);
            break;
        case 3:
            if(Mod(c, n))
                write2file(c, n);
            break;
        }
        system("pause");//
    }
}



写下给你

代码如下

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

struct table {
    char name[64];  //课程名
    char time[16];    //时间
    char room[16];  //教室
};

//从本地文件读课表信息
int read(struct table t[])
{
    int n = 0;
    FILE *fp = fopen("D:\\table.txt", "r");
    if(fp == NULL) {
        printf("无课表信息\n");
        return 0;
    }
    while(!feof(fp)) {
        fscanf(fp, "%s %s %s\n", t[n].name, t[n].time, t[n].room);
        n++;
    }
    fclose(fp);
    printf("课表信息读取成功,总信息数为%d\n", n);
    return n;
}

//显示课表信息
void display(struct table t[], int n)
{
    printf("课程名\t时间\t教室\n");
    if(n <= 0) {
        printf("无课表信息\n");
        return;
    }
    for(int i=0; i<n; i++) {
        printf("%s\t%s\t%s\n", t[i].name, t[i].time, t[i].room);
    }
}

//录入课表信息
int input(struct table t[], int n)
{
    char ch;
    FILE *fp = fopen("D:\\table.txt", "a");
    if(fp == NULL) {
        return -1;
    }
    while(1) {
        printf("请输入课表信息(课程名 时间 教室):\n");
        scanf("%s %s %s", t[n].name, t[n].time, t[n].room);
        fprintf(fp, "%s\t%s\t%s\n", t[n].name, t[n].time, t[n].room);
        n++;
        printf("录入成功");
        printf("是否继续录入?(y/n)");
        while(1) {
            ch = getchar();
            if(ch == 'y' || ch == 'n') {
                break;
            }
        }
        if(ch == 'n') {
            break;
        }
    }
    fclose(fp);
    printf("课表信息录入完成\n");
    return n;
}

//修改课表信息
void modify(struct table t[], int n)
{
    if(n <= 0) {
        printf("无课表信息\n");
        return;
    }
    char ch;
    char name[64];
    while(1) {
        printf("请输入需要修改的课程名:");
        scanf("%s", name);
        for(int i=0; i<n; i++) {
            if(strcmp(t[i].name, name) == 0) {
                printf("请输入新的课表信息(课程名 时间 教室):\n");
                scanf("%s %s %s", t[i].name, t[i].time, t[i].room);
                printf("修改成功\n");
                break;
            }
            if(i == n - 1) {
                printf("无该课程的课表信息\n");
            }
        }
        printf("是否继续修改?(y/n)");
        while(1) {
            ch = getchar();
            if(ch == 'y' || ch == 'n') {
                break;
            }
        }
        if(ch == 'n') {
            break;
        }
    }
    FILE *fp = fopen("D:\\table.txt", "w");
    if(fp == NULL) {
        return;
    }
    for(int i=0; i<n; i++) {
        fprintf(fp, "%s\t%s\t%s\n", t[i].name, t[i].time, t[i].room);
    }
    fclose(fp);
    printf("课表信息修改完成\n");
}

int main()
{
    struct table t[100];
    int quit = 1, select, ret, n = 0;
    n = read(t);
    while(quit) {
        printf("\n/*********** 课表管理系统 **********/\n");
        printf("/**********  1.查看课表  **********/\n");
        printf("/**********  2.录入课表  **********/\n");
        printf("/**********  3.修改课表  **********/\n");
        printf("/**********  4.退出课表  **********/\n");
        printf("请选择:");
        scanf("%d", &select);
        switch (select) {
        case 1:
            display(t, n);
            break;
        case 2:
            ret = input(t, n);
            if(ret != -1) {
                n = ret;
            }
            break;
        case 3:
            modify(t, n);
            break;
        case 4:
            quit = 0;
            break;
        default:
            printf("无效选择\n");
            break;
        }
    }
    return 0;
}