帶UI的小初高數學學習軟體——湖南大學結對程式設計總結

HNUJSY發表於2020-11-05

連結:完整程式碼及說明
提取碼:87mx

複製這段內容後開啟百度網盤手機App,操作更方便哦
一、功能需求

1、使用者註冊功能。使用者提供手機號碼,點選註冊將收到一個註冊碼,使用者可使用該註冊碼完成註冊;

2、使用者完成註冊後,介面提示設定密碼,使用者輸入兩次密碼匹配後設定密碼成功。密碼6-10位,必須含大小寫字母和數字。使用者在登入狀態下可修改密碼,輸入正確的原密碼,再輸入兩次相同的新密碼後修改密碼成功;

3、密碼設定成功後,跳轉到選擇介面,介面顯示小學、初中和高中三個選項,使用者點選其中之一後,提示使用者輸入需要生成的題目數量;

4、使用者輸入題目數量後,生成一張試卷(同一張卷子不能有相同題目,題目全部為選擇題),介面顯示第一題的題乾和四個選項,使用者選擇四個選項中的一個後提交,介面顯示第二題,…,直至最後一題;

5、最後一題提交後,介面顯示分數,分數根據答對的百分比計算;

6、使用者在分數介面可選擇退出或繼續做題;

7、小初高數學題目要求見個人專案。

二、功能測試

  1. 註冊功能:利用手機號進行註冊,手機收到驗證碼,將驗證碼輸入進行確認,然後進行密碼設定,密碼設定必須滿足6-10位,含大小寫字母和數字,且兩次密碼必須相同,匹配成功,使用者才註冊成功。
    在這裡插入圖片描述
    在這裡插入圖片描述

  2. 登入功能:註冊完成之後可以通過手機號和設定的密碼進行登入出題,如果密碼輸入不相同則會進行錯誤提示,且無法登入系統;
    在這裡插入圖片描述

  3. 出題功能:進入出題系統之後,使用者可以根據自身需要選擇相應的年級進行出題,然後進入相應出題數量的選擇,輸入所需要的題目數量點選出題,則會進入出題介面,並在下面出現四個選項,且只有一個正確答案,最後將會根據答對的題目數量進行統計分數。

在這裡插入圖片描述

  1. 重設密碼功能:使用者可以通過重設密碼按鍵進入重設密碼的功能介面,輸入舊密碼,再輸入新密碼,確認新密碼,當新密碼兩次相同且滿足密碼要求的情況下,則會重設密碼。

在這裡插入圖片描述

三、實現要點

  1. 程式實現的總體架構:我們在src中放入我們程式實現的程式碼部分,在images中放入我們使用的圖片元素,以及後面用於資料庫連線使用的jar包。
    在這裡插入圖片描述

  2. 圖形介面的實現:剛開始本著要用html來實現圖形介面的實現,但是隊友有javaui的使用經驗,在他的推薦之下,我們使用eclipse的視覺化外掛WindowBuilder進行輔助設計,通過外掛可以對介面實行簡單的實現,再通過我們修改程式碼進行不斷完善,極大加快了我們的圖形介面的開發效率。

在這裡插入圖片描述

  1. 出題功能的重用:在之前的個人專案之中我們實現的出題程式碼,我們通過類進行封裝,我們可以通過類進行呼叫返回實現我們的題目字串,但是這次完成的功能必須實現題目結果的計算,所以我們在返回值改成了字串陣列,一個用於返回我們的題目字串,另一個字串返回的是我們對其中的特殊字元計算後的題目字串,可用於在後面我們可以通過直接呼叫逆波蘭表示式對結果進行計算。
    在這裡插入圖片描述

  2. 題目的生成和結果的計算:在進行出題時,因為我們必須保證題目的不可重複性,我們必須一次性將所有題目放入hashset進行校驗,所以我們選擇在開始時直接生成所有的題目和結果,分別放入problem字串陣列和result陣列,我們就可以通過直接將這些題目和結果作為引數進行傳參,保證題目的唯一性,為了節省空間,我們對選項的隨機生成並沒有放入陣列進行傳參,而是通過在接下來的遞迴呼叫中進行生成。

在這裡插入圖片描述

  1. 題目的跳轉與計分:我們對題目的跳轉是通過不斷的遞迴呼叫來實現的,當我們選擇了一個選項並進行確認時,我們就會重新生成一個視窗物件,傳入我們之前生成的題目和結果和當前的是第幾個題目,再通過隨機化的方法,我們就可以生成四個選項,生成了我們的題目。至於計分困擾了我們很久,後來我們選擇通過類的靜態變數來進行實現,因為當我們遞迴呼叫生成類的時候,我們對物件的類的靜態變數的更改會影響到這個類的所有物件,由此我們可以進行計分,當再次重新開始出題時我們只需將計分個數初始化為0即可。
    在這裡插入圖片描述

  1. 資料庫的實現:用於對使用者資訊的儲存,剛開始的個人專案中我使用的是檔案的儲存,當時面對現在要實現的功能,用文字實現複雜化,所以我們用資料庫mysql對使用者資訊進行管理,同時使用mysql專用的資料庫管理軟體對管理更加有效,安全性更高。
 1 package testPaperUI;
 2 import java.sql.Connection;
 3 import java.sql.DriverManager;
 4 public class dbhelp {//資料庫連線
 5     private static final String driver = "com.mysql.cj.jdbc.Driver";
 6        private static final String url = "jdbc:mysql://localhost:3306/test?userUnicode=true&characterEnconding=UTF-8&serverTimezone=UTC";//test為資料庫
 7        private static final String username = "user";//賬號
 8        private static final String password = "123456";//密碼
 9        private static Connection conn = null;
10
11        static {
12            try {
13             Class.forName(driver);
14         } catch (Exception e) {
15             e.printStackTrace();
16         }
17        }
18
19        public static Connection getConnection() throws Exception{
20            if(conn == null) {
21                conn = DriverManager.getConnection(url,username,password);//獲得連線
22                return conn;
23            }
24            return conn;
25        }
26
27        public static void main(String[] args) {//測試主函式
28            try{
29                Connection conn = dbhelp.getConnection();
30                if(conn != null) {//獲得連線輸出正常
31                    System.out.println("資料庫連線正常");
32                }else {//連線失敗輸出異常
33                    System.out.println("資料庫連線異常");
34                }
35            }catch(Exception e) {
36                e.printStackTrace();
37            }
38        }
39
40
41 }

四、結對程式設計總結

這是我的第一次結對程式設計體驗,給我帶來一種新的編碼方式,通過兩個結對編寫程式碼,我們互相發現對方編碼中的小錯誤,互相提醒,提高了我們編碼的正確性,減少了我們後期的調整除錯的時間,很大提到了我們的編碼效率。同時,我們又在不同的方面瞭解更多一些,我更熟悉後臺編碼的實現,而我的隊友更熟悉前端介面的實現,我們各有所長,在相應的部分我們可以發揮各自的長處,大大提高了我們整個專案的實現效率。在這次結對程式設計中,通過和隊友的對比也發現了自己還有很多不足,在接下來的學習中,我將會更加努力提升自己的能力。

相關文章