隨機產生驗證碼
首先,我們得想清楚,如何從陣列裡面隨機取出一個元素,只要我們能從陣列裡取出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迴圈獲取、定義變數元素存入
總覽