C语言实现课程管理系统

程序采用C语言编写,用到了结构体、链表相关知识,代码如下:

#include <Windows.h>
#include <stdio.h>

#define READ_FILE1 "courses.csv"
#define WRITE_FILE1 "courses_new.txt" 
#define MAX_XYCOUNT 1000

typedef struct DataNode_ {
    int banhao;
    char kclb[128];
    int yxpgs;
    float pgfs;
    char jszc[128];
    char kkxy[128];
    char xn[128];
    char xq[128];
    float pjcj;
    int jsbh;
}DataNode;
typedef struct SeqTable_ {
    int len;
    DataNode* datas;
}SeqTable;

int menu()
{
    int cmd = 0;
    printf("*****************欢迎使用课程管理系统*****************\r\n");
    printf("************1.加载课程数据\r\n");
    printf("************2.删除非法数据,并存储到courses_new.txt文件\r\n");
    printf("************3.查询指定教师所教课程信息\r\n");
    printf("************4.根据评估分数统计\r\n");
    printf("************5.统计每个学院信息\r\n");
    printf("************6.根据平均成绩统计\r\n");
    printf("************0.退出系统\r\n");
    printf("请选择:");
    scanf("%d", &cmd);
    return cmd;
}
unsigned char split_(const char* src, const char* separator, char** dest, int* num)
{
    if (!src || !separator || !strlen(src))
        return 0;
    char* pSeparator, * pStart, * pEnd;
    unsigned int sep_len;
    int count = 0;
    pSeparator = (char*)malloc(16);
    if (pSeparator == NULL) return 0;
    if (separator == NULL || strlen(separator) == 0) strcpy(pSeparator, " ");/* one blank by default */
    else strcpy(pSeparator, separator);
    sep_len = strlen(pSeparator);
    pStart = (char*)src;
    while (1)
    {
        pEnd = strstr(pStart, pSeparator);
        if (pEnd != NULL)
        {
            memset(pEnd, '\0', sep_len);
            *dest++ = pStart;
            pEnd = pEnd + sep_len;
            pStart = pEnd;
            ++count;
        }
        else
        {
            *dest = pStart;
            ++count;
            break;
        }
    }
    *num = count;
    if (pSeparator != NULL) free(pSeparator);
    return 1;
}
void setValue(DataNode* data, char* tmp[128])
{
    if (!data)
        return;
    memset(data, 0, sizeof(DataNode));
    data->banhao = atoi(tmp[0]);
    strcpy(data->kclb, tmp[1]);
    data->yxpgs = atoi(tmp[2]);
    data->pgfs = atof(tmp[3]);
    strcpy(data->jszc, tmp[4]);
    strcpy(data->kkxy, tmp[5]);
    strcpy(data->xn, tmp[6]);
    strcpy(data->xq, tmp[7]);
    if (strstr(tmp[8], "N/A"))
        data->pjcj = -1;//表示异常数据
    else
        data->pjcj = atof(tmp[8]);
    data->jsbh = atoi(tmp[9]);
}
void loadData(SeqTable* seqTObj)
{
    if (!seqTObj)
        return;
    FILE* fp = fopen(READ_FILE1, "r");
    if (!fp)
    {
        printf("打开文件:%s 失败...\r\n", READ_FILE1);
        return;
    }
    char* tmp[128];
    int colCount = 0;
    char oneLine[1024] = { 0 };
    fscanf(fp, "%s", oneLine);
    while (!feof(fp))
    {
        fscanf(fp, "%s", oneLine);
        split_(oneLine, ",", tmp, &colCount);
        if (10 != colCount)
            continue;
        if (0 == seqTObj->len)
        {
            seqTObj->len = 1;
            seqTObj->datas = (DataNode*)malloc(sizeof(DataNode) * 1);
            setValue(&seqTObj->datas[0], tmp);
        }
        else
        {
            seqTObj->len++;
            seqTObj->datas = (DataNode*)realloc(seqTObj->datas, sizeof(DataNode) * seqTObj->len);
            setValue(&seqTObj->datas[seqTObj->len - 1], tmp);
        }
    }
    fclose(fp);
    printf("从文件%s加载数据成功...\r\n", READ_FILE1);
}
void delInvalidDataAndStore(SeqTable* seqTObj)
{
    if (!seqTObj)
        return;
    if (0 == seqTObj->len)
    {
        printf("没有数据...\r\n");
        return;
    }
    int i = 0;
    for (; i < seqTObj->len; i++)
    {
        if (0 == strlen(seqTObj->datas[i].jszc) || seqTObj->datas[i].pjcj < 0)
        {
            memmove(seqTObj->datas + i, seqTObj->datas + i + 1, sizeof(DataNode) * (seqTObj->len - i - 1));
            seqTObj->len--;
        }
    }
    FILE* fp = fopen(WRITE_FILE1, "w");
    if (!fp)
    {
        printf("打开文件%s失败...\r\n", WRITE_FILE1);
        return;
    }
    for (i = 0; i < seqTObj->len; i++)
    {
        fprintf(fp, "%d,%s,%d,%f,%s,%s,%s,%s,%f,%d\n",
            seqTObj->datas[i].banhao,
            seqTObj->datas[i].kclb,
            seqTObj->datas[i].yxpgs,
            seqTObj->datas[i].pgfs,
            seqTObj->datas[i].jszc,
            seqTObj->datas[i].kkxy,
            seqTObj->datas[i].xn,
            seqTObj->datas[i].xq,
            seqTObj->datas[i].pjcj,
            seqTObj->datas[i].jsbh);
    }
    fclose(fp);
    printf("存储到文件%s成功...\r\n", WRITE_FILE1);
}
void findTecherCousInfo(SeqTable* seqTObj)
{
    if (!seqTObj)
        return;
    if (0 == seqTObj->len)
    {
        printf("没有数据...\r\n");
        return;
    }
    int jsbh;
    printf("请输入教师编号:");
    scanf("%d", &jsbh);
    int i = 0;
    float pgfs = 0, pjcj = 0;
    int count = 0;
    for (; i < seqTObj->len; i++)
    {
        if (seqTObj->datas[i].jsbh == jsbh)
        {
            count++;
            pgfs += seqTObj->datas[i].pgfs;
            if (seqTObj->datas[i].pjcj > -1)
            {
                pjcj += seqTObj->datas[i].pjcj;
            }
        }
    }
    if (count > 0)
        printf("教师编号为:%d老师的所有课程平均评估分数是:%f,平均成绩是:%f\r\n", jsbh, pgfs / count, pjcj / count);
    else
        printf("教师编号为:%d的老师没有课程...\r\n", jsbh);
}
void tongjiPGFS(SeqTable* seqTObj)
{
    if (!seqTObj)
        return;
    if (0 == seqTObj->len)
    {
        printf("没有数据...\r\n");
        return;
    }
    float pgfs;
    printf("请输入要比较的评估分数:");
    scanf("%f", &pgfs);
    int i = 0;
    int count = 0;
    for (; i < seqTObj->len; i++)
    {
        if (seqTObj->datas[i].pgfs > pgfs)
        {
            count++;
            printf("班号:%d,评估分数:%f\r\n", seqTObj->datas[i].banhao, seqTObj->datas[i].pgfs);
        }
    }
    printf("评估分数高于 %f 的班级总共有 %d 个\r\n", pgfs, count);
}
typedef struct XYCount_ {
    char xymc[128];
    int count;
}XYCount;
void tongjiXY(SeqTable* seqTObj)
{
    if (!seqTObj)
        return;
    if (0 == seqTObj->len)
    {
        printf("没有数据...\r\n");
        return;
    }
    XYCount tmpxy[MAX_XYCOUNT];
    memset(tmpxy, 0, sizeof(XYCount) * MAX_XYCOUNT);
    int i = 0;
    for (; i < seqTObj->len; i++)
    {
        int j = 0;
        for (; j < MAX_XYCOUNT; j++)
        {
            if (0 == strcmp(seqTObj->datas[i].kkxy, tmpxy[j].xymc))
            {
                tmpxy[j].count++;
                break;
            }
            if (0 == tmpxy[j].count)
            {
                strcpy(tmpxy[j].xymc, seqTObj->datas[i].kkxy);
                tmpxy[j].count++;
                break;
            }
        }
    }
    int i2 = 0, j2 = 0;
    for (i2 = 1; i2 < MAX_XYCOUNT; i2++)
        for (j2 = i2 + 1; j2 < MAX_XYCOUNT; j2++)
            if (tmpxy[i2].count < tmpxy[j2].count)    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
            {
                XYCount t;
                strcpy(t.xymc, tmpxy[i2].xymc);
                t.count = tmpxy[i2].count;
                strcpy(tmpxy[i2].xymc, tmpxy[j2].xymc);
                tmpxy[i2].count = tmpxy[j2].count;
                strcpy(tmpxy[j2].xymc, t.xymc);
                tmpxy[j2].count = t.count;
            }
    for (i2 = 0; i2 < MAX_XYCOUNT; i2++)
    {
        if (0 == tmpxy[i2].count)
            break;
        printf("%s\t%d\r\n", tmpxy[i2].xymc, tmpxy[i2].count);
    }
}
void tongjiPJCJ(SeqTable* seqTObj)
{
    if (!seqTObj)
        return;
    if (0 == seqTObj->len)
    {
        printf("没有数据...\r\n");
        return;
    }
    float pjcj = 0;
    printf("请输入平均成绩参考值:");
    scanf("%f", &pjcj);
    int i = 0;
    XYCount tmpxy[MAX_XYCOUNT];
    memset(tmpxy, 0, sizeof(XYCount) * MAX_XYCOUNT);
    for (; i < seqTObj->len; i++)
    {
        if (seqTObj->datas[i].pjcj > pjcj)
        {
            int j = 0;
            for (; j < MAX_XYCOUNT; j++)
            {
                if (0 == strcmp(seqTObj->datas[i].kclb, tmpxy[j].xymc))
                {
                    tmpxy[j].count++;
                    break;
                }
                if (0 == tmpxy[j].count)
                {
                    strcpy(tmpxy[j].xymc, seqTObj->datas[i].kclb);
                    tmpxy[j].count++;
                    break;
                }
            }
        }
    }
    int i2 = 0, j2 = 0;
    for (i2 = 1; i2 < MAX_XYCOUNT; i2++)
        for (j2 = i2 + 1; j2 < MAX_XYCOUNT; j2++)
            if (tmpxy[i2].count < tmpxy[j2].count)    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
            {
                XYCount t;
                strcpy(t.xymc, tmpxy[i2].xymc);
                t.count = tmpxy[i2].count;
                strcpy(tmpxy[i2].xymc, tmpxy[j2].xymc);
                tmpxy[i2].count = tmpxy[j2].count;
                strcpy(tmpxy[j2].xymc, t.xymc);
                tmpxy[j2].count = t.count;
            }
    for (i2 = 0; i2 < MAX_XYCOUNT; i2++)
    {
        if (0 == tmpxy[i2].count)
            break;
        printf("%s\t%d\r\n", tmpxy[i2].xymc, tmpxy[i2].count);
    }
}
int main()
{
    SeqTable seqTObj;
    seqTObj.len = 0;
    seqTObj.datas = NULL;
    while (1)
    {
        int choiceCmd = menu();
        if (1 == choiceCmd)
        {
            loadData(&seqTObj);
        }
        else if (2 == choiceCmd)
        {
            delInvalidDataAndStore(&seqTObj);
        }
        else if (3 == choiceCmd)
        {
            findTecherCousInfo(&seqTObj);
        }
        else if (4 == choiceCmd)
        {
            tongjiPGFS(&seqTObj);
        }
        else if (5 == choiceCmd)
        {
            tongjiXY(&seqTObj);
        }
        else if (6 == choiceCmd)
        {
            tongjiPJCJ(&seqTObj);
        }
        else if (0 == choiceCmd)
        {
            printf("欢迎下次使用...\r\n");
            system("pause");
            break;
        }
        system("pause");
        system("cls");
    }
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2193410903

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值