1. 程式人生 > >計算開腦題

計算開腦題

條件判斷語句 換行 一個 soft str 正整數 完整 cte 加減

自己取一個大氣又可愛的標題

一、預估與實際

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基礎知識很重要。在敲代碼的時候有時候會發現自己知道要怎麽做,但是就是因為不清楚基礎知識而花費更多時間

計算開腦題