1. 程式人生 > 實用技巧 >結對程式設計專案總結

結對程式設計專案總結

前言

本部落格對在個人程式設計的基礎上進行的結對程式設計進行總結,主要包括程式碼的複用和結對程式設計中學到的經驗教訓。

結對程式設計分工:我負責(驗證碼註冊模組,查重模組,儲存賬戶資訊模組,計算模組),隊友負責UI介面(登陸介面,出題介面,做題介面,彙報介面,修改密碼,彈窗模組)。

一、結對程式設計要求

1、所有功能通過圖形化介面操作,可以是桌面應用,可以是網站(程式語言和技術不限); 2、使用者註冊功能。使用者提供手機號碼,點選註冊將收到一個註冊碼,使用者可使用該註冊碼完成註冊; 3、使用者完成註冊後,介面提示設定密碼,使用者輸入兩次密碼匹配後設置密碼成功。密碼6-10位,必須含大小寫字母和數字。使用者在登入狀態下可修改密碼,輸入正確的原密碼,再輸入兩次相同的新密碼後修改密碼成功; 4、密碼設定成功後,跳轉到選擇介面,介面顯示小學、初中和高中三個選項,使用者點選其中之一後,提示使用者輸入需要生成的題目數量; 5、使用者輸入題目數量後,生成一張試卷(同一張卷子不能有相同題目,題目全部為選擇題),介面顯示第一題的題乾和四個選項,使用者選擇四個選項中的一個後提交,介面顯示第二題,…,直至最後一題; 6、最後一題提交後,介面顯示分數,分數根據答對的百分比計算; 7、使用者在分數介面可選擇退出或繼續做題。

二、程式碼實現

1.驗證碼註冊模組

根據UI介面使用者輸入的手機號碼,通過阿里雲的API介面,返回一個隨機的code作為驗證碼,實現驗證碼傳送和接收驗證功能。

public static SendSmsResponse sendSms(String tel,String code) throws ClientException {
//可自助調整超時時間
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暫不支援region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//組裝請求物件-具體描述見控制檯-文件部分內容
SendSmsRequest request = new SendSmsRequest();
//必填:待發送手機號
request.setPhoneNumbers(tel);
//必填:簡訊簽名-可在簡訊控制檯中找到
request.setSignName("中小學題目生成器初版");
//必填:簡訊模板-可在簡訊控制檯中找到
request.setTemplateCode("SMS_204106386");
//可選:模板中的變數替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為
request.setTemplateParam("{\"code\":"+code+"}");
//選填-上行簡訊擴充套件碼(無特殊需求使用者請忽略此欄位)
//request.setSmsUpExtendCode("90997");
//可選:outId為提供給業務方擴充套件欄位,最終在簡訊回執訊息中將此值帶回給呼叫者
request.setOutId("yourOutId");
//hint 此處可能會丟擲異常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
return sendSmsResponse;
}

2.儲存賬戶資訊模組/查重模組

使用者資訊儲存在名為account的txt檔案裡,在程式開始,程式將account資訊存入一個ArrayList連結串列,在程式結束後,將ArrayList裡的內容寫回account檔案,驗證account檔案即可進行查重判斷

public static void SaveToLoc()throws IOException {
FileOutputStream fos = null;
fos = new FileOutputStream("src/Frame/" + "account.txt"); //不覆蓋原內容
for (String s : al) {
String msg = s + '\n';
fos.write(msg.getBytes());
}
fos.close();
}
public static void SaveToCur(){
File file = new File("src/Frame/" + "account.txt");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}

try{
FileReader fr = new FileReader("src/Frame/" + "account.txt");
BufferedReader bf = new BufferedReader(fr);
String str;
while ((str = bf.readLine()) != null) {
al.add(str);
}
bf.close();
fr.close();
}
catch (IOException e){
e.printStackTrace();
}
}

3.計算模組

用隨機生成二元運算子和運算數,然後把他們拼接成字尾表示式。根據題目的型別,隨即插入根號等一元運算子,再通過棧,從字尾表示式中取字串,根據字串的內容來決定進行入棧還是出棧的操作,把字尾表示式翻譯成中綴表示式。再利用棧,遍歷一次後綴表示式,就可以計算出答案。

int num = (int) (0 + Math.random() * (4 - 0 + 1));  //獲取0-4個 二元運算子
ArrayList<String> houzhui = new ArrayList<>();
int operands = (int) (1 + Math.random() * (100 - 1 + 1)); //運算元的取值範圍是1-100
houzhui.add(Integer.toString(operands));
//將字尾表示式翻譯成中綴表示式
Stack<String> stack = new Stack<>();
int time=0;
for (String str:houzhui){
if (str.equals("sin")||str.equals("cos")||str.equals("tan")||str.equals("√")||str.equals("²")){
String popB=stack.pop();
if (str.equals("√")){
stack.push("√"+"("+popB+")");
}
if (str.equals("²")){
stack.push("("+popB+")"+"²");
}
if (str.equals("sin")){
stack.push("sin"+"("+popB+")");
}
if (str.equals("cos")){
stack.push("cos"+"("+popB+")");
}
if (str.equals("tan")){
stack.push("tan"+"("+popB+")");
}
}
......
public static String[] Calculate(ArrayList<String> houzhui) {
//str是一個字尾表示式
Stack<Double> stack = new Stack<Double>();
Double result;

for (String str:houzhui) {
if(str.equals("√")||str.equals("²")||str.equals("sin")||str.equals("cos")||str.equals("tan")){
double popB = stack.pop();
if (str.equals("√")){
if (popB!=0)
stack.push(Math.sqrt(popB));
else
stack.push(1.0);
}
if (str.equals("²")){
stack.push(Math.pow(popB,2));
}
if (str.equals("sin")){
stack.push(Math.sin(popB));
}
if (str.equals("cos")){
stack.push(Math.cos(popB));
}
if (str.equals("tan")){
stack.push(Math.tan(popB));
}
}

三、程式碼複用

1.生成試卷

根據使用者選擇的題目型別和數量生成題目(示例): 給函式增加了返回值,函式返回一個字串陣列,每一個字串代表一個題目,傳入的引數分別是題目型別,題目儲存的路徑和題目數量

2.初始化介面

包括手機號碼和驗證碼輸入框、獲取驗證碼按鈕和註冊按鈕等,給按鈕新增監聽器,點選按鈕後傳送驗證碼或啟動註冊程式,註冊成功後將賬戶資訊儲存在本地

3.登入介面

使用者註冊後,跳轉到設定使用者名稱和密碼介面。介面包括使用者名稱和密碼輸入框以及確認按鈕。有一個按鈕,點選可以切換隱藏密碼和檢視密碼,此功能是通過一個JTextField和一個JPasswordField切換實現的

4.選擇題目介面

包含一個單選框和一個數字輸入框,使用者輸入題目型別和數量。題目型別為在(小學、初中、高中)三個選項中單選,數量為10-30之間的數字

5.做題介面

從GenerateTest()函式的返回值得到試卷,然後再用Calculate()函式得到備選答案,把備選答案加入單選按鈕,放置在面板上。使用者可點選”上一題“”下一題“按鈕來切換當前的題目,做過的題目答案會儲存

6.彙報介面

在使用者做完全部題目後,介面顯示分數,使用者可選擇繼續做題或者退出

7.使用者資訊

使用者資訊儲存在名為account的txt檔案裡,在程式開始,程式將account資訊存入一個ArrayList連結串列,在程式結束後,將ArrayList裡的內容寫回account檔案