Java实验案例(一)
目录
案例一:买飞机票
案例二:开发验证码
案例三:评委打分
案例四:数字加密
案例五:数组拷贝
案例六:抢红包
案例七:找素数的三种方法
案例八:打印乘法口诀表
案例九:打印三角形
案例十:模拟双色球
案例一:买飞机票
我的思考:
用 if 语句分割开淡旺季,再分别在淡旺季中区分两种舱的价格。
我的初步代码:
逻辑非常简单,没有问题,但是感觉代码写的冗余不清晰,明明非常简单的几步感觉被复杂化了,所以写代码必须简洁明了,简单易懂。
尤其时main函数主体内的代码要少,几行之内搞定是最好的,可以将繁冗的代码封装成方法,减少main函数中的代码:
案例二:开发验证码
我的思考:
首先,生成的验证码位数是需要我们输入确定的。每一位可以用一个字符表示(数字就是数字字符 '0' ~ '9'),可以用随机数确定每一位是数字字符还是大小写字母。
每一位可以通过字符串拼接的方式 ' + ' 来实现单个字符变成字符串。
数字字符容易用随机数生成,大小写字母其实就是ASCLL码,也可以通过随机数生成。
我的代码:
案例三:评委打分
案例四:数字加密
我的思考:
首先输入的是字符串,在字符串中改变每一位数字并不方便,于是我设置了一个字符数组接收字符串,对每一位的数字进行算术运算字符并不好处理,于是我设置了一个整型临时变量,循环地处理每一位的算术运算,再将算好的整型数字转化成字符放到字符数组中去。返回数组的地址,在main函数中用一个字符串接收,最后打印出来。
我的代码:
public class test_01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入原始密码:");String ori_code = sc.next();String codes = new String(encryption(ori_code));System.out.println("加密后的密码是:" + codes);}public static char[] encryption(String ori_code){assert(ori_code != null);char[] code = new char[ori_code.length()];for (int i = 0; i < code.length; i++) {int temp = 0;temp = ori_code.charAt(i)-'0';temp += 5;temp %= 10;code[i] = (char)(temp+'0');}for(int i = 0,j = ori_code.length()-1;i < j;i++,j--){char tmp = code[i];code[i] = code[j];code[j] = tmp;}return code;}
}
案例五:数组拷贝
我的思考:
复制一个内容一样的数组很容易,关键在于这题需要的是一模一样的数组,那也就是说连地址都相同,所以需要把旧数组的地址赋给新数组。
我的代码:
public class test_01 {public static void main(String[] args) {int[] arr = {11,22,33};System.out.println(Arrays.toString(copy(arr)));}public static int[] copy(int[] arr){int[] copy_arr = new int[arr.length];copy_arr = arr;for (int i = 0; i < arr.length; i++) {copy_arr[i] = arr[i];}System.out.println(copy_arr);System.out.println(arr);return copy_arr;}
}
案例六:抢红包
我的思考:
一共有五个数据,可以存放在整型数组中,用switch语句分别处理每种抽到的情况,用随机数控制switch语句的执行。
关键在于每个数只能抽到一次,可以在循环中处理重复情况。(我没想到简便的处理方法,就是很僵硬地设置了5个计数器分别对应5种抽奖结果,抽到过地break)
我的代码:
public class test_01 {public static void main(String[] args) {int[] arr = {9,666,188,520,99999};extractRedEnvelopes(arr);}public static void extractRedEnvelopes(int[] arr){System.out.println("有五个红包,分别是9,666,188,520,99999的");System.out.println("现在开始直播抽取红包");Random r = new Random();int count1 = 0,count2 = 0,count3 = 0,count4 = 0,count5 = 0;while(count1 + count2 + count3 + count4 + count5 != 5){System.out.println("请按任意键开始抽奖");Scanner sc = new Scanner(System.in);String s = sc.next();if (s.equals("1")) {int random = r.nextInt(5); //0~4switch (random) {case 0:if (count1 == 1){System.out.println("很抱歉,你没抽到");break;}System.out.println("恭喜你,你抽到了," + 6);count1++;break;case 1:if (count2 == 1){System.out.println("很抱歉,你没抽到");break;}System.out.println("恭喜你,你抽到了," + 188);count2++;break;case 2:if (count3 == 1){System.out.println("很抱歉,你没抽到");break;}System.out.println("恭喜你,你抽到了," + 666);count3++;break;case 3:if (count4 == 1){System.out.println("很抱歉,你没抽到");break;}System.out.println("恭喜你,你抽到了," + 520);count4++;break;case 4:if (count5 == 1){System.out.println("很抱歉,你没抽到");break;}System.out.println("恭喜你,你抽到了," + 99999);count5++;break;default:System.out.println("出错了,请重试");break;}} else {System.out.println("请输入正确的键以开始抽奖");return;}}}
}
可以看到代码十分冗余繁杂,来看看老师是怎么实现的:
下面有两种方案,方案一和上面类似,都存在效率低下,可能多次重复寻找的问题。
方案一:
数组中每个位置的值代表红包金额,取的时候看该位置值是否为0,是0则继续循环寻找;不是0则取该数并将该位置的值置为0.
代码:
public class test_01 {public static void main(String[] args) {int[] arr = {9,666,188,520,99999};extractRedEnvelopes(arr);}public static void extractRedEnvelopes(int[] arr){System.out.println("有五个红包,分别是9,666,188,520,99999的");System.out.println("现在开始直播抽取红包");for (int i = 0; i < arr.length; i++) {System.out.println("输入任意内容开始抢红包");Scanner sc = new Scanner(System.in);sc.next();while (true){Random r = new Random();int money = r.nextInt(arr.length);if(arr[money] != 0){System.out.println("恭喜你,你抢到了"+arr[money]);arr[money] = 0;break;}else{System.out.println("抱歉,你没抢到");}}}}
}
方案二:
可以将初始红包的顺序打乱,也就是将数组中的数据顺序打乱,然后根据先来后到分配给抢红包的用户,这样有多少个红包就是分发多少次,不会出现重复查找效率低下的情况。
那么关键就在于打乱数组数据,可以依次遍历数组元素,根据随机索引调换数据位置,以达到打乱数据的效果。
代码:
public class test_01 {public static void main(String[] args) {extractRedEnvelopes();}public static void extractRedEnvelopes(){System.out.println("有五个红包,分别是9,666,188,520,99999的");System.out.println("现在开始直播抽取红包");System.out.println("输入任意内容开始抽取");int[] arr = {9,666,188,520,99999};disruptingData (arr); //打乱数组数据Scanner sc = new Scanner(System.in);sc.next();for (int i = 0; i < arr.length; i++) {System.out.println("恭喜"+(i+1)+"号观众,"+"你抽到了"+arr[i]);}}public static void disruptingData(int[] arr){Random r = new Random();for (int i = 0; i < arr.length; i++) {int ran = r.nextInt(arr.length);int tmp = arr[i];arr[i] = arr[ran];arr[ran] = tmp;}}
}
案例七:找素数的三种方法
我的思考:
素数是除了1和自己本身,其他数都不能整除的数。那么就依次遍历101~200的每个数,用2~ (i-1)的数去尝试能否被整除,不能就是素数。
我的代码:
public class test_01 {public static void main(String[] args) {findingPrimeNumbers();}public static void findingPrimeNumbers(){int[] arr = new int[100];int k = 0;for (int i = 101; i < 200; i++) {int flag = 1;for(int j = 2; j < i-1; j++){if(i % j == 0) {flag = 0;break;}}if(flag == 1) arr[k++] = i;}System.out.println(Arrays.toString(arr));}
}
这段代码效率低,因为进行了多余操作,其实不用将 2~ (i-1)的数都试一遍的,只需要一半的数字足矣。
下面来看一下老师的代码:
public class test_01 {public static void main(String[] args) {System.out.println("请输入要查找的素数范围:");Scanner sc = new Scanner(System.in);int start = sc.nextInt();int end = sc.nextInt();int count = findingPrimeNumbers(start,end);System.out.println("素数的个数为" + count);}public static int findingPrimeNumbers(int start,int end) {assert (start > 0 && end > 0 && start < end);int count = 0;for (int i = start; i <= end; i++) {boolean flag = true;for (int j = 2; j < i / 2; j++) {if (i % j == 0) {flag = false;break;}}if (flag == true) {System.out.println("素数有" + i + " ");count++;}}return count;}
}
方案三
public class test_01 {public static void main(String[] args) {System.out.println("请输入要查找的素数范围:");Scanner sc = new Scanner(System.in);int start = sc.nextInt();int end = sc.nextInt();for(int i = start;i <= end; i++){if(findingPrimeNumbers(i)) System.out.println(i+"是素数");}}public static boolean findingPrimeNumbers(int num) {for(int i = 2;i < num/2; i++){if(num % i == 0) return false;}return true;}
这种方案就是先建立一个判断是否为素数的方法,来一个数就放到该方法中判断,更加方便,也更贴近工作中编程的思想。
案例八:打印乘法口诀表
我的思考:
主要是注意一个格式,内层循环外层循环的嵌套。外层行,内层列。
我的代码:
public class test_01 {public static void main(String[] args) {for(int i = 1;i <= 9;i++){for(int j = 1;j <= i;j++){System.out.print(j+" * "+i+" = "+i*j+" ");}System.out.println();}}
}
案例九:打印三角形
我的思考:
第一行:3空格+ 1星
第二行:2空格+3星
第三行:1空格+5星
第四行:0空格+7星
我的代码:
public class test_01 {public static void main(String[] args) {for(int i = 1;i <= 4;i++){for(int j = 1;j <= (4-i);j++){System.out.print(" ");}for (int j = i; j <= (2*i-1) ; j++) {System.out.print("*");}System.out.println();}}
}
案例十:模拟双色球
我的思考:
如上图所示,三色球的实现需要三个方法:用户投注号码,中奖标准号码,判断中几等奖。
可以将投注号码和中奖号码存在数组中返回,最终比较投注号码和中奖号码以判断中奖情况。
我的代码:
第一次理解错了,以为是每一等中奖号码要手动输入,麻烦了很多。
public class test_01 {public static void main(String[] args) {int[] userNumbers = userSelectNumbers();String[] luckNumbers = creatLuckNumbers();judge(userNumbers,luckNumbers);}public static int[] userSelectNumbers(){int[] userNumbers = new int[7];System.out.println("请输入你的投注号码,前6位1~33,最后一位1~16");Scanner sc = new Scanner(System.in);for (int i = 0; i < userNumbers.length; i++) {userNumbers[i] = sc.nextInt();assert(userNumbers[i] > 0 && userNumbers[i] < 34);assert (userNumbers[6] > 0 && userNumbers[6] < 17);}return userNumbers;}public static String[] creatLuckNumbers(){String[] luckNumbers = new String[9];int[] eachNumbers = new int[7];for (int k = 0; k < luckNumbers.length; k++) {System.out.println("请输入第"+(k+1)+"级中奖号码:");Scanner sc = new Scanner(System.in);for (int i = 0; i < eachNumbers.length; i++) {eachNumbers[i] = sc.nextInt();assert(eachNumbers[i] > 0 && eachNumbers[i] < 34);assert (eachNumbers[8] > 0 && eachNumbers[8] < 17);}luckNumbers[k] = Arrays.toString(eachNumbers);System.out.println((k+1)+"级中奖号码是:"+ Arrays.toString(eachNumbers));}return luckNumbers;}public static void judge(int[] userNumbers,String[] luckNumbers){for(int i = 0;i < luckNumbers.length;i++){if(Arrays.toString(userNumbers).equals(luckNumbers[i])){switch (i){case 0:System.out.println("恭喜你,中了一等奖");break;case 1:System.out.println("恭喜你,中了二等奖");break;case 2,3:System.out.println("恭喜你,中了三等奖");break;case 4,5:System.out.println("恭喜你,中了四等奖");break;case 6,7:System.out.println("恭喜你,中了五等奖");break;case 8,9:System.out.println("恭喜你,中了六等奖");break;}}else System.out.println("很抱歉,你没中奖。");}}
}
改正:
public class test_01 {public static void main(String[] args) {int[] userNumbers = userSelectNumbers();int[] luckNumbers = creatLuckNumbers();judge(userNumbers,luckNumbers);}public static int[] userSelectNumbers(){int[] userNumbers = new int[7];System.out.println("请输入你的投注号码,前6位1~33,最后一位1~16");Scanner sc = new Scanner(System.in);for (int i = 0; i < userNumbers.length; i++) {userNumbers[i] = sc.nextInt();if(userNumbers[i] < 1 || userNumbers[i] > 33) {System.out.println("请输入合法的号码");System.exit(-1);}for(int j = 0;j < i;j++){if(userNumbers[j] == userNumbers[i]) {System.out.println("请勿输入同样的号码!");break;}}}if(userNumbers[6] < 1 || userNumbers[6] > 16) {System.out.println("请输入合法的号码");System.exit(-1);}return userNumbers;}public static int[] creatLuckNumbers(){int[] luckNumbers = new int[7];System.out.println("请输入中奖号码,前6位1~33,最后一位1~16");Scanner sc = new Scanner(System.in);for (int i = 0; i < luckNumbers.length; i++) {luckNumbers[i] = sc.nextInt();if(luckNumbers[i] < 1 || luckNumbers[i] > 33){System.out.println("请输入合法的号码");System.exit(-1);}for(int j = 0;j < i;j++) {if (luckNumbers[j] == luckNumbers[i]) {System.out.println("请勿输入同样的号码!");break;}}}if(luckNumbers[6] < 1 || luckNumbers[6] > 16) {System.out.println("请输入合法的号码");System.exit(-1);}return luckNumbers;}public static void judge(int[] userNumbers,int[] luckNumbers){int count = 6, flag = 1;for (int i = 0; i < userNumbers.length-1; i++) {if(userNumbers[i] != luckNumbers[i]) count--;}if(userNumbers[6] != luckNumbers[6]) flag = 0;switch(count){case 0,1:if(flag == 1) System.out.println("恭喜,你中了六等奖");else System.out.println("很抱歉,你没有中奖");break;case 2,3:if(flag == 1) System.out.println("恭喜,你中了五等奖");else System.out.println("很抱歉,你没有中奖");break;case 4:if(flag == 1) System.out.println("恭喜,你中了四等奖");else System.out.println("恭喜,你中了五等奖");break;case 5:if(flag == 1) System.out.println("恭喜,你中了三等奖");else System.out.println("恭喜,你中了四等奖");break;case 6:if(flag == 1) System.out.println("恭喜,你中了一等奖");else System.out.println("恭喜,你中了二等奖");break;default:System.out.println("error");break;}}
}
相关文章:

Java实验案例(一)
目录 案例一:买飞机票 案例二:开发验证码 案例三:评委打分 案例四:数字加密 案例五:数组拷贝 案例六:抢红包 案例七:找素数的三种方法 案例八:打印乘法口诀表 案例九&#x…...

Service Worker原理
Service Worker原理 1.基本概念与使用场景:a.什么是Service Worker?它的主要用途是什么?b.Service Worker和Web Worker有什么不同?c.预缓存和缓存的区别 2. 实现细节:a.描述Service Worker的生命周期。b.如何注册和注销一个Service Worker&am…...

MySQL集群高可用架构之MHA
MHA 一、MHA概述1.1 为什么要用MHA?1.2 什么是 MHA?1.3 MHA 的组成1.4 MHA 的特点1.5 故障切换备选主库的算法1.5 MHA工作原理 二、MySQL MHA高可用实例2.1 架构搭建部分1)所有节点服务器安装MySQL2)主从节点服务器添加域名映射3&…...

【算法专题突破】二分查找 - 704. 二分查找(16)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:704. 二分查找 - 力扣(LeetCode) 题目非常简单,就是查找一个 target。 2. 算法原理 根据最基本的二分查找算法: 在一个…...

基于Docker_Nginx+LVS+Flask+MySQL的高可用Web集群
一.项目介绍 1.拓扑图 2.详细介绍 项目名称:基于Docker_NginxLVSFlaskMySQL的高可用Web集群 项目环境:centos7.9,docker24.0.5,mysql5.7.30,nginx1.25.2,mysqlrouter8.0.21,keepalived 1.3.5,…...

如何写一份出色的毕业设计任务书
title: 如何写一份出色的毕业设计任务书 date: 2023-09-20 毕业设计任务书是每个毕业生必须面对的关键文档。它不仅是你完成毕业设计的路线图,还是导师评估你工作的依据。因此,撰写一份清晰、详细且具体的任务书至关重要。本文将向你介绍如何编写一份出色…...

RedHat 服务器安装NGINX
参照官方文档:nginx: Linux packages 按顺序操作: 安装前提: sudo yum install yum-utils 设置yum仓库(执行命令的时候会自动新建文件): sudo vi /etc/yum.repos.d/nginx.repo 粘贴下面的内容保存退出…...

跨域问题解决方案(三种)
Same Origin Policy同源策略(SOP) 具有相同的Origin,也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同,那么该资源就将被认为是从不同的Origin得来的,进而不被允许访问。 Cross-origin resource…...

多轨音频编辑软件Multitrack Editor mac中文版主要功能
Multitrack Editor mac是一种音频编辑软件,它可以同时处理多个音轨。它通常用于录制、编辑和混合音乐、电影、电视和广播节目等多媒体项目。 Multitrack Editor的主要功能包括录音、编辑、混音和声音效果处理。使用该软件,用户可以同时录制和编辑多个音轨…...

工作中遇到的事务
文章目录 介绍原因分析:修改代码一波三折,再次出现问题 介绍 遇到了一个很有意思的问题。 在service层加了事务。 为了防止并发,在component层加了分布式锁。 先根据前端传入的id,在数据库中使用queryA()查到一个key然后对这个key进行加锁再…...

【论文写作】Latex 所有符号汇总参考
【论文写作】Latex 所有符号汇总参考 文章目录 【论文写作】Latex 所有符号汇总参考1. 希腊字母2. 数学构造3. 分割4. 累加累成等5. 标准函数名称6. 二进制符号(关系符号)7. 箭头8. 杂项符号(其他的符号)9. 数学模式重音、音节10.…...

pom.xml中解决“vulnerable dependency maven:org.yaml:snakeyaml:1.33“警告问题
问题 当我们引入依赖的时候,pom文件会有这样的提示,其大概的意思就是 maven:org.yaml:snakeyaml:1.30"表示通过Maven引入了一个潜在的安全漏洞依赖项"org.yaml:snakeyaml:1.30" 解决办法 其实我们就是要更改这个依赖的版本,…...

栈和队列-Java
目录 一、栈 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1.5 概念区分 二、队列 2.1 概念 2.2 队列的使用 2.3 队列的模拟实现 2.4 循环队列 三、双端队列 四、面试题 一、栈 1.1 概念 栈:一种特殊的线性表,只允许在固定的一端进行插…...

ORA-07445: exception encountered: core dump [kdxlin()+4088]---惜分飞
abort方式关闭数据库,启动报错 Tue Sep 19 21:52:56 2023 NOTE: dependency between database orcl and diskgroup resource ora.DATA.dg is established Tue Sep 19 21:52:57 2023 Reconfiguration started (old inc 4, new inc 6) List of instances: 1 (myinst:…...

【C刷题】day3
一、选择题 1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( ) A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 【答案…...

go 线程限制数量 --chatGPT
问:runTask(names, limit), 遍历启动以names的子名称的工作线程 name测试打印,上限数量是limit, 要求打印所有names gpt: 你可以使用 Go 协程来实现 runTask 函数,该函数会遍历启动以 names 子名称的工作线程,并在达到上限数量 …...

【Linux网络编程】日志与守护进程
日志是网络服务器程序在后台以守护进程的形式运行时,处理情况的描述被打印到了日志文件里面,方便维护人员查看。 1.前台进程与后台进程 左边会话输入命令 sleep 10000 & 代表进程后台运行,右边会话输入命令 sleep 20000可以看到命令行解…...

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出
多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出 目录 多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出…...

Qt: 鼠标形状设置
设置全局鼠标形状 设置完毕后,整个APP的任何窗体,包括Dialog中的鼠标形状都会被修改为设定类型,某一个控件设定的鼠标形状将被替换。一般不建议使用 QCursor cursor;//创建鼠标对象 cursor.setShape(Qt::CursorShape::ClosedHandCursor);//…...

【Oracle】Oracle系列之七--表的创建与管理
文章目录 往期回顾前言1. 表的创建2. 表的修改3. 表中数据的增删改查(1)插入数据(2)删除数据(3)更新数据 4. 表的Merge5. 表的删除6. 表的重命名7. 表的索引(1)B树索引(2…...

C/C++运算符超详细讲解(系统性学习day5)
目录 前言 一、运算符的概念与分类 二、算术运算符 三、关系运算符 四、逻辑运算符 五、赋值运算符 六、运算符的优先级 总结 前言 本篇文章是对运算符的具体讲解。 一、运算符的概念与分类 概念: 运算符就是一种告诉编译器执行特定的数学或逻辑操作的符…...

Android 遍历界面所有的View
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…...

建筑能源管理(1)——建筑能源管理的概念
1、什么是建筑能源管理 目前,主要有三种不同的类型能源管理: (1)节约型能源管理 又称“减少能耗型”能源管理。这种管理方式着眼于能耗数量上的减少,采取限制用能的措施。例如,在非人流高峰时段停开部分电梯、在室外气温特别高时…...

SpringSecurity
明文存储密码,前加{noop}...

C++ vector模拟实现
目录 一.默认成员函数 二.扩容相关函数 三.[]重载 四.修改函数 五.迭代器 继上次写完string之后,可以写一个vector练练手以及熟悉其底层。vector是一个顺序表,相比普通数组不同点在于顺序表的数据必须是连续存放的。 一.默认成员函数 string是只存放字符…...

BUUCTF:[GYCTF2020]FlaskApp
Flask的网站,这里的功能是Base64编码解码,并输出 并且是存在SSTI的 /hint 提示PIN码 既然提示PIN,那应该是开启了Debug模式的,解密栏那里随便输入点什么报错看看,直接报错了,并且该Flask开启了Debug模式&am…...

好玩的调度技术
好玩的调度技术 文章目录 好玩的调度技术前言一、乱金柝-空间剥离二、拖拽编辑三、全端兼容 前言 最近感觉自己抑郁了,生态技术实在太庞大太复杂,所以我决定先停一段时间,在停下写生态的这两天写了几个调度的小玩意换换脑子,很有…...

Android 自定义加解密播放音视频(m3u8独立加密)
文章目录 背景加密流程音视频解密音视频播放结语 背景 当涉及App内部视频的时候,我们不希望被别人以抓包的形式来爬取我们的视频大视频文件以文件方式整个加密的话需要完全下载后才能进行解密当前m3u8格式虽然支持加密,但是ts格式的小视频可以独立播放的…...

常见的文件格式
一、C:\fakepath\新建文本文档.txt [object String] 实现方式: <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…...

浏览器输入url后回车展开过程
当你在浏览器中输入一个URL并敲下回车后,浏览器会执行一系列步骤来访问并展示网页。下面是浏览器访问网页的一般流程: DNS解析:浏览器首先会提取URL中的主机名,然后向DNS服务器发送请求,将主机名解析为对应的IP地址。这…...