美文网首页
判短算式表达式正错

判短算式表达式正错

作者: 王古 | 来源:发表于2018-08-01 20:14 被阅读0次
    package compiling;
    import java.util.Random;
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.lang.StringBuilder;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.Scanner;
    import java.util.Stack;
    
    /**
     *
     * @author weifeng
     */
    public class Compiling {
        
        //private static LinkedList<String> operators=new LinkedList<>(); //用于记录操作符
        //private static LinkedList<String> output=new LinkedList<>();//用来记录输出
        //private static StringBuilder sb=new StringBuilder();//用来记录后缀表达式
    
        /**
         * @param args the command line arguments
         */
        static String path1 = "C:\\Users\\weifeng\\Desktop\\结果.txt";
        static String path = "C:\\Users\\weifeng\\Desktop\\算术表达式.txt";
        static String path2 = "C:\\Users\\weifeng\\Desktop\\错误.txt";
        static String path3 = "C:\\Users\\weifeng\\Desktop\\检查结果.txt";
        static int n=0;
        
        public static void main(String[] args) throws IOException {
            while(true){
                System.out.println("                          ");
                System.out.println("请做出以下选择:");
                System.out.println("1,生成40道正确的算术表达式");
                System.out.println("2,生成40道错误的算术表达式");
                System.out.println("3,将算术表达式中缀转后缀");
                System.out.println("4,判断错误的正确表达式");
                System.out.println("0,退出");
                System.out.println("                          ");
                int x;
                System.out.print("你的选择是:");
                Scanner input = new Scanner(System.in);
                x = input.nextInt();
                switch(x){
                    case 1:
                    {
                        FileWriter fc =new FileWriter(path);
                        //FileWriter fcc =FileWriter(fc);
                        //BufferedWriter fccc =BufferedWriter(fcc);
                        int i =0;
                        while(i<=40){
                            i++;
                            String CC ="";
                            String DD =getnumberset(CC);
                            System.out.println(DD);
                            fc.write(DD+"\r\n");
                            //fccc.flush();
                        }
                        fc.close();
                        break;
                    }
                    case 2:
                        {
                        FileWriter fe =new FileWriter(path2);
                        int i =0;
                        while(i<=40){
                            i++;
                            String MM ="";
                            String NN =wrong(MM);
                            System.out.println(NN);
                            fe.write(NN+"\r\n");
                            //fccc.flush();
                        }
                        fe.close();
                        break;
                    }
                        
                    case 3:
                        changefirst();
                        break;
                    case 4:
                        analysefirst();
                        break;
                    case 0:
                        return;
                    default:
                        break;
                }
            
            }
           
            //analysefirst();
                    
        }
    
        public static String getnumberset(String AA){     //随机生成算术表达式
            
            String numberset="";
            String BB="";
            String[] A ={"+","-","*","/"};
            //生成最简单的运算式子
            int max=1000;
            int min=0;
            Random random =new Random();
            //随机生成1000以内的数字
            n++;
            if(n<6){
            boolean flag =random.nextBoolean();
            int number =random.nextInt(max)%(max-min+1)+min;
            //int number2 =random.nextInt(max)%(max-min+1)+min;
            int rand =(int)(Math.random()*A.length);
            if (flag==true){
                numberset ="("+String.valueOf(number)+String.valueOf(A[rand])+getnumberset(BB)+")";
                return numberset;
            }
            else{
                numberset =String.valueOf(number)+String.valueOf(A[rand])+getnumberset(BB);
                return numberset;   
            }}
            else{
                n=0;
                int rands =(int)(Math.random()*A.length);
                int number1 =random.nextInt(max)%(max-min+1)+min;
                int number2 =random.nextInt(max)%(max-min+1)+min;
                boolean flag1 =random.nextBoolean();
                if(flag1==true){
                numberset =String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2);
                return numberset;}
                else{
                    numberset ="("+String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2)+")";
                    return numberset;              
                }
                        }
            //number1=String.valueOf(rands);                             
        }
           
        public static void changefirst() throws FileNotFoundException, IOException{  //从文件中读取并将中缀转后缀写入新的文件
            FileWriter fw = new FileWriter(path1);
            File file = new File(path);
            FileReader reader = new FileReader(file);
            BufferedReader breader = new BufferedReader(reader);
            String C = "";
            while((C = breader.readLine())!=null){
                System.out.println(C);    
                System.out.print("中缀转后缀为:");
                System.out.println(changesecond(C));
                fw.write("中缀:"+C+"\r\n");
                fw.write("后缀:"+changesecond(C)+"\r\n");
            }
            breader.close();
            fw.close();
        }
    
      
        
        public static String wrong(String EE){//随机生成错误的正确表达式
            String numberset="";
            String FF="";
            String[] A ={"+","-","*","/","(",")","++","+-","**","/*","+*"};
            //生成最简单的运算式子
            int max=1000;
            int min=0;
            Random random =new Random();
            //随机生成1000以内的数字
            n++;
            if(n<6){
            boolean flag =random.nextBoolean();
            int number =random.nextInt(max)%(max-min+1)+min;
            //int number2 =random.nextInt(max)%(max-min+1)+min;
            int rand =(int)(Math.random()*A.length);
            if (flag==true){
                numberset ="("+String.valueOf(number)+String.valueOf(A[rand])+wrong(FF)+")";
                return numberset;
            }
            else{
                numberset =String.valueOf(number)+String.valueOf(A[rand])+wrong(FF);
                return numberset;   
            }}
            else{
                n=0;
                int rands =(int)(Math.random()*A.length);
                int number1 =random.nextInt(max)%(max-min+1)+min;
                int number2 =random.nextInt(max)%(max-min+1)+min;
                boolean flag1 =random.nextBoolean();
                if(flag1==true){
                numberset =String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2);
                return numberset;}
                else{
                    numberset ="("+String.valueOf(number1)+String.valueOf(A[rands])+String.valueOf(number2)+")";
                    return numberset;              
                }
                        }
        }
        
        public static void analysefirst() throws FileNotFoundException, IOException{   //分析错误的算术表达式
            File a =new File(path2);
            FileReader areader = new FileReader(a);
            BufferedReader abreader = new BufferedReader(areader);
            String W ="";
            while(( W= abreader.readLine())!=null){
                int rcount =0; //右括号数
                int lcount =0; // 
                System.out.println(W);
                System.out.println("判断:");
                for(int i=0;i<W.length();i++){
                    if(i<W.length()-1){
                    if(W.charAt(i)=='('){
                        lcount=lcount +1;
                        if(W.charAt(i+1)==')'){System.out.println("第 "+i+" 字符 ( 后缺少运算表达式");}}
                    if(W.charAt(i)==')'){
                        rcount=rcount +1;
                        if(rcount>lcount){System.out.println("第 "+i+" 字符括号 ) 与前面括号不匹配");}
                        if(W.charAt(i+1)!='-'&& W.charAt(i+1)!='+'&& W.charAt(i+1)!='/'&& W.charAt(i+1)!='*'&&W.charAt(i+1)!='('&& W.charAt(i+1)!=')'){
                            System.out.println("第 "+i+" 个字符 ) 后不能直接出现数字");
                        }
                        if(W.charAt(i+1)=='('){System.out.println("第 "+i+" 个字符 ) 后不能直接出现 (");}
                    }
                    if(W.charAt(i)=='+'||W.charAt(i)=='-'||W.charAt(i)=='/'||W.charAt(i)=='*'||W.charAt(i)=='('){
                        if(W.charAt(i+1)=='+'||W.charAt(i+1)=='-'||W.charAt(i+1)=='/'||W.charAt(i+1)=='*'){
                            System.out.println("第 "+i+"  字符运算符号后缺少运算值");
                        }
                    }
                    if(W.charAt(i)!='-'&& W.charAt(i)!='+'&& W.charAt(i)!='/'&& W.charAt(i)!='*'&&W.charAt(i)!='('&& W.charAt(i+1)!=')'){
                        if(W.charAt(i+1)=='(')
                            System.out.println("第 "+i+" 数值后面不能直接添加 ( ");
                    }
                }
                    if(i==W.length()-1){
                        if(W.charAt(i)=='('){lcount++;}
                        if(W.charAt(i)==')'){rcount++;}
                        if(W.charAt(i)=='+'||W.charAt(i)=='-'||W.charAt(i)=='/'||W.charAt(i)=='*'){
                            System.out.println("最后一个运算符号右边缺少运算值");
                        }
                        
                        if(lcount!=rcount)
                            System.out.println("最后一个括号与前面不匹配");
                    }
                }
                
                }
                 
            abreader.close();
        }
        
        
        public static String changesecond(String exp) throws IOException{
            Stack<Character> s = new Stack<Character>(); // 要输出的后缀表达式字符串
            String suffix = "";
            int length = exp.length(); // 输入的中缀表达式的长度
            for (int i = 0; i < length; i++) {
                
                char temp;
                char ch = exp.charAt(i);
                switch (ch) {
                    case ' ':
                        break;
                    case '(':
                        s.push(ch);
                        break;
     
                    case '+':
                    case '-':
                        while (s.size() != 0) {
                            temp = s.pop();
                            if (temp == '(') {
                                s.push('(');
                               break;
                            }
                            suffix += temp;                     
                        }
                        s.push(ch);
                        break;
                        
                    case '*':
                    case '/':
                        while (s.size() != 0) {
                            temp = s.pop();
                            if (temp == '+' || temp == '-' || temp == '(') {
                                s.push(temp);
                                break;
                            } 
                            else {suffix += temp; }
                        }
                        s.push(ch);
                        break;
                        
                    case ')':
                        while (!s.isEmpty()) {
                            temp = s.pop();
                            if (temp == '(') {
                                break;
                            } 
                            else { suffix += temp;}
                        }
                        break;
                        
                    default:
                        suffix +=ch;
                        if(i+1<exp.length()){
                        char nu=exp.charAt(i+1);
                        if(nu == '-'||nu=='+'||nu=='/'||nu=='*'){
                            suffix +=" ";break;}
                        else break;
                        }                      
                }
            }
            while (s.size() != 0) {
                suffix += s.pop();
            }
            return suffix;
        }   
    }
    

    运行结果:

    图片1.png 图片2.png 图片3.png 图片4.png 图片5.png 图片6.png 图片7.png

    相关文章

      网友评论

          本文标题:判短算式表达式正错

          本文链接:https://www.haomeiwen.com/subject/szzrvftx.html