Java實現四則運算


本次使用java語言,實現了四則運算習題的生成。

一、主要功能:

(1)算式個數

(2)是否有乘除法

(3)結果集數值范圍

(4)加減法有無負數

(5)除法有無余數

(6)除法出現小數是否支持分數顯示

(7)選擇生成算式導入的文件

(8)輸出打印每行個數

二、代碼實現:

1IFormulaGeneration

package cn.zhl.software;

 

import java.util.Map;

 

public interface IFormulaGeneration {

    //加法生成接口,結果范圍,加法有無負數,生成個數

    public Map<String,Integer> Add(int resultRange,boolean is,int num);

 

    //減法生成接口,結果范圍,減法有無負數,生成個數

    public Map<String,Integer> Sub(int resultRange,boolean is,int num);

 

    //乘法生成接口,生成個數

    public Map<String,Integer> Mul(int resultRange,int num);

 

    //除法生成接口,結果范圍,除法有無余數,是否支持分數,生成個數

    public Map<String,String> Div(int resultRange,boolean is,boolean is2,int num);

 

    //檢測算式是否存在重復,如果存在返回true

    public boolean Repeat(Map<?,?> map,String formula);

 

    //生成特定范圍的數值

    public int nextInt(int min, int max);

 

    //化簡小數

    public String fracReduction(int numerator, int denominator);

 

    //算法生成器:算式個數,是否有乘除法,數值范圍,加減法有無負數,除法又無余數,是否支持分數,打印每行個數

    public Map<String,?> FormulaCustom(int formulaNum,boolean if_MulDiv,int range,

                                       boolean ifNeg_AddSub,boolean ifRem_Div,

                                       boolean ifRed_Div,int lineNum);

}

2FormulaRealization

package cn.zhl.software;

 

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

import java.util.Set;

 

public class FormulaRealization implements IFormulaGeneration {

 

    Random random = new Random();

 

    @Override

    public Map<String, Integer> Add(int resultRange, boolean is, int num) {

        if (resultRange < 0) {

            resultRange = -resultRange;

        }

 

        Map<String, Integer> addMap = new HashMap<>();

        int r1 = 0, r2 = 0, n = 0;

        String formula = "";

        for (; n < num; ) {

            r1 = nextInt(-resultRange, resultRange);

            if (is) {//加法允許出現負數

                r2 = nextInt(-resultRange - r1, resultRange - r1);

            } else {

                r2 = nextInt(-r1, resultRange - r1);

            }

            formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "+" + (r2 < 0 ? "(" + r2 + ")" : r2);

            if (Repeat(addMap, formula)) {

                addMap.put(formula, r1 + r2);

                n++;

            }

        }

        return addMap;

    }

 

    @Override

    public Map<String, Integer> Sub(int resultRange, boolean is, int num) {

        if (resultRange < 0) {

            resultRange = -resultRange;

        }

 

        Map<String, Integer> subMap = new HashMap<>();

        int r1 = 0, r2 = 0, n = 0;

        String formula = "";

        for (; n < num; ) {

            r1 = nextInt(-resultRange, resultRange);

            if (is) {//加法允許出現負數

                r2 = nextInt(-resultRange + r1, resultRange + r1);

            } else {

                r2 = nextInt(r1, resultRange + r1);

            }

            formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "-" + (r2 < 0 ? "(" + r2 + ")" : r2);

            if (Repeat(subMap, formula)) {

                subMap.put(formula, r1 - r2);

                n++;

            }

        }

        return subMap;

    }

 

    @Override

    public Map<String, Integer> Mul(int resultRange, int num) {

        if (resultRange == 0) {

            resultRange = 1;

        }

        if (resultRange < 0) {

            resultRange = -resultRange;

        }

        Map<String, Integer> mulMap = new HashMap<>();

        int r1 = 0, r2 = 0, n = 0;

        String formula = "";

        for (; n < num; ) {

            while (r1 == 0) {

                r1 = nextInt(-resultRange, resultRange);

 

            }

            r2 = nextInt(-(int) (resultRange / Math.abs(r1)), (int) (resultRange / Math.abs(r1)));

            formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "*" + (r2 < 0 ? "(" + r2 + ")" : r2);

            if (Repeat(mulMap, formula)) {

                mulMap.put(formula, r1 * r2);

                n++;

                r1 = nextInt(-resultRange, resultRange);

            }

        }

        return mulMap;

    }

 

    @Override
    public Map<String, String> Div(int resultRange, boolean is, boolean is2, int num) {
        if (resultRange == 0) {
            resultRange = 1;
        }
        if (resultRange < 0) {
            resultRange = -resultRange;
        }
        Map<String, String> divMap = new HashMap<>();
        int r1 = 0, r2 = 0, n = 0;
        String formula = "";
        for (; n < num; ) {
            //r1 = nextInt(-resultRange, resultRange);
            while (r2 == 0) {
                r2 = nextInt(-resultRange, resultRange);
            }
            if (!is) {//除法沒有余數
                r1 = r2 * nextInt(-(resultRange), resultRange);
            } else {//有余數
                r1 = nextInt(-resultRange, resultRange);
            }

            formula = (r1 < 0 ? "(" + r1 + ")" : r1) + "/" + (r2 < 0 ? "(" + r2 + ")" : r2);
            if (Repeat(divMap, formula)) {
                String result = "";
                if (is && is2) {//有余數且化為分數
                    if(r1*r2<0){
                        result = "-"+fracReduction(Math.abs(r1), Math.abs(r2));
                    }else {
                        result = fracReduction(Math.abs(r1), Math.abs(r2));
                    }
                    if(r1%r2==0){
                        result = ((double) r1 / r2) + "";
                    }
                } else {
                    if (!is) {//無余數
                        result = ((double) r1 / r2) + "";
                    }
                    if (is) {
                        result = ((double) r1 / r2) + "";
                    }
                }
                if(r1==0){
                    result=0.0+"";
                }
                if (r1==-r2){
                    result="-1.0";
                }

                divMap.put(formula, result);
                n++;
            }
        }
        return divMap;
    }

 

 

    @Override

    public boolean Repeat(Map<?, ?> map, String formula) {

        if (map.isEmpty()) {

            return true;

        } else {

            Set<String> strings = (Set<String>) map.keySet();

            for (String string : strings) {

                //如果當前算式與前面算式重復返回false

                if (string.equals(formula)) {

                    return false;

                }

 

            }

            //如果當前算式與前面算式不存在重復返回true

            return true;

        }

    }

 

    @Override

    public int nextInt(int min, int max) {

        if (min == max) {

            return max;

        }

        return random.nextInt(max - min + 1) + min;

    }

 

    @Override

    public String fracReduction(int numerator, int denominator) {

        //找到最大公約數,然后分別處以最大公約數

        int m = numerator;

        int n = denominator;

        int r;

        while (numerator > 0) {

            r = denominator % numerator;

            denominator = numerator;

            numerator = r;

        }

//        if ((m / denominator)==-(n / denominator)){

//            return "-1.0";

//        }

        return m / denominator + "/" + n / denominator;

 

    }

 

    @Override

    //算法生成器:算式個數,是否有乘除法,數值范圍,加減法有無負數,除法又無余數,是否支持分數,打印每行個數

    public Map<String, ?> FormulaCustom(int formulaNum, boolean if_MulDiv, int range, boolean ifNeg_AddSub, boolean ifRem_Div, boolean ifRed_Div, int lineNum) {

        int add = 0, sub = 0, mul = 0, div = 0;

        add = nextInt(formulaNum/5,formulaNum/3);

        sub = nextInt((formulaNum - add)/4,(formulaNum - add)/2);

        mul = nextInt((formulaNum - add - sub)/3,(formulaNum - add - sub)/1);

        div = formulaNum - add - sub - mul;

        Map map = new HashMap();

        if (if_MulDiv) {//如果存在乘除法將算式總數分為四份

            Map<String, Integer> addMap = Add(range, ifNeg_AddSub, add);

            Map<String, Integer> subMap = Sub(range, ifNeg_AddSub, sub);

            Map<String, Integer> mulMap = Mul(range, mul);

            Map<String, String> divMap = Div(range, ifRem_Div, ifRed_Div, div);

            map.putAll(addMap);

            map.putAll(subMap);

            map.putAll(mulMap);

            map.putAll(divMap);

        } else {//不存在則分為兩份

            Map<String, Integer> addMap = Add(range, ifNeg_AddSub, add);

            Map<String, Integer> subMap = Sub(range, ifNeg_AddSub, sub);

            map.putAll(addMap);

            map.putAll(subMap);

        }

        return map;

    }

 

}

3FormulaRealizationTest

package cn.zhl.test;

 

import cn.zhl.software.FormulaRealization;

import org.junit.Test;

 

import java.util.Map;

import java.util.Set;

 

public class FormulaRealizationTest {

    FormulaRealization formulaRealization = new FormulaRealization();

 

    @Test

    public void testAdd() {

        Map<String, Integer> add = formulaRealization.Add(100, false, 5);

        for (String s : add.keySet()) {

            System.out.print(s+"="+add.get(s)+"   ");

        }

    }

 

    @Test

    public void testSub() {

        Map<String, Integer> sub = formulaRealization.Sub(100, true, 5);

        for (String s : sub.keySet()) {

            System.out.print(s+"="+sub.get(s)+"   ");

        }

    }

 

    @Test

    public void testMul() {

        Map<String, Integer> mul = formulaRealization.Mul(100, 5);

        for (String s : mul.keySet()) {

            System.out.print(s+"="+mul.get(s)+"   ");

        }

    }

 

    @Test

    public void testDiv() {

        Map<String, String> div = formulaRealization.Div(100, true, true, 5);

        for (String s : div.keySet()) {

            System.out.print(s+"="+div.get(s)+"   ");

        }

    }

 

    @Test

    public void test1() {

        String div = formulaRealization.fracReduction(25,5);

            System.out.print(div);

 

    }

 

}

4IFileGeneration

 

package cn.zhl.fileCreate;

 

import java.util.Map;

 

public interface IFileGeneration {

    //用於將產生的算式寫入到文件中

    public void fileShow(Map<String,?> stringMap,int lineNum,String fileName);

}

5FileRealization

package cn.zhl.fileCreate;

 

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Map;

 

public class FileRealization implements IFileGeneration {

    @Override

    public void fileShow(Map<String,?> stringMap, int lineNum, String fileName) {

 

        int n=0;

        String answerName=fileName+"_Answer.txt";

        fileName=fileName+".txt";

        /*File file1 = new File("\\cn\\zhl\\formulaFile\\" + fileName);

        File file2 = new File("\\cn\\zhl\\formulaFile\\" + answerName);*/

        File file1 = new File("Arithmetic_question_generation_system\\src\\cn\\zhl\\formulaFile\\"+fileName);

        File file2 = new File("Arithmetic_question_generation_system\\src\\cn\\zhl\\formulaFile\\"+answerName);

 

        for (String s : stringMap.keySet()) {

            n++;

            try(FileWriter formulaWriter = new FileWriter(file1,true); FileWriter answerWriter = new FileWriter(file2,true)) {

                formulaWriter.write(s+"=  ");

                answerWriter.write(s+"="+stringMap.get(s)+"  ");

                if(n%lineNum==0){

                    formulaWriter.write("\n");

                    answerWriter.write("\n");

                }

            } catch (IOException e) {

                e.printStackTrace();

                System.out.println("未成功將算式保存到"+fileName+",答案保存到"+answerName+",請聯系開發人員!");

            }

        }

        System.out.println("已成功將算式保存到"+fileName+",答案保存到"+answerName+",歡迎您的下次使用!");

    }

}

6FormulaCustomTest

package cn.zhl.software;

 

import cn.zhl.fileCreate.FileRealization;

 

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Map;

import java.util.Scanner;

 

public class FormulaCustomTest {

    public static void main(String[] args) {

 

        int formulaNum;

        boolean if_MulDiv;int range;

        boolean ifNeg_AddSub;boolean ifRem_Div;

        boolean ifRed_Div;int lineNum;

 

        Scanner scanner = new Scanner(System.in);

        System.out.println("請輸入需要算式個數:");

        formulaNum=scanner.nextInt();

        System.out.println("請輸入需要乘除法(Y/N):");

        if(scanner.next().equals("y")||scanner.next().equals("Y")){

            if_MulDiv=true;

        }else {

            if_MulDiv=false;

        }

        System.out.println("請輸入需要結果集范圍(默認-n~n):");

        range=scanner.nextInt();

 

        System.out.println("請輸入允許加減法出現負數(Y/N):");

        if(scanner.next().equals("y")||scanner.next().equals("Y")){

            ifNeg_AddSub=true;

        }else {

            ifNeg_AddSub=false;

        }

        System.out.println("請輸入允許除法出現小數(Y/N):");

        if(scanner.next().equals("y")||scanner.next().equals("Y")){

            ifRem_Div=true;

        }else {

            ifRem_Div=false;

        }

        System.out.println("請輸入允許除法結果換算成分數(Y/N):");

        if(scanner.next().equals("y")||scanner.next().equals("Y")){

            ifRed_Div=true;

        }else {

            ifRed_Div=false;

        }

        System.out.println("請輸入算式每行個數:");

        lineNum=scanner.nextInt();

 

        //文件名

        String fileName="";

        System.out.println("請輸入算式需要導入的文件名:");

        fileName=scanner.next();

 

        System.out.println("定制完成,正在隨機生成算式。。。。");

        long l = System.currentTimeMillis();

        //算法生成器:算式個數,是否有乘除法,數值范圍,加減法有無負數,除法又無余數,是否支持分數,打印每行個數

        FormulaRealization formulaRealization = new FormulaRealization();

        Map<String, ?> stringMap = formulaRealization.FormulaCustom(formulaNum,if_MulDiv,range,

        ifNeg_AddSub,ifRem_Div,

        ifRed_Div,lineNum);

        long l2 = System.currentTimeMillis();

        System.out.println("算式生成成功,耗時"+(l2-l)+"毫秒!");

 

        FileRealization fileRealization = new FileRealization();

        fileRealization.fileShow(stringMap,lineNum,fileName);

 

    }

}

三、運行結果:

test1.txt

test1_Answer.txt

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM