【C语言】C语言 好声音比赛管理系统(含源码+数据文件)【独一无二】

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


【C语言】C语言 好声音比赛管理系统(含源码+数据文件)【独一无二】


目录

  • 【C语言】C语言 好声音比赛管理系统(含源码+数据文件)【独一无二】
  • 一、设计要求
  • 二、设计思路
    • 1. 数据结构定义模块
      • 设计思路
      • 关键代码
    • 2. 全局变量及函数声明模块
      • 设计思路
      • 关键代码
    • 3. 菜单显示模块
      • 设计思路
      • 关键代码
    • 4. 选手数据输入模块
      • 设计思路
      • 关键代码
    • 5. 评委打分模块
      • 设计思路
      • 关键代码
    • 6. 成绩排序模块
      • 设计思路
      • 关键代码
    • 7. 数据查询模块
      • 设计思路
      • 关键代码
    • 8. 追加选手数据模块
      • 设计思路
      • 关键代码
    • 9. 数据保存模块
      • 设计思路
      • 关键代码
    • 10. 主函数与整体流程控制模块
      • 设计思路
      • 关键代码
  • 三、可视化分析


一、设计要求

设计一个用于管理“好声音”比赛的选手数据的系统,主要功能包括输入选手数据、评委打分、成绩排序、数据查询、追加选手数据以及将数据保存到文件中。系统通过结构体 Contestant 来存储选手的基本信息,包括选手编号、姓名、评委打分、以及平均分。程序的主要操作流程如下:首先,用户可以通过菜单选择不同的功能。例如,用户可以输入选手的基本数据,接着为每位选手的比赛表现打分(每个选手有5个评委评分),系统自动计算每位选手的平均分。接下来,用户可以根据选手的平均分对成绩进行排序,从高到低排列。系统还提供查询功能,用户可以通过输入选手编号来查询特定选手的信息。如果需要,可以添加新的选手数据,或者将现有数据保存到本地文件 contestants.txt 中,确保数据的持久化。系统通过循环菜单的方式不断运行,直到用户选择退出。整体设计简洁,功能全面,能够满足比赛管理的基本需求,适用于小型比赛的管理与数据存储。

在这里插入图片描述


二、设计思路

1. 数据结构定义模块

设计思路

程序首先定义了一个结构体 Contestant,用来存储每个选手的信息。该结构体包含:

  • 选手编号(id
  • 选手姓名(name
  • 评委打分数组(scores,共 5 个评委的分数)
  • 选手平均分(avgScore

这样设计能够完整记录每位选手的基本信息及后续评委打分的结果,方便后续计算和处理。

关键代码

// 定义选手数据结构
typedef struct {
    int id;
    char name[50];
    float scores[5]; // 假设有5个评委
    float avgScore;
} Contestant;

2. 全局变量及函数声明模块

设计思路

程序使用一个全局的 Contestant 数组来存储所有选手数据,并利用全局变量 count 来记录选手数量。同时,提前声明各个功能模块的函数,便于后续实现和调用。

关键代码

Contestant contestants[100];
// 函数声明
void inputContestantData(Contestant contestants[], int *count);
void judgeScoring(Contestant contestants[], int count);
void sortScores(Contestant contestants[], int count);
void searchData(Contestant contestants[], int count);
void addContestantData(Contestant contestants[], int *count);
void saveDataToFile(Contestant contestants[], int count);
void displayMenu();

3. 菜单显示模块

设计思路

displayMenu() 函数用于显示系统主菜单,提示用户可执行的各项操作。该模块将菜单内容打印出来,使用户能够直观了解操作选项。

关键代码

void displayMenu() {
    printf("\n===== 好声音比赛管理系统 =====\n");
    printf("1. 输入选手数据\n");
    printf("2. 评委打分\n");
    printf("3. 成绩排序(按平均分)\n");
    printf("4. 数据查询\n");
    printf("5. 追加选手数据\n");
    printf("6. 写入数据文件\n");
    printf("7. 退出系统\n");
}

4. 选手数据输入模块

设计思路

inputContestantData() 函数用于录入选手的基本信息,包括选手编号和姓名,并初始化平均分为 0。函数通过参数传入当前选手的数组与数量,输入完成后更新选手数量。

关键代码

在这里插入图片描述

void inputContestantData(Contestant contestants[], int *count) {
    printf("输入选手数据:\n");
    printf("请输入选手编号:");
    scanf("%d", &contestants[*count].id);
    printf("请输入选手姓名:");
    scanf("%s", contestants[*count].name);
    contestants[*count].avgScore = 0; // 初始化平均分
    (*count)++;
}

5. 评委打分模块

设计思路

judgeScoring() 函数实现评委为每个选手打分,每个选手由 5 个评委打分,然后计算平均分。函数遍历所有已录入的选手,对每位选手依次输入 5 个分数,累加后求均值并存入选手的 avgScore 字段。

关键代码

void judgeScoring(Contestant contestants[], int count) {
    for (int i = 0; i < count; i++) {
        printf("为选手 %s 打分:\n", contestants[i].name);
        float total = 0;
        for (int j = 0; j < 5; j++) {
            printf("请输入评委 %d 的分数:", j + 1);
            scanf("%f", &contestants[i].scores[j]);
            total += contestants[i].scores[j];
        }
        contestants[i].avgScore = total / 5;
    }
}

6. 成绩排序模块

在这里插入图片描述

设计思路

sortScores() 函数利用冒泡排序算法,根据选手的平均分对选手数组进行排序,排序方式为按平均分从高到低排列。排序后,程序输出“成绩已排序”的提示信息,方便用户查看结果。

关键代码

void sortScores(Contestant contestants[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (contestants[j].avgScore < contestants[j + 1].avgScore) {
                Contestant temp = contestants[j];
                contestants[j] = contestants[j + 1];
                contestants[j + 1] = temp;
            }
        }
    }
    printf("成绩已排序。\n");
}

7. 数据查询模块

设计思路

searchData() 函数允许用户输入一个选手的编号,然后在选手数据中查找匹配的选手信息,并输出该选手的编号、姓名和平均分。如果没有找到对应的选手,则输出提示信息。

关键代码

void searchData(Contestant contestants[], int count) {
    int id;
    printf("请输入要查询的选手编号:");
    scanf("%d", &id);
    for (int i = 0; i < count; i++) {
        if (contestants[i].id == id) {
            printf("编号: %d, 姓名: %s, 平均分: %.2f\n", contestants[i].id, contestants[i].name, contestants[i].avgScore);
            return;
        }
    }
    printf("未找到编号为 %d 的选手。\n", id);
}

8. 追加选手数据模块

设计思路

addContestantData() 函数实现对已有数据的追加,即调用前面录入数据的函数 inputContestantData(),从而使用户可以在原有基础上继续增加选手数据。

关键代码

void addContestantData(Contestant contestants[], int *count) {
    inputContestantData(contestants, count);
}

9. 数据保存模块

设计思路

saveDataToFile() 函数用于将当前选手数据保存到文件中。函数打开名为 “contestants.txt” 的文件(写入模式),遍历选手数组,将每个选手的编号、姓名和平均分输出到文件中,然后关闭文件。这样,即使程序退出,也可以通过文件恢复数据。

关键代码

void saveDataToFile(Contestant contestants[], int count) {
    FILE *file = fopen("contestants.txt", "w");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return;
    }
    for (int i = 0; i < count; i++) {
        fprintf(file, "编号: %d, 姓名: %s, 平均分: %.2f\n", contestants[i].id, contestants[i].name, contestants[i].avgScore);
    }
    fclose(file);
    printf("数据已保存到文件。\n");
}

在这里插入图片描述


10. 主函数与整体流程控制模块

设计思路

主函数中首先初始化存储选手数据的数组和选手数量变量,然后进入一个 do–while 循环展示菜单,根据用户输入的选项依次调用上面各个功能模块:

  • 输入选手数据
  • 评委打分
  • 成绩排序
  • 数据查询
  • 追加选手数据
  • 写入数据文件
    同时,当用户选择退出时,退出循环并结束程序。

关键代码

int main() {
    Contestant contestants[100];
    int count = 0;
    int choice;

    do {
        displayMenu();
        printf("请输入您的选择:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                inputContestantData(contestants, &count);
                break;
            case 2:
                judgeScoring(contestants, count);
                break;
            case 3:
                sortScores(contestants, count);
                break;
            case 4:
                searchData(contestants, count);
                break;
            case 5:
                addContestantData(contestants, &count);
                break;
            case 6:
                saveDataToFile(contestants, count);
                break;
            case 7:
                printf("退出系统。\n");
                break;
            default:
                printf("无效选项,请重新选择。\n");
        }
    } while (choice != 7);

    return 0;
}

在这里插入图片描述

本程序采用模块化设计,主要模块包括:

  1. 数据结构定义模块:定义 Contestant 结构体存储选手基本信息。
  2. 文件读写模块:通过 loadData(本例中未单独提取加载函数)和 saveDataToFile 实现数据文件持久化保存。
  3. 数据录入与追加模块:实现选手数据的输入与追加,更新选手数量。
  4. 评委打分模块:实现对每个选手的打分,并计算平均分。
  5. 成绩排序模块:采用冒泡排序算法按平均分从高到低排序选手。
  6. 数据查询模块:通过输入选手编号查询并输出选手信息。
  7. 主函数模块:提供菜单驱动的用户交互,调用相应功能模块完成管理任务。

三、可视化分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969952.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性&#xff1a;理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据&#xff08;Metadata…

QML使用ChartView绘制饼状图

一、工程配置 首先修改CMakeLists.txt&#xff0c;按下图修改&#xff1a; find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp&#xff0c;按下图修改&#xff…

单片机上SPI和IIC的区别

SPI&#xff08;Serial Peripheral Interface&#xff09;和IC&#xff08;Inter-Integrated Circuit&#xff09;是两种常用的嵌入式外设通信协议&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; — 1. 基本概念 SPI&#xff0…

2025年02月12日Github流行趋势

项目名称&#xff1a;data-formulator 项目地址url&#xff1a;https://github.com/microsoft/data-formulator 项目语言&#xff1a;TypeScript 历史star数&#xff1a;4427 今日star数&#xff1a;729 项目维护者&#xff1a;danmarshall, Chenglong-MS, apps/dependabot, mi…

LeetCode《算法通关手册》 1.2 数组排序

Python强推&#xff1a;算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 目录 文章目录 1.2 数组排序1.2.1 选择排序1.2.2 冒泡排序[283. 移动零 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/p…

DeepSeek R1打造本地化RAG知识库

本文将详细介绍如何使用Ollama、Deepseek R1大语音模型、Nomic-Embed-Text向量模型和AnythingLLM共同搭建一个本地的私有RAG知识库。 一. 准备工作 什么是RAG&#xff1f; RAG是一种结合了信息检索和大模型&#xff08;LLM&#xff09;的技术&#xff0c;在对抗大模型幻觉、…

网页版贪吃蛇小游戏开发HTML实现附源码!

项目背景 贪吃蛇是一款经典的休闲小游戏&#xff0c;因其简单易玩的机制和丰富的变形而深受玩家喜爱。本次开发目标是实现一款网页版贪吃蛇小游戏&#xff0c;并通过前端与后端结合的方式&#xff0c;提供一个流畅的在线体验。 实现过程 游戏逻辑设计 蛇的移动&#xff1a;…

简易 Shell 实现指南

目录 前言&#xff1a; 一、代码中的核心功能 1. 环境变量获取 2. 当前路径处理 3. 用户输入处理 4. 命令解析 5. 内建命令处理 6. 外部命令执行 7. 错误处理 二、代码中涉及的关键知识点 1. 系统调用 2. 环境变量 3. 字符串处理 4. 文件操作 5. 进程管理 三、…

快速排序

目录 什么是快速排序&#xff1a; 图解&#xff1a; 递归法&#xff1a; 方法一&#xff08;Hoare法&#xff09;&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 方法二&#xff08;挖坑法&#xff09;&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 非递…

网络安全尹毅 《网络安全》

一 网络安全基本概念 1.网络安全定义 安全在字典中的定义是为了防范间谍活动或蓄意破坏、犯罪、攻击而采取的措施。网络安全就是为了防范计算机网络硬件、软件、数据被偶然或蓄意破坏、篡改、窃听、假冒、泄露、非法访问以及保护网络系统持续有效工作的措施总和。网络安全保护…

6.appender

文章目录 一、前言二、源码解析AppenderUnsynchronizedAppenderBaseOutputStreamAppenderConsoleAppenderFileAppenderRollingFileAppenderFileNamePattern 三、总结 一、前言 前一篇文章介绍了appender、conversionRule、root和logger节点的解析, 为的是为本篇详细介绍它们的…

P9584 「MXOI Round 1」城市

题目描述 小 C 是 F 国的总统&#xff0c;尽管这个国家仅存在于网络游戏中&#xff0c;但他确实是这个国家的总统。 F 国由 n 个城市构成&#xff0c;这 n 个城市之间由 n−1 条双向道路互相连接。保证从任意一个城市出发&#xff0c;都能通过这 n−1 条双向道路&#xff0c;…

什么是Docker多架构容器镜像

什么是Docker多架构容器镜像 在 Docker 中&#xff0c;同一个 Docker 镜像可以在不同的平台上运行&#xff0c;例如在 x86、ARM、PowerPC 等不同的 CPU 架构上。 为了支持这种多平台的镜像构建和管理&#xff0c;Docker 在 17.06 版本时引入了 Manifest 的概念&#xff0c;在…

Baklib知识中台构建企业智能运营核心架构

内容概要 在数字化转型的浪潮中&#xff0c;企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台&#xff0c;通过构建智能运营核心架构&#xff0c;为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…

深度学习机器学习:常用激活函数(activation function)详解

目录 Sigmoid Function ReLU&#xff08;Rectified Linear Unit&#xff09; LeakyReLU&#xff08;Leaky Rectified Linear Unit&#xff09; ClippedReLU&#xff08;Clipped Rectified Linear Unit&#xff09; PRelu&#xff08;Parametric ReLU&#xff09; Tanh&am…

【面试】网络安全常问150道面试题

1&#xff0c;拿到一个待测网站&#xff0c;你觉得应该先做什么&#xff1f; 信息收集&#xff1a; 服务器相关---&#xff1a;## 系统版本&#xff0c;真实IP&#xff0c;开放端口&#xff0c;使用的中间件 指纹信息---## 有无cdn加速&#xff0c;dns解析记录&#xff0c;是不…

【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 &#x1f3e0; yum &#x1f3b8; 什么是yum 当用户想下载软…

物联网平台-分布式的设备接入与管理系统

乐吾乐物联网平台是由乐吾乐自主研发的一款分布式的设备接入与管理系统&#xff0c;专为满足不断增长的设备接入和数据处理需求而设计。平台集数据采集、分析、监控、告警和通知等功能于一体&#xff0c;并融合了乐吾乐大屏可视化和乐吾乐3D数字孪生技术&#xff0c;帮助用户快…

Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲

Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲 dijkstra(堆优化版) 题目 https://www.programmercarl.com/kamacoder/0047.%E5%8F%82%E4%BC%9Adijkstra%E5%A0%86.html 小明参加科学大会 思路 思路 朴素版的dijkstra&#xff0c;时间复杂度为O(n^2)&am…

动手实现自己的 JVM——Go!(ch01)

动手实现自己的 JVM——Go&#xff01;&#xff08;ch01&#xff09; 参考张秀宏老师的《自己动手写java虚拟机》 为什么需要命令行 在 JMV 中&#xff0c;要运行一个 Java 文件&#xff08;字节码&#xff09;&#xff0c;首先需要找到这个文件。那么&#xff0c;如何找到文件…