【Java基础】06 专题课:编程案例思维训练
目的:复习前半段课程学习的Java编程知识,能够使用所学的知识解决问题,提升同学们的编程能力。
涉及到的知识点
- 变量、数组
- 运算符:基本运算符、关系运算符、逻辑运算符…
- 程序流程控制:if、switch;for、while;死循环、循环嵌套
- 跳转关键字:break、continue、return。
- 方法
- …
编程思维:使用所学的Java技术解决问题的思维方式和编写代码实现出来的能力。
关于提升编程思维和编程能力的建议
- 编程思维和编程能力不是一朝一夕形成的,需要时间的沉淀和大量练习。
- 前期:先模仿,后期:再创新。
- 具体措施:勤于练习代码,勤于思考,孰能生巧。
案例一:买飞机票
需求:
- 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
- 机票最终优惠价格的计算方案如下:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。
分析:
- 键盘录入机票的原价,仓位类型,月份信息,调用方法返回机票最终的优惠价格。
- 方法内部应该先使用if分支判断月份是是旺季还是淡季,然后使用switch分支判断是头等舱还是经济舱。
- 选择对应的折扣进行计算并返回计算的结果,如果信息录入有误返回价位为-1元代表即可。
1 | package test; |
遇到判断值匹配的时一般选择什么结构实现?
使用switch分支结构实现。遇到判断区间范围的时候一般选择什么结构实现?
使用if分支结构实现。
案例二:找素数
- 需求:判断101到200之间有多少个素数,并输出所有素数。
- 说明:除了1和它本身以外,不能被其他正整数整除,就叫素数。
- 分析:101-200之间的数据可以采用循环依次拿到; 每拿到一个数,判断该数是否是素数。
- 判断规则是:从2开始遍历到该数的一半的数据,看是否有数据可以整除它,有则不是素数,没有则是素数。
- 如果最终判定是素数,即可输出展示。
1 | package test; |
- 本次案例中是如何确定出该数是素数的,具体如何实现?
- 定义了flag标记位
- 遍历2到该数的一半的数据去判断是否有整除的数据,有则改变falg标记位的状态。
- 最终通过flag的状态判断是否是素数。
案例三:开发验证码
- 需求:定义方法实现随机产生一个指定位数的验证码,每位可能是数字、大写、小写字母
- 分析:
- 定义一个方法,生成验证码返回:返回值类型是String,需要形参接收位数。
- 在方法内部使用for循环依次生成每位随机字符,并连接起来。
- 把连接好的随机字符作为一组验证码返回。
1 | package test; |
其中字符池的另一种添加方法可以是:
1 | package hnn; |
- 随机验证码的核心实现逻辑是如何进行的?
- 定义一个String类型的变量存储验证码字符。
- 定义一个for循环,循环5次。
- 随机生成0|1|2的数据,依次代表当前位置要生成数字|大写字母|小写字母。
- 把0、1、2交给switch生成对应类型的随机字符,把字符交给String变量。
- 循环结束后,返回String类型的变量即是所求的验证码结果。
案例四:数组元素的复制
- 需求:把一个数组中的元素复制到另一个新数组中去。
- 分析:
- 需要动态初始化一个数组,长度与原数组一样。
- 遍历原数组的每个元素,依次赋值给新数组。
- 输出两个数组的内容。
1 | package test; |
抽离成方法:
1 | package test; |
- 数组的拷贝是什么意思?
需要创建新数组,把原来数组的元素赋值过来。(地址是不同的)
案例五:评委打分
- 需求:在唱歌比赛中,有6名评委给选手打分,分数范围是[0 - 100]之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。
- 分析:
- 把6个评委的分数录入到程序中去 —-> 使用数组
- 遍历数组中每个数据,进行累加求和,并找出最高分、最低分。
- 按照分数的计算规则算出平均分。
1 | package test; |
- 如何实现评委打分案例?
- 定义一个动态初始化的数组用于存储分数数据。
- 定义三个变量用于保存最大值、最小值和总和。
- 遍历数组中的每个元素,依次进行统计。
- 遍历结束后按照规则计算出结果即可。
案例六:数字加密
- 需求:
- 某系统的数字密码:比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5 , 再对10求余,最后将所有数字反转,得到一串新数。
- 将每位数据存入到数组中去,遍历数组每位数据按照「规则」进行更改,把更改后的数据从新存入到数组中。
- 将数组的前后元素进行交换(反转),数组中的最终元素就是加密后的结果。
加密过程:
1 | package test; |
录入密码并加密:
1 | package test; |
- 本次案例中是如何完成数组元素的反转的?
- 定义2个变量分别占数组的首尾位置。
- 一个变量往前走,一个变量往后走,同步交换双方位置处的值。
案例拓展:数字解密(选做)
1 | package test; |
案例七:模拟双色球(拓展)
业务分析、随机生成一组中奖号码
投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色球号码从1-16中选择。
随机一组中奖号码的分析:
- 中奖号码由6个红球和1个蓝球组成(注意:6个红球要求不能重复)。
- 可以定义方法用于返回一组中奖号码(7个数据),返回的形式是一个整型数组
1 | package test; |
- 本次案例中是如何去保证随机的6个中奖的红球号码不重复的?
- 每次随机一个红球号码后去数组中判断是否存在。
- 存在需要重新随机一个数字直到不重复为止。
用户输入一组双色球号码
- 用户输入一组双色球号码分析:
- 定义一个方法,该方法可以录入用户输入的6个红球和1个篮球号码
- 该方法最终需要返回一个数组,数组中就是用户录入的号码(7位)。
1 | package test; |
判断中奖情况
- 中奖情况判断的分析:
- 定义一个方法,可以接收中奖号码的数组,用户选号的数组。
- 根据命中红球数和蓝球数判断最终的中奖情况并输出详情和中奖金额。
1 | package test; |
- 本次案例中是如何去统计红球的命中数量的?
- 遍历用户的每个选号,然后遍历中奖号码的数组。
- 看当前选号是否在中奖号码中存在,存在则命中数量加1。
【参考内容】:
- java判断字符串是否相等的方法(
==
或equals方法
) - 报错:
ArrayIndexOutOfBoundsException
数组下标越界异常 - 警告:
String concatenation '+=' in loop
- 被
private static
修饰的属性仅仅可以被静态方法调用,但是只能被本类中的方法(可以是非静态的)调用,在外部创建这个类的对象或者直接使用这个类访问都是非法的。被public static
修饰的属性除了可以被静态方法和非静态调用之外,还可以直接被类名和外部创建的对象调用。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 百里飞洋!
若存在错误或不当之处,还望兄台不吝赐教,期待与您交流!
评论