1. 程式人生 > >四則運算(基於控制臺)

四則運算(基於控制臺)

bre 地址 類型 都是 eat 報告 correct acc HR

一、題目描述:

1. 使用 -n 參數控制生成題目的個數,例如 Myapp.exe -n 10 -o Exercise.txt 將生成10個題目。 2. 使用 -r 參數控制題目中數值(自然數、真分數和真分數分母)的範圍,例如 Myapp.exe -r 10 將生成10以內(不包括10)的四則運算題目。該參數可以設置為1或其他自然數。該參數必須給定,否則程序報錯並給出幫助信息。 3. 生成的題目中如果存在形如e1 ÷ e2的子表達式,那麽其結果應是真分數 4. 每道題目中出現的運算符個數不超過3個。 5. 程序一次運行生成的題目不能重復,即任何兩道題目不能通過有限次交換+和×左右的算術表達式變換為同一道題目。例如,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。 6. 在生成題目的同時,計算出所有題目的答案,並存入執行程序的當前目錄下的Answers.txt文件,格式如下: 1. 答案1 2. 答案2 特別的,真分數的運算如下例所示:1/6 + 1/8 = 7/24。 7. 程序應能支持一萬道題目的生成。 8. 程序支持對給定的題目文件和答案文件,判定答案中的對錯並進行數量統計,並會輸出所有題目中重復的題目,輸入參數如下:
Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt -o Grade.txt 統計結果輸出到文件Grade.txt,格式如下: Correct: 5 (1, 3, 5, 7, 9) Wrong: 5 (2, 4, 6, 8, 10) Repeat:2 RepeatDetail: (1) 2,45+32 Repeat 3,32+45 (2) 5,3+(2+1) Repeat 7,1+2+3 解釋: Correct: 5 ----5道題目正確,正確的題號 1,3,5,7,9
Wrong:5 -----5道題目錯誤,錯誤的題號 2,4,6,8,10 Repeat:2 2---組題目重復 (1) 第一組 題號2,題目 45+32 與題號3的題目重復,題號3為 32+45 (2)第二組 題號5,題目 3+(2+1) 與題號7的題目重復,題號7為 1+2+3 其中“:”後面的數字5表示對/錯的題目的數量,括號內的是對/錯題目的編號。為簡單起見,假設輸入的題目都是按照順序編號的符合規範的題目。 二、需求分析 用戶在控制臺輸入想要輸入的題目,難度系數,選擇完畢後,系統根據選擇的難度系數隨機出題,其中表達式的數包含自然數和分數,分數以真分數和帶分數的形式出現。用戶填寫答案,提交後可以進行判斷正誤,返回數據報告。程序支持10000道題目的生成,生成題目後將題目和題目的運算結果保存至文件保存,用戶答題和答題後返回的數據報告均以文件形式保存在當前的目錄下。 三、功能設計 基本功能 1.生成隨機數(包括分數) 2.生成隨機運算符 3.生成表達式 4.生成二叉樹(用於計算,查重) 5.分數的計算 6.計算題目結果並輸出到文件 7.比較答案並給出正確錯誤題號 四、設計實現 1.create.java 生成隨機數,隨機運算符,表達式,題目集 2.Calculate.java 計算結果並輸出文檔 3.Result.java 比較答案並給出正確錯誤題號 4.FenShu.java 分數的運算 5.Binary.java 生成二叉樹 功能1.生成隨機數 技術分享圖片

功能2.生成隨機運算符

技術分享圖片

功能3.生成表達式

技術分享圖片

功能4.生成二叉樹

技術分享圖片

功能5.分數的計算

技術分享圖片

功能6.計算題目結果

技術分享圖片

功能7.比較答案

技術分享圖片

五、代碼說明

去除表達式首部和尾部的多余括號 當出現了括號不匹配時出現異常拋出

public TreeNode createTree(String expression) {
		/*
		 * 去除表達式首部和尾部的多余括號 當出現了括號不匹配時出現異常 拋出
		 */
		if (expression.indexOf("(") == 0) {
			for (int i = 0; i < expression.length(); i++) {
				if (expression.startsWith("(") == true) {
					if (expression.endsWith(")") == true) {
						expression = expression.substring(1,
								expression.length() - 1);
					} else {
						/*
						 * 拋出異常 括號不比配
						 */
					}

				}
			}
		}
		char[] exp = expression.toCharArray();

		TreeNode newNode = new TreeNode();
		String leftString = new String();
		String rightString = new String();
		String stack = new String(); // 用於存儲括號的棧 當表達式檢測完畢後 若棧不為空 這說明括號使用不合法
		if (checkOperator(expression) == true) {
			int index = 0; // 記錄最先掃描到的不在括號中的加號或減號 必為表達式運算的最後一次操作
			int multi_div = 0; // 記錄最先掃描到的不在括號中的乘號或除號的位置 只有在掃描不到加號和減號的前提下才有用
			for (int i = exp.length - 1; i >= 0; i--) {
				if (exp[i] == ‘)‘) {
					stack = stack + exp[i];
				} else if (exp[i] == ‘(‘) {
					if (stack.length() > 0) {
						stack = stack.substring(0, stack.length() - 1);
					}
				} else if (exp[i] == ‘+‘ && stack.length() == 0
						|| exp[i] == ‘-‘ && stack.length() == 0) {
					index = i;
					break;
				} else if (exp[i] == ‘/‘ && stack.length() == 0
						|| exp[i] == ‘*‘ && stack.length() == 0) {
					multi_div = i;
				} else {
					if (exp[i] < 48 || exp[i] > 57) {
						/*
						 * 拋出異常 出現不合法的字符
						 */
					}
				}
			}
			if (stack.length() != 0) {
				/*
				 * 拋出異常 括號不匹配
				 */
			}
			int separator;
			if (index != 0) { // 說明表達式的最後運算的為加法或減法
				separator = index;
			} else {
				separator = multi_div;
			}
			newNode.data = String.valueOf(exp[separator]);
			int pos = 0;
			for (; pos < separator; pos++) {
				leftString = leftString + exp[pos];
			}
			pos++;
			for (; pos < exp.length; pos++) {
				rightString = rightString + exp[pos];
			}
			if (node == null) {
				node = newNode;
			}
			newNode.left = createTree(leftString);
			newNode.right = createTree(rightString);
		} else {

			newNode.data = expression;

		}
		return newNode;
	}

六、測試運行

技術分享圖片

題目文件test.txt

技術分享圖片

答案文件calculate.txt

技術分享圖片

數據報告文件result.txt

技術分享圖片

七、小結

此程序未實現查重功能,此程序已用二叉樹結構存儲日後在在這基礎上完善已完成查重功能。此程序對於各種類型的操作數運算,是把各類型的操作數轉換為分數形式運算,最後通過約分得出結果。

八、代碼地址:https://gitee.com/jingyinglan/codes/iczorhpd2juakbw8vg4lx19

四則運算(基於控制臺)