石头剪刀布游戏(C语言)

题目描述

石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母 A , B , C 表示。

游戏规则:

出拳形状之间的胜负规则如下: A > B;B > C;C > A;">"左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。
当本场次中有且仅有一种出拳形状优于其它出拳形状,则该形状的玩家是胜利者。否则认为是平局。
当发生平局,没有赢家。有多个胜利者时,同为赢家。

  • 例如 1: 三个玩家出拳分别是A, B, C ,由于出现三方优势循环(即没有任何一方优于其它出拳者),判断为平局。
  • 例如 2: 两个玩家,出拳分别是 A, B ,出拳 A 的获胜。
  • 例如 3: 三个玩家,出拳全部是 A ,判为平局。

输入描述

在一场游戏中,每个玩家的信息为一行。玩家数量不超过 1000 。每个玩家信息有 2 个字段,用空格隔开:

  1. 玩家 ID:一个仅由英文字母和数字组成的字符串

  2. 出拳形状:以英文大写字母表示, A 、B 、C 形状。 例:

    abc1 A
    xyz B
    12

输出描述

输出为赢家的玩家 ID 列表(一个或多个),每个 ID 一行,按字符串升序排列。如果没有赢家,输出为"NULL"字符串。例如:

abc1

用例1

输入

abc1 A  
xyz B

输出

abc1

说明

A比B有优势,abc1 胜出

用例2

输入

abc1 A  
xyz A

输出

NULL

说明

没有优胜的出拳形状,平局

用例3

输入

abc1 A  
def A  
alic A  
xyz B

输出

abc1  
alic  
def

说明

A为优胜方,有三个赢家

思路

解题思路如下:

  1. 读取输入:通过 scanf 函数逐行读取每个玩家的 ID 和出拳形状,存储在 Player 结构体数组中,并记录有效玩家数量(即 count 变量)。

  2. 统计各出拳形状的数量:遍历 Player 结构体数组,分别计算出拳为 ‘A’、‘B’ 和 ‘C’ 的玩家数量(countA、countB、countC)。

  3. 判断游戏结果

    • 检查是否存在三种出拳形状都出现的情况,且没有任何一种形状的数量大于另一种形状,这种情况表示平局,输出 “NULL”。
    • 检查是否存在某一种形状的所有玩家都选择同一种出拳,这也是一种平局情况,同样输出 “NULL”。
  4. 确定赢家

    • 根据前面统计得到的 countA、countB、countC,检查是否有某种形状不存在(即数量为 0),若有,从另外两个形状中选择赢家,并输出对应出拳形状的赢家玩家ID。

通过以上步骤,程序即可根据石头剪刀布的游戏规则正确解析输入信息并输出赢家列表。

代码

// 石头剪刀布游戏代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义玩家结构体,包含玩家ID(name)和出拳形状(play)
typedef struct {char name[10]; // 玩家ID,由英文字母和数字组成,最大长度为9个字符char play; // 玩家出拳形状,用英文大写字母'A'、'B'或'C'表示石头、剪刀、布
} Player;int main() {// 初始化一个可存储100个玩家信息的数组Player player[100];int count = 0; // 记录有效输入玩家的数量// 读取玩家输入,直到文件结束符EOFwhile (scanf("%s %c", player[count].name, &player[count].play) != EOF) {count++; // 每成功读取一组玩家信息,计数器加1}// 统计各出拳形状的数量int countA = 0, countB = 0, countC = 0;for (int i = 0; i < count; i++) {if (player[i].play == 'A') {countA++;}if (player[i].play == 'B') {countB++;}if (player[i].play == 'C') {countC++;}}// 判断游戏结果:// 1. 如果三种出拳形状都出现,并且没有一种形状数量大于另一种形状,则平局// 2. 如果某一种形状的数量等于总玩家数,则也是平局if ((countA > 0 && countB > 0 && countC > 0) ||(countA == count || countB == count || countC == count)) {printf("NULL\n"); // 输出“NULL”,表示没有赢家return 0;}// 根据剩余形状确定赢家if (countA == 0) { // 剩余B和C,说明B是赢家for (int i = 0; i < count; i++) {if (player[i].play == 'B') {printf("%s\n", player[i].name); // 输出赢家ID}}}if (countB == 0) { // 剩余A和C,说明C是赢家for (int i = 0; i < count; i++) {if (player[i].play == 'C') {printf("%s\n", player[i].name); // 输出赢家ID}}}if (countC == 0) { // 剩余A和B,说明A是赢家for (int i = 0; i < count; i++) {if (player[i].play == 'A') {printf("%s\n", player[i].name); // 输出赢家ID}}}return 0;
}

注意

1、scanf的返回值

scanf() 是 C 语言中用于从标准输入读取数据的标准库函数,它根据指定的格式字符串从 stdin(通常为键盘)读取并解析输入的数据。scanf() 函数返回一个整数值,该值表示成功读取和转换的参数个数。

以下是 scanf() 返回值的详细说明:

  1. 成功读取与转换

    • scanf() 成功读取并转换了与格式化字符串中相应格式说明符匹配的数据时,它会返回读取成功的变量或字段的数量。
    • 例如,如果你有 scanf("%d %f", &num, &flt); 并且用户正确地输入了一个整数和一个浮点数,scanf() 将返回2,因为两个变量都成功读取。
  2. 部分成功

    • 如果格式化字符串中有多个占位符,但只有一部分被成功读取,则返回值是成功读取的参数个数。
    • scanf("%d%d", &a, &b); 用户仅输入了一个整数,那么 scanf() 将返回1,表示成功读取了一个整数,第二个变量没有被赋值。
  3. 失败与错误

    • scanf() 遇到无法转换的数据、到达文件末尾(EOF)、或者发生其他错误时,它将返回0。
    • 若遇到非法输入或预期类型与实际输入不符的情况,后续的输入项将不会被读取,并且整个函数调用将立即终止。
    • 在读取过程中如果碰到 EOF (End Of File),在Unix/Linux系统下通常是通过按下组合键Ctrl+D,在Windows系统下通常是按下Ctrl+Z然后回车来模拟的,此时 scanf() 的返回值可能为EOF(通常定义为-1,具体取决于编译器实现)。
      在这里插入图片描述
  4. 缓冲区问题与安全

    • 注意,由于 scanf() 不清除输入流中的未处理字符,所以连续调用 scanf() 可能导致意外结果,尤其是在处理用户输入时应特别小心,考虑使用 fgets() 结合 sscanf() 或其他更安全的方式来读取和解析输入。

总结来说,scanf() 的返回值是一个非常重要的信息,它可以用来判断读取操作是否按预期完成,以及有多少个变量成功接收到了有效的输入数据。开发人员应当始终检查 scanf() 的返回值以确保程序正确处理所有可能的输入情况。

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

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

相关文章

bat 查找文件所在

脚本 在批处理文件&#xff08;.bat&#xff09;中查找文件所在的目录&#xff0c;你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例&#xff0c;演示如何在批处理文件中查找指定文件并输出其所在目录&#xff1a; echo off setlocal enabledelayedexpansio…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

开源LLMs导览:工作原理、顶级LLM列表对比

目录 一、开源 LLM 是什么意思&#xff1f;二、开源LLM如何工作&#xff1f;2.1 预训练2.2 代币化2.3 开源LLM的微调2.4 输入编码2.5 训练与优化2.6 推理 三、开源LLM对组织的好处3.1 增强的数据安全和隐私3.2 节约成本3.3 减少供应商依赖性3.4 代码透明度 四、哪种LLM模式最好…

数据可视化在商业领域有哪些重要性?

数据可视化在商业领域的重要性体现在多个方面&#xff0c;它通过将复杂的数据集转化为直观、易于理解的图形和图表&#xff0c;帮助企业和组织做出更明智的决策。以下是数据可视化对商业的一些关键重要性&#xff1a; 提高决策效率&#xff1a;通过直观的图表和图形&#xff0c…

漫漫数学之旅031

文章目录 经典格言数学习题古今评注名人小传 - 经典格言 如果没有数学知识&#xff0c;这个世界的事物是无法搞清楚的。——罗杰培根&#xff08;Roger Bacon&#xff09; 好的&#xff0c;各位看官&#xff0c;让我们来听听罗杰培根这位中世纪的“科学老顽童”是怎么说的&…

罗克韦尔AB的PLC实现ModbusTCP和ModbusRTU协议标签方式通讯

本文是通过IGT-DSER智能网关读写AB罗克韦尔Compact、Control系列PLC的标签数据缓存并转为Modbus从站协议&#xff0c;与上位机通讯的案例。 打开智能网关的参数软件(下载地址)&#xff0c;通过功能->数据转发与平台对接&#xff0c;再选择数据转发与缓存’&#xff0c;进入以…

基于java+springboot+vue实现的城市垃圾分类管理系统(文末源码+Lw)23-191

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本城市垃圾分类管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

使用python查看官网是否发布新的内容

目录 前言 第一章、python介绍和使用pip install下载包 1.python介绍 2.使用vscode编写python 3.pip install的使用 第二章、查看官网是否发布新的内容 第三章、代码实现 目录结构 代码实现 check_new_news.py files.py news.py main.py file.txt 运行演示 前言 也…

【Azure 架构师学习笔记】- Azure Databricks (7) --Unity Catalog(UC) 基本概念和组件

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog 前言 在以前的Databricks中&#xff0c;主要由Workspace和集群、SQL Warehouse组成&#xff0c; 这两年Databricks公…

我们在SqlSugar开发框架中,用到的一些设计模式

我们在《SqlSugar开发框架》中&#xff0c;有时候都会根据一些需要引入一些设计模式&#xff0c;主要的目的是为了解决问题提供便利和代码重用等目的。而不是为用而用&#xff0c;我们的目的是解决问题&#xff0c;并在一定的场景下以水到渠成的方式处理。不过引入任何的设计模…

【YOLOX-nano】YOLOX-nano的推理实践

目录 1 pt文件和pth文件的区别 2 安装依赖库 3 模型下载 4 实践 YOLOX-nano.pth模型转换为YOLOX-nano.onnx模型</

SpringBoot对于SpringMVC的支持

创建项目 版本说明这里使用的 SpringBoot 2.0.0.Release SpringBoot对于SpringMVC的支持 在之前的开发中很多场景下使用的是基于xml配置文件或者是Java配置类的方式来进行SpringMVC的配置。一般来讲&#xff0c;初始的步骤如下所示 1、初始化SpringMVC的DispatcherServlet2、…

pytest结合Allure生成测试报告

文章目录 1.Allure配置安装2.使用基本命令报告美化1.**前置条件**2.**用例步骤****3.标题和描述****4.用例优先级**3.进阶用法allure+parametrize参数化parametrize+idsparametrize+@allure.title()4.动态化参数5.环境信息**方式一****方式二**6.用例失败截图1.Allure配置安装 …

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

web安全学习笔记【15】——信息打点(5)

信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

基于springboot财务管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

【C语言必知必会 | 第一篇】C语言入门,这一篇就够了

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第一篇&#xff0c;带你初步了解C语言&#xff0c;为之后的学习打下基础 文章目录 1️⃣发展历史2️⃣语言特点3️⃣语…

论文精读--GPT2

被BERT敲打了&#xff0c;但是仍然坚持解码器架构 Abstract Natural language processing tasks, such as question answering, machine translation, reading comprehension, and summarization, are typically approached with supervised learning on taskspecific dataset…

使用代理IP技术实现爬虫同步获取和保存

概述 在网络爬虫中&#xff0c;使用代理IP技术可以有效地提高爬取数据的效率和稳定性。本文将介绍如何在爬虫中同步获取和保存数据&#xff0c;并结合代理IP技术&#xff0c;以提高爬取效率。 正文 代理IP技术是一种常用的网络爬虫技术&#xff0c;通过代理服务器转发请求&a…