栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言课程设计】C语言成绩管理系统--可自定义是什么成绩

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言课程设计】C语言成绩管理系统--可自定义是什么成绩

如需全部代码,关注公众号(coding加油站)回复“C语言成绩管理系统”免费领取。 1、相关功能
  • 管理员登录

    • 在 userData/admin.txt 中单行保存账号和密码,空格分隔,示例:admin 12345678

    • 登录时输入账号和密码,验证通过即可继续操作

  • 选择或新建比赛项目

    • 先判断项目索引文件是否为空,为空则直接进入新建项目模块

    • 不为空时,输出比赛列表,按编号进入对应比赛或新建比赛,弹出菜单

    • 每注册一场比赛,向后台 userData/workList.txt 追加比赛编号和名称,每行1条数据,单行保存比赛编号和名称,空格分隔,示例:第一届歌手大赛总决赛12345

    • 如用户输入add关键字,则进入新建项目模块

  • 学生成绩录入

    • 进入成绩录入状态,可连续输入,每行输入一名学生的成绩和信息

    • 打开文件,每次回车完成一次输入后,计算出最终成绩,将当行数据写入文件

    • 当输入off时,退出录入状态,关闭文件,弹出菜单

    • 输入格式:long 学号, int 评委数量(小于10), char [10] 姓名, float 评委成绩1, float 评委成绩2 ... float 评委成绩10

  • 学生成绩查询

    • 输入待查询的学生姓名,读取后台TXT数据,按行遍历文本数据,每次遍历,解析当行学生数据信息,将当行姓名与查询条件进行比较,若匹配成功,则输出当行数据

    • 结束遍历,弹出菜单

  • 学生成绩排行

    • 读取后台TXT数据,按行遍历文本数据,每次遍历,将当行数据解析后保存到结构体数组中,遍历完成后,以结构体的总分项数值为基准,进行冒泡排序,在数组项交换时,中转项应为单个结构体

    • 排序完成后,对结构体数组进行遍历输出,每行一条数据

    • 结尾输出最高分学生成绩信息,弹出菜单

  • 导出成绩单

    • 与成绩排行一样,先进行结构体数组的排序,只不过遍历输出时,输出HTML表格代码,并且将打印信息同时输出至文件中

    • 输出导出文件的路径,弹出菜单

  • 修改管理员账号密码

    • 打开后台文件,获取用户输入,重新写入文件

2、系统流程图

 3、部分代码
int main()
{
    char dirs[2][20] = {"MainFile", "ProgramList"};
    int index;
    for (index = 0; index < 2; index++)
    {
        if (access(dirs[index], 0))
        {
            mkdir(dirs[index]);
        }
    }
    system("cls");
    login();
    Program();
}
int login()
{
    char admin1[30], password1[30], Radmin[20], Rpassword[20];
    char admin2[30], password2[30], ch;
    FILE *fp = fopen("MainFile/register.txt", "a+");
    if ((ch = fgetc(fp)) == EOF)
    {
        rewind(fp);
        printf("n============歌手大赛成绩管理系统============n");
        printf("n     ------请先创建一个管理员账号------nn");
        printf("t账号:");
        scanf("%s", admin1);
        printf("t密码:");
        scanf("%s", password1);
        fprintf(fp, "%s %s", admin1, password1);
        system("cls");
        printf("           >>>新的账号创建成功<<<");
    }
    rewind(fp);
    printf("n============歌手大赛成绩管理系统============n");
    printf("n        ------管理员账号登录------n");
    printf("       账号:");
    scanf("%s", admin2);
    printf("       密码:");
    scanf("%s", password2);
    fscanf(fp, "%s", Radmin);    //从文件读取账号
    fscanf(fp, "%s", Rpassword); //从文件读取密码
    if (strcmp(admin2, Radmin) == 0 && strcmp(password2, Rpassword) == 0)
    { //判断账号密码是否正确
        fclose(fp);
        system("cls");
        printf("                   >>>登录成功<<<");
    }
    else
    {
        system("cls"); //清屏
        printf("           >>>账号或密码错误<<<");
        fclose(fp);
        login();
    }
}
int Program()
{
    printf("n============请选择比赛项目或新建比赛项目============nn");
    FILE *program = fopen("MainFile/program.txt", "a+"); //打开文件
    char pro[50], num[20], workid[10], workname[50], user[100], pl[30] = "ProgramList/", ch;
    int i = 0, ret, count = -1, Count, end = 1;
    printf("        -------比赛编号------比赛名称-------n");
    rewind(program);
    if ((ch = fgetc(program)) == EOF)
    {
        rewind(program);
        printf("nt  暂未查询到比赛项目,请输入add添加n");
    }
    while (!feof(program))
    {
        fgets(user, 100, program);
        count++;
    }
    Count = count;
    rewind(program);
    while (count--)
    { //输出文件中的比赛项目
        fscanf(program, "%s %s", workid, workname);
        printf("tt%st%sn", workid, workname);
    }
    printf("n====================================================n");
    printf("n    >>>请输入比赛编号或输入add新建比赛项目:");
    scanf("%s", num);
    if (strcmp("add", num) == 0)
    { //添加新项目
        addWork();
    }
    else
    {
        rewind(program); //使文件重新回流
        for (i = 0; i < Count; i++)
        {
            fscanf(program, "%s %s", workid, workname);
            if (strcmp(num, workid) == 0)
            {
                strcat(pl, num); //判断文件是否已经建立
                strcat(pl, ".txt");
                FILE *fp = fopen(pl, "a+"); //打开文件
                system("cls");              //清屏
                printf("        %s", workname);
                fclose(program);
                list(fp);
                end = 0; //项目操作函数
                break;
            }
        }
        if (end)
        {
            system("cls"); //清屏
            printf("tt  >>>您的输入有误<<<");
            Program();
        }
    }
    system("cls"); //清屏
    fclose(program);
}
int list(FILE *fp)
{
    rewind(fp); //文件指向开头
    int num;
    printf("n=============比赛详情=============nn"); //界面
    printf("1)选手成绩录入n");
    printf("2)选手成绩查询n");
    printf("3)查看成绩排行n");
    printf("4)返回n");
    printf("0)退出nn");
    printf("输入对应序号进行操作:");
    scanf("%d", &num);
    if (num == 1)
    { //根据输入序号进行对应操作
        system("cls");
        enter(fp);
    }
    else if (num == 2)
    {
        inquire(fp);
    }
    else if (num == 3)
    {
        ranking(fp);
    }
    else if (num == 4)
    {
        system("cls");
        Program();
    }
    else if (num != 1 && num != 2 && num != 3 && num != 4 && num != 0)
    {
        system("cls");
        printf("t>>>您的输入有误<<<");
        list(fp); //重新输入
    }
    else if (num == 0)
    { //结束程序
        system("cls");
        fclose(fp);
        printf(" ==========n");
        printf("  感谢使用!n");
        printf(" ==========n");
        system("pause");
    }
}
int addWork()
{
    system("cls");
    FILE *program = fopen("MainFile/program.txt", "a+");
    int t;
    char workname[30];
    time_t now; //获取一个五位数
    time(&now);
    t = now % 100000;
    printf("n============请输入比赛项目名称============nnt   >>>");
    scanf("%s", workname);
    fprintf(program, "%d %sn", t, workname);
    system("cls");
    printf("t     %s添加成功", workname);
    fclose(program);
    Program();
}
int enter(FILE *fp)
{
    printf("n============选手成绩录入============n");
    printf("n     请按照以下格式录入学生成绩n");
    printf("  选手姓名 成绩个数 成绩1 成绩2...n");
    printf("            输入off返回n");
    char stu[20];
    int gread[10], i, num = 0, all = 0, min = 10000, max = 0;
    float average;
    scanf("%s", stu);
    if (strcmp(stu, "off") == 0)
    { //读入选手姓名
        system("cls");
        list(fp);
    }
    else
    {
        scanf("%d", &num);
        for (i = 0; i < num; i++)
        { //读入成绩
            scanf("%d", &gread[i]);
            all += gread[i];
            if (gread[i] > max)
            {
                max = gread[i]; //成绩处理
            }
            if (gread[i] < min)
            {
                min = gread[i];
            }
        }
        average = 1.0 * (all - max - min) / (num - 2);
        fprintf(fp, "%s %d %.2fn", stu, all, average); //记入成绩
        system("cls");                                  //清屏
        printf("         >>>%s已录入<<<", stu);
        enter(fp);
    } //重新来一遍
}
int inquire(FILE *fp)
{
    rewind(fp); //使文件回到开头
    char name[20], i, workname[20];
    int all;
    float average;
    system("cls");
    printf("n============选手成绩查询============nn");
    printf("       请输入选手姓名进行查询n");
    printf("             输入off返回n");
    printf("nt    >>>");
    scanf("%s", name); //用户输入选手姓名
    if (strcmp(name, "off") == 0)
    {
        system("cls");
        list(fp); //判断是否结束
    }
    else
    {
        struct stu
        {                      //定义选手信息结构体
            char workname[30]; //为数据交换定义一个中间结构体
            int all;
            float average;
        } stu[100], stu1;
        int j, count[100], a, Tall, num = 0, rank;
        char ch[100];
        while (!feof(fp))
        {
            fgets(ch, 100, fp); //判断选手个数
            num++;
        }
        num--;
        rewind(fp);
        for (i = 0; i < num; i++)
        {
            fscanf(fp, "%s %d %f", stu[i].workname, &stu[i].all, &stu[i].average); //调出选手信息
            count[i] = stu[i].average;
        }
        for (j = 0; j < num; j++)
        { //对选手信息进行排序
            for (i = 0; i < num; i++)
            {
                if (count[i] < count[i + 1])
                {
                    a = count[i + 1];
                    count[i + 1] = count[i];
                    count[i] = a;
                    strcpy(stu1.workname, stu[i + 1].workname); //姓名交换
                    strcpy(stu[i + 1].workname, stu[i].workname);
                    strcpy(stu[i].workname, stu1.workname);
                    stu1.all = stu[i].all; //总分交换
                    stu[i].all = stu[i + 1].all;
                    stu[i + 1].all = stu1.all;
                    stu1.average = stu[i].average; //平均分交换
                    stu[i].average = stu[i + 1].average;
                    stu[i + 1].average = stu1.average;
                }
            }
        }
        rewind(fp);
        for (i = 0; i < 20; i++)
        {
            fscanf(fp, "%s %d %f", workname, &all, &average); //进行查询
            if (strcmp(name, workname) == 0)
            {
                system("cls");
                for (i = 0; i < num; i++)
                {
                    if (strcmp(workname, stu[i].workname) == 0)
                    {
                        rank = i + 1;
                    }
                }
                printf("n====================查询结果====================n");
                printf("n    姓名t总分t  最终得分t排名n");
                printf("    %st%dt  %  .2ft %dn", workname, all, average, rank);
                printf("n================================================n");
                printf("n       ");
                system("pause");
                system("cls");
                inquire(fp);
                break;
            }
        }
        if (strcmp(name, "off") != 0 && strcmp(name, workname) != 0)
        { //无对应姓名
            system("cls");
            printf("nn==========查无此人==========nn     ");
            system("pause");
            inquire(fp);
        }
    }
}
int ranking(FILE *fp)
{
    rewind(fp);
    system("cls");
    printf("n==========选手成绩排行==========nn");
    struct stu
    {                      //定义选手信息结构体
        char workname[30]; //为数据交换定义一个中间结构体
        int all;
        float average;
    } stu[100], stu1;
    int i, j, count[100], a, Tall, num = 0;
    char ch[100];
    while (!feof(fp))
    {
        fgets(ch, 100, fp); //判断选手个数
        num++;
    }
    num--;
    rewind(fp);
    for (i = 0; i < num; i++)
    {
        fscanf(fp, "%s %d %f", stu[i].workname, &stu[i].all, &stu[i].average); //调出选手信息
        count[i] = stu[i].average;
    }
    for (j = 0; j < num; j++)
    { //对选手信息进行排序
        for (i = 0; i < num; i++)
        {
            if (count[i] < count[i + 1])
            {
                a = count[i + 1];
                count[i + 1] = count[i];
                count[i] = a;
                strcpy(stu1.workname, stu[i + 1].workname); //姓名交换
                strcpy(stu[i + 1].workname, stu[i].workname);
                strcpy(stu[i].workname, stu1.workname);
                stu1.all = stu[i].all; //总分交换
                stu[i].all = stu[i + 1].all;
                stu[i + 1].all = stu1.all;
                stu1.average = stu[i].average; //平均分交换
                stu[i].average = stu[i + 1].average;
                stu[i + 1].average = stu1.average;
            }
        }
    }
    printf(" 姓名t  总分t最终得分   排名n"); //输出排行
    for (i = 0; i < num; i++)
    {
        printf(" %st  %dt %.2f      %dn", stu[i].workname, stu[i].all, stu[i].average, i + 1);
    }
    printf("n================================");
    printf("nn      ");
    system("pause");
    system("cls");
    list(fp);
}

4、程序运行详细情况

启动程序,输入管理员账号密码,回车登录

回车进入项目,弹出菜单面板,输入对应序号执行相应操作

 学生成绩录入,输入off结束输入

输出排行榜 

 导出成绩单,输出HTML文件路径

 

如需全部代码,关注公众号(coding加油站)回复“C语言成绩管理系统”免费领取

暑期编程PK赛 得CSDN机械键盘等精美礼品!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015828.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号