黑马程序员技术交流社区

标题: 昨天学到数组类中的各种方法,今天顺便写了个小程序... [打印本页]

作者: geektosages    时间: 2015-12-14 18:57
标题: 昨天学到数组类中的各种方法,今天顺便写了个小程序...
大家好,我是北京校区黑马双元课堂JAVA基础1126班的张世豪
今天写了个小程序,一个注册登陆系统,对密码有很变态的要求......连续三次登陆不成功就要重新注册.
本人自己写的,欢迎顶贴!欢迎大家给我批评指正!
相信大家有更优化的编写方法,欢迎在回帖中交流!

  1. import java.util.Scanner;

  2. public class MemberSystem {

  3.         /**
  4.          * 一个注册登陆系统,对密码有很变态的要求......连续三次登陆不成功就要重新注册
  5.          * 本人自己写的,欢迎顶贴!欢迎大家给我批评指正!
  6.          * 相信大家有更优化的编写方法,欢迎在回帖中交流!
  7.          */
  8.         public static void main(String[] args) {
  9.                 String account = "";
  10.                 String password = "";
  11.                 String[] info = new String[2];        //建立一个2元素的字符串数组,用来存放账号和密码
  12.                 info[0] = account;
  13.                 info[1] = password;
  14.                 boolean judge = false;                        //用来判断登陆是否成功,成功则为true,否则为false.
  15.                 int count = 3;                                        //代表剩余登陆机会,初始化为3
  16.                 Scanner input = new Scanner(System.in);
  17.                 while (judge==false) {                        //当登陆未成功时就循环
  18.                         register(info);                                //运行注册方法,将注册的用户名和密码保存在数组info里.
  19.                         while (count>0) {                        //只要还有剩余登陆机会,就继续循环
  20.                                 System.out.println("您还有"+count+"次剩余登陆机会");
  21.                                 System.out.println("请输入用户名");
  22.                                 account = input.nextLine();
  23.                                 System.out.println("请输入密码");
  24.                                 password = input.nextLine();
  25.                                 if ((info[0].equals(account)) && (info[1].equals(password))) {        //判断输入值和注册时设定的是否相等
  26.                                         System.out.println("登陆成功");
  27.                                         judge = true;        //judge变量为true,表示登陆成功
  28.                                         break;                        //跳出内循环
  29.                                 } else {
  30.                                         System.out.println("用户名或密码错误,请重新输入!");
  31.                                         count--;                //登陆次数减一
  32.                                 }
  33.                         }
  34.                         if (judge) {                        //若登陆成功,不进行任何操作,程序结束
  35.                                
  36.                         } else {
  37.                                 System.out.println("登陆错误次数过多,请重新注册!");
  38.                                 count = 3;                        //复原登陆次数
  39.                         }
  40.                         //这里如果登陆成功了,那么judge为true,跳出外循环,否则接着循环.
  41.                 }
  42.         }

  43.         public static void register(String[] info) {
  44.                 System.out.println("您尚未注册,请输入您想用的账号,不能包含中文,只能使用英文大小写字母/数字和符号,区分大小写");
  45.                 Scanner sc = new Scanner(System.in);
  46.                 String account = "";
  47.                 boolean con = true;                //判断账号正确性,正确为true,否则为false
  48.                 do {
  49.                         account = sc.nextLine();
  50.                         if (account.isEmpty()) {                                        //判断账号输入是否为空
  51.                                 System.out.println("账号不能为空!请重新输入!");
  52.                                 con = false;                                                        //账号不正确
  53.                         } else if (!falseSymbol(account)) {                        //判断是否包含非法字符
  54.                                 con = false;                                                        //账号不正确
  55.                         } else {
  56.                                
  57.                         }
  58.                 } while (!con);                                                                        //只要账号不正确,就继续循环
  59.                 System.out.println("账号设置成功!您的账号为:"+account);
  60.                
  61.                 System.out.println("请输入密码.");
  62.                 System.out.println("密码不得小于8位,不能大于30位.密码中不能出现账号.本系统不支持密码的第一位或最后一位是空格,如果您输入了空格,系统会自动清除.");
  63.                 System.out.println("不能包含中文,只能使用英文大小写字母/数字和符号,区分大小写.");
  64.                 System.out.println("数字不得少于3个,特殊字符也不得少于3个,且所有的数字不能全部在一起,所有的特殊符号也不能全连在一起.");
  65.                 System.out.println("任意字符都不能连续超过3个在一起,且任意字符在密码中出现的次数不能多于8次.");
  66.                 boolean flag = false;                        //判断密码正确性,正确为true,否则为false
  67.                 String password = "";
  68.                 String pw = "";                                        //代表两边去空格后的密码
  69.                 do {
  70.                         password = sc.nextLine();
  71.                         pw = password.trim();
  72.                        
  73.                         if ((pw.length()<8) || (pw.length()>30)) {
  74.                                 System.out.println("密码长度错误!请重新输入!");
  75.                         } else if (pw.contains(account)) {                //字符串方法contains()
  76.                                 System.out.println("密码中不能包含账号,请重新输入.");
  77.                         } else if (!falseSymbol(pw)) {                        //falseSymbol()为判断是否有非法字符的函数,有就返回false.
  78.                                
  79.                         } else if (!numAndSym(pw)) {                        //numAndSym()为判断数字和特殊字符是否符合要求的函数,不符合就返回false.
  80.                                
  81.                         } else if (!maxto3(pw)) {                                //maxto3()为判断是否有超过连续3个字符都一样的函数,有就返回false.
  82.                                
  83.                         } else if (!over8(pw)) {                                //over8()为判断是否有字符出现超过8次的函数,有就返回false.
  84.                                
  85.                         } else {
  86.                                 flag = true;                                                //若所有的条件都满足,就说明密码符合要求
  87.                         }
  88.                 } while (!flag);                                                        //只要密码不合法,就继续循环
  89.                 System.out.println("您设定的密码是:"+pw);
  90.                 info[0] = account;                                                        //将合法的用户名和密码保存到字符串数组里
  91.                 info[1] = pw;
  92.         }

  93.         public static boolean over8(String pw) {
  94.                 boolean flag4 = true;                                                //over8()为判断是否有字符出现超过8次的函数,有就返回false.
  95.                 String rule = "";                                                        //定义一个存储表,用来存储已经检查过的字符,用来减少不必要的循环
  96.                 int count = 0;                                                                //表示重复次数
  97.                 for (int j = 0; j < pw.length(); j++) {
  98.                         if (rule.indexOf(pw.charAt(j))!=(-1)) {        //j编号的字符在存储表中已经有了,表示该字符已经检查过了.
  99.                                 continue;
  100.                         } else {
  101.                                 rule = rule + pw.charAt(j);                        //添加到已检查列表
  102.                                 for (int i = j; i < pw.length(); i++) {
  103.                                         if ((pw.charAt(j))==(pw.charAt(i))) {
  104.                                                 count++;                                        //从i号元素开始挨个遍历,发现重复的就记下来
  105.                                         }
  106.                                 }
  107.                                 if (count>8) {                                                //重复超过8次
  108.                                         System.out.println("任意字符在密码中出现的次数不能多于8次!请重新输入!");
  109.                                         flag4 = false;                                        //false表示不符合规范
  110.                                         break;
  111.                                 }
  112.                         }
  113.                         count = 0;                                                                //复原计数器
  114.                 }
  115.                 return flag4;
  116.         }

  117.         public static boolean falseSymbol(String account) {        //没有非法字符就返回true,有就返回false.
  118.                 boolean con2 = true;
  119.                 for (int i = 0; i < account.length(); i++) {
  120.                         if((((int)(account.charAt(i)))<0) || (((int)(account.charAt(i)))>127)) {
  121.                                 System.out.println("包含非法字符“"+account.charAt(i)+"”!请重新输入!");
  122.                                 con2 = false;
  123.                                 break;
  124.                         }       
  125.                 }
  126.                 return con2;
  127.         }

  128.         public static boolean maxto3(String pw) {                        //有超过3个连续的就返回false,否则返回true;
  129.                 boolean flag3 = true;
  130.                 for (int j = 2; j < pw.length(); j++) {                        //从第三个元素开始,把它自身和前两个进行比较,看看是否相等
  131.                         if((pw.charAt(j)==pw.charAt(j-1)) && (pw.charAt(j-1)==pw.charAt(j-2))) {
  132.                                 System.out.println("任意字符都不能连续超过3个在一起!请重新输入!");
  133.                                 flag3 = false;
  134.                                 break;
  135.                         }
  136.                 }
  137.                 return flag3;
  138.         }

  139.         public static boolean numAndSym(String pw) {                //有错就返回false,否则返回true;
  140.                 int numCount = 0;                        //两个计数器
  141.                 int numSymbol = 0;
  142.                 boolean flag2 = false;
  143.                 String test = "";                        //定义一个测试表
  144.                 for (int i = 0; i < pw.length(); i++) {
  145.                         if (isNum(pw, i)) {
  146.                                 numCount++;
  147.                                 test = test + 'N';
  148.                         } else if (isSymbol(pw, i)) {
  149.                                 numSymbol++;
  150.                                 test = test + 'S';
  151.                         } else {
  152.                                 test = test + 'L';
  153.                         }
  154.                 }                                                        //最后相当于输入的字符串中的数字变为测试表中的N,符号变S,字母变L.
  155.                 if (numCount<3) {
  156.                         System.out.println("数字不能少于3个,请重新输入.");
  157.                 } else if (numSymbol<3) {
  158.                         System.out.println("特殊字符不能少于3个,请重新输入.");
  159.                 } else if ((test.lastIndexOf('S')-test.indexOf('S'))<=(numSymbol-1)) {
  160.                         System.out.println("特殊字符不能全部连在一起,请重新输入.");        //如果测试表中最后一个S的编号减去第一个S的编号不大于特殊符号数目
  161.                                                                                                                                                 //那么就说明特殊符号连起来了
  162.                 } else if ((test.lastIndexOf('N')-test.indexOf('N'))<=(numSymbol-1)) {
  163.                         System.out.println("数字不能全部连在一起,请重新输入.");                //如果测试表中最后一个N的编号减去第一个N的编号不大于数字数目
  164.                                                                                                                                                 //那么就说明数字连起来了
  165.                 } else {
  166.                         flag2 = true;                //全部条件都满足
  167.                 }
  168.                 return flag2;
  169.         }

  170.         public static boolean isNum(String pw, int i) {                                                //判断字符串中第i号元素是否是数字
  171.                 return (pw.charAt(i)>='0') && (pw.charAt(i)<='9');
  172.         }

  173.         public static boolean isSymbol(String pw, int i) {                                        //判断字符串中第i号元素是否是特殊符号
  174.                 return (pw.charAt(i)>=32) && (pw.charAt(i)<=47) || (pw.charAt(i)>=58) && (pw.charAt(i)<=64)
  175.                                 || (pw.charAt(i)>=58) && (pw.charAt(i)<=64) || (pw.charAt(i)>=91) && (pw.charAt(i)<=96)
  176.                                 || (pw.charAt(i)>=123) && (pw.charAt(i)<=127);
  177.         }

  178. }
复制代码




作者: 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