軟工作業-小學生四則運算程序(java實現)
github傳送
https://github.com/Lock98/-
項目需求
- 使用 -n 參數控制生成題目的個數,例如:
Myapp.exe -n 10
- 使用 -r 參數控制題目中數值(自然數、真分數和真分數分母)的範圍,例如:
Myapp.exe -r 10
- 生成的題目中計算過程不能產生負數,也就是說算術表達式中如果存在形如e1 ? e2的子表達式,那麽e1 ≥ e2。
- 生成的題目中如果存在形如e1 ÷ e2的子表達式,那麽其結果應是真分數。
- 每道題目中出現的運算符個數不超過3個。
- 程序一次運行生成的題目不能重復,即任何兩道題目不能通過有限次交換+和×左右的算術表達式變換為同一道題目
-
生成的題目存入執行程序的當前目錄下的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.1 | Personal 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實現)