当前位置: 首页 > news >正文

Java基础结课题-统计双色球中奖数

目录

案例要求:

实现思路:

代码:

四、总结(升华代码意义)


案例要求:

这道题是围绕双色球号码设计的编程实践题目,核心要实现两个功能:

1. 随机生成符合规则的双色球号码

  • 按规则生成 6 个 不重复 的红球(范围 1-35),并对红球升序排序
  • 生成 1 个篮球(范围 1-15),最终按 “红球 + 篮球” 的格式输出完整号码。

2. 模拟中奖校验逻辑

  • 给定一组 “中奖号码”(题目示例图里的红球 + 篮球);
  • 拿随机生成的号码与中奖号码对比,统计 红球命中个数 和 篮球命中个数,判断中奖情况。

简单说,就是让你用代码模拟双色球的「随机出票」和「中奖核对」流程,既练随机数、集合操作,也涉及业务规则(去重、排序、范围约束)和逻辑校验,很适合用来写 “编程趣味实践”“小功能开发思路” 类的博客,能结合彩票规则讲代码逻辑~

实现思路:

使用TreeSet集合,该集合特性是不重复

代码:

package com.itheima.demo1;import java.util.Collections;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;public class test1 {public static void main(String[] args) {Set<Integer> target=new TreeSet<>();Collections.addAll(target,10,12,30,16,7,17);int blueTarget=12;Scanner sc=new Scanner(System.in);Set<Integer> user=new TreeSet<>();while (user.size()<6) {System.out.println("请输入选择的红球的数字");int num=sc.nextInt();if(num<1||num>35){System.out.println("请输入1-35之间的红球数");}elseuser.add(num);}int blueUser=0;while (true){System.out.println("请输入选择的篮球的数字");int num=sc.nextInt();if(num<1||num>15){System.out.println("请输入1-15之间的数字");}else{blueUser=num;break;}}int count=0;for(int val:user){if(target.contains(val)){count++;}}System.out.println("用户中红球"+count+"个");count=blueUser==blueTarget?1:0;System.out.println("用户中篮球"+count+"个");}
}

以下从代码结构、功能逻辑、细节设计等维度,全方位深度讲解这段双色球模拟程序,帮你理解每行代码的意义与价值:

一、整体功能定位

这段 Java 代码实现了模拟双色球「用户选号 - 与预设中奖号码对比」的核心流程,让用户手动输入 6 个红球(1-35,不重复)和 1 个蓝球(1-15),然后与程序预设的中奖号码比对,统计红球、蓝球的命中数量。既模拟了真实双色球的选号规则,也实现了基础的中奖校验逻辑,是对「数据录入 - 规则校验 - 结果统计」流程的完整实践。

二、代码模块拆解与详解

1. 中奖号码初始化:构建比对 “基准”

java

运行

Set<Integer> target = new TreeSet<>();
Collections.addAll(target, 10, 12, 30, 16, 7, 17);
int blueTarget = 12;

  • 数据结构选型(TreeSet)
    用 TreeSet 存储 6 个红球中奖号码,利用其自动排序、去重特性,既契合 “红球需有序(虽然题目要求用户红球升序,但中奖号码用 TreeSet 存储可保证有序,方便后续对比)” 的隐含需求,也避免手动维护排序逻辑。
  • 功能意义
    target 作为红球中奖号码容器,blueTarget 作为蓝球中奖号码,共同构成 “中奖基准”,后续用户输入的号码都要与这两个数据比对,判断是否中奖。

2. 用户交互初始化:准备接收输入

java

运行

Scanner sc = new Scanner(System.in);
Set<Integer> user = new TreeSet<>();

  • Scanner 作用
    实例化 Scanner,从控制台获取用户输入,是 Java 实现 “人机交互” 的基础工具。
  • 用户选号容器(TreeSet)
    同样用 TreeSet 存用户红球选号,利用其自动去重特性,若用户输入重复数字(如连续输两次 10),集合会自动过滤,无需手动写去重逻辑,简化代码同时契合 “红球不重复” 规则。

3. 用户红球选号逻辑:规则校验与录入

java

运行

while (user.size() < 6) {System.out.println("请输入选择的红球的数字");int num = sc.nextInt();if (num < 1 || num > 35) {System.out.println("请输入1-35之间的红球数");} else user.add(num);
}

  • 循环控制(while (user.size () < 6))
    要求用户必须输入 6 个有效红球,若数量不足则持续循环,保证 “6 个红球” 的规则被严格执行。
  • 合法性校验(if (num < 1 || num> 35))
    限定用户输入范围,若超出 1-35 则提示重新输入,确保输入符合双色球 “红球号码范围” 规则,是业务规则落地的关键校验点
  • 自动去重(user.add (num))
    依赖 TreeSet 的去重特性,若用户输入重复数字(如先输 10 再输 10),集合不会重复存储,天然满足 “红球不重复” 需求,无需额外写去重判断。

4. 用户蓝球选号逻辑:循环校验直至合规

java

运行

int blueUser = 0;
while (true) {System.out.println("请输入选择的篮球的数字");int num = sc.nextInt();if (num < 1 || num > 15) {System.out.println("请输入1-15之间的数字");} else {blueUser = num;break;}
}

  • 死循环 + break 设计
    用 while (true) 构建 “必循环” 逻辑,强制用户输入蓝球,直到输入 1-15 范围内的数字才通过 break 跳出循环。相比固定次数循环,这种设计更灵活、更贴合 “必须输入合规值” 的强校验场景
  • 变量赋值(blueUser = num)
    一旦输入合规,将值赋给 blueUser,作为用户蓝球选号结果,供后续中奖校验使用。

5. 中奖校验与结果输出:核心业务逻辑

java

运行

int count = 0;
for (int val : user) {if (target.contains(val)) {count++;}
}
System.out.println("用户中红球" + count + "个");count = blueUser == blueTarget ? 1 : 0;
System.out.println("用户中篮球" + count + "个");

  • 红球命中统计(for 循环)
    遍历用户红球选号(user),逐个与中奖红球(target)比对,用 target.contains(val) 判断是否命中,命中则 count 自增。通过遍历 + 集合查询,简洁实现 “多对多比对”,统计命中数量。
  • 蓝球命中统计(三元运算符)
    用三元运算符 blueUser == blueTarget ? 1 : 0,一行代码完成 “命中则计 1,否则计 0” 的逻辑,相比 if-else 更简洁。
  • 结果输出
    分别打印红球、蓝球命中数量,将业务结果直观呈现给用户,完成 “选号 - 比对 - 反馈” 的完整闭环。

6. 代码潜在优化点(可拓展讲解)

  • 用户体验优化
    若用户输入重复数字(虽 TreeSet 去重,但程序未提示 “该数字已选”),体验略有不足,可在 else 分支(user.add(num) 前)加提示,如 System.out.println("该数字已选,请重新输入");
  • 边界场景覆盖
    若用户输入非数字(如字母、符号),sc.nextInt() 会抛 InputMismatchException,需用 try-catch 或 hasNextInt() 校验,增强程序鲁棒性。
  • 功能拓展性
    中奖号码目前写死在代码里,可改为从文件、数据库读取,或随机生成(贴合题目 “随机一组号码” 的原始需求),让程序更灵活、贴近真实场景。

三、代码设计亮点与价值

1. 巧妙利用数据结构特性

  • 用 TreeSet 同时解决 “去重、排序” 需求,减少手动逻辑,让代码更简洁、高效。无论是中奖号码存储,还是用户选号录入,都利用其特性规避重复开发。

2. 分层实现业务逻辑

  • 从 “初始化(中奖号码、交互工具)”→“用户输入(红球、蓝球)”→“中奖校验(遍历比对)”→“结果输出”,流程清晰,符合 **“单一职责原则”**,每个模块专注做一件事,代码易读、易维护。

3. 贴合真实业务规则

  • 严格遵循双色球 “红球 1-35、蓝球 1-15,红球不重复” 的规则,通过数据结构(TreeSet)、条件判断(if (num < 1 || num > 35))落地业务约束,是 “业务逻辑转代码规则” 的典型实践。

四、总结(升华代码意义)

这段代码虽短小,但完整覆盖 **“需求分析(理解双色球规则)→ 技术选型(TreeSet、Scanner 等)→ 逻辑实现(输入校验、中奖比对)→ 结果呈现”** 的开发流程,是 “小需求驱动编程实践” 的优质案例。

本文介绍了一个Java实现的双色球号码模拟程序,包含随机选号和中奖校验两大功能。程序使用TreeSet存储红球确保不重复且自动排序,通过Scanner实现用户交互,严格校验输入范围(红球1-35,蓝球1-15)。核心逻辑通过集合比对统计命中数,完整实现了&quot;选号-校验-反馈&quot;的闭环流程。代码巧妙利用数据结构特性简化业务规则实现,展现了基础语法解决实际问题的能力,既遵循彩票规则又体现分层设计思想,是业务逻辑转代码的典型范例。

它不仅教你如何用 Java 基础语法(循环、条件判断、集合操作)解决实际问题,更传递了 **“利用数据结构简化逻辑”“强规则场景下的校验设计”“人机交互的流程闭环”** 等编程思维,对理解 “业务需求转代码实现” 有很高的学习价值,也适合作为 “小功能开发剖析” 的博客素材,从代码细节延展到编程思路、设计哲学,丰富博客内容~

http://www.dtcms.com/a/325373.html

相关文章:

  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘lightgbm’问题
  • yolo目标检测技术之yolo1到yolo5(二)
  • Profile.vue组件详细解析
  • 缓存的三大问题分析与解决
  • 【运维进阶】WEB 服务器
  • Linux epoll:高并发网络编程的终极武器
  • Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin
  • 自动化UI测试工具TestComplete的多语言引擎与内置实践
  • LabVIEW声波测井信号处理系统
  • 【前沿技术动态】【AI总结】时隔六年!OpenAI 8 月 5 日「开放权重」回归,GPT-OSS 双模型能否重塑开源格局?
  • 小项目方的“活跃术”:市值管理 + 批量交易 + 新地址买入指南
  • [4.2-1] NCCL新版本的register如何实现的?
  • ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库
  • 【JavaEE】(12) 创建一个 Sring Boot 项目
  • 如何在直播APP中集成美颜SDK?美白滤镜功能开发全流程解析
  • Python笔记之`getattr`和`hasattr`用法详解
  • Vibe Coding 自然语言驱动 AI 编程方式
  • 5G NR NTN 在 PHY 层和 MAC 层实现 OAI
  • 第9节 大模型分布式推理核心挑战与解决方案
  • 代码管理工具——Git基本使用方法
  • 架构设计(15):AI时代的架构设计
  • 系统编程——信号通信
  • MySQL-日志
  • 第10节 大模型分布式推理典型场景实战与架构设计
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的多目标跟踪与行为分析优化(393)
  • 低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?
  • Docker-08.Docker基础-本地目录挂载
  • Camera open failed
  • Flutter SharedPreferences存储数据基本使用
  • Apollo平台下相机和激光雷达手眼联合标定