-
键盘录入一个字符串,统计该字符串中大写字母字符、小写字母字符、数字字符出现的次数,不考虑其他字符。
javapackage test10; import java.util.Scanner; public class T1 { public static void main(String[] args) { System.out.println("请输入仅包含英文、数字的字符串:"); Scanner scanner = new Scanner(System.in); String ch=scanner.nextLine(); int big=0; int small=0; int digit=0; // try{ // for(int i=0;i<ch.length();i++){ // char c=ch.charAt(i); // if(Character.isUpperCase(c)){ // big++; // } // else if(Character.isLowerCase(c)){ // small++; // } // else if(Character.isDigit(c)){ // digit++; // } // } // }catch(Exception e){ // System.out.println(e.getMessage()); // }finally{scanner.close();} // 增强写法: 注意这个for循环是没有办法遍历String类型的 所以需要toCharArray()强制转换为char类型给for循环遍历 try{ for(char c:ch.toCharArray()){ if(Character.isUpperCase(c)){ big++; } else if(Character.isLowerCase(c)){ small++; } else if(Character.isDigit(c)){ digit++; } } }catch(Exception e){ System.out.println(e.getMessage()); }finally{scanner.close();} System.out.println("输入的字符串中大写英文的数量为:"+big); System.out.println("输入的字符串中小写英文的数量为:"+small); System.out.println("输入的字符串中数字的数量为:"+digit); } }
截图

2、将输入手机号码的4到7位屏蔽后输出,如"131****9468"。
java
package test10;
import java.util.Scanner;
public class T2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入11位手机号:");
// 注意手机号应该使用String类型 因为手机号11位虽然全部都是数字,但是int类型只能存下10位数字,且有些手机号开头为0,int类型会忽略开头的0 Long也不行 因为也会忽略开头的0
String number=scanner.nextLine();
// 对于屏蔽4-7位数字 有2个方法 第一个是subString 第2个是使用replace进行替换
try{
if(number.length()!=11){
throw new Exception("手机号的长度不对,请输入11位手机号!");
}
// 注意这里还是需要使用else if的 因为只要保证11位手机号才再验证是否都是数字
else if(!number.matches("\\d+")){
throw new Exception("请输入仅包含数字的手机号!");
}
// 这里其实可以直接写\\d{11}来保证11位数字手机号 这样前面的num.length!=11就可以删去
// if(!number.matches("\\d{11}"))throw new Exception("请输入11位仅包含数字的手机号");
else if(!number.startsWith("1")){
throw new Exception("请输入以1开头的手机号!");
}
// 法1:使用subString()方法
// String start=number.substring(0,3);
// String end=number.substring(7);
// System.out.println("输入的手机号为:"+number);
// System.out.println("屏蔽了4-7位手机号的结果为:"+start+"****"+end);
// 法2:使用replaceAll方法
System.out.println("原始手机号为:"+number);
System.out.println("屏蔽了4-7位手机号的结果为:"+number.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));
}catch(Exception e){
System.out.println(e.getMessage());
}finally{scanner.close();}
}
}
截图:


3、给定两个字符串,A和B。A的旋转操作就是将A最左边的字符移动到最右边。例如,若A="abcde",在一次移动后结果就是"bcdea"。如果在若干次调整操作之后,A能变成B,那么返回true,如果不能匹配成功,则返回false。
java
package test10;
import java.util.Scanner;
public class T3 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入字符串A:");
String A=scanner.nextLine();
System.out.println("请输入字符串B:");
String B=scanner.nextLine();
// 这题需要先判断判断AB的长度是否相等,不相等直接返回false
// 然后进行chatAt(0)和subString(1)从1开始的所有进行拼接实现最左边的放到最右边
// 每循环1次 就判断a.equals(b)是否为true
T3 t3 = new T3();
boolean panduan=t3.is_rotate(A,B);
if(panduan){
System.out.println("A通过旋转可以得到B,返回true");
}else{
System.out.println("A通过旋转无法得到B,返回false");
}
}
public boolean is_rotate(String A,String B) {
// 先判断长度是否相等
if (A.length() != B.length()) {
return false;
}
if(A.isEmpty()){
return false;//去除空串的情况
}
// 然后将A最左边的字符挪到最右边
for (int i = 0; i < A.length(); i++) {
// 先得到最左边的字符 chatAt的返回值类型是char
char first = A.charAt(0);
// 也可以用subString方法 不过这种没有charAt方便,
// 而且返回值类型为String 不是char 所以还需要使用调用方法获取第一个字符 注意:String类型是无法强制转换成char类型的 这种写法太多余了
// String first=A.substring(0,1);
// char c=first.charAt(0);
String middle_end = A.substring(1);
//注意这里就拼接了 将最左边的弄到最右边
A = middle_end+first;
if (A.equals(B)) {//最后判断字符是否完全一样就行
return true;
}
}
return false;//所有循环都完成后 没有和B匹配成功的 所以输出false
}
}
截图:

4、已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后给出相应的提示。
java
package test10;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
//4.已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后给出相应的提示。
//先把正确的用户名和密码写死 然后提示用户输入用户名和密码 (这里要注意用户名和密码必须匹配)
// 如果错误就返回密码错误 如果正确就返回密码正确 登录成功 如果循环了 3 次(这里指的是只有3次循环也就是i=0到i=2)
// 都没有成功 return 请在 2 小时后在进行输入
//注意:1. 如果 flag 是 false(没登录成功)→ !flag → true → if 条件成立 → 执行里面的代码:打印锁定提示
// 2. 如果 flag是 true(登录成功了)→ !flag → false → if 条件不成立 → 里面的代码不跑
public class T4 {
public static void main(String[] args) {
String user_name="wudililiwang";
String user_passwd="master";
Scanner scanner = new Scanner(System.in);
// 获取当前时间 以及获取2h之后的时间 锁定时间问题 应当是从3次密码输错之后才进行时间的计数 而不是一开始就获取当前时间
// 放在for循环结束之后再执行!
// LocalDateTime now=LocalDateTime.now();
// LocalDateTime now_after_2h=now.plusHours(2);
boolean flag=false;
for(int i=0;i<=2;i++){
// 注意这里输入用户名和密码应当在for循环里面 这样才能保证最大输入账号密码的次数为3
// i从0开始 所以是第i+1次
System.out.println("这是第"+(i+1)+"次输入用户名和密码!请注意每2h最多只有3次输错机会!");
System.out.println("请输入用户名:");
String user1=scanner.nextLine();
System.out.println("请输入"+user1+"的密码:");
String user_ps=scanner.nextLine();
// 这里也需要注意 一开始我使用的是== 这里对于字符串的比较应当使用equals
if(user_name.equals(user1) && user_ps.equals(user_passwd)){
System.out.println("密码正确,登录成功!");
flag=true;
break;//登录成功就跳出循环,没有必要再执行循环了
}
else{
System.out.println("密码错误,请重新输入!你还有"+(2-i)+"次输入机会!");
}
// 一开始我使用的是if else-if else写法 这里有个致命问题 就是最后的else永远不知道到了第几个循环 因为整个if语句只是单词循环
// 最终循环到了i=2后,也只是结束到else if语句,根本进不到else中
// 而且还有个问题 就是这个锁定时间问题 应当是从3次密码输错之后才进行时间的计数 而不是一开始就获取当前时间
// else{
// System.out.println("密码输入次数已用尽,请于"+now_after_2h+"后再次进行登录!");
// }
}//////
// 一定要在for循环外面
if(!flag){
LocalDateTime now=LocalDateTime.now();
LocalDateTime now_after_2h=now.plusHours(2);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 这个LocalDateTime输出会带T 丑! 格式化一下
System.out.println("密码输入次数已用尽,请于"+now_after_2h.format(fmt)+"后再次进行登录!");
}
scanner.close();
}
}
截图:
