首页 新闻 会员 周边

刚学java不久,试着写了个最基础简单的代码,高手大神们,指导指导 *-*

0
悬赏园豆:10 [已解决问题] 解决于 2014-10-17 18:07

  写了个很简单的验证码的代码,高手大神们看看,指点指点  *-* 谢谢

public static void main(String[] args) {
        //生成验证码(4位)
        char[] codes={'3','4','5','6','7','8','a','b','c',
                'd','e','f','h','i','j','k','m',
                'n','p','q','r','s','t','u','v',
                'w','x','y','z','A','B','C','D','E','F',
                'G','H','I','J','K','M','N','P','Q','R',
                'S','T','U','V','W','X','Y'};
        int n=4;
        char[] ver=new char[n];
        
        int index=0;
        int i;
        Random random=new Random();
        boolean[] used=new boolean[codes.length];
        do{
            i=random.nextInt(codes.length);
            if(used[i]){
                continue;
            }
            ver[index++]=codes[i];
            used[i]=true;
        }while(index!=ver.length);
        System.out.println(ver[0]+" "+ver[1]
                +" "+ver[2]+" "+ver[3]);
        
        //获取用户输入
        Scanner console=new Scanner(System.in);
        String input;
        do{
            System.out.print("请输入验证码:");
            input=console.nextLine();
            input=input.trim();
        }while(input.length()!=ver.length);
        char[] inp=input.toCharArray();
        //System.out.println(inp);
        
        //设置忽略大小写
        //char ch;
        for(i=0;i<ver.length;i++){
            if(inp[i]-ver[i]=='A'-'a' || 
                    inp[i]-ver[i]=='a'-'A'){
                inp[i]=ver[i];
            }
        }
        System.out.println(
                Arrays.toString(ver));
        System.out.println(
                Arrays.toString(inp));
        String in=new String(inp);
        String check=new String(ver);
        if(in.equals(check)){
            System.out.println("OK!");
        }else{
            System.out.println("输入错误!");
        }
    }
}
小小工程师的主页 小小工程师 | 初学一级 | 园豆:5
提问于:2014-10-14 21:57
< >
分享
最佳答案
1

你想要什么? 逻辑上看,没什么问题。忽略大小写那块可以改进。 还有,验证码一般允许重复,不需要用标识(当然,如果想唯一,就需要标记一下)

收获园豆:10
幻天芒 | 高人七级 |园豆:37175 | 2014-10-15 08:41

我是想知道自己这样写的,有没有更好的思路,或者更简单一点的代码。(第一次试着写的东西,所以拿出来问问。呃。。以后,一定多想想,拿深一点层次来请教  不然,都有点不好意思...*-*)

小小工程师 | 园豆:5 (初学一级) | 2014-10-16 18:18

@小小工程师: 思路没什么问题,改进的地方我上面也说了。多写,多思考。

幻天芒 | 园豆:37175 (高人七级) | 2014-10-16 21:13

@幻天芒: 哦,我想问问,那个忽略大小写,应该怎么改进,当时写的时候,思路还搞错了。没能想到其它的,来换,简化它

小小工程师 | 园豆:5 (初学一级) | 2014-10-17 18:07

@小小工程师: String应该直接由忽略大小写的比较吧,

幻天芒 | 园豆:37175 (高人七级) | 2014-10-17 22:05

@幻天芒: 不太明白啊,能不能单独上下代码啊?Stirng我学了,但理解得还不太深,运用比较欠缺啊。可以上下估代码,给个思路吗? 谢谢哒

小小工程师 | 园豆:5 (初学一级) | 2014-10-17 23:59

@小小工程师: public boolean equalsIgnoreCase(String anotherString)  

var b="Test".equalsIgnoreCase("test"); //true

幻天芒 | 园豆:37175 (高人七级) | 2014-10-18 12:31

@幻天芒: equalsIgnoreCase()忽略大小写..这个方法看过一次,但是忘记了。谢谢,我去试试*-*

小小工程师 | 园豆:5 (初学一级) | 2014-10-19 12:43
其他回答(1)
0

这段代码是一个生成并验证验证码的程序。它的思路是:

  1. 定义一个字符数组codes,包含了验证码可能包含的字符。
  2. 定义一个整数变量n,表示验证码的位数。
  3. 创建一个字符数组ver,用于存储生成的验证码。
  4. 创建一个布尔数组used,用于记录已使用的字符。
  5. 使用do-while循环来生成验证码,直到生成了指定位数的验证码为止。
    • 在每次循环中,使用random.nextInt(codes.length)生成一个随机数i,表示随机选择一个字符的索引。
    • 如果该字符已经被使用过,则继续生成下一个随机数。
    • 否则,将该字符添加到ver数组中,并将该字符标记为已使用。
  6. 打印生成的验证码。
  7. 使用Scanner读取用户输入的验证码。
  8. 使用do-while循环来获取用户输入的验证码,直到输入的验证码位数与生成的验证码位数相等为止。
  9. 将用户输入的验证码转换为字符数组inp
  10. 对用户输入的验证码进行大小写忽略的比较。
  11. 将生成的验证码数组ver和用户输入的验证码数组inp转换为字符串,并进行比较。
  12. 如果两个字符串相等,则打印"OK!",否则打印"输入错误!"。

以下是更简单的实现思路:

  1. 使用StringBuilder来生成验证码。
  2. 使用for循环生成指定位数的验证码:
    • 在每次循环中,生成一个随机数index,表示从codes数组中随机选择一个字符的索引。
    • 使用append方法将选中的字符添加到StringBuilder对象中。
  3. 打印生成的验证码。
  4. 使用Scanner读取用户输入的验证码。
  5. 使用trim方法去除用户输入字符串的前后空格。
  6. 将用户输入的验证码与生成的验证码进行比较,忽略大小写。
  7. 如果两个字符串相等,则打印"OK!",否则打印"输入错误!"。

以下是按照上述思路简化后的代码示例:

public static void main(String[] args) {
    // 生成验证码(4位)
    StringBuilder ver = new StringBuilder();
    char[] codes = {'3', '4', '5', '6', '7', '8', 'a', 'b', 'c',
                    'd', 'e', 'f', 'h', 'i', 'j', 'k', 'm',
                    'n', 'p', 'q', 'r', 's', 't', 'u', 'v',
                    'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
                    'G', 'H', 'I', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
                    'S', 'T', 'U', 'V', 'W', 'X', 'Y'};
    int n = 4;
    Random random = new Random();
    
    for (int i = 0; i < n; i++) {
        int index = random.nextInt(codes.length);
        ver.append(codes[index]);
    }
    
    System.out.println(ver.toString());
    
    // 获取用户输入
    Scanner console = new Scanner(System.in);
    String input;
    
    do {
        System.out.print("请输入验证码:");
        input = console.nextLine().trim();
    } while (input.length() != ver.length());
    
    if (input.equalsIgnoreCase(ver.toString())) {
        System.out.println("OK!");
    } else {
        System.out.println("输入错误!");
    }
}

这段代码使用了StringBuilder更简单地生成验证码,并使用equalsIgnoreCase方法进行大小写忽略的比较,从而简化了原有代码逻辑。

小九九呀 | 园豆:383 (菜鸟二级) | 2023-07-21 14:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册