随机产生验证码
首先,我们得想清楚,如何从数组里面随机取出一个元素,只要我们能从数组里取出1个元素,接下来再随机取出4个,不就组成一个验证码了么
.
1.取出一个随机元素:
说到随机,我们肯定会想到随机数,但我们该如何让随机数与我们的数组元素产生联系呢?
答:数组不管是什么类型,它肯定会有由数字组成的索引,那我们随机一个5范围内的随机数,我们会发现随机数产生的数字,与索引对应上了。
既然对应上了,就把这个随机数当作索引,去数组里面获取元素
.
上图的代码还需要优化,因为我们把随机数范围写死了,而正是因为数组长度是5,我们才写的5,那我们直接在随机数里写arr.length不就行了,这样无论什么数组都可以适用
取出元素思路:根据数组的长度,产生随机数,拿这个随机数,当作索引去获取数组中的元素
.
2.取出5个元素:
既然已经知道该如何取出1个元素,那我们只需要循环5次取出1个元素,不就取出5个元素了么
写到这,我们的代码并没有结束,在现实生活中,产生了验证码,是不是应该让用户对着验证码输入,然后比较用户输入的和系统产生的是否一致,因此,我们还需要写一个校验代码
键盘录入,然后if进行比较
写到比较时,我们发现写不下去了,用户输入的验证码该拿谁进行比较?我们前面只是将元素取出然后进行打印,压根没有进行存储,代码中根本没有形成一份数据(arr[i]只是一个随机元素,并且会在每一轮循环结束后弹栈,根本不能比较)
.
因此,现在的代码中看不中用,那怎么才能使用呢?
.
答:我们应该把随机取出来的字符,拼接成一个字符串,把他们拼接成一个整体就可以使用了
+=,就是左右两边数据进行运算然后把值赋给左边。而之前我们也说过,在加法的操作当中,如果遇到了字符串,它就会变成拼接。
定义一个空的字符串,然后将每个产生的随机数进行拼接,成为一个整体。这样就清楚要拿什么和用户输入的进行比较了
if后面的代码就暂时不写了,因为String的比较用的不是==,而是equal。
.
在完成了上述所有流程后,还需要优化一个地方,便是最开始的数组,一大包数字和字母挤在一个数组里,实在不美观而且臃肿。
3.优化数组:
1.数组里面不止有数字,还有字母,所以我们应该定义char类型数据,并且使用动态初始化
char[] arr=new char[26+26+10];
26个小写字母,26个大写字母,还有0~9的数字。
.
2.然后,我们要想办法获取这些字符
上图中,使用了for循环,但是括号里的却全是字符,并且控制台还真可以打印。
之前我们说过,每个字符都有一个数值表示形式,这里的'a'便是97,由此,程序内部根据数值进行判断,97+1=98,98就是b的数值表示形式,以此类推,所有字母就都被遍历打印了。
.
3.接下来,我们要把这些字符存入数组中
c代表a-z,然后我们把每一个c装入数组,但是该存到哪个索引位置,又是一个问题。
仔细想想,我们想往里存的顺序就是第一次是存在0号,然后1号,然后2号.....
所以,目前我们缺少的就是一个变量,没有这个变量怎么办?那我们就自己定义一个!
最开始index是0,存入0号索引,然后加1,存入1号....以此类推,26个字母全部存满
后面的大写字母和数字都可以用index,因为index是定义在循环外面,不会消失,每一次index++都会固定index的值,所以轮到A时,index就是27,A就存入27,以此类推......
细节:对于打印语句,如果打印的时字符类型数组,程序内部会自动帮你遍历数组
4.总结
第一步:取1个
第二步:取5个
第三步、第四步、第五步:键盘录入、空字符串、对比
第六步、第七步、第八步:优化数组动态初始化、for循环获取、定义变量元素存入
总览