大家好,我是北京校区黑马双元课堂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);
- }
- }
复制代码
|
|