第一次作业

项目地址:地址

 

需求分析

  • [√] 控制生成题目的个数。
  • [√] 控制题目中数值(自然数、真分数和真分数分母)的范围。
  • [x] 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
  • [x] 每道题目中出现的运算符个数不超过3个。
  • [√] 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。
  • [√] 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件。
  • [√] 程序应能支持一万道题目的生成。
  • [x] 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,并会输出所有题目中重复的题目。

功能设计

  • 基本功能

    生成四则运算题目

    判断题目是否重复

    计算答案

    存入文件

设计实现

    One():生成一个运算符的题目

    oneMore():生成多个运算符的题目

    compare2():判断题目重复

       readFile(File file):读取txt文件

    calculateAndPrint (String s) :计算答案

代码说明

  1.主方法

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class First {
    private static int One[][]=new int[10001][10001];//
    private static int temp[]=new int[10001];
    private static char symbol[]= new char[] {'+','-','*','/'};
    private static int realCount=0;//
    private static int count=0;
    private static int number=22;
    private static int range=9;
    private static int oneIndex=1;
    private static int tempIndex=1;
    private static int member=2;//
    //member=2
    public static void main(String args[]) throws IOException {
        File file1=new File("Exercises.txt");
        PrintWriter pw1=new PrintWriter(file1);//
        File file2=new File("answer.txt");
        PrintWriter pw2=new PrintWriter(file2);
        
        System.out.println("输入生成题目的个数:");
        Scanner s1 = new Scanner(System.in);
        number=s1.nextInt();
        System.out.println("输入范围:");
        range=s1.nextInt();
        One();
    }

 

2.生成题目

//产生一个运算符的题目
    public static void One() throws IOException {
        for(int i=0;realCount<number;i++) {
            if(realCount==0) {
                One[0][0]=new Random().nextInt(range);
                twoPlus(member);
                realCount++;
                //
                File file=new File("Exercises.txt");
                FileWriter fw = new FileWriter(file, true);  
                PrintWriter pw = new PrintWriter(fw);  
                pw.print(realCount+"."+One[realCount-1][0]+(char)One[realCount-1][1]+One[realCount-1][2]);
                pw.println();
                pw.close();
                //
                System.out.println("题目:");
                System.out.print(One[realCount-1][0]);
                System.out.print((char)One[realCount-1][1]);
                System.out.print(One[realCount-1][2]);
                System.out.println();
                //
            }
            else {
                temp[0]=new Random().nextInt(range);
                tempPlus(member);
                if(!compare2() ) {
                    One[realCount][0]=temp[0];
                    twoWithTemp(member);
                    realCount++;
                    //
                    File file=new File("Exercises.txt");
                    FileWriter fw = new FileWriter(file, true);  
                    PrintWriter pw = new PrintWriter(fw);  
                    pw.print(realCount+"."+One[realCount-1][0]+(char)One[realCount-1][1]+One[realCount-1][2]);
                    pw.println();
                    pw.close();
                    //
                    System.out.print(One[realCount-1][0]);
                    System.out.print((char)One[realCount-1][1]);
                    System.out.print(One[realCount-1][2]);
                    System.out.println();
                    //
                }
            }
            if(i==12) {
                member++;
                oneMore(number-realCount);
            }
        }
        File file=new File("Exercises.txt");
        readFile(file);
    }
    //产生多个运算符的题目
    public static void oneMore(int remainNumber) throws IOException {
        int index=1;
        if(realCount==number)
            return ;
        else {
            count=0;
            for(int i=0;count<remainNumber;i++) {
                if(i==0) {
                    One[realCount][0]=new Random().nextInt(range);
                    twoPlus(member);
                    count++;
                    realCount++;
                    File file=new File("Exercises.txt");
                    FileWriter fw = new FileWriter(file, true);  
                    PrintWriter pw = new PrintWriter(fw);  
                    pw.print(realCount+"."+One[realCount-1][0]);
                    for(int i3=0;i3<member-1;i3++) {
                        pw.print((char)One[realCount-1][index]);
                        pw.print(One[realCount-1][index+1]);
                        index+=2;
                    }
                    pw.println();
                    pw.close();
                    index=1;
                    //
                    System.out.print(One[realCount-1][0]);
                    for(int i3=0;i3<member-1;i3++) {
                        System.out.print((char)One[realCount-1][index]);
                        System.out.print(One[realCount-1][index+1]);
                        index+=2;
                    }
                    index=1;//
                    System.out.println();
                    //
                }
                else {
                    temp[0]=new Random().nextInt(range);
                    tempPlus(member);    
                    if(!compare2() ) {
                        One[realCount][0]=temp[0];
                        twoWithTemp(member);
                        count++;
                        realCount++;
                        File file=new File("Exercises.txt");
                        FileWriter fw = new FileWriter(file, true);  
                        PrintWriter pw = new PrintWriter(fw);  
                        pw.print(realCount+"."+One[realCount-1][0]);
                        for(int i3=0;i3<member-1;i3++) {
                            pw.print((char)One[realCount-1][index]);
                            pw.print(One[realCount-1][index+1]);
                            index+=2;
                        }
                        pw.println();
                        pw.close();
                        index=1;
                        //
                        System.out.print(One[realCount-1][0]);
                        for(int i3=0;i3<member-1;i3++) {
                            System.out.print((char)One[realCount-1][index]);
                            System.out.print(One[realCount-1][index+1]);
                            index+=2;
                        }
                        index=1;//
                        System.out.println();
                        //
                    }
                    
                }
                if(i==12) {
                    member++;
                    oneMore(number-realCount);
                    break;
                }
            }
        }
    }

3.判断题目重复

public static boolean compare2() {
        int arr2[][]=new int[10001][10000];
        int temp2[]=new int[10000];
        for(int i=0;i<realCount;i++) {//拷贝二维数组
             arr2[i]=One[i].clone();
        }
        temp2=temp.clone();        //拷贝临时数组
        for(int i=0;i<realCount;i++) { //二维数组排序
            Arrays.sort(arr2[i]);
        }
        Arrays.sort(temp2);  //临时数组排序
        for(int i=0;i<realCount;i++) {  
            if(Arrays.equals(temp2,arr2[i])) {
                return true;
            }
            else 
                continue;
        }

        return false;
    }

4.

//数组赋值
    public static int twoPlus(int member) {
        if(member==1) {
            oneIndex=1;
            return 0;
        }
        else {
            One[realCount][oneIndex]=symbol[new Random().nextInt(4)];
            One[realCount][oneIndex+1]=new Random().nextInt(range);
            oneIndex+=2;
            return twoPlus(member-1);
        }
    }    
    //数组赋值
    public static int tempPlus(int member) {
        if(member==1) {
            tempIndex=1;
            return 0;
        }
        else {
            temp[tempIndex]=symbol[new Random().nextInt(4)];
            temp[tempIndex+1]=new Random().nextInt(range);
            tempIndex+=2;
            return tempPlus(member-1);
        }
    }    
    //数组合并
    public static int twoWithTemp(int member) {
        if(member==1) {
            oneIndex=1;
            return 0;
        }
        else {
            One[realCount][oneIndex]=temp[oneIndex];
            One[realCount][oneIndex+1]=temp[oneIndex+1];
            oneIndex+=2;
            return twoWithTemp(member-1);
        }
    }

5.计算答案

//读取txt
    public static String readFile(File file){
        StringBuilder result = new StringBuilder();
        try{
            BufferedReader br = new BufferedReader(new FileReader(file));
            String s = null;
            int i=1;
            System.out.println("答案:");
            while((s = br.readLine())!=null) {;//
                i++;
                if(i<=10) {
                    String s1=s.substring(2);
                    calculateAndPrint(s1);
                }else if(i<100) {
                    String s2=s.substring(3);
                    calculateAndPrint(s2);
                }
                else if(i<1000) {
                    String s3=s.substring(4);
                    calculateAndPrint(s3);
                }
                else if(i<10001) {
                    String s4=s.substring(5);
                    calculateAndPrint(s4);
                }
            }
            
            br.close();    
        }catch(Exception e){
            e.printStackTrace();
        }
        return result.toString();
    }
    //计算答案
    public static void calculateAndPrint (String s) throws IOException {
        ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript");
        String str = s;
        try {
            Integer i =10;
            double tmp=Double.valueOf(i.toString());
            double d = Double.valueOf(se.eval(str).toString());
            System.out.println(d);
            File file=new File("answer.txt");
            FileWriter fw = new FileWriter(file, true);  
            PrintWriter pw = new PrintWriter(fw);  
            pw.println(d);
            pw.close();
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

测试运行

   控制台

 

  文件

 

 

PSP表格

 

 小结

  还有一些功能没完成。

posted on 2017-09-24 04:04  maobinggan  阅读(199)  评论(1编辑  收藏  举报