随机产生验证码并进行输入匹配

》题目要求

  》》用户输入产生验证码的个数

  》》根据个数随机产生验证码

  》》用户输入验证码

  》》验证码比较(不区分大小写)

》程序实现

 1 package cn.fury.test;
 2 
 3 import java.util.Scanner;
 4 /**
 5  * 题目要求:
 6  *         用户输入产生验证码的个数
 7  *         随机产生指定个数的字符
 8  *         提示用户输入验证码
 9  *         进行验证码比较(不区分大小写)然后进行输出
10  */
11 public class Test{
12     public static void main(String[] args) {
13         
14         //字符库
15         char [] alphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
16                 'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D',
17                 'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
18                 'U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'};
19         
20         //输入需要产生的验证码的个数
21         Scanner sc = new Scanner(System.in);    
22         System.out.print("Please input a number to represent the quantity of verification code:");
23         int quantity_of_verification_code = sc.nextInt();
24         sc.nextLine(); //为了解决因为之前输入的换行符导致后面的nextLine()函数失效问题
25         
26         //随机产生指定个数的字符并且进行输出
27         char [] verification_code = new char[quantity_of_verification_code];
28         for(int i = 0; i < quantity_of_verification_code; i++){
29             verification_code[i] = alphabet[(int)(Math.random()*alphabet.length)];
30         }
31         String verification_code_String = new String(verification_code);  
32         System.out.println("The verification code is:" + verification_code_String);
33         
34         //用户输入验证码
35         System.out.print("Please input the verification code:");
36         String input_verification_code = sc.nextLine();
37         
38         //对用户输入的验证码和随机产生的验证码进行比较(不区分大小写),然后进行输出操作
39         if((verification_code_String.toUpperCase()).equals(input_verification_code.toUpperCase())){
40             System.out.println("The verification code you input just now is true.");
41         }else{
42             System.out.println("The verification code you input just now is wrong.");
43         }
44         
45     }
46 }
View Code

》遇到的问题

  1.怎么将字符数组变成一个字符串并且和另外一个字符串进行 + 操作

  2.next() 和 nextLine() 的区别

  3.怎么解决nextLine() 接受之前输入的换行符问题

 1 package atest.dak.com;
 2 
 3 import java.util.Arrays;
 4 import java.util.Scanner;
 5 
 6 /*
 7  * 随机生成指定位数的验证码
 8  * 提醒用户输入
 9  * 判断用户输入是否正确
10  */
11 public class Test{
12     public static void main(String[] args){
13         Scanner scan = new Scanner(System.in);
14         
15         System.out.print("请输入随机产生的验证码的个数:");
16         int number = scan.nextInt();
17         
18         char[] arr_of_random = randome_num(number);  //获取随机验证码
19         System.out.println(Arrays.toString(arr_of_random)); //打印随机验证码
20         
21         System.out.print("请输入验证码:");
22         
23         /*
24          * 注意:由于之前进行输入的时候是用回车作为结束的,所以如果用nextline()的话就会
25          *         将上一次的结束的回车作为这次的输入,又因为nextline()的结束也是回车,所以
26          *         在这里通过nextline()作为输入函数是不会得到任何输入值的;因此我们用next()
27          *         作为这里的输入函数可以有效的避免这种问题。
28          */
29         String answer = scan.next();  //获取输入字符串
30         char[] arr_of_answer = answer.toCharArray(); //将输入字符串转化成字符数组
31         System.out.println(Arrays.toString(arr_of_answer)); //打印输入字符数组
32         
33         int[] result = match(arr_of_answer, arr_of_random);
34         System.out.println(Arrays.toString(result));
35         
36     }
37     
38 //    产生所有小写字母
39     private static void f1(){
40         for(int i = 97; i < 97 + 26; i++){
41             System.out.print("\'"+(char)i+"\'"+",");
42         }
43     }
44     
45 //    产生所有大写字母
46     private static void f2(){
47         for(int i = 65; i < 65 + 26; i++){
48             System.out.print("\'"+(char)i+"\'"+",");
49         }
50     }
51     
52 //    随机产生指定个数的验证码
53     private static char[] randome_num(int figure){
54         char[] cha01 = {'a','b','c','d','e','f','g','h',
55                 'i','j','k','l','m','n','o','p','q','r','s',
56                 't','u','v','w','x','y','z','A','B','C','D',
57                 'E','F','G','H','I','J','K','L','M','N','O',
58                 'P','Q','R','S','T','U','V','W','X','Y','Z'};
59         boolean[] used = new boolean[cha01.length];
60         char[] cha02 = new char[figure];
61         for(int i = 0; i < cha02.length; i++){
62             int j;
63             
64             //进行去重复处理
65             do{
66                 j = (int)(Math.random()*(cha01.length));
67             }while(used[j]);
68             
69             cha02[i] = cha01[j];
70             used[j] = true;
71         }
72         return cha02;
73     }
74 
75 //    对随机验证码和输入的验证码进行匹配
76     private static int[] match(char[] answer, char[] random){
77         int[] result = new int[2];
78         for(int i = 0; i < answer.length; i++){
79             for(int j = 0; j < random.length; j++){
80                 if(random[j] == answer[i]){
81                     result[0]++;
82                     if(j == i){
83                         result[1]++;
84                     }
85                 }
86             }
87         }
88         return result;
89     }
90 }
随机验证码的匹配

 

》问题解决

  三少有点累,今天不想继续写啦,待更新中......

  1.三少暂时还没有想到 -->> 暂时只想到通过Arrays.toString(arr01)来实现,但是可以通过一个自定义方法来实现 2017年3月1日11:27:21

  2.请参见本人博客 -->  next()和nextLine()的区别

  3.方法一:用一个nextLine()来接收那个回车

     方法二:用next()来代替nextLine()

》 程序改进

  》》提醒用户输入产生验证码的个数

  》》提醒用户输入验证码

  》》判断用户的输入是否正确(内容和位置都要进行判断)

  》》如果用户没有完全输入正确,那么输出用户输错的个数

 1 package atest.dak.com;
 2 
 3 import java.util.Arrays;
 4 import java.util.Random;
 5 import java.util.Scanner;
 6 
 7 public class Test01{
 8     public static void main(String[] args) {
 9         
10         /*随机产生指定数量的不重复的验证码*/
11         Scanner scan = new Scanner(System.in);
12         System.out.print("请输入需要产生的验证码的数量:");
13         int number = scan.nextInt();
14         char [] ran_verification_code = create_verification_code(number);
15         System.out.println("随机产生的" + number + "个验证码为: " + Arrays.toString(ran_verification_code));
16         
17         /*输入验证码*/
18         System.out.print("请输入验证码:");
19         String str01 = scan.next();
20         char [] input_verification_code = str01.toCharArray();
21         System.out.println("你输入的验证码是:" + Arrays.toString(input_verification_code));
22         
23         /*验证码判断*/
24         int num_correct = 0;
25         for(int i = 0; i < input_verification_code.length; i++) {
26             for(int j = 0; j < ran_verification_code.length; j++) {
27                 if((input_verification_code[i] == ran_verification_code[j]) && (i == j)) {
28                     num_correct++;
29                 }
30             }
31         }
32         if(number == num_correct) {
33             System.out.println("验证码输入正确。");
34         }
35         else {
36             System.out.println("你输错啦" + (number - num_correct) + "个验证码。");
37         }
38         
39     }
40 
41     /**
42      * 随机产生指定数量的验证码
43      * @param number TODO
44      * @return TODO
45      * 
46      */
47     private static char[] create_verification_code(int number) {
48         char[] letter = create_alphabet();  //存放所有的字母
49         boolean [] judge = new boolean[letter.length]; //存放所有字母是否被选中的状态
50         char[] ran_num = {}; //存放随机产生的验证码
51         int index = 0;
52         Random random = new Random();
53         for(int i = 0; i < number; i++) {
54             do {
55                 index = random.nextInt(letter.length);
56             } while(judge[index]);
57             judge[index] = true; //没选中一个字母,就将这个字母的状态变成选中
58             ran_num = Arrays.copyOf(ran_num, ran_num.length + 1); //扩容处理
59             ran_num[ran_num.length - 1] = letter[index]; //添加元素
60         }
61 //        System.out.println(Arrays.toString(ran_num));
62         return ran_num;
63     }
64 
65     /**
66      * 产生全部大写字母和全部小写字母还有0到9的阿拉伯数字
67      * @return TODO
68      * 
69      */
70     private static char[] create_alphabet() {
71         char x = 'a';
72         char y = 'A';
73         char z = '0';
74         char [] alphabet = {}; //用于存放字符
75         for(int i = 0; i < 26; i++) { //将26个小写字母放到alphabet数组中去
76             alphabet = Arrays.copyOf(alphabet, alphabet.length + 1); //扩容处理
77             alphabet[alphabet.length - 1] = (char)(x + i); //添加元素
78         }
79         for(int i = 0; i < 26; i++) { //将26个大写字母放到alphabet数组中去
80             alphabet = Arrays.copyOf(alphabet, alphabet.length + 1); 
81             alphabet[alphabet.length - 1] = (char)(y + i);
82         }
83         for(int i = 0; i <= 9; i++) { //将10个阿拉伯数字放到alphabet中去
84             alphabet = Arrays.copyOf(alphabet, alphabet.length + 1);
85             alphabet[alphabet.length - 1] = (char)(z + i);
86         }
87 //        System.out.println(Arrays.toString(alphabet));
88         return alphabet;
89     }
90     
91 }
View Code

 

posted @ 2016-11-26 22:22  寻渝记  阅读(548)  评论(0编辑  收藏  举报