0
点赞
收藏
分享

微信扫一扫

运动会分数统计程序

一叶轻舟okok 2022-01-14 阅读 51

题目:运动会分数统计

参加这动会有 n 个学收,学校编号为 1 ~ n。比赛 分成 m 个男子项目,和 w 个女子项目,项目编号为 1 ~ n + w。不同的项目取前五名或前三名获得积分:取前五名的得分分别为:7、5、3、2、1;取前三名的得分分别为:5、3、2;。哪些项目取前五名或前三名由用户自己设定。(15 < n <= 20, 15 < n + w <= 20)。

要求

1、可以输入各个项目的前三名或前五名的成绩。
2、能统计各学校的积分总分。
3、可以按学校编号或名称、学核总分、男女生团体总排序输出。
4、数据存入文件并能随时查询。
5、可以按学校编号查询学校某个硕旦的精况;也可以按项目编号查询取得前三或前五名的学较。

界面要求

有合理的提示,每个功能可以设立菜单。

存储结构

运动会的相关数据要存储在数据文牛中。

输入数据

完整代码(C)

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

typedef struct score // 总分结构类型
{
    int schoolNum, boyEventNum, girlEventNum; // 学校、男子、女子项目的数量
    char boyEvent[21][110], girlEvent[21][110]; // 男子、女子项目的名称
    int boyTop[21][6], girlTop[21][6]; // 这两个数组记录男、女子每个项目前三名或前五名的编号

    int flag; // fasle == 0 表明分数还未统计过,需要统计
}ScoreInit;

typedef struct school // 学校的结构类型
{
    char name[110]; // 该学校名字
    int boyEventGrade[21], girlEventGrade[21]; // 该学校男子、女子项目的成绩
    int boyTotalScore, girlTotalScore, totalScore; // 该学校男子、女子项目的总得分
}SchoolInit;

// 全局变量定义
ScoreInit Score; // 分数结构变量
SchoolInit School[21];
int topThreeScore[4] = {-1, 5, 3, 2}; // 前三名的积分
int topFiveScore[6] = {-1, 7, 5, 3, 2, 1}; // 前五名的积分

void Interface() // 打印界面的函数 none
{
    printf("\t\t运动会积分统计\n\n");
    printf("1. 添加学校以及各项目成绩 \n");
    printf("2. 统计所有学校的得分结果 \n");
    printf("3. 按男子项目总分排序输出 \n");
    printf("4. 按女子项目总分排序输出 \n");
    printf("5. 按学校编号或名称排序输出 \n");
    printf("6. 按学校编号查询各项目得分 \n");
    printf("7. 按项目编号查询前三或前五 \n");
    printf("8. 保存信息 \n");
    printf("9. 清屏 \n");
    printf("10.退出 \n");
}

void Init() // 对数组相关数据初始化的函数
{
    Score.flag = 0;
    int i = 0, j, k; // i, j, k, 用于标记循环次数
    while (i < 21) // 对前几名数组初始化
    {
        j = 0;
        while (j < 6)
        {
            Score.boyTop[i][j] = 0;
            Score.girlTop[i][j] = 0;
            ++j;
        }
        ++i;
    }

    i = 0;
    while (i < 21) // 对 School 数组进行初始化
    {
        j = k = 0;
        while (j < 21)
            School[i].boyEventGrade[j++] = 0;
        while (k < 21)
            School[i].girlEventGrade[k++] = 0;
        School[i].boyTotalScore = School[i].girlTotalScore = School[i].totalScore = 0;
        ++i;
    }
}

void GetScoreData() // 数据读取函数 none
{
    int i = 1, j, k; // i, j, k, 用于标记循环次数
    printf("请依次输入学校、男子项目和女子项目的数量(均为至少三个):\n");
    scanf("%d%d%d", &Score.schoolNum, &Score.boyEventNum, &Score.girlEventNum);

    i = j = 1;
    printf("请依次输入男子项目、女子项目的名称(每个名称输入后需回车):\n");
    printf("男子项目:\n");
    while (i <= Score.boyEventNum)
        scanf("%s", Score.boyEvent[i++]);
    printf("\n女子项目:\n");
    while (j <= Score.girlEventNum)
        scanf("%s", Score.girlEvent[j++]);

    i = 1;
    printf("\n请依次输入各个学校的名称、男子项目的分数和女子项目的分数:\n");
    while (i <= Score.schoolNum)
    {
        j = k = 1;
        scanf("%s", School[i].name); // 输入学校的名称
        while (j <= Score.boyEventNum) // 输入男子项目的分数
            scanf("%d", &School[i].boyEventGrade[j++]);
        while (k <= Score.girlEventNum) // 输入女子项目的分数
            scanf("%d", &School[i].girlEventGrade[k++]);
        printf("\n");
        ++i;
    }
    getchar();
    printf("\n请输入任意键继续...");
    getchar();
    Clear(); // 由于输入的数据比较多,因为执行完输入函数后清一次屏
}

void CountTotalScore() // 各学校总分统计函数 none
{
    int topNum = 0;
    int i = 1, j = 1, k;
    printf("\n请依次输入各男子项目取前几名的成绩\n");
    while (i <= Score.boyEventNum)
    {
        printf("%s:", Score.boyEvent[i]);
        scanf("%d", &topNum);
        CountRank(i, topNum, Score.schoolNum + 1, 0);
        ++i;
    }
    printf("\n请依次输入各女子项目取前几名的成绩\n");
    while (j <= Score.girlEventNum)
    {
        printf("%s:", Score.girlEvent[j]);
        scanf("%d", &topNum);
        CountRank(j, topNum, Score.schoolNum + 1, 1);
        ++j;
    }
    Score.flag = 1;
}

void CountRank(int number, int topNum, int border, int sex) // number 是项目编号,topNum 代表前 topNum 名
{ // border 表示循环的边界值,sex 表示男子还是女子项目 none
    int *A = (int*)malloc(sizeof(int) * border); // 定义一个长度为 border 的数组,其中的元素是学校的编号
    for (int i = 1; i < border; ++i) // 给数组元素赋值
        A[i] = i;
    if (sex == 0) // 如果是男子项目
    {
        int i, j;
        for (i = 2; i < border; ++i) // 利用直接插入排序
        { // 将 topNum 个成绩最好的学校的编号移到数组的最前面
            if (School[i].boyEventGrade[number] > School[i - 1].boyEventGrade[number])
            {
                A[0] = A[i];
                for (j = i - 1; A[0] > A[j]; --j)
                    A[j + 1] = A[j];
                A[j + 1] = A[0];
            }
        }
        for (int i = 1; i <= topNum; ++i) // 将前几名的编号赋值给 top 数组
        {
            Score.boyTop[number][i] = A[i];
            if (topNum == 3) // 依照名次给各个学校添加总分
                School[A[i]].boyTotalScore += topThreeScore[i];
            else
                School[A[i]].boyTotalScore += topFiveScore[i];
        }
    }
    else
    {
        int i, j;
        for (i = 2; i < border; ++i) // 利用冒泡排序,只进行 topNum 趟排序
        {
            if (School[i].girlEventGrade[number] > School[i - 1].girlEventGrade[number])
            {
                A[0] = A[i];
                for (j = i - 1; A[0] > A[j]; --j)
                    A[j + 1] = A[j];
                A[j + 1] = A[0];
            }
        }
        for (int i = 1; i <= topNum; ++i)
        {
            Score.girlTop[number][i] = A[i];
            if (topNum == 3) // 依照名次给各个学校添加总分
                School[A[i]].girlTotalScore += topThreeScore[i];
            else
                School[A[i]].girlTotalScore += topFiveScore[i];
        }
    }
}

void EventTotalScoreSort(int sex) // 该函数实现按照各学校的总分进行排序
{
    int *A = (int*)malloc(sizeof(int) * (Score.schoolNum + 1)); // 定义一个长度为 Score.schoolNum + 1 的数组,其中的元素是学校的编号
    for (int i = 1; i <= Score.schoolNum; ++i) // 给数组元素赋值
        A[i] = i;
    if (sex == 0) // 如果是男子项目
    {
        int i, j;
        for (i = 2; i <= Score.schoolNum; ++i) // 直接插入排序
        {
            if (School[i].boyTotalScore > School[i - 1].boyTotalScore)
            {
                A[0] = A[i];
                for (j = i - 1; A[0] > A[j]; --j)
                    A[j + 1] = A[j];
                A[j + 1] = A[0];
            }
        }
        printf("男子项目总分排名是:\n");
        for (int i = 1; i <= Score.schoolNum; ++i)
            printf("%s\n", School[A[i]].name);
    }
    else
    {
        int i, j;
        for (i = 2; i <= Score.schoolNum; ++i) // 直接插入排序
        {
            if (School[i].girlTotalScore > School[i - 1].girlTotalScore)
            {
                A[0] = A[i];
                for (j = i - 1; A[0] > A[j]; --j)
                    A[j + 1] = A[j];
                A[j + 1] = A[0];
            }
        }
        printf("女子项目总分排名是:\n");
        for (int i = 1; i <= Score.schoolNum; ++i)
            printf("%s\n", School[A[i]].name);
    }
}
void SchoolNumberSort()
{
    printf("参赛的学校分别是:\n");
    for (int i = 1; i <= Score.schoolNum; ++i)
        printf("编号%d--%s\n", i, School[i].name);
}

void SchoolQuery() // 该函数依据学校编号查询各项目成绩和总得分 none
{
    int number;
    printf("请输入需要查询的学校编号:");
    scanf("%d", &number);
    int i = 1, j = 1;
    printf("编号%d:%s\n", number, School[number]);
    printf("\n男子项目的成绩如下\n");
    while (i <= Score.boyEventNum)
    {
        printf("%s:%d\n", Score.boyEvent[i], School[number].boyEventGrade[i]);
        ++i;
    }
    printf("\n女子项目的成绩如下\n");
    while (j <= Score.girlEventNum)
    {
        printf("%s:%d\n", Score.girlEvent[j], School[number].girlEventGrade[j]);
        ++j;
    }

    printf("\n男子项目的总得分是:%d\n", School[number].boyTotalScore);
    printf("女子项目的总得分是:%d\n", School[number].girlTotalScore);
}

void EventQuery() // 该函数依据项目的编号查询各学校的成绩排名 none
{
    if (Score.flag)
    {
        int number;
        printf("请输入需要查询的项目编号:");
        scanf("%d", &number);
        printf("\n编号为%d的男子项目%s的排名分别是:", number, Score.boyEvent[number]);
        for (int i = 1; i < 6; ++i) // 依据 top 数组中记录的学校编号输出名字,前提是编号不为0
            if (Score.boyTop[i] != 0)
                printf("%s ", School[Score.boyTop[number][i]].name);
        printf("\n编号为%d的女子项目%s的排名分别是:", number, Score.girlEvent[number]);
        for (int i = 1; i < 6; ++i)
            if (Score.girlTop[i] != 0)
                printf("%s ", School[Score.girlTop[number][i]].name);
        printf("\n");
    }
    else printf("您还未查询过总分!\n");

}

void SaveData() // 该函数将数据存入文件 output.txt 中
{
    if (Score.flag)
    {
        FILE *fp;
        fp = fopen("output.txt", "w"); // 令 fp 指向输出的文件

        // 先输出 Score 中的数据
        fprintf(fp, "学校数量:%d   男子项目数量:%d   女子项目的数量:%d\n", Score.schoolNum, Score.boyEventNum, Score.girlEventNum);
        fprintf(fp, "男子项目有:");
        for (int i = 1; i <= Score.boyEventNum; ++i)
            fprintf(fp, "%s ", Score.boyEvent[i]);
        fprintf(fp, "\n");
        fprintf(fp, "女子项目有:");
        for (int i = 1; i <= Score.girlEventNum; ++i)
            fprintf(fp, "%s ", Score.girlEvent[i]);
        fprintf(fp, "\n\n");

        // 然后按学校顺序输出相关数据
        for (int i = 1; i <= Score.schoolNum; ++i)
        {
            fprintf(fp, "编号%d-%s\n", i, School[i].name); // 输出学校名称
            fprintf(fp, "男子项目成绩为:");
            for (int j = 1; j <= Score.schoolNum; ++j)
                fprintf(fp, "%d ", School[i].boyEventGrade[j]);
            fprintf(fp, "\n女子项目成绩为:");
            for (int j = 1; j <= Score.schoolNum; ++j)
                fprintf(fp, "%d ", School[i].girlEventGrade[j]);
            fprintf(fp, "\n男子项目总得分为:%d\n女子项目总得分为:%d\n\n", School[i].boyTotalScore, School[i].girlTotalScore);
        }

        fclose(fp);
        printf("文件写入完成!\n");
        system("output.txt"); // 打开 output.txt 文件
    }
    else printf("还没统计分数呢!\n");
}

void Clear() // 该函数实现清屏的功能 none
{
    system("cls");
    Interface();
}

void Exit() // none
{
    exit(0);
}

int main()
{
    Interface(); // 打印界面的函数

    Init(); // 调用初始化函数

    int choice = 0;
    while (1)
    {
        printf("\n请输入您的选择(1-10):\n");
        scanf("%d", &choice);
        if (choice < 1 || choice > 10)
            printf("输入非法!请重新输入!\n");
        switch(choice) // 根据用户输入进入不同的模块
        {
            case 1:
                GetScoreData();
                break;
            case 2:
                CountTotalScore();
                break;
            case 3:
                EventTotalScoreSort(0);
                break;
            case 4:
                EventTotalScoreSort(1);
                break;
            case 5:
                SchoolNumberSort();
                break;
            case 6:
                SchoolQuery();
                break;
            case 7:
                EventQuery();
                break;
            case 8:
                SaveData();
                break;
            case 9:
                Clear();
                break;
            case 10:
                Exit();

        }
    }
}

希望本篇博客能对你起到一点的帮助作用,也希望能动动小手点个赞哟~~。

举报

相关推荐

0 条评论