計算開腦題
自己取一個大氣又可愛的標題
一、預估與實際
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 500 | 730 |
? Estimate | ? 估計這個任務需要多少時間 | 950 | 920 |
Development | 開發 | 30 | |
? Analysis | ? 需求分析 (包括學習新技術) | 10 | 13 |
? Design Spec | ? 生成設計文檔 | 20 | 16 |
? Design Review | ? 設計復審 | 20 | 43 |
? Coding Standard | ? 代碼規範 (為目前的開發制定合適的規範) | 20 | 26 |
? Design | ? 具體設計 | 20 | 36 |
? Coding | ? 具體編碼 | 500 | 630 |
? Code Review | ? 代碼復審 | 20 | 16 |
? Test | ? 測試(自我測試,修改代碼,提交修改) | 260 | 330 |
Reporting | 報告 | 20 | 42 |
? Test Repor | ? 測試報告 | 20 | 32 |
? Size Measurement | ? 計算工作量 | 20 | 12 |
? Postmortem & Process Improvement Plan | ? 事後總結, 並提出過程改進計劃 | 26 | 30 |
合計 |
二、需求分析
我通過百度和實際問答的方式了解到,小學一年級數學有如下的幾個特點:
特點1只有加減法
2只有正整數運算 3只有20內的正整數
我通過百度和實際問答的方式了解到,小學二年級數學有如下的幾個特點:
特點1比小學一年級多了乘除法2會2位數相加減的運算了 3會運算100以內的數加減
經過分析,我認為,這個程序應當:
可接接收2個參數:題目數量、年級
會檢測出各種輸入參數的錯誤
會根據傳入的年級生成對應需求的題目
最後將題目答案輸出到out.txt文件
各部分函數代碼給註釋,有明確的邏輯。
程序運行中、文件輸出後要給明確的提示
經過分析,我認為,這個程序應當:
三、設計
1. 設計思路
這個程序有一個類,3個函數,功能如下:
主函數裏調用check()函數排除輸入參數的各種問題
主函數裏調用init()函數初始化題目和答案
主函數裏調用OutPutFile()函數將題目和答案輸出到out.txt文件中
check()類用來排除輸入參數的各種問題,函數流程如下:
檢測輸入的參數的數量(只能為0、1、2這幾種)
檢測輸入的是否為正整數
檢測參數的大小是否符合需求
init()類用來生成題目和答案,函數流程如下:
生成2個可變字符串
生成2個隨機數
在循環內將2個隨機數用可變字符串拼接成題目和答案,並且保存答案
OutPutFile()函數將題目和答案輸出到out.txt文件
函數流程圖:
算法的關鍵:
判斷輸入的參數是否合法,對於不合法的各種情況需給予提示
生成的數字是否滿足大綱要求時的判斷邏輯
2. 實現方案
寫出具體實現的步驟
準備工作:先在Github上創建倉庫,克隆到本地
設計大綱:設置算法分類、多次判斷、分類輸出
技術關鍵:年級的選擇、分類輸出
四、編碼
編碼過程:
main函數:
創建一個可變字符串str用於拼接題目
創建check()函數專門用於檢測輸入參數的各種錯誤
將str和main函數的參數傳入init()初始化函數中
創建OutPutFile()用於題目和答案輸出到out.txt文件
init()函數:
創建1個可變字符串str1用於拼接答案
創建1個for循環
循環內生成2個隨機數
用str拼接題目
用條件判斷語句判斷當前的運算符並算出答案
str1拼接答案
str1拼接到str尾部
遇到的問題:
如何使用cmd接收的參數
查閱別人的博客發現,用cmd輸入的參數的使用方法和字符串數組的使用方法一致。
加減法怎麽才能保證是隨機的
原先我是用問號表達式來控制加減後面發現這種發放並不適用於2年級的加減乘除的情況。思考了一會兒,我將加減乘除法存入字符串數組當中,然後用隨機數隨機數組的下標就實現了,1年級隨機數範圍[0-1],2年級隨機數範圍[0-3]。
怎麽才能實現題目和答案分離輸出
原先我打算用字符串來完成,但是後面突然想到,如果要進行大批的字符串拼接可變字符串的拼接效率是最高的,所有我改變使用可變字符串Stringbuffer來進行拼接,我用2個可變字符串分開拼接題目和答案,最後再把題目和答案拼接到一起就解決了這個問題。
如何實現年級判斷
我在年級判斷的時候卡殼了一會兒,主要是因為1個參數應該默認為1年級,2個參數也可能是1年級也可能是二年級。經過一番思考我加了參數長度的判斷就解決了問題。
我在字符串拼接的時候有換行out.txt 文件裏面的題目全部顯示在一行
百度查閱資料發現記事本裏面的換行是‘\r\n‘
1. 調試日誌
記錄編碼調試的日誌,請記錄下開發過程中的 debug 歷程
除法余數的判斷
解決方案:都做余數判斷,分為兩類輸出,有余數按模版輸出,無余數省略余數輸出。
參數(年級的選擇)
解決方案:在整體前做判斷。由於我先寫的算法,後進行年級選擇導致。
輸入的參數為英文、特殊符號、參數個數不對、參數數值過大程序意外停止
解決:將判斷參數各種錯誤的代碼獨立抽出來寫成一個check()函數,並且在出現錯誤的地方增加提示和正確的結束程序,防止程序拋錯誤。
2. 關鍵代碼
package com.java.Task01;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
/**
- @author 郟敏傑
- 這是命令行工具MathExam,自動生成一份小學一年級的數學加減計算題。
*/
public class Math1Exam6317 {
public static void main(String[] args) throws IOException {
//定義答案
int answer;
//確定輸出的文件
File file = new File("out.txt");
//創建指向文件的數據輸出流
DataOutputStream out = new DataOutputStream(new FileOutputStream(file));
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("小學一年級數學加減計算題");
System.out.println("請輸入題目數量:");
//獲取控制臺輸入題目數量n
int n = input.nextInt();
//生成題目
for (int i = 1; i <= n; i++) {
//生成兩個隨機數
int num1 = (int)(Math.random()*100+1);
int num2 = (int)(Math.random()*100+1);
//生成題序和題目
if(num1 > num2) {
//生成減法
System.out.println("("+ i +") " + num1 +" - "+ num2 + " =");
String str = ("("+ i +") " + num1 +" - "+ num2 + " = " + (num1-num2));
//寫入數據
out.writeUTF(str);
// System.out.println(str);
}
else {
//生成加法
System.out.println("("+ i +") " + num1 +" + "+ num2 + " =");
String str = ("("+ i +") " + num1 +" + "+ num2 + " = " + (num1+num2));
//寫入數據
out.writeUTF(str);
// System.out.println(str);
}
}
out.close();
System.out.println("------------------標準答案------------------");
//創建指向文件的數據輸入流
DataInputStream in = new DataInputStream(new FileInputStream(file));
//讀數據
for (int i = 0; i < n; i++) {
System.out.println(in.readUTF());
}
in.close();
}//main
}
3. 代碼規範
請給出本次實驗使用的代碼規範:
第一條代碼中的命名均不以下劃線或美元符號開始,也不一下劃線或美元符號結束。
第二條代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。
第三條類名使用UpperCamelCase風格,但是以下情形例外:DO / DTO / VO / AO / PO 等。
第四條方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格,必須遵循駝峰形式。
第五條變量和常量的命名方式:非公有(private/protected/default)變量前面要加上小寫m;
第六條類型與中括號緊挨相連來定義數組。正例:定義整形數組 int[] arrayDemo;並人工檢查代碼是否符合規範
第七條杜絕完全不規範的縮寫,避免忘文不知義。反例:AbstractClass“縮寫”命名成AbsClass;condition“縮寫”命名成 condi,此類隨意縮寫嚴重降低了代碼的可閱讀性。
第八條為了達到代碼自己自解釋的目標,任何自定義編程元素在命名時,使用精良完整的單詞組合來表達其意。但是有些名稱實在過於長,這個可以適當的縮寫,不要忘文不知義就可以。這個不是客觀的規定。
第九條不允許任何魔法值(即未經預先定義的常量)直接出現在代碼中。
第十條大括號的使用約定。如果是大括號內為空,則簡介地寫成{}即可,不需要換行;如果是非空代碼塊則:
左大括號前不換行。
左大括號後換行。
右大括號前換行。
右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。
五、測試
請思考並記錄你認為必要的測試點,並記錄測試用例與測試結果測試編號
測試編號 具體輸入 預期結果 實際結果
1 0 格式錯誤!請重新輸入...... 符合預期
2 10 正常執行,生成10道一年級加減運算題 符合預期
3 10 1 正常執行,生成10道一年級加減運算題 符合預期
4 10 2 正常執行,生成10道二年級乘除運算題 符合預期
5 10 3 格式錯誤!請重新輸入...... 符合預期
6 1000 格式錯誤!請重新輸入...... 符合預期
六、總結
請總結過程中的教訓和經驗,思考
1 程序不僅僅只是編碼,在開始編碼前應該還有很多工作要做,要分析需求,設計好文檔,才能在完成的時候符合要求
編碼前要先構思,有一個大致的方向
2基礎知識很重要。在敲代碼的時候有時候會發現自己知道要怎麽做,但是就是因為不清楚基礎知識而花費更多時間
計算開腦題