作業要求來源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232
項目的github位址:https://github.com/ShumeiHe/FourArithmetic_android
結對同伴的學号:201606120102
結對同伴的姓名:萬玙
結對同伴的部落格位址:https://www.cnblogs.com/wan-y/p/9869394.html
一、需求分析
基本要求:
(1) 生成題目,單個題目最多不能超過4個運算符,操作數小于100;
(2) 使用者可以輸入答案;
(3) 若使用者輸入答案正确,則提示正确;若答案錯誤,則提示錯誤,并要提示正确答案是多少;
四個擴充方向:
(4) 使用者在第一次答題時,需要使用者輸入使用者名,使用者下次啟動後,程式需要記住使用者前一次輸入的使用者名 ;
(5) 使用者答題結束以後,程式可以顯示使用者答題所用的時間;
(6) 使用者可以選擇出題的個數(最多不能超過5個題目),答題結束可以顯示使用者答錯的題目個數和答對的題目個數;
(7) 程式可以出單個整數階乘的題目:如:4!=24。
二、同伴與我
考慮到第四次作業中的需求已滿足該作業需求的(1)(2)無需進行大量修改。
同伴需要完成的需求:(4)(5)
我需要完成的需求:(3)(6)(7)
三、開發環境
工具:Android Stdio
語言:JAVA
四、功能設計
(1) 頁面布局:
首頁面布局:輸入題目題數、是否存在階乘的選擇、是否存在負數的選擇;
做題頁面布局:題目文本框(1個)、答案輸入框(5個)、改錯文本框(5個)、答案文本框(1個)、送出按鈕、答案按鈕。
(2) 題目數目的限制:隻能輸入不超過五道題的題數,如果輸出大于5與小于1則提示輸入錯誤;
(3) 題目輸出:根據輸入的題目個數輸出相應數目的題目;
(4) 是否存在階乘:是,則在最後一道題目中輸出一道階乘(随機産生一個1~10的整數);否,則隻輸入加減乘除四則運算;
(5) 答案的輸入與改錯:如果輸入的答案與正确答案相符,則在送出的時候,在相應題目後面輸出“√”,否則輸出“X”
(6) 正确答案的輸出:當送出時,答案按鈕會顯示,點選答案按鈕,在底部輸出正确答案。
五、詳細設計
(1) 使用者題目個數的輸入:如果使用者輸入的題目個數小于則提示“您輸入的題數小于1道請重新輸入!”,如果使用者輸入的額題目個數大于5則提示“您輸入的題數大于5道請重新輸入!”:
//傳輸資料、題目個數、是否存在階乘。
public void transferData(Intent intent){
topicNum=et_topicnum.getText().toString().trim();
if(0>=Integer.parseInt(topicNum)){
Toast.makeText(TopicActivity.this,"您輸入的題數小于1道請重新輸入!",Toast.LENGTH_SHORT).show();
}else if(Integer.parseInt(topicNum)>5){
Toast.makeText(TopicActivity.this,"您輸入的題數大于5道請重新輸入!",Toast.LENGTH_SHORT).show();
}else{
intent.putExtra("topicNum",topicNum);
intent.putExtra("factorial",factorial);
startActivity(intent);
}
}
(2) 答案輸入框與改錯文本框個數的顯示:如果輸入題目個數為n,那麼答案輸入框與改錯線束框的顯示個數為n個,其餘則隐藏:
<!--在布局中隐藏編輯文本框-->
<android:visibility="gone"/>
//編輯文本框的顯示。
et_input_answer1.setVisibility(View.VISIBLE);
(3) 送出按鈕的隐藏:點選一次送出按鈕後,送出按鈕不能再次點選:
(4) 答案按妞的顯示:點選送出按鈕後,在送出按鈕左邊顯示答案按鈕:
/送出按鈕事件。
btn_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn_answer.setVisibility(View.VISIBLE); //答案按鈕的顯示。
Makking();
int error=Integer.parseInt(topicNum)-score;
Toast.makeText(DotopicActivity.this,"您答對"+score+"道題,答錯"+error+"道題",Toast.LENGTH_SHORT).show();
Et_enable();
btn_submit.setEnabled(false); //送出按鈕不可點選
}
});
(5) 答案文本框的顯示:點選答案按鈕,正确答案在底部輸出:
(6) 答題結束,分别顯示正确與錯誤的題目個數:每答對一道題則加一,否則不加:
(7) 階乘運算:
//階乘運算。
public static long getNFactorial(int n){
if(n==0){
return 1;
}
return n*getNFactorial(n-1);
}
六、運作結果
(1)使用者名登入:

(2)大于五道題:
(3)小于1道題:
(4)輸入四道題目,有階乘:
(5)做題頁面(四道題目,有階乘):
(6)輸出答案:
(7)輸入五道題,無階乘:
七、問題及解決辦法
由于我選擇輸出最多不超過五道題的需求,是以當時的想法限制了我:即一次性顯示題目個數,并非顯示一道題做一道題然後再顯示一道題做一道題的想法。
我完成了所有布局與一些需求的實作,是以修改布局是比較困難、繁雜的。
我面臨的問題是:一次性顯示所有題目,那麼如何完成3)需求裡的若使用者輸入答案正确,則提示正确;若答案錯誤,則提示錯誤,并要提示正确答案是多少。
我的了解是輸入一道但則提示一道題目的正确答案。
我的解決方法是隻能等待使用者輸入所有的答案,送出後則輸出以“√”“X”的形式提示使用者哪道題正确,哪道題錯誤。同時添加一個送出後顯示答案的按鈕,點選答案按鈕則在底部顯示全部題目的正确答案。
歸根結底,我的問題在于在需求分析的時候不夠明确清晰。整個軟體開發流程,我認為最重要的時需求分析,但是,當時我對需求不夠明确的時候,着急着手布局與編碼的行為上犯了一個大忌。
一次性顯示題目僅限于該項目6)需求,即輸入不超過5道題的題目。如果輸入超過5道題,那麼該功能的擴充對于本項目來說比較棘手。
該項目的布局大緻如下:
我的想法:如果超過5道題目,那麼該頁面上顯示超過5道題的題目嗎?不是,可以在另外一個頁面顯示剩餘的題目或者動态重新整理頁面。該想法同時适用于顯示一道題做一道題的功能。
将經常修改的部分轉換為動态視圖:
八、過程耗時估計統計表
PSP2.1 | Personal Software Process Stages | Time Senior Studen(h) | Time(h) |
Planning | 計劃 | 2 | 1.5 |
Estimate | 估計這個任務需要多少時間 | 20 | 25 |
Development | 開發 | 6 | 7 |
Analysis | 需求分析 | 1 | |
Design Spec | 生成設計文檔 | ||
Design Review | 設計複審 | 0.5 | |
Coding Standard | 代碼規範 | ||
Design | 具體設計 | 3 | |
Coding | 具體編碼 | 13 | 15 |
Code Review | 代碼複審 | ||
Test | 測試(自我測試,修改代碼,送出修改) | 2.5 | |
Reporting | 報告 | ||
測試報告 | |||
計算工作量 | |||
并提出過程修改計劃 |
九、結對照片