【案例5-1】 模拟订单号生成
【案例介绍】
1.任务描述
在超市购物时,小票上都会有一个订单号,而且每个订单号都是唯一的。本例要求编写一个程序,模拟订单系统中订单号的生成。在生成订单号时,使用年月日和毫秒值组合生成唯一订单号。
例如,给定一个包括年月日以及毫秒值的数组arr={2020,0504,1101},将其拼接成字符串s:[202005041101],作为一个订单号。
2.运行结果
运行结果如图5-1所示
图5-1 模拟订单号生成运行结果图
【案例任务】
-
学会分析“模拟订单号生成”任务的实现思路。
-
根据思路独立完成“模拟订单号生成”任务的源代码编写、编译及运行。
-
掌握String类中常用方法的使用。
-
掌握之前学习的for循环、方法调用等知识。
【案例思路】
(1)分析任务描述可知,做此任务需要先定义一个数组,数组中包括年月日以及毫秒值。
(2)要实现数组转成一个字符串,首先定义一个方法实现数组拼接成字符串。参数类型为数组,返回值类型为String,可先使用String定义一个空串,然后使用字符串的操作方法在开始最后加上“[]”字符。之后在加“[]”字符中间循环遍历数组用开始定义的字符串接收。自此,我们拼接的方法完成。在方法中将数组遍历,然后把每一个得到的字符拼接成一个字符串并且返回。
(3) 在主函数入口调用刚才的方法。并定义一个字符串变量接收结果
(4) 输出结果,观察控制台的效果。
【案例实现】
模拟订单号生成系统的实现代码,如文件5-1所示。
文件5-1 example1.java
package com.itheima;
public class example1 {
public static void main(String[] args) {
// 订单的年份月份毫秒值,定义一个数组即可
int[] arr = {2019,0504,1101};
//调用方法,用一个变量接受结果
String s = arrayToString(arr);
//输出结果
System.out.println("s:" + s);
}
// 定义一个方法实现数组拼接成字符串。参数类型为数组 返回值类型为String
public static String arrayToString(int[] arr) {
String s = "";
s += "[";
for (int i = 0; i < arr.length; i++) {
if(i == arr.length-1) {
s+=arr[i];
}else {
s+= arr[i];
}
}
s += "]";
//在方法中将数组遍历,然后把每一个得到的字符拼接成一个字符串并且返回
return s;
}
}
在文件5-1中,第6行定义了一个数组arr,数组中有年月日以及毫秒值。第7行代码调用了arrayToString()方法,该方法封装将数组遍历拼接成字符串并返回的核心功能。第13行用String的初始化代码定义了一个空串,用于接收拼接成的字符串并且返回拼接成的字符串。
第15~22行代码用于遍历数组arr,每循环一次将数组中元素赋值给空串s,for循环中定义了一个i变量,用于记录循环的次数。当i的值不小于数组元素长度是循环结束。数组也全部遍历完并全部赋值给空串s。第24行用于返回拼接后的字符串。
【案例5-2】 模拟默认密码自动生成
【案例介绍】
1.任务描述
本例要求编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。
2.运行结果
运行结果如图5-2所示。
图5-2 模拟密码自动生成运行结果图
【案例任务】
-
学会分析“模拟默认密码的生成”任务的实现思路。
-
根据思路独立完成“模拟默认密码的生成”任务的源代码编写、编译及运行。
-
掌握String类及Scanner类中常用方法的使用。
-
掌握之前学习的for循环、方法调用等知识。
【案例思路】
(1) 分析任务描述可知,做此任务首先需要用Scanner类相关方法实现键盘手动输入一个字符串代表用户名。
(2) 要实现默认密码自动生成,根据任务描述可知默认密码就是手动输入用户名的反转及字符串的反转。因此需要将字符串用循环倒着遍历,用charAt()方法接收遍历的字符并赋值给空串。
(3) 在主函数入口调用刚才的方法。并定义一个字符串变量接收结果
(4) 输出结果,观察控制台的效果。
【案例实现】
模拟默认密码生成策略的实现代码,如文件5-2所示。
文件5-2 example2.java
package com.itheima;
import java.util.Scanner;
public class example2 {
public static void main(String[] args) {
//键盘输入一个字符串,用Scanner实现
Scanner sc = new Scanner(System.in);
System.out.println("请您输入用户名:");
String line = sc.nextLine();
//调用方法,用一个变量接收
String reverse = reverse(line);
//输出结果
System.out.println("恭喜"+line+"用户注册成功,您的初始密码
为:"+reverse);
}
//定义一个方法实现字符串反转
public static String reverse(String s) {
String ss = "";
//在方法中将字符串倒着遍历,然后把每一个得到的字符拼接成一个字符串并且返
回
for (int i = s.length()-1; i >=0; i--) {
ss+=s.charAt(i);
}
return ss;
}
}
在文件5-2中, 第6~8行用Scanner实现了一个从键盘输入字符串,第10行代码调用了reverse()方法,该方法实现了循环遍历字符串中的字符。并且是倒叙遍历的。然后用charAt()方法将单个字符依次返回。最后将倒过来的字符串返回。第12行代码用System类实现将结果输出到打印控制台。
【案例5-3】 模拟用户登录
【案例介绍】
1.任务描述
在使用一些APP时,通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功,否则会提示用户名或密码错误。
本例要求编写一个程序,模拟用户登录。程序要求如下:
(1) 用户名和密码正确,提示登录成功。
(2) 用户名或密码不正确,提示“用户名或密码错误”。
(3) 总共有3次登录机会,在3次内(包含三次)输入正确的用户名和密码后给出登录成功的相应提示。超过3次用户名或密码输入有误,则提示登录失败,无法再继续登录。。
在登录时,需要比较用户输入的用户名密码与已知的用户名密码是否相同,本案例可以使用Scanner类以及String类的相关方法实现比较操作。
2.运行结果
登录成功的运行结果如图5-3所示
登录失败的运行结果如图5-4所示
【案例任务】
-
学会分析“模拟用户登录”任务的实现思路。
-
根据思路独立完成“模拟用户登录”任务的源代码编写、编译及运行。
-
掌握String类及Scanner类中常用方法的使用。
-
掌握之前学习的if判断知识。
【案例思路】
(1) 分析任务描述可知,已知用户名密码,定义两个字符串表示即可。
(2) 键盘录入要登录的用户名密码。用Scanner实现。
(3) 拿键盘录入的用户名密码和已知的用户名密码进行比较,给出相应的提示,字符串内容比较用equles实现。
(4) 循环实现多次机会。这里次数明确,用for循环实现。并在登录成功的时候。用break结束循环。
【案例实现】
模拟用户登录的实现代码,如文件5-3所示。
文件5-3 example3.java
package com.itheima;
import java.util.Scanner;
public class example3 {
public static void main(String[] args) {
//已知用户名密码,定义两个字符串表示即可。
String username = "itheima";
String password = "czbk";
for (int i = 0; i < 3; i++) {
// 键盘录入要登录的用户名密码。用Scanner实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String uname = sc.nextLine();
System.out.println("请输入用户密码:");
String pwd = sc.nextLine();
//拿键盘录入的用户名密码和已知的用户名密码进行比较,给出相应的提示,字符
串内容比较用equles实现。
if(uname.equals(username)&&pwd.equals(password)) {
System.out.println("登录成功!");
break;
}else {
if(2-i == 0) {
System.out.println("你的账户被锁定了,请联系管理员!!");
}else {
//2,1,0
System.out.println("登录失败,还有"+(2-i)+"次机会");
}
}
}
}
}
在文件5-3中,第6行和第7行分别定义字符串表示已知的用户名与用户密码,第8行代码用for循环来控制用户名与密码输入错误的次数,第10~14
行代码用Scanner类中的方法实现键盘录入用户名密码。
第17~26行代码表示拿键盘输入的用户名与用户密码与已知的用户名与用户密码进行比较。其中比较字符串内容用equals()方法,如果内容相同,则用break跳出for循环。如果内容不相同,则提示登录失败以及还有几次机会。
【案例5-4】 字符串转换为二进制
【案例介绍】
1.任务描述
本例要求编写一个程序,从键盘录入一个字符串,将字符串转换为二进制数。在转换时,将字符串中的每个字符单独转换为一个二进制数,将所有二进制数连接起来进行输出。
案例在实现时,要求使用Math类、String类以及Scanner等常见Java API的常用方法。
2.运行结果
字符串转换为二进制的运行结果如图5-1所示
【案例任务】
-
学会分析“十进制转化成二进制”任务的实现思路。
-
根据思路独立完成“十进制转化成二进制”任务的源代码编写、编译及运行。
-
掌握String类、Math类及Scanner类中常用方法的使用。
-
掌握之前学习的双重for循环以及数组的相关知识。
【案例思路】
(1) 分析任务描述可知,键盘录入要转化的字符串。用Scanner实现。
(2)定义一个二维数组。其中4代表每一行长度。ss.length()根据键盘录入的字符串表示有多少行。
(3)利用for循环遍历字符串,遍历后用String的charAt()方法获取每个字符并转化成int。char与int进行运算,char的数值要减去 48,因为ASCII码中0的值是48,1就是49。
(4)转化成int后再用for循环获取每一个int类型的数进行转化成二进制赋值给数组。其中Math.pow()方法是Math类中求幂的方法。
(5)最后用双重for循环遍历二维数组。将结果输出到控制台。
【案例实现】
模拟用户登录的实现代码,如文件5-1所示。
文件5-1 example4.java
package com.itheima;
import java.util.Scanner;
public class example4 {
public static void main(String[] args) {
//键盘录入要转化的字符串。用Scanner实现。
Scanner sc = new Scanner(System.in);
System.out.println("请输入要转换的字符串:");
String ss = sc.nextLine();
//定义一个二维数组。其中4代表每一行长度。ss.length()根据键盘录入的字
符串表示有多少行。
int [][] arr = new int[ss.length()][4];
//利用for循环遍历字符串,遍历后用String的charAt()方法获取每个字符并
转化成int。char与int进行运算,char的数值要减去 48,因为ASCII码中0
的值是48,1就是49。
for (int i = 0; i < ss.length(); i++) {
int charss = (int) ss.charAt(i)-48;
for (int j = 0; j < 4; j++) {
//转化成int后再用for循环获取每一个int类型的数进行转化成二进
制赋值给数组。其中Math.pow()方法是Math类中求幂的方法。
arr[i][j] = (int)((charss/Math.pow(2, 3-j))%2);
}
}
// 最后用双重for循环遍历二维数组。将结果输出到控制台。
System.out.println("二进制的数是:");
// 最后用双重for循环遍历二维数组。将结果输出到控制台。
for (int i = 0; i < ss.length(); i++) {
for (int j = 0; j < 4; j++) {
System.out.print(arr[i][j]);
}
}
}
}
在文件5-1中,第6~8
行代码表示键盘输入要转化的字符串。第11行代码定义了一个二维数组用于接收转化后的二进制数。其中4表示每一行的长度。
ss.length()根据键盘录入的字符串决定由多少行。第16~23
行代码表示将字符串转化成二进制的数并且存入二维数组中。第27~29行代码表示遍历二维数组并输出结果到控制台。
【案例5-5】 二月天
【案例介绍】
1.任务描述
二月是一个有趣的月份,平年的二月有28天,闰年的二月有29天。闰年每四年一次,在判断闰年时,可以使用年份除以4,如果能够整除,则该年是闰年。
本例要求编写一个程序,从键盘输入年份,根据输入的年份计算这一年的2月有多少天。在计算二月份天数时,可以使用日期时间类的相关方法实现。
2.运行结果
二月天的运行结果如图5-1所示
【案例任务】
-
学会分析“二月天”任务的实现思路。
-
根据思路独立完成“二月天”任务的源代码编写、编译及运行。
-
掌握在程序中使用日期类的使用。
-
掌握Scanner类中键盘输入的使用。
【案例思路】
(1)分析任务描述可知,要实现此功能,首先程序要用键盘录入一个年份。可以使用Scanner类实现
(2)设置日历对象的年、月、日。
年:来自于键盘的输入;
月:设置为3月,因为我们需要计算2月的天数,可以通过3月1号推前一天就是2月的最后一天;
日:设置为1天。
(3)获取2月的天数并输出,将结果打印到控制台。
【案例实现】
二月天的实现代码,如文件5-1所示。
文件5-1 example5.java
import java.time.LocalDate;
import java.util.Scanner;
public class example5 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入需要判断的年份:");
int year=sc.nextInt();
//实例化出需要判断年份的3月1日
LocalDate of =LocalDate.of(year,3,1);
//将3月1日减去一天得到2月的最后一天日期
LocalDate newof = of.minusDays(1);
System.out.println(year+"年的2月有"+newof.getDayOfMonth()+"天");
}
}
在文件5-1中,第5~6行代码用于获取键盘输入的数字。第9行代码用于设置日期的对象年、月、日。第11行代码用于计算二月的天数。3月1日往前推一天,就是2月的最后一天。第12行代码用于获取2月最后的一天并且输出。