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

news/发布时间2024/5/15 17:35:16

题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html

题目描述

石头剪刀布游戏有 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.bcls.cn/AKyC/3953.shtml

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

相关文章

视频基础学习二——图像深度与格式(RGB与YUV)

文章目录 前言一、图像深度1.什么是图像深度2.图像深度的意义3.常见的图像深度8位16位24位32位 二、图像格式1.RGB格式2.RGB样式2.YUVYUV的来由YUV样式RGB和YUV之间的转换YUV的常见类型 总结 前言 本文的目的是为了梳理音视频基础相关的知识&#xff0c;有很多做流媒体、音视频…

神经网络——循环神经网络(RNN)

神经网络——循环神经网络&#xff08;RNN&#xff09; 文章目录 神经网络——循环神经网络&#xff08;RNN&#xff09;一、循环神经网络&#xff08;RNN&#xff09;二、循环神经网络结构1、一对一&#xff08;One to One&#xff09;2、一对多&#xff08;One to Many&#…

稀疏计算、彩票假说、MoE、SparseGPT

稀疏计算可能是未来10年内最有潜力的深度学习方向之一&#xff0c;稀疏计算模拟了对人脑的观察&#xff0c;人脑在处理信息的时候只有少数神经元在活动&#xff0c;多数神经元是不工作的。而稀疏计算的基本思想是&#xff1a;在计算过程中&#xff0c;将一些不重要的参数设置为…

基于ssm的校园帮系统设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于ssm的校园帮系统设计…

axios是如何实现的(源码解析)

1 axios的实例与请求流程 在阅读源码之前&#xff0c;先大概了解一下axios实例的属性和请求整体流程&#xff0c;带着这些概念&#xff0c;阅读源码可以轻松不少&#xff01; 下图是axios实例属性的简图。 可以看到axios的实例上&#xff0c;其实主要就这三个东西&#xff1a…

npmjs官网(查询依赖包)

npmjs官网 可以方便的查看依赖包的安装、使用说明及相关注意事项等。 以wechat-http为例&#xff1a;

【黑马程序员】STL容器之string

string string 基本概念 string本质 string是c风格的字符串&#xff0c;而string本质上是一个类 string和char* 区别 char* 是一个指针string是一个类&#xff0c;类内部封装了char*,管理这个字符串&#xff0c;是一个char*型的容器 特点 string 内部封装了很多成员方法…

小程序--事件处理

一、事件对象 给小程序的事件传递参数&#xff0c;有以下两种方法&#xff1a; 1、自定义属性 <view class"item" wx:for"{{ 5 }}" wx:key"*this" data-index"{{index}}" bind:tap"onClick"></view> Page({o…

C#安装CommunityToolkit.Mvvm依赖

这里需要有一定C#基础&#xff0c; 首先找到右边的解决方案&#xff0c;右键依赖项 然后选择nuget管理 这里给大家扩展一下nuget的国内源&#xff08;https://nuget.cdn.azure.cn/v3/index.json&#xff09; 然后搜自己想要的依赖性&#xff0c;比如CommunityToolkit.Mvvm 再点…

vue中实现拖拽排序功能

npm i vuedraggable <template><div class"app-container"><!-- <div :class"canEdit ? dargBtn-lock el-icon-unlock : dargBtn-lock el-icon-lock" click"removeEvent()">{{ canEdit ? 调整 : 锁定 }}</div> --&…

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…

如何修改unity的背景颜色

要在Unity中将背景颜色设为黑色&#xff0c;可以按照以下步骤进行&#xff1a; 1、在Unity编辑器中&#xff0c;选择你想要修改背景颜色的摄像机对象&#xff08;一般是Main Camera&#xff09;。 2、在Inspector面板中&#xff0c;找到"Clear Flags"&#xff08;清…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f;1-2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f;1-3. JDK 动态代理和 CGLIB 动态代理的区别是什么&#xff1f; 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么&…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家&#xff0c;我打开自己的项目&#xff0c;执行&#xff1a; cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码&#xff0c;然后更新依赖&#xff0c;最后开始今晚的开发时候&#xff0c;意外发生了&#xff0c;竟然报错了&#xff0c;…

【linux】查看openssl程序的安装情况

【linux】查看openssl程序的安装情况 1、查看安装包信息 $ rpm -qa |grep openssl 2、安装路径 $ rpm -ql openssl $ rpm -ql openssl-libs $ rpm -ql openssl-devel 3、相关文件和目录 /usr/bin/openssl /usr/include/openssl /usr/lib64/libssl.so.* /usr/lib64/libcrypto…

[golang] 24 fmt.Errorf(), error.Is() 和 error.As()

文章目录 一、默认的 error 实现二、自定义 error 实现2.1 通过 fmt.Errorf(%w) 创建嵌套 error2.1.1 fmt.Errorf() 实现 2.2 errors.Is()2.2.1 使用2.2.2 实现 2.3 errors.As()2.3.1 使用2.3.2 实现 一、默认的 error 实现 首先&#xff0c;go 定义了 error interface&#x…

跨区互联组网怎么做?SD-WAN专线可以实现吗?

在当今数字化时代&#xff0c;企业不断扩张&#xff0c;跨区域互联成为业务发展的必然需求。然而&#xff0c;跨区互联组网涉及到复杂的网络架构和连接&#xff0c;传统的网络方案往往难以满足高性能、高可靠性和低成本的要求。SD-WAN专线技术的出现&#xff0c;为跨区互联组网…

IO线程进程作业day6

1> 将标准io文件IO的内容复习一遍 2> 进程线程的相关函数复习一遍 3> 将信号和消息队列的课堂代码敲一遍 1、处理普通信号 #include <myhead.h> //定义信号处理函数 void handler(int signo) {if(signoSIGINT){puts("按下ctrlc");} } int main(in…

chatGPT 使用随想

一年前 chatGPT 刚出的时候&#xff0c;我就火速注册试用了。 因为自己就是 AI 行业的&#xff0c;所以想看看国际上最牛的 AI 到底发展到什么程度了. 自从一年前 chatGPT 火出圈之后&#xff0c;国际上的 AI 就一直被 OpenAI 这家公司引领潮流&#xff0c;一直到现在&#x…

创建型设计模式 - 原型设计模式 - JAVA

原型设计模式 一 .简介二. 案例三. 补充知识 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一 .简介 原型模式提供了一种机制&#xff0c;可以将原始对象复制到新对象&#xff0…
推荐文章