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;}}
}

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

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

相关文章

大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…

某度sign参数逆向

文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 分析 经过我们几次抓包&#xff0c;测试&#xf…

解决jupyter打开的默认路径问题

已经安装完anaconda&#xff0c;但是jupyter每一次打开的路径都不是自己想要的路径&#xff0c;可以在配置文件中修改jupyter打开的默认路径&#xff0c;具体步骤如下&#xff1a; 首先打开anaconda的命令行 如果有多个环境的&#xff0c;需要输入conda activate 环境名称以下命…

list容器排序案例

案例描述:将Perspn自定义数据类型进行排序&#xff0c;Person中属性有姓名、年龄、身高 排序规则:按照年龄进行升序&#xff0c;如果年龄相同按照身高进行降序 代码示例 #include <iostream> #include <string.h> #include <iterator> #include <vector…

【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】

文章目录 12.虚函数与多态举例&#xff1a;委托 继承【观察者模式】13.委托相关设计Composite 组合模式Prototype 原型模式 12.虚函数与多态 纯虚函数 一定要 子类重新定义的 继承和复合 关系下的构造和析构 举例&#xff1a;委托 继承【观察者模式】 13.委托相关设计 问题…

云原生安全性:保护现代应用免受威胁

文章目录 引言云原生安全性的挑战云原生安全性的关键实践1. 安全的镜像构建2. 网络策略3. 漏洞扫描和漏洞管理4. 认证和授权5. 日志和监控 云原生安全工具结论 &#x1f389;欢迎来到云计算技术应用专栏~云原生安全性&#xff1a;保护现代应用免受威胁 ☆* o(≧▽≦)o *☆嗨~我…

科目二倒车入库

调整座位和后视镜 离合踩到底大腿小腿成130-140 上半身90-100 座椅高度能看到前方全部情况 后视镜调节到能看到后门把手&#xff0c;且后门把手刚好在后视镜上方边缘、离车1/3处。 保持直线&#xff1a; 前进&#xff1a; 车仪表盘中央的原点和地面上的黄线擦边&#xff…

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…

PyTorch深度学习实战(17)——多任务学习

PyTorch深度学习实战&#xff08;17&#xff09;——多任务学习 0. 前言1. 多任务学习1.1 多任务学习基本概念1.2 多任务学习优势 2. 模型与数据集分析2.1 模型分析2.2 数据集介绍 3. 实现年龄估计和性别分类小结系列链接 0. 前言 多任务学习( Multi-Task Learning, MTL )是一…

双向控制舵机(树莓派版)

文章目录 前言1、舵机参数2、功能测试参考文献 前言 为了实现垃圾分类和倾倒功能&#xff0c;于是购买了180度舵机 避坑提示&#xff1a;360度舵机无法像180度舵机一样控制角度&#xff0c;它只能控制旋转方向和速度&#xff0c;所以别买360度的舵机。 1、舵机参数 我买的舵机…

194、SpringBoot -- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问“h…

gym_unity学习笔记

最近学了一段时间gym_unity&#xff0c;把一些资料留在这里 实例 实例gym_unity训练RollerBall&#xff1a;https://blog.csdn.net/alibutter/article/details/120908687实例gyn_unity训练3DBall&#xff1a;https://zhuanlan.zhihu.com/p/554927641?utm_id0 源码&#xff1…

基于香橙派和SU-03T 使用Linux实现语音控制刷抖音

硬件介绍 SU-03T之前在小车的时候使用过&#xff0c;详见&#xff1a;语音小车---6 最终整合_mjmmm的博客-CSDN博客 按照下图进行接线&#xff1a; 项目需求 通过语音指令来控制安卓手机刷抖音&#xff0c;可以实现视频切换和点赞等功能&#xff1a; 1. 开机播报“你好&a…

Go 并发可视化解释 - sync.Mute

在学习 Go 编程语言时&#xff0c;您可能会遇到这句著名的格言&#xff1a;“不要通过共享内存来进行通信&#xff1b;相反&#xff0c;通过通信来共享内存。” 这句话构成了 Go 强大并发模型的基础&#xff0c;其中通道&#xff08;channels&#xff09;作为协程之间的主要通信…

6条优势,anzo capital昂首资本相信MT5替代MT4的原因

投资者都知道MT5是在MT4基础上升级换代的多资产平台&#xff0c;MT5于2010年6月首次发布。anzo capital昂首资本认为MT5将完全取代MT4&#xff0c;就像MT4取代之前版本一样&#xff0c;因为有以下6条优势&#xff1a; 一.市场深度(DOM)数据。在MT4中&#xff0c;DOM几乎没有用…

什么是生成对抗网络 (GAN)?

什么是生成对抗网络 &#xff08;GAN&#xff09;&#xff1f; 钦吉兹赛义德贝利 一、说明 GAN&#xff08;Generative Adversarial Network&#xff09;网络是一种深度学习模型&#xff0c;由两个神经网络——生成器和判别器组成。生成器负责生成虚假的数据&#xff0c;而判别…

yarn安装依赖时报错 error An unexpected error occurred:

一切起因是因为前一天安装了volta管理node&#xff0c;第二天启动项目&#xff0c; 显示error An unexpected error occurred: “https://registry.npmmirror.com/webpack-aliyun-oss/-/webpack-aliyun-oss-0.2.6.tgz: Request failed “404 Not Found””. 项目启动时发现报错…

【WSN】基于蚁群算法的WSN路由协议(最短路径)消耗节点能量研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【虚拟化】虚拟机vcpu绑核物理机

文章目录 一、NUMA二、虚拟机xml配置解析 参考文章 第一篇&#xff1a;KVM虚拟化CPU技术总结 第二篇&#xff1a;虚机cpu和mem的配置&#xff08;cputune和numatune&#xff09; 第三篇&#xff1a;libvirt 中cpu, numa 的配置 第四篇&#xff1a;如何提高虚拟机性能&#xff1…

安全学习_开发相关_JavaEE过滤器监听器简单了解

文章目录 Web应用运行流程图 JavaEE-过滤器-Filter过滤器概述&作用过滤器相关安全测试场景 JavaEE-监听器-Listener监听器作用&#xff1a;监听器相关安全测试场景 过滤器和监听器&#xff0c;主要对安全测试有影响的是过滤器&#xff0c;监听器只是在对代码进行逻辑分析时…