1. 程式人生 > >軟工作業-小學生四則運算程序(java實現)

軟工作業-小學生四則運算程序(java實現)

.com develop txt emp token 自然數 lean 創建 作業

github傳送

https://github.com/Lock98/-

項目需求

  • 使用 -n 參數控制生成題目的個數,例如:
    Myapp.exe -n 10
  • 使用 -r 參數控制題目中數值(自然數、真分數和真分數分母)的範圍,例如:
    Myapp.exe -r 10
  • 生成的題目中計算過程不能產生負數,也就是說算術表達式中如果存在形如e1 ? e2的子表達式,那麽e1 ≥ e2
  • 生成的題目中如果存在形如e1 ÷ e2的子表達式,那麽其結果應是真分數。
  • 每道題目中出現的運算符個數不超過3個。
  • 程序一次運行生成的題目不能重復,即任何兩道題目不能通過有限次交換+和×左右的算術表達式變換為同一道題目
    。例如,23 + 45 = 和45 + 23 = 是重復的題目,6 × 8 = 和8 × 6 = 也是重復的題目。3+(2+1)和1+2+3這兩個題目是重復的,由於+是左結合的,1+2+3等價於(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重復的兩道題,因為1+2+3等價於(1+2)+3,而3+2+1等價於(3+2)+1,它們之間不能通過有限次交換變成同一個題目。
  • 生成的題目存入執行程序的當前目錄下的Exercises.txt文件,格式如下:

    1. 四則運算題目1

    2. 四則運算題目2

    ……

    其中真分數在輸入輸出時采用如下格式,真分數五分之三表示為3/5,真分數二又八分之三表示為2’3/8
  • 在生成題目的同時,計算出所有題目的答案,並存入執行程序的當前目錄下的Answers.txt文件,格式如下:

    1. 答案1

    2. 答案2

    特別的,真分數的運算如下例所示:1/6 + 1/8 = 7/24。
  • 程序應能支持一萬道題目的生成。
  • 程序支持對給定的題目文件和答案文件,判定答案中的對錯並進行數量統計,輸入參數如下:

    Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt
  • 統計結果輸出到文件Grade.txt,格式如下:

    Correct: 5 (1, 3, 5, 7, 9)

    Wrong: 5 (2, 4, 6, 8, 10)

    其中“:”後面的數字5表示對/錯的題目的數量,括號內的是對/錯題目的編號。為簡單起見,假設輸入的題目都是按照順序編號的符合規範的題目。

PSP(right-undue)

PSP2.1Personal Software Process Stages預估耗時(分鐘)實際耗時(分鐘)
Planning 計劃 45 45
· Estimate · 估計這個任務需要多少時間 · 45 · 45
Development 開發 960 645
· Analysis · 需求分析 (包括學習新技術) · 120 · 150
· Design Spec · 生成設計文檔 · 45 · 40
· Design Review · 設計復審 (和同事審核設計文檔) · 45 · 30
· Coding Standard · 代碼規範 (為目前的開發制定合適的規範) · 30 · 45
· Design · 具體設計 · 120 · 90
· Coding · 具體編碼 · 480 · 200
· Code Review · 代碼復審 · 60 · 50
· Test · 測試(自我測試,修改代碼,提交修改) · 60 · 80
Reporting 報告 105 105
· Test Report · 測試報告 · 45 · 45
· Size Measurement · 計算工作量 · 30 · 30
· Postmortem & Process Improvement Plan · 事後總結, 並提出過程改進計劃 · 30 · 30
合計 1110

835

關鍵代碼:

逆波蘭表達式:

逆波蘭的求值步驟:

  • 初始化一個空堆棧
  • 如果字符是一個操作數,把它壓入棧
  • 如果字符是一個操作符號,彈出兩個操作數,執行恰當操作,然後把結果壓入堆棧,如果不能夠彈出兩個操作數,那麽後綴表達式的語法錯誤。
  • 到後綴表達式末尾,從堆棧中彈出結果,若後綴表達式格式正確,那麽堆棧應該為空。

package com.SCL;

import java.util.*;
public class Expression {




private ArrayList expression = new ArrayList();// 存儲中序表達式

private ArrayList right = new ArrayList();// 存儲右序表達式

private String expresult ;// 結果


public Expression() {

}

public String getExpresult() {

return expresult;
}


// 依據輸入信息創建對象,將數值與操作符放入ArrayList中
Expression(String input) {
StringTokenizer st = new StringTokenizer(input, "+-*/()", true);
while (st.hasMoreElements()) {
String s=st.nextToken();
expression.add(s);
}
}
//將中序表達式轉換為右序表達式
private void toRight() {
Stack aStack = new Stack();
String operator;
int position = 0;
while (true) {
if (Calculate.isOperator((String) expression.get(position))) {
if (aStack.top == -1
|| ((String) expression.get(position)).equals("(")) {
aStack.push(expression.get(position));
} else {
if (((String) expression.get(position)).equals(")")) {
while(true){
if (aStack.top != -1&&!((String) aStack.top()).equals("(")) {
operator = (String) aStack.pop();
right.add(operator);
}else{
if(aStack.top != -1)
aStack.pop();
break;
}
}
} else {
while(true){
if (aStack.top != -1&& Calculate.priority((String) expression
.get(position)) <= Calculate
.priority((String) aStack.top())
) {
operator = (String) aStack.pop();
if (!operator.equals("("))
right.add(operator);
}else{
break;
}

}
aStack.push(expression.get(position));
}
}
} else
right.add(expression.get(position));
position++;
if (position >= expression.size())
break;
}
while (aStack.top != -1) {
operator = (String) aStack.pop();
if(!operator.equals("("))
right.add(operator);
}
}

// 對右序表達式進行求值
boolean getResult() {


this.toRight();

Stack aStack = new Stack();
String op1, op2, is = null;
String temp="";
Iterator it = right.iterator();
while (it.hasNext()) {
is = (String) it.next();
if (Calculate.isOperator(is)) {
op1 = (String) aStack.pop();
op2 = (String) aStack.pop();
temp = Calculate.twoResult(is, op1, op2);
double td = Double.parseDouble(temp.trim());
if(td==999999.0){
return false;

}
aStack.push(temp);
} else
aStack.push(is);
}

expresult = (String)aStack.pop();

it = expression.iterator();


while (it.hasNext()) {

String tempstr = (String) it.next();

System.out.print(tempstr);

} System.out.println("=" ); //expresult為計算結果 return true; }}

項目測試

正常測試

生成三個文檔

技術分享圖片

技術分享圖片

技術分享圖片

錯誤測試

技術分享圖片

技術分享圖片

生成10000道題

技術分享圖片

項目總結

因為平時敲代碼比較少,很多java基礎知識都忘記了,導致很多數據類型不匹配的錯誤,很頭疼,還得翻書看看復習復習

作業中使用了博客的方法來提交作業,對於一直想要搭建博客寫博文卻一直沒有實現的自己無疑是極好的,既能培養自己寫博客的習慣,又能提升自己的實踐能力。

軟工作業-小學生四則運算程序(java實現)