杨校老师课堂之信息学奥赛结构体操作使用经典题集锦汇总

news2025/2/22 10:21:49

C++基础:结构体数组综合训练

    • 员工信息处理系统
        • 题目描述
        • 输入描述
        • 输出描述
        • 解题思路
        • 参考代码

员工信息处理系统

题目描述

在一家企业中,员工信息的准确性和时效性是日常人事管理工作的关键。由于企业员工数量众多,手动统计与更新员工信息不仅耗费大量时间,还容易出现错误。作为企业的技术人员,你准备开发一个专门的信息管理系统来协助人事部门高效完成这项任务。

该系统旨在实现以下核心功能,以全面覆盖员工信息管理的各个方面:
(1)添加员工功能:每当企业迎来新员工时,人事专员可以输入新员工数量,然后快速录入每位新员工的工号 ID、姓名 name、年龄 age、性别 gender 以及业绩评分 score 等关键信息。(注:员工信息具体数据类型可参考示例和数据范围说明)
(2)删除员工功能:面对员工离职或岗位调整的情况,系统可以通过工号快速定位并删除相应员工的信息。
(3)修改员工信息功能:考虑到员工信息可能因各种原因需要更新(如年龄增长、业绩变化等),系统能够通过工号检索到具体员工后,对其信息进行修改。
(4)查询员工信息功能:为了快速获取某位员工的详细信息,系统提供了按工号查询的功能。
(5)统计员工数据功能:系统能够自动计算并展示全体员工的业绩评分平均值。
(6)清空数据功能:随着财年的结束和部分员工的离职,系统提供了清空当前企业所有员工信息的选项。

输入描述

每次操作,只能是下列七个操作中的一个,每次操作将按照操作提示进行输入,数据保证合法。
1、添加员工功能:输入一行 insert n,表示进行添加员工功能,n 表示新加入员工的数量,然后输入 n 行信息,依次为 ID、name、age、gender、score。
2、删除员工功能:输入一行 del ID,表示进行删除工号为 ID 的员工信息。
3、修改员工信息功能:输入一行 update ID,表示进行更新工号为 ID 的员工信息,然后第二行输入员工信息,依次为 ID、name、age、gender、score。
4、查询员工信息功能:输入一行 Find ID,表示查询工号为 ID 的员工信息,然后输出一行,依次为员工的 ID、name、age、gender、score。
5、统计员工数据功能:输入一行 calc,表示统计员工数据,然后输出一行,为当前企业员工业绩的平均值。
6、清空数据功能:输入一行 clear,表示清空,清空表示所有员工信息都被删除。
7、退出系统:输入一行 exit,表示退出系统,此时程序停止执行。

输出描述

每次执行功能 4,输出一行,信息以一个空格分隔,依次为学生的 ID、name、age、gender、score。
每次执行功能 5,输出一行,包含一个数字,保留两位小数,表示平均分。
当执行功能 7,按存储顺序输出所有学生信息,每个学生信息占一行,信息以一个空格分隔,依次为学生的 ID、name、age、gender、score,然后结束程序。

输入样例

insert 5
20000101011 wangcai 15 f 100
20000101012 xiaoqiang 25 m 70
20000101013 xingxing 35 f 67
20000101014 afa 11 f 78
20000101015 aqi 19 m 26
del 20000101013
calc
update 20000101014
20000101014 kaka 12 m 90
Find 20000101015
clear
insert 2
20000101011 wangcai 15 f 100
20000101012 xiaoqiang 25 m 70
exit

输出样例

68.50
20000101015 aqi 19 m 26
20000101011 wangcai 15 f 100
20000101012 xiaoqiang 25 m 70

注意
本题目输入输出量较大,推荐使用更快的输入输出方式,例如:scanf、printf。

数据范围
每组操作数量最多不超过 10001000 次。
添加学生功能中,每次 nn 不超过 2020。
学号 ID 为11位数,姓名 name 长度不超过 1010 且都为小写字母,年龄 age 在 00 到 100100 之间,性别 gender 为 m 或者 f ,信息学成绩 score 为整数,在 00 到 100100 之间。
数据保证学号ID不重复。

解题思路
  1. 数据结构设计
  • 结构体定义:定义 Student 结构体来存储单个学生的信息,包含学号 id、姓名 name、年龄 age、性别 gender 和成绩 score。
  • 静态数组存储:使用静态数组 students[20005] 存储所有学生的信息,同时定义全局变量 studentCount 记录当前学生数量,totalScore 记录所有学生的总成绩。
  1. 功能函数实现
  • 添加学生(insertStudents):
    • 接收要添加的学生数量 n 作为参数。
    • 循环 n 次,每次读取一个学生的学号、姓名、年龄、性别和成绩,并将其存储到数组中。
    • 每添加一个学生,更新 studentCount 和 totalScore。
  • 删除学生(deleteStudent):
    • 接收要删除的学生的学号 id 作为参数。
    • 遍历数组,找到学号匹配的学生。
    • 从 totalScore 中减去该学生的成绩,将其后的学生信息依次前移覆盖该学生,同时 studentCount 减 1。
  • 修改学生信息(updateStudent):
    • 接收要修改信息的学生的学号 id 作为参数。
    • 遍历数组,找到学号匹配的学生。
    • 先从 totalScore 中减去该学生原来的成绩,再读取新的信息并更新到数组中,最后将新成绩累加到 totalScore 中。
  • 查找学生信息(findStudent):
    • 接收要查找的学生的学号 id 作为参数。
    • 遍历数组,找到学号匹配的学生并输出其信息。
  • 统计学生数据(calculateAverage):
    • 若 studentCount 为 0,输出 0.00。
    • 否则,计算并输出 totalScore 除以 studentCount 的结果,保留两位小数。
  • 清空数据(clearData):将 studentCount 和 totalScore 重置为 0,相当于清空所有学生信息。
  • 输出所有学生信息(printAllStudents):遍历数组,依次输出每个学生的信息。
  1. 主函数逻辑
  • 使用 while (true) 循环不断读取用户输入的操作指令。
  • 根据不同的操作指令,执行相应的功能函数:
    • 若指令为 insert,读取要添加的学生数量 n,调用 insertStudents 函数。
    • 若指令为 del,读取要删除的学生的学号 id,调用 deleteStudent 函数。
    • 若指令为 update,读取要修改信息的学生的学号 id,调用 updateStudent 函数。
    • 若指令为 Find,读取要查找的学生的学号 id,调用 findStudent 函数。
    • 若指令为 calc,调用 calculateAverage 函数。
    • 若指令为 clear,调用 clearData 函数。
    • 若指令为 exit,调用 printAllStudents 函数输出所有学生信息,然后退出循环,结束程序。
  1. 输入输出优化
    考虑到输入输出量较大,部分输入使用 scanf,部分输出使用 printf 以提高效率。对于字符串输入,使用 cin 处理姓名和性别等信息。同时,使用 std::string 类型存储操作指令,方便进行字符串比较。
参考代码
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

// 定义学生结构体,用于存储学生的各项信息
struct Student {
    long long id;  // 学生的学号,使用 long long 类型以适应可能较长的学号
    string name;   // 学生的姓名,使用 string 类型方便处理字符串
    int age;       // 学生的年龄,使用 int 类型存储整数
    string gender; // 学生的性别,使用 string 类型存储 "m" 或 "f" 等字符串
    int score;     // 学生的信息学成绩,使用 int 类型存储整数
};

// 定义一个静态数组,用于存储学生信息,最多可存储 20005 个学生
Student students[20005];
// 记录当前学生的数量,初始化为 0
int studentCount = 0;
// 记录所有学生的总成绩,初始化为 0
int totalScore = 0;

// 添加学生的函数,参数 n 表示要添加的学生数量
void insertStudents(int n) {
    // 循环 n 次,依次输入每个学生的信息
    for (int i = 0; i < n; ++i) {
        // 学生数量加 1
        studentCount++;
        // 读取学生的学号
        scanf("%lld", &students[studentCount].id);
        // 读取学生的姓名
        cin >> students[studentCount].name;
        // 读取学生的年龄
        scanf("%d", &students[studentCount].age);
        // 读取学生的性别
        cin >> students[studentCount].gender;
        // 读取学生的成绩
        scanf("%d", &students[studentCount].score);
        // 将该学生的成绩累加到总成绩中
        totalScore += students[studentCount].score;
    }
}

// 删除学生的函数,参数 id 表示要删除的学生的学号
void deleteStudent(long long id) {
    // 遍历所有学生,查找要删除的学生
    for (int i = 1; i <= studentCount; ++i) {
        if (students[i].id == id) {
            // 从总成绩中减去要删除学生的成绩
            totalScore -= students[i].score;
            // 将后面的学生信息依次向前移动,覆盖要删除的学生信息
            for (int j = i; j < studentCount; ++j) {
                students[j] = students[j + 1];
            }
            // 学生数量减 1
            studentCount--;
            // 找到并删除学生后,提前返回
            return;
        }
    }
}

// 修改学生信息的函数,参数 id 表示要修改信息的学生的学号
void updateStudent(long long id) {
    // 遍历所有学生,查找要修改信息的学生
    for (int i = 1; i <= studentCount; ++i) {
        if (students[i].id == id) {
            // 从总成绩中减去该学生原来的成绩
            totalScore -= students[i].score;
            // 读取新的学号
            scanf("%lld", &students[i].id);
            // 读取新的姓名
            cin >> students[i].name;
            // 读取新的年龄
            scanf("%d", &students[i].age);
            // 读取新的性别
            cin >> students[i].gender;
            // 读取新的成绩
            scanf("%d", &students[i].score);
            // 将新的成绩累加到总成绩中
            totalScore += students[i].score;
            // 找到并修改学生信息后,提前返回
            return;
        }
    }
}

// 查找学生信息的函数,参数 id 表示要查找的学生的学号
void findStudent(long long id) {
    // 遍历所有学生,查找指定学号的学生
    for (int i = 1; i <= studentCount; ++i) {
        if (students[i].id == id) {
            // 找到学生后,输出该学生的信息
            printf("%lld %s %d %s %d\n", students[i].id, students[i].name.c_str(), students[i].age, students[i].gender.c_str(), students[i].score);
            // 找到学生后,提前返回
            return;
        }
    }
}

// 统计学生数据的函数,用于计算并输出学生的平均成绩
void calculateAverage() {
    // 如果学生数量为 0,输出 0.00
    if (studentCount == 0) {
        printf("0.00\n");
    } else {
        // 计算平均成绩并输出,保留两位小数
        printf("%.2f\n", (double)totalScore / studentCount);
    }
}

// 清空数据的函数,将学生数量和总成绩重置为 0
void clearData() {
    studentCount = 0;
    totalScore = 0;
}

// 输出所有学生信息的函数,遍历所有学生并输出其信息
void printAllStudents() {
    for (int i = 1; i <= studentCount; ++i) {
        printf("%lld %s %d %s %d\n", students[i].id, students[i].name.c_str(), students[i].age, students[i].gender.c_str(), students[i].score);
    }
}

int main() {
    string op;  // 用于存储用户输入的操作指令
    while (true) {
        // 读取用户输入的操作指令
        cin >> op;
        if (op == "insert") {
            int n;
            // 读取要添加的学生数量
            scanf("%d", &n);
            // 调用添加学生的函数
            insertStudents(n);
        } else if (op == "del") {
            long long id;
            // 读取要删除的学生的学号
            scanf("%lld", &id);
            // 调用删除学生的函数
            deleteStudent(id);
        } else if (op == "update") {
            long long id;
            // 读取要修改信息的学生的学号
            scanf("%lld", &id);
            // 调用修改学生信息的函数
            updateStudent(id);
        } else if (op == "Find") {
            long long id;
            // 读取要查找的学生的学号
            scanf("%lld", &id);
            // 调用查找学生信息的函数
            findStudent(id);
        } else if (op == "calc") {
            // 调用统计学生数据的函数
            calculateAverage();
        } else if (op == "clear") {
            // 调用清空数据的函数
            clearData();
        } else if (op == "exit") {
            // 调用输出所有学生信息的函数
            printAllStudents();
            // 退出循环,结束程序
            break;
        }
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx环境安装

一、官网地址 Nginx官网&#xff1a;http://nginx.org/ Nginx中文网&#xff1a;https://nginx.p2hp.com/ 二、Nginx版本 mainline version 开发版本stableversion 稳定版本legacy version 历史版本 三、Windows系统安装Nginx 第一步&#xff1a;选择Windows版本&#xff0c;…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型&#xff0c;凭借其强大的自然语言处理能力和丰富的知识储备&#xff0c;迅速成为业界关注的焦点。无论是文本生…

android系统SystemServer进程启动流程分析

目录 一,SystemServer整体框架 二,SystemServer启动源码分析 2.1,重要的概念 2.2,启动入口 2.3,创建对应进程的binder 三,binder驱动和binder线程池 四,SystemServer真正启动方法 4.1 SystemServer main方法里面主要做了几件事情 1)创建SystemServiceManager管理所有的…

Oracle 深入理解Lock和Latch ,解析访问数据块全流程

Oracle 锁机制介绍 根据保护对象的不同&#xff0c;单实例Oracle数据库锁可以分为以下几大类&#xff1a; DML lock&#xff08;data locks&#xff0c;数据锁&#xff09;&#xff1a;用于保护数据的完整性&#xff1b; DDL lock&#xff08;dictionary locks&#xff0c;字典…

如何基于transformers库通过训练Qwen/DeepSeek模型的传统分类能力实现文本分类任务

文章目录 模型与环境准备文档分析源码解读模型训练及推理方式进阶:CPU与显存的切换进阶:多卡数据并行训练🔑 DDP 训练过程核心步骤🚫 DDP 不适用于模型并行⚖️ DDP vs. Model Parallelism⚙️ 解决大模型训练的推荐方法🎉进入大模型应用与实战专栏 | 🚀查看更多专栏…

Unity中一个节点实现植物动态(Shader)

1 . 核心思路就操作顶点作往复运动&#xff1b; 核心代码&#xff1a; half stage1 dot(positionOS, float3(0, 1, 0)) * _Strength; half stage2 sin(dot(positionOS, float3(1, 0, 0)) * _Strength _Time.y * _Speed); half stage3 stage1 * stage2 * float3(0.001,…

PrimeTime:工具简介

相关阅读 PrimeTimehttps://blog.csdn.net/weixin_45791458/category_12900271.html?spm1001.2014.3001.5482 PrimeTime是PrimeTime Suite中的一个工具&#xff0c;能够执行全芯片级、门级的静态时序分析&#xff0c;这是芯片设计和分析流程中的一个关键部分。该工具通过检查…

【拜读】Tensor Product Attention Is All You Need姚期智团队开源兼容RoPE位置编码

姚期智团队开源新型注意力&#xff1a;张量积注意力&#xff08;Tensor Product Attention&#xff0c;TPA&#xff09;。有点像一种「动态的LoRA」&#xff0c;核心思路在于利用张量分解来压缩注意力机制中的 Q、K、V 表示&#xff0c;同时保留上下文信息&#xff0c;减少内存…

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…

用Chrome Recorder轻松完成自动化测试脚本录制

前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…

python中的异常-模块-包

文章目录 异常异常的定义异常捕获语法捕获常规异常捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常传递总结 模块概念导入自定义模块及导入main方法all变量 总结 包自定义包定义pycharm中建包的基本步骤导入方式 第三方包 异常 异常的定义 当检测到一个错误时…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

ssm-day06 ssm整合

从springMVC总结再回顾一下 60节 整合就是应用框架&#xff0c;并且把这个框架放到IOC容器中 web容器&#xff1a;装springMVC和controller相关的web组件 root容器&#xff1a;装业务和持久层相关的组件 子容器可以引用父容器中的组件&#xff0c;父容器不能调子容器 一个容器…

AI 编程助手 cursor的系统提示词 prompt

# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生&#xff0c;不善于表达产品和代码需求。你的工作对用户来说非常重要&#xff0c;完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…

ollama如何安全卸载,解决Ollama unins000.msg is missing

春节后在本地电脑安装了Ollama的客户端&#xff0c;每次开机自启&#xff0c;影响开机速度&#xff0c;而且本地的模型不如联网的回答效果好&#xff0c;果断选择了卸载&#xff0c;但是今天卸载发现提示下方的错误。根据此文章可以解决当前的问题。 根据此文章可以解决当前的…

网络安全设备防护原理 网络安全防护装置

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 防火墙 简介 网络层的防护设备&#xff0c;依照特殊的规则允许或者限制传输的数据通过 是由软件和硬件设备组合而成&#xff0c;在内部网和外部网之间、专用网…

Python的那些事第二十八篇:数据分析与操作的利器Pandas

Pandas:数据分析与操作的利器 摘要 Pandas是基于Python的开源数据分析库,广泛应用于数据科学、机器学习和商业智能等领域。它提供了高效的数据结构和丰富的分析工具,能够处理结构化数据、时间序列数据以及复杂的数据转换任务。本文从Pandas的基础概念入手,深入探讨其核心…

学习threejs,使用MeshBasicMaterial基本网格材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshBasicMaterial 二…

【git-hub项目:YOLOs-CPP】本地实现05:项目移植

ok&#xff0c;经过前3个博客&#xff0c;我们实现了项目的跑通。 但是&#xff0c;通常情况下&#xff0c;我们的项目都是需要在其他电脑上也跑通&#xff0c;才对。 然而&#xff0c;经过测试&#xff0c;目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】&#xff1a; 精…

【python】协程(coroutine)

协程&#xff08;coroutine&#xff09;可以理解为一个可以中途暂停保存当前执行状态信息并可以从此处恢复执行的函数&#xff0c;多个协程共用一个线程执行&#xff0c;适合执行需要“等待”的任务。 所以严格意义上&#xff0c;多个协程同一时刻也只有一个在真正的执行&#…