黑马程序员技术交流社区
标题:
昨天学到数组类中的各种方法,今天顺便写了个小程序...
[打印本页]
作者:
geektosages
时间:
2015-12-14 18:57
标题:
昨天学到数组类中的各种方法,今天顺便写了个小程序...
大家好,我是北京校区黑马双元课堂JAVA基础1126班的张世豪
今天写了个小程序,一个注册登陆系统,对密码有很变态的要求......连续三次登陆不成功就要重新注册.
本人自己写的,欢迎顶贴!欢迎大家给我批评指正!
相信大家有更优化的编写方法,欢迎在回帖中交流!
import java.util.Scanner;
public class MemberSystem {
/**
* 一个注册登陆系统,对密码有很变态的要求......连续三次登陆不成功就要重新注册
* 本人自己写的,欢迎顶贴!欢迎大家给我批评指正!
* 相信大家有更优化的编写方法,欢迎在回帖中交流!
*/
public static void main(String[] args) {
String account = "";
String password = "";
String[] info = new String[2]; //建立一个2元素的字符串数组,用来存放账号和密码
info[0] = account;
info[1] = password;
boolean judge = false; //用来判断登陆是否成功,成功则为true,否则为false.
int count = 3; //代表剩余登陆机会,初始化为3
Scanner input = new Scanner(System.in);
while (judge==false) { //当登陆未成功时就循环
register(info); //运行注册方法,将注册的用户名和密码保存在数组info里.
while (count>0) { //只要还有剩余登陆机会,就继续循环
System.out.println("您还有"+count+"次剩余登陆机会");
System.out.println("请输入用户名");
account = input.nextLine();
System.out.println("请输入密码");
password = input.nextLine();
if ((info[0].equals(account)) && (info[1].equals(password))) { //判断输入值和注册时设定的是否相等
System.out.println("登陆成功");
judge = true; //judge变量为true,表示登陆成功
break; //跳出内循环
} else {
System.out.println("用户名或密码错误,请重新输入!");
count--; //登陆次数减一
}
}
if (judge) { //若登陆成功,不进行任何操作,程序结束
} else {
System.out.println("登陆错误次数过多,请重新注册!");
count = 3; //复原登陆次数
}
//这里如果登陆成功了,那么judge为true,跳出外循环,否则接着循环.
}
}
public static void register(String[] info) {
System.out.println("您尚未注册,请输入您想用的账号,不能包含中文,只能使用英文大小写字母/数字和符号,区分大小写");
Scanner sc = new Scanner(System.in);
String account = "";
boolean con = true; //判断账号正确性,正确为true,否则为false
do {
account = sc.nextLine();
if (account.isEmpty()) { //判断账号输入是否为空
System.out.println("账号不能为空!请重新输入!");
con = false; //账号不正确
} else if (!falseSymbol(account)) { //判断是否包含非法字符
con = false; //账号不正确
} else {
}
} while (!con); //只要账号不正确,就继续循环
System.out.println("账号设置成功!您的账号为:"+account);
System.out.println("请输入密码.");
System.out.println("密码不得小于8位,不能大于30位.密码中不能出现账号.本系统不支持密码的第一位或最后一位是空格,如果您输入了空格,系统会自动清除.");
System.out.println("不能包含中文,只能使用英文大小写字母/数字和符号,区分大小写.");
System.out.println("数字不得少于3个,特殊字符也不得少于3个,且所有的数字不能全部在一起,所有的特殊符号也不能全连在一起.");
System.out.println("任意字符都不能连续超过3个在一起,且任意字符在密码中出现的次数不能多于8次.");
boolean flag = false; //判断密码正确性,正确为true,否则为false
String password = "";
String pw = ""; //代表两边去空格后的密码
do {
password = sc.nextLine();
pw = password.trim();
if ((pw.length()<8) || (pw.length()>30)) {
System.out.println("密码长度错误!请重新输入!");
} else if (pw.contains(account)) { //字符串方法contains()
System.out.println("密码中不能包含账号,请重新输入.");
} else if (!falseSymbol(pw)) { //falseSymbol()为判断是否有非法字符的函数,有就返回false.
} else if (!numAndSym(pw)) { //numAndSym()为判断数字和特殊字符是否符合要求的函数,不符合就返回false.
} else if (!maxto3(pw)) { //maxto3()为判断是否有超过连续3个字符都一样的函数,有就返回false.
} else if (!over8(pw)) { //over8()为判断是否有字符出现超过8次的函数,有就返回false.
} else {
flag = true; //若所有的条件都满足,就说明密码符合要求
}
} while (!flag); //只要密码不合法,就继续循环
System.out.println("您设定的密码是:"+pw);
info[0] = account; //将合法的用户名和密码保存到字符串数组里
info[1] = pw;
}
public static boolean over8(String pw) {
boolean flag4 = true; //over8()为判断是否有字符出现超过8次的函数,有就返回false.
String rule = ""; //定义一个存储表,用来存储已经检查过的字符,用来减少不必要的循环
int count = 0; //表示重复次数
for (int j = 0; j < pw.length(); j++) {
if (rule.indexOf(pw.charAt(j))!=(-1)) { //j编号的字符在存储表中已经有了,表示该字符已经检查过了.
continue;
} else {
rule = rule + pw.charAt(j); //添加到已检查列表
for (int i = j; i < pw.length(); i++) {
if ((pw.charAt(j))==(pw.charAt(i))) {
count++; //从i号元素开始挨个遍历,发现重复的就记下来
}
}
if (count>8) { //重复超过8次
System.out.println("任意字符在密码中出现的次数不能多于8次!请重新输入!");
flag4 = false; //false表示不符合规范
break;
}
}
count = 0; //复原计数器
}
return flag4;
}
public static boolean falseSymbol(String account) { //没有非法字符就返回true,有就返回false.
boolean con2 = true;
for (int i = 0; i < account.length(); i++) {
if((((int)(account.charAt(i)))<0) || (((int)(account.charAt(i)))>127)) {
System.out.println("包含非法字符“"+account.charAt(i)+"”!请重新输入!");
con2 = false;
break;
}
}
return con2;
}
public static boolean maxto3(String pw) { //有超过3个连续的就返回false,否则返回true;
boolean flag3 = true;
for (int j = 2; j < pw.length(); j++) { //从第三个元素开始,把它自身和前两个进行比较,看看是否相等
if((pw.charAt(j)==pw.charAt(j-1)) && (pw.charAt(j-1)==pw.charAt(j-2))) {
System.out.println("任意字符都不能连续超过3个在一起!请重新输入!");
flag3 = false;
break;
}
}
return flag3;
}
public static boolean numAndSym(String pw) { //有错就返回false,否则返回true;
int numCount = 0; //两个计数器
int numSymbol = 0;
boolean flag2 = false;
String test = ""; //定义一个测试表
for (int i = 0; i < pw.length(); i++) {
if (isNum(pw, i)) {
numCount++;
test = test + 'N';
} else if (isSymbol(pw, i)) {
numSymbol++;
test = test + 'S';
} else {
test = test + 'L';
}
} //最后相当于输入的字符串中的数字变为测试表中的N,符号变S,字母变L.
if (numCount<3) {
System.out.println("数字不能少于3个,请重新输入.");
} else if (numSymbol<3) {
System.out.println("特殊字符不能少于3个,请重新输入.");
} else if ((test.lastIndexOf('S')-test.indexOf('S'))<=(numSymbol-1)) {
System.out.println("特殊字符不能全部连在一起,请重新输入."); //如果测试表中最后一个S的编号减去第一个S的编号不大于特殊符号数目
//那么就说明特殊符号连起来了
} else if ((test.lastIndexOf('N')-test.indexOf('N'))<=(numSymbol-1)) {
System.out.println("数字不能全部连在一起,请重新输入."); //如果测试表中最后一个N的编号减去第一个N的编号不大于数字数目
//那么就说明数字连起来了
} else {
flag2 = true; //全部条件都满足
}
return flag2;
}
public static boolean isNum(String pw, int i) { //判断字符串中第i号元素是否是数字
return (pw.charAt(i)>='0') && (pw.charAt(i)<='9');
}
public static boolean isSymbol(String pw, int i) { //判断字符串中第i号元素是否是特殊符号
return (pw.charAt(i)>=32) && (pw.charAt(i)<=47) || (pw.charAt(i)>=58) && (pw.charAt(i)<=64)
|| (pw.charAt(i)>=58) && (pw.charAt(i)<=64) || (pw.charAt(i)>=91) && (pw.charAt(i)<=96)
|| (pw.charAt(i)>=123) && (pw.charAt(i)<=127);
}
}
复制代码
作者:
geektosages
时间:
2015-12-14 19:00
不好意思...是字符串String类,写错了,没法删帖.
作者:
你与时光皆薄情
时间:
2015-12-14 19:04
沙发!!!!!
作者:
Oluwa
时间:
2015-12-14 19:15
厉害!!!
作者:
小黑锅锅
时间:
2015-12-14 19:28
赞一个。{:3_54:}
作者:
667784
时间:
2015-12-14 19:29
好嘛,这么长
作者:
duandong
时间:
2015-12-14 19:30
目前还看不懂
作者:
zhongjilingzhu
时间:
2015-12-14 19:32
大神 ,加油 啊 ,一路牛下去
作者:
not@good@enough
时间:
2015-12-14 19:35
这是把我们学过的知识,都巩固了一下!
作者:
黄成德
时间:
2015-12-14 19:35
6666666666
作者:
金金金小天
时间:
2015-12-14 19:41
666。大神真多
作者:
wx_KWWw45aw
时间:
2015-12-14 19:43
真牛啊,看不懂
作者:
段江波
时间:
2015-12-14 21:02
6666666666666666666666
作者:
陈小龙
时间:
2015-12-14 21:06
目前还看不懂 还要努力学
作者:
花见花开1991
时间:
2015-12-14 21:11
厉害了啊…出息了
作者:
星海浮沉
时间:
2015-12-16 15:31
12.11的路过,赞一个~
作者:
陈凯旋
时间:
2015-12-17 14:03
好厉害 ! 看得我眼都花了
作者:
陈凯旋
时间:
2015-12-17 14:06
好厉害 ! 看得我眼都花了
作者:
唐洪超
时间:
2015-12-17 14:14
还不会,没看太明白
作者:
鬼魅_vYpyK
时间:
2015-12-17 22:31
不错 哦!小伙子!
作者:
晓晓恩
时间:
2015-12-17 23:08
赞一个,支持
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2